V Y написал: Николай Камынин , Эта идея не сработала, по крайней мере для Quik Junior, В Quik открыта одна таблица Текущих торгов с одной строкой. Из скрипта получаю таблицу securities. возвращается 3909 записей, и не в одной шаг цены и/или размер лота не равны нулю.
Я говорб всегда о боевом сервере, а на учебном вообще ничего не надо смотреть. Он просто так для тестирования буратин.
Время изменения стакана получаемого через OnQuotes, OnQuotes - есть ли возможность параллельно с чтением стакана, получить точное время торгового сервера, когда он возник/изменился
Борис Гудылин написал: О синхронизации локального времени с сервером точного времени.
Раз в час синхронизирую время с сервером точного времени ntp1.vniiftri.ru. Сразу после этого локальное время и время биржи если и отличаются, то не слишком заметно. Но за час расхождение достигает нескольких секунд.
Во-первых, биржа тоже синхронизируется по серверу точного времени. и гораздо точнее чем ваш комп. Во-вторых, синхронизируйте на раз в час а как хотите быстрее. Я синхронизирую раз в пять минут. В-третьих, в винде есть алгоритм автоподстройки времени, который обеспечивает погрешность указанную ранее. Вот результаты моих исследований этого вопроса (по оси Y - погрешность в секундах):
Александр Правилов написал: Итак, имеем код: Функция getstime уже вам известна.
1. Проверяем условие и получаем true 2. Рассчитываем LASTDEPTHT - всё ок 3. Выходим из условия 4. В Delta присваиваем LASTDEPTHT - не работает LASTDEPTHT = nil
Код
if getSTime() > 100000 and getSTime() < 184003 then
local LASTDEPTHT_T = getParamEx (class, sec, «LAST»)
local LASTDEPTHT = tonumber(toPrice(sec, LASTDEPTHT_T.param_value))
tbl: SetValue (line_count_table[sec],'LAST', string.format (LASTDEPTHT))
end
local Delta = LASTDEPTHT
сделайте так:
Код
local LASTDEPTHT_T,LASTDEPTHT;
if getSTime()>100000 and getSTime()<184003 then
LASTDEPTHT_T = getParamEx(class, sec, «LAST»)
LASTDEPTHT=tonumber(toPrice(sec, LASTDEPTHT_T.param_value))
tbl:SetValue(line_count_table[sec],'LAST', string.format(LASTDEPTHT))
end
local Delta = LASTDEPTHT
Давно ставил таймеры из IUPLUA. Но мне привычнее добавлять свои dll на основе API C for Lua. Таким же способом обеспечиваю синхронизацию потоков, если надо.
А чем вам не нравятся локальные часы? Либо сделать отдельно иконку часов прозрачную и повесить впереди всех. Локальные часы я синхронизирую по серверу точного времени . погрешность при длительной синхронизации 10-100 мс.
Время изменения стакана получаемого через OnQuotes, OnQuotes - есть ли возможность параллельно с чтением стакана, получить точное время торгового сервера, когда он возник/изменился
стакан возникает в момент его создания на экране потом сервер присылает изменения которые добавляются в стакан. время обновления можно узнать при вызове колбека OnQuote функцией getInfoParam ("SERVERTIME") ------------------------------- Замечу следующее. Если есть желание знать время биржи, которое может отличаться от времени сервера, то синхронизируйте часы своего компа по серверу точного времени и читайте локальное время. Погрешность составить 10-100 ms.
aidan1387 написал: Возникла следующая задача: хочется на чарте видеть текущее локальное время.
Не очень понятно, как обеспечить его стабильное обновление, например, в клир, когда поток данных не такой плотный.
Есть ли какая-то возможность сэмулировать ивент, который будет прилетать в том же потоке через определенный промежуток времени, что и все остальные ивенты во избежания гонки? Из main не хотелось бы апдейтить гуй, чтобы не вылавливать потом не понятные хипкарапшены. Так же, необходимо обойтись только средствами скрипта lua (без каких-либо сторонних бинарей, данное требование нельзя отменить).
Может кто сталкивался, или разработчики что посоветуют?
Много можно сделать вариантов.
Например, 1) в момент совершения сделки по любому ликвидному инструменту. 2) В момент обновления ТТП 3) В момент изменения стакана и т д т е в момент вызова любого колбека. ---------------------- Кроме того можно добавить средствами луа таймер. -------------------
Роман написал: Уважаемый сотрудники ARQA Techologies в связи с тем что данные отражаемые на ваших графиках имею индивидуальные параметры (я имею введу цены свечей отличаются от скажем финама), прошу вас создать раздел или меню в Квике от куда пользователи мог ли бы загружать архивы котировок и тестировать на них свои системы! Да сейчас вы предоставляете возможность вытаскивать с графиков 3000 свечей, но этого мало, мне бы было интересно брать ваш архив скажем часовик с 2000 года.
Прикольно, где это у ARQA Techologies нашли архивы реальных котировок ? Архивы в студию!!!
Роман написал: Решение одно стандартизировать разрядность.
Ну, во-первых, у меня нет разности доходности в амиброкере и квике. во-вторых, у меня считает одинаково и в Амиброкере и в квике В-третьих, я не виноват в том, что Вы воинствующий дилетант.
Егор Масалкин написал: Т.е. я правильно понимаю, что отдельно события "открытие новой свечи" нет, и кроме пересчета времени способа открыть сделку с первой сделкой в свече нет?
правильно понимаете. Но открою Вам секрет, отрывать сделку надо не по открытию , а по закрытию свечи. Тогда ваша сделка будет либо на открытии следующей свечи, либо в числе первых насколько это будет возможным.
Роман написал: Николай Камынин , при всём уважении я привёл здесь достаточно фактов!
Вполне допускаю, что примеров достаточно с Вашей точки зрения. так как Вы озабочены этой проблемой. Но судя по ответам, проблема либо не понятна , либо проблемы вообще нет. Если цель поста - сделать заявление о том, что все у Вас плохо, то цель достигнута. но полагаю, что вы хотите получить какие-то ответы для решения проблемы. Верно? Тогда попробуйте объяснить проблему подробнее и понятнее для других, если нужна помощь в ее решении.
Роман написал: print(string.format("x = %.15f", x)) - ну это так заплатка конечно временная, при каждом сложении её ставить. В программе нужно настройку поставить или с общими стандарты откорректировать.
Полагаю, что Вы не поняли. Есть внутренний формат данных и внешний. Внутренний - это то как считается, а внешний - это то как смотрится. Считается и WLD и в lua и в МТ4 в формате double. В других языках, например на CИ либо на 64 битной машине можно считать еще в double dlouble формате, будет еще точнее. А отображение на экране в каждом языке делается, еслм по умолчанию, то как задумано автором языка. ----------------------------- Но основная проблема у Вас, по-моему мнению, в том, что если Ваш робот перестает работать при разности в ценах E-15, то это мертвый робот. Он будет сливать депозит на реальном счете.
Вопрос к разработчикам: Вы можете предложить надёжный способ убедиться, что getParamEx даёт действительно последнюю цену инструмента, а не её отсутствие?
Вообще-то странный вопрос. это же цена последней сделки !!! Если инструмент торгуется и была хотя бы одна сделка в сессии, то цена последней сделки не может быть равна нулю или nil. следовательно, если цена последней сделки ноль - то информации о сделках в текущей сессии еще не поступало, что равноценно - сделок нет. --------------------------- Умным - горе от ума..
Егор Масалкин написал: Всем доброго времени суток. Пишу робота, столкнулся с таким нюансом. Изначально спроектировал его так, чтобы проверка на выполнение условий выставления заявки была по времени (допустим, раз в минуту, путём pause(X) ).
Дело в том, что таким образом если я запускаю робота на 46-ой секунде на сервере, то первая проверка будет осуществляться на 46-ой секунде; следующая на 1 минуте 46; потом 2 минуты 46 и т.д.
Надо сделать так, чтобы проверка отрабатывала всегда на моменте открытия новой свечи. И не могу найти инфу, как программно выцепить именно момент открытия. Могу конечно время подогнать, но это не то. Подскажите, может есть какая-то встроенная функция... из справки в разделе "функции обратного вызова" вроде нет ничего подходящего, либо я не понял это(
Для этого необходимо понять каким образом формируется свеча. Поясняю. -------------------------------- Свеча - это четыре индикатора. Ее основная задача сжать данные о сделках. ----------------------------- Это сжатие осуществляется следующим образом: Ось времени разбивается на одинаковые интервалы. На каждом интервале формируются четыре индикатора. Первый индикатор - открытие свечи (open) - это первая сделка, которая произошла на текущем интервале. - Это и есть правило определения начала сделки. --------------------------------- Для его реализации Вы должны синхронизировать свои часы с часами биржи и обнаруживать первую сделку при наступлении нового интервала. интервалы считаются от начала суток т е от 00:00. --------------------
8,51999999999998 * 100 = 851,999999999998 равно 8,52 *100 = 852
Цитата
Роман написал: Michael Bulychev , т.е. по вашему 8,51999999999998 это тоже самое что и 8,52?
Роман, правильно я вас понял. Вы утверждаете, что 8,51999999999998 это не 8.52? ------------------------------- Но если Вы посчитаете погрешность то получите 2.29342E-15. Потом возьмете справочник по программированию и узнаете, что формат double, который используется в LUA, в МТ4, в WLD позволяет хранить числа с погрешностью 15 десятичных цифр, т е относительная погрешность E-15. а вот отображение на экране оператором print выполняется в соответствии с заданным Вами или заданным по умолчанию форматом. ---------------------------------- так в чем у вас проблема?
Николай Камынин написал: если надо анализировать историю , то возьмите амиброкер. Обрабатывал в нем историю по сберу за 10 лет с таймом 5 минут.
10 лет ?))))))))) я вам открою маленькую тайну за 10 лет рынок поменялся минимум раз 20))) 2-3 квартала, дальше смысла смотреть нету очень много всего может произойти за это время и активность изменится и уже раньше активность которая способствовала заработку в настоящее время не будет способствовать! Вы всегда будете на шаг позади если слишком далеко будете уходить в историю задумайтесь над этим за 10 лет вы можете выявить общую тенденцию и логику сделок но подстроится грамотно чётко у вас не получится и сама по себе история это тоже малооинформативная информация нужно смотреть как торговалось как приходили объёмы в каком количестве на каком фоне но эту инфу я беру из другой программы там полностью торги все проигрываются, но есть минус я не могу отдалить график нормально в общем такая вот наша держава великая.. все кусками приходится собирать..
Николай задумайтесь над этим! сегодня 1000 коней развернут рынок через квартал активность на активе будет гораздо выше он не почувствует эти 1000 коней... через квартал активность упадёт 1000 коней снова развернут... все в сравнении и вообще активность меняется каждый день иногда каждый час..))) Есть активность которую работает трейдер это что то среднее.. надеюсь вам это поможет... когда то на сишке объёмы торгов были не такие большие соответственно другие деньги влияли на ценовое движение сегодня всё подругому, это не 10 лет это 6 лет со дня когда началось ралли на рубле, все начали покупать и продавать доллары и активность актива выросла в разы!
Благодарю за рассказ Вашего видения рынка. Но если Вы не видите в чем-то смысл, то это не значит , что в этом нет смысла. Смысла нет исключительно лишь для вас. Например, могу предположить, что Вы не видите смысла и нейронных сетях и искусственном интеллекте. Посмотрите мой сайт www.kamynin.ru , возможно Вы увидите смысл и в изучении больших интервалов. ------------------ В качестве информации к размышлению: попробуйте ответить на вопросы: 1) почему рынок меняется, а для технического анализа применяются методы которым в обед 100 лет, а вездесущим свечам так все двести. 2) Что изменилось в психологии людей за последние 1000 лет? ------------------- Успехов в поиске смысла.
Сергей Королев написал: QUIK дает возможность писать программы для себя сразу на двух языках. Просмотрел форум, но не нашел сравнительного анализа. Прошу знатоков высказывать свое мнение о преимуществах и недостатках каждого.
Преимущества QPILE простой язык. проще освоить и писать на нем. -------------------------------------------------- Недостатки QPILE простой язык. Переменный одного уровня видимости. Программа исполняется интерпретатором, что существенно медленнее, чем VMLua. Существенно ограничены возможности реализации сложных алгоритмов. ================== В Lua есть возможность подключать любые библиотеки (dll), что позволяет реализовать алгоритмы на нативном коде и получить максимальное быстродействие, создавать программы на любых языках программирования. ====================== QPILE - умер..
вообще-то свечи - это разделение сделок по одинаковым временным интервалам. Поэтому если в каком-то интервале нет сделок то и свеча нулевая. Поэтому пустая свеча - это время без сделок. Если сделок нет, то свеча пустая и считать нечего. Поэтому правильно - ничего не изменять на пустых свечах. Но так как применение различных статистических методов к свечам вообще не корректно, то можно считать все, что угодно. ----------------------------- Как говорится в анекдоте: Там висит кирпич, туда ехать нельзя, но вам можно.
Нет свечки, тогда значению массива текущей даем предудыщее значение.
Код
if not CandleExist(index) then
CC[index] = CC[index - 1 ]
return nil
end
Если надо получить значение пршлой свечки, то сначала находим ближайшую существующую прошлую, через эту функцию
Код
function FindExistCandle (I)
local out = I
while not CandleExist(out) do
out = out - 1
end
return out
end
Код
local previous = index - 1
if not CandleExist(previous) then
previous = FindExistCandle(previous)
end
if C(index) > C(previous) then
Соорудил подобное при помощи рекурсивного вызова функции.
Код
function GetPrice (ind)
if ind ~ = 0 then
if CandleExist(ind) = = false then
return GetPrice(ind - 1 );
else
return С(ind)
end
else
return 0
end
end
Быстрее будет, если вместо поиска свечки назад, просто запоминать индекс последней существующей свечки. При отсутствии свечки брать сохраненный индекс.
валерий написал: Концепции Амиброкера это почемуто не противоречит и пользователей устраивает. Я же не сам это придумал. Любой индикатор это вообще то, чего реально нет. Это отражение реальности, а не сама реальность. Способов отражения, в том числе и пропусков, несчетное множество. А предложение позволяет пользователю выбрать или самое простое и ходовое zero-order hold или полную своду творчества или компромисс, когда по нулевым объемам можно выявить пропуски и как-то дополнить зох.
Восприятие мира человеком - это отражение реальности, а не сама реальность.
это условие: if t1[0].close>t2[0].close and t1[1].close<t2[1].close then не будет работать, если t1[0]==t2[0], но t1[-1]>t2[-1]. и еще во многих случаях.
Эту функцию: ------------------ function isnil(a,b) if a == nil then return b else return a end; end; ------------------------ можно записать так: ------------------ function isnil(a,b) return a or b; end;
Settings =
{
Name = "+PE" ,
fname = "OSCp" ,
line =
{
{
Name = "eq - " ,
Color = RGB ( 40 , 80 , 190 ),
Type = TYPE_LINE,
Width = 1
},
{
Name = "pos - " ,
Color = RGB ( 255 , 60 , 50 ),
Type = TYPE_LINE,
Width = 2
}
}
}
function Init ()
return # Settings.line
end
function OnCalculate (index)
local fnm = "\ \" .. Settings.fname .. ".txt"
if index = = Size () then
local callResult, result = pcall(dofile, getScriptPath () .. fnm)
if not callResult then
return
end
SetValue (index - # eq, 1 , nil )
SetValue (index - # pos, 2 , nil )
local cnt = 0
for i = index - # eq + 1 , index - 1 do
cnt = cnt + 1
SetValue (i, 1 , eq[cnt])
SetValue (i, 2 , pos[cnt])
end
return eq[ # eq], pos[ # pos]
end
end
В файле для дуфайл - типа этого: pos={0.00,0.00,0.00,1.00,1.00,} eq={0.43,0.43,0.43,0.45,0.44,} только длиннее - 300-500 палок.
Могу посоветовать следующее: 1) дорисовывать последнюю точку и удалять первую, а не перерисовывать все. 2) перерисовывать лишь те точки которые изменились.
Могу посоветовать следующее: 1) Пустые свечи определяете по нулевому объему. ------------------------------- 2) примеры индикаторов написаны правильно и работают правильно при двух условиях а)на графике один инструмент b) графики не в реале. --------------------------- 3) Примеры написаны не для использования в роботах, а для технического анализа. поэтому они написаны не оптимально.
Космонавт написал: Николай, циферка 3 - аукцион открытия, 4 - аукцион закрытия (перед ней и после неё есть ещё периоды со своими цифрами, не помню их названий) 0 - сессия закрыта.
Я понял вашу мысль про оператор and, но не могу понять как это работает. Мне ведь нужно срабатывание либо одного условия (премаркет), либо второго (постмаркет), а не одновременно обоих (and)
Космонавт написал: Николай, циферка 3 - аукцион открытия, 4 - аукцион закрытия (перед ней и после неё есть ещё периоды со своими цифрами, не помню их названий) 0 - сессия закрыта.
Я понял вашу мысль про оператор and, но не могу понять как это работает. Мне ведь нужно срабатывание либо одного условия (премаркет), либо второго (постмаркет), а не одновременно обоих (and)
Космонавт написал: Зачем у Oninit в скобках параметр (script_path)? У меня работает и без него: OnInit ()
имеется в виду, что нужно делать так?
Код
script_path = getScriptPath ()
function OnInit (script_path)
--задаём переменные
end
Если память мне не врет, то вроде бы раньше вызов getScriptPath () в начале подвешивал скрипт и еще были глюки вызова функций QLUA вне колбеков или main.
Космонавт написал: И ещё вопрос. Он не праздный. Может быть у дохлого брокера с одним сервером это будет проблемой.
Когда я заказываю данные с сервера, например, стакан, это создаёт нагрузку на сервер брокера? ну например бесконечный цикл:
Код
class = "SPBFUT"
sec = "SRH7"
for i = 1 , 10000000000000000000 do
qt = getQuoteLevel2 (class, sec)
end
Вредит ли это способности брокера обслуживать других клиентов? Например отправка заявок бесконечным потоком точно вредит. У других клиентов заявки будут дольше улетать на биржу.
это вредит только Вам, так как Вы таким циклом ничего не заказываете многократно а просто вешаете свой комп. ----------------------------------------- За такие программы надо по рукам палкой.
Возможные состояния торгов по финансовому инструменту. Константа Описание N Недоступно для торгов O Период открытия C Торги закрыты F Период закрытия B Перерыв T Торговая сессия ------------------------------------ Если так то Ваш оператор надо записать так: while getParamEx(class,"GAZP","tradingstatus").param_value)~='O' and getParamEx(class,"GAZP","tradingstatus").param_value)~='F' do sleep (1000) end
------------------------ В любом случае замените or на and
еще замечу, что в init ставить настройку каких либо параметров не имеет смысла, так как он не вызывается при изменении параметров индикаторов. Поэтому без проверки на 1 индекса Вы все рано не обойдетесь. И смысла делать как вы хотите нет никакого.
Алексей написал: Это то понятно, что решить задачу можно, отлавливая вызов для первой свечки, но это лишние накладные расходы, пускай и мизерные. А на медленных машинках, для процессов, исполняемых интерпретатором, если кто-то решит повесить много индикаторов, в каждом из которых по несколько линий ... :) ,
1) То что проверка первой свечи приводит к "накладным расходам" не более чем просто слова. 2) Гипотетическое создание Init2 совершенно никак не позволит изменить ситуацию. И даже если ее добавить, это будет ровно тоже самое что проверка первой свечи. 3) Решение в виде проверки первой свечи, в полной мере решает задачу и аргументов которые не позволят ее решить указанным способом, Вы так и не привели.
отлавливание первой свечи оператором if indx==1 then ... end на медленных машинах займет не более 50 мкс. А поступление очередных данных происходит не чаще, чем раз в 100 мс. Разница примерно в 2000 раз. А задержка реакции OC не менее 10 мс. Разница в 200 раз. А задержка отправки коротких сообщений с компа на сервер брокера типа заявок, может составить 200 мс Разница примерно в 4000 раз. За что боремся?
Я же нарисовал смайлик. И сразу далее написал, что естественно не в этом суть. А суть вопроса к quik в том, что:
Не прослеживается единообразия в логике вызовов Init() со стороны Quik: при исходном добавлении индикатора на график, Init() вызывается до привязки к источнику данных, а при замене инструмента Init(), почему-то, вызывается уже после привязки к новому инструменту.
А в квике как мультике про простоквашено (Письмо дяди Федора). Начинал писать квик один писатель потом второй и т д. Стратегию построения КВИКА разработали еще в прошлом веке. Вот и нет однообразия. А читатели - это клиенты брокеров.
Где почитать подробнее про этот пункт? А матлаб не так уж и сильно грузит, не знаю пока как быстр обмен по Кому.
почитать в API C для LUA. В инете полно. -------------------- У Вас получается две вм машины работают VM LUA и VM Matlab. А это хорошие расходы ресурсов. ------------------------- А Вы для чего матлаб подключаете? Может не имеет смысла вычислять 2+2 на матлабе?
Николай Камынин написал: Вас не смущает задержка в 160 мс?
Здесь нет задержки. По оси y отложена цена инструмента из пришедшего колбэка. Что касается задержки, то вы никакими супер-атомными часами не получите время задержки для OnParam в QUIK. Вы ведь не серьёзно про часы-то?
Цитата
Николай Камынин написал: Как Вы узнали что в OnParam нет лучшей цены?
На график в OnParam выведены только изменения по LAST.
Вообще-то я серьезно. Подобными Вашим измерениями я последний раз лет семь назад. Суть таких измерений не в том, чтобы выяснить какой колбек быстрее, так как это, говоря образно," ловля блох". Суть таких измерений в том, чтобы выяснить на сколько запаздывают данные на компе относительно реальных событий на бирже. Никто не мешает брокеру создать специально задержку данных, поступающих на ваш комп и показывать Вам вчерашний день. А Вы будете быстро быстро постоянно присылать на биржу с запаздыванием на десятки и сотни миллисекунд при этом радуясь, что делаете это на микросекунды быстрее. Подумайте над этим.
Алексей написал: Это то понятно, что решить задачу можно, отлавливая вызов для первой свечки, но это лишние накладные расходы, пускай и мизерные. А на медленных машинках, для процессов, исполняемых интерпретатором, если кто-то решит повесить много индикаторов, в каждом из которых по несколько линий ...:),
1) То что проверка первой свечи приводит к "накладным расходам" не более чем просто слова. 2) Гипотетическое создание Init2 совершенно никак не позволит изменить ситуацию. И даже если ее добавить, это будет ровно тоже самое что проверка первой свечи. 3) Решение в виде проверки первой свечи, в полной мере решает задачу и аргументов которые не позволят ее решить указанным способом, Вы так и не привели.
отлавливание первой свечи оператором if indx==1 then ... end на медленных машинах займет не более 50 мкс. А поступление очередных данных происходит не чаще, чем раз в 100 мс. Разница примерно в 2000 раз. А задержка реакции OC не менее 10 мс. Разница в 200 раз. А задержка отправки коротких сообщений с компа на сервер брокера типа заявок, может составить 200 мс Разница примерно в 4000 раз. За что боремся?
еще можно через DDE и подобные механизмы. Так как DDE - это обмен через память, то работать будет быстро. Но судя по уровню задающего вопросы, рекомендую просто запустить скрипт на каждом терминале.
из собственного опыта. Я использовал из матлаба любые методы следующим образом: 1) Пишем программу в матлаб. 2) Преобразуем ее средствами матлаб в прогамму на С либо С++ (по вкусу) 3) создаем DLL. 4) Подключаем DLL к LUA. 5) работаем в реале без загрузки матлаба и с высокой скоростью.