Сергей Королев написал: QUIK дает возможность писать программы для себя сразу на двух языках. Просмотрел форум, но не нашел сравнительного анализа. Прошу знатоков высказывать свое мнение о преимуществах и недостатках каждого.
Преимущества QPILE простой язык. проще освоить и писать на нем. -------------------------------------------------- Недостатки QPILE простой язык. Переменный одного уровня видимости. Программа исполняется интерпретатором, что существенно медленнее, чем VMLua. Существенно ограничены возможности реализации сложных алгоритмов. ================== В Lua есть возможность подключать любые библиотеки (dll), что позволяет реализовать алгоритмы на нативном коде и получить максимальное быстродействие, создавать программы на любых языках программирования. ====================== QPILE - умер..
INDICATORS.ZIP
Пользователь
Сообщений: Регистрация: 30.01.2015
17.02.2017 19:25:07
вообще-то свечи - это разделение сделок по одинаковым временным интервалам. Поэтому если в каком-то интервале нет сделок то и свеча нулевая. Поэтому пустая свеча - это время без сделок. Если сделок нет, то свеча пустая и считать нечего. Поэтому правильно - ничего не изменять на пустых свечах. Но так как применение различных статистических методов к свечам вообще не корректно, то можно считать все, что угодно. ----------------------------- Как говорится в анекдоте: Там висит кирпич, туда ехать нельзя, но вам можно.
Ограничение 3000 свечек., Безумие.
Пользователь
Сообщений: Регистрация: 30.01.2015
17.02.2017 19:16:08
если надо анализировать историю , то возьмите амиброкер. Обрабатывал в нем историю по сберу за 10 лет с таймом 5 минут.
Нет свечки, тогда значению массива текущей даем предудыщее значение.
Код
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
Быстрее будет, если вместо поиска свечки назад, просто запоминать индекс последней существующей свечки. При отсутствии свечки брать сохраненный индекс.
INDICATORS.ZIP
Пользователь
Сообщений: Регистрация: 30.01.2015
16.02.2017 08:46:48
Цитата
валерий написал: Концепции Амиброкера это почемуто не противоречит и пользователей устраивает. Я же не сам это придумал. Любой индикатор это вообще то, чего реально нет. Это отражение реальности, а не сама реальность. Способов отражения, в том числе и пропусков, несчетное множество. А предложение позволяет пользователю выбрать или самое простое и ходовое zero-order hold или полную своду творчества или компромисс, когда по нулевым объемам можно выявить пропуски и как-то дополнить зох.
Восприятие мира человеком - это отражение реальности, а не сама реальность.
Почему нет реакции на код,мувинги пересикаються а сообщения нет
Пользователь
Сообщений: Регистрация: 30.01.2015
14.02.2017 20:19:20
это условие: if t1[0].close>t2[0].close and t1[1].close<t2[1].close then не будет работать, если t1[0]==t2[0], но t1[-1]>t2[-1]. и еще во многих случаях.
INDICATORS.ZIP
Пользователь
Сообщений: Регистрация: 30.01.2015
14.02.2017 20:13:32
Эту функцию: ------------------ 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) перерисовывать лишь те точки которые изменились.
INDICATORS.ZIP
Пользователь
Сообщений: Регистрация: 30.01.2015
14.02.2017 19:58:24
Могу посоветовать следующее: 1) Пустые свечи определяете по нулевому объему. ------------------------------- 2) примеры индикаторов написаны правильно и работают правильно при двух условиях а)на графике один инструмент b) графики не в реале. --------------------------- 3) Примеры написаны не для использования в роботах, а для технического анализа. поэтому они написаны не оптимально.
or и цикл while
Пользователь
Сообщений: Регистрация: 30.01.2015
31.01.2017 21:09:26
В итоге три варианта: while tradingstatus <3 while tradingstatus ~= 4 and tradingstatus ~= 3 while not (tradingstatus == 4 or tradingstatus == 3)
Космонавт написал: Николай, циферка 3 - аукцион открытия, 4 - аукцион закрытия (перед ней и после неё есть ещё периоды со своими цифрами, не помню их названий) 0 - сессия закрыта.
Я понял вашу мысль про оператор and, но не могу понять как это работает. Мне ведь нужно срабатывание либо одного условия (премаркет), либо второго (постмаркет), а не одновременно обоих (and)
Согласен, должно быть or. Тогда, в чем вопрос?
нет or не будет работать.
or и цикл while
Пользователь
Сообщений: Регистрация: 30.01.2015
31.01.2017 21:01:36
Цитата
Космонавт написал: Николай, циферка 3 - аукцион открытия, 4 - аукцион закрытия (перед ней и после неё есть ещё периоды со своими цифрами, не помню их названий) 0 - сессия закрыта.
Я понял вашу мысль про оператор and, но не могу понять как это работает. Мне ведь нужно срабатывание либо одного условия (премаркет), либо второго (постмаркет), а не одновременно обоих (and)
Согласен, должно быть or. Тогда, в чем вопрос?
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 30.01.2015
31.01.2017 20:53:30
Цитата
Космонавт написал: Зачем у Oninit в скобках параметр (script_path)? У меня работает и без него: OnInit ()
имеется в виду, что нужно делать так?
Код
script_path = getScriptPath ()
function OnInit (script_path)
--задаём переменные
end
Если память мне не врет, то вроде бы раньше вызов getScriptPath () в начале подвешивал скрипт и еще были глюки вызова функций QLUA вне колбеков или main.
простой код не работает
Пользователь
Сообщений: Регистрация: 30.01.2015
30.01.2017 16:03:58
Цитата
Космонавт написал: И ещё вопрос. Он не праздный. Может быть у дохлого брокера с одним сервером это будет проблемой.
Когда я заказываю данные с сервера, например, стакан, это создаёт нагрузку на сервер брокера? ну например бесконечный цикл:
Код
class = "SPBFUT"
sec = "SRH7"
for i = 1 , 10000000000000000000 do
qt = getQuoteLevel2 (class, sec)
end
Вредит ли это способности брокера обслуживать других клиентов? Например отправка заявок бесконечным потоком точно вредит. У других клиентов заявки будут дольше улетать на биржу.
это вредит только Вам, так как Вы таким циклом ничего не заказываете многократно а просто вешаете свой комп. ----------------------------------------- За такие программы надо по рукам палкой.
or и цикл while
Пользователь
Сообщений: Регистрация: 30.01.2015
30.01.2017 16:00:45
Возможные состояния торгов по финансовому инструменту. Константа Описание 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
or и цикл while
Пользователь
Сообщений: Регистрация: 30.01.2015
30.01.2017 15:57:54
а где Вы взяли коды состояний? вроде бы должно быть так: Возможные состояния торгов по финансовому инструменту.
Константа
Описание
N
Недоступно для торгов
O
Период открытия
C
Торги закрыты
F
Период закрытия
B
Перерыв
T
Торговая сессия
or и цикл while
Пользователь
Сообщений: Регистрация: 30.01.2015
30.01.2017 15:54:37
например так: while tonumber(getParamEx(class,"GAZP","tradingstatus").param_value)<3 do sleep (1000) end
Для меня это определяет продолжать ли дальше "мучатся" с квиком или взять софт где это уже есть
Мечтать не вредно, но безрезультатно. Знаете альтернативу квику? Может подскажите?
Вызов getDataSourceInfo() из Init() в Lua индикаторах
Пользователь
Сообщений: Регистрация: 30.01.2015
18.01.2017 16:19:23
еще замечу, что в init ставить настройку каких либо параметров не имеет смысла, так как он не вызывается при изменении параметров индикаторов. Поэтому без проверки на 1 индекса Вы все рано не обойдетесь. И смысла делать как вы хотите нет никакого.
Вызов getDataSourceInfo() из Init() в Lua индикаторах
Алексей написал: Это то понятно, что решить задачу можно, отлавливая вызов для первой свечки, но это лишние накладные расходы, пускай и мизерные. А на медленных машинках, для процессов, исполняемых интерпретатором, если кто-то решит повесить много индикаторов, в каждом из которых по несколько линий ... :) ,
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.
Вообще-то я серьезно. Подобными Вашим измерениями я последний раз лет семь назад. Суть таких измерений не в том, чтобы выяснить какой колбек быстрее, так как это, говоря образно," ловля блох". Суть таких измерений в том, чтобы выяснить на сколько запаздывают данные на компе относительно реальных событий на бирже. Никто не мешает брокеру создать специально задержку данных, поступающих на ваш комп и показывать Вам вчерашний день. А Вы будете быстро быстро постоянно присылать на биржу с запаздыванием на десятки и сотни миллисекунд при этом радуясь, что делаете это на микросекунды быстрее. Подумайте над этим.
Вызов getDataSourceInfo() из Init() в Lua индикаторах
Алексей написал: Это то понятно, что решить задачу можно, отлавливая вызов для первой свечки, но это лишние накладные расходы, пускай и мизерные. А на медленных машинках, для процессов, исполняемых интерпретатором, если кто-то решит повесить много индикаторов, в каждом из которых по несколько линий ...:),
1) То что проверка первой свечи приводит к "накладным расходам" не более чем просто слова. 2) Гипотетическое создание Init2 совершенно никак не позволит изменить ситуацию. И даже если ее добавить, это будет ровно тоже самое что проверка первой свечи. 3) Решение в виде проверки первой свечи, в полной мере решает задачу и аргументов которые не позволят ее решить указанным способом, Вы так и не привели.
отлавливание первой свечи оператором if indx==1 then ... end на медленных машинах займет не более 50 мкс. А поступление очередных данных происходит не чаще, чем раз в 100 мс. Разница примерно в 2000 раз. А задержка реакции OC не менее 10 мс. Разница в 200 раз. А задержка отправки коротких сообщений с компа на сервер брокера типа заявок, может составить 200 мс Разница примерно в 4000 раз. За что боремся?
Торговля в двух и более терминалах на LUA
Пользователь
Сообщений: Регистрация: 30.01.2015
18.01.2017 08:30:33
еще можно через DDE и подобные механизмы. Так как DDE - это обмен через память, то работать будет быстро. Но судя по уровню задающего вопросы, рекомендую просто запустить скрипт на каждом терминале.
Матлаб из Клуа
Пользователь
Сообщений: Регистрация: 30.01.2015
18.01.2017 08:25:47
из собственного опыта. Я использовал из матлаба любые методы следующим образом: 1) Пишем программу в матлаб. 2) Преобразуем ее средствами матлаб в прогамму на С либо С++ (по вкусу) 3) создаем DLL. 4) Подключаем DLL к LUA. 5) работаем в реале без загрузки матлаба и с высокой скоростью.
Николай Камынин написал: информацию можно получить по любому полю из любой таблице, используя экспорт DDE в excel, включив "С заголовками столбцов" и "Формальные заголовки"
Это работает только для таблицы Params, для остальных совпадение не гарантируется.
На старых версиях проверял для все таблиц все совпадало.
Описания полей, Не хватает данных в справочнике
Пользователь
Сообщений: Регистрация: 30.01.2015
16.01.2017 13:21:14
информацию можно получить по любому полю из любой таблице, используя экспорт DDE в excel, включив "С заголовками столбцов" и "Формальные заголовки"
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 30.01.2015
13.01.2017 18:50:57
Цитата
Старатель написал: Чтобы узнать, кто пришёл раньше, атомные часы не нужны. Есть такое понятие, как точка отсчёта. Скрытый текст По оси х отложено время получения колбэка (в мс) с момента начала отсчёта. В OnParam - только параметр LAST, никаких стаканОв. Данные с боевого сервера - незадолго до окончания торгов.
Вас не смущает задержка в 160 мс? Это на сервер в москве!!! О какой скорости вы тогда говорите? Это даже не велосипед, а скорее телега какая-то. --------------------------------- Как Вы узнали что в OnParam нет лучшей цены? Вы в ТТП отключили все параметры кроме LAST?
пинг брокеров
Пользователь
Сообщений: Регистрация: 30.01.2015
13.01.2017 16:34:41
Цитата
Космонавт написал: Николай, у Открытия этого параметра нет в Информационном окне. Это не только у меня, я у многих спрашивал, в том числе у менеджера когда счёт открывал. Там у всех пусто... Эта странность у них на всех серверах
У меня этот параметр есть и он соответствует субъективному ощущению задержки сервера. Вообще-то для оценки пинга до сервера я делал функцию пинга для луа и встраивал ее в скрипт.
Я правильно понял, что путь к Открытию - короче, чем к Неттрейдеру (меньше узлов). То есть Открытие с этой точки зрения предпочтительнее?
У неттрейдера вообще сервер в зоне Net какой-то мутный. У Открытия безусловно лучше. Вообще-то по моим наблюдением скорость у открытия лучше, чем у некоторых других брокеров.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 30.01.2015
12.01.2017 22:49:08
Цитата
Космонавт написал: Мой скрипт выложен вверху. Кто первый пришел и записался в лог тот и победил.
А Вы внимательно посмотрите на время в ваших логах. onparam приходит раньше не потому что в нем цена сделки, а потому что в нем цена из стакана. Т е стакан меняется чаще и раньше чем совершается сделка. Если время одинаковое то onparam вызывается перед вызовом других колбеков. Но оnparam медленный колбек так как при работе в нем вы вынуждены ходить в хранилище за нужными параметрами. Поэтому полагаю, что onparam - это самый затратный колбек.
Проблема запуска скрипта на Lua, Квик не видит core.dll
dmitry dorjiev написал: Да, про ssl это я не то написал, потом с новой библиотекой пробовал только сокет, ошибка была Unknown error. Possible unhandled exception. Про ssl пожалуйста игнорируйте :).
В первом случае не находилась не вызываемая библиотека, а одна из тех, которая используется внутри этой библиотеки. Чтобы найти , что надо еще используйте прогу depends, чтобы найти зависимости.
Про ssl и про core.dll уже не надо, сейчас ошибка Unknown error. Possible unhandled exception. при попытке подгрузить socket (это после того как я поменял бинарники на скачанные из github'a).
Это сообщение означает, что встретился глюк в коде, который никто из разработчиков не знает , либо не захотел делать на него ловушку.
пинг брокеров
Пользователь
Сообщений: Регистрация: 30.01.2015
12.01.2017 22:32:33
Цитата
Космонавт написал: сравниваю двух брокеров - Неттрейдер и Открытие. Когда открывал счёт в Открытии, опасался что через них данные будут приходить медленно и заявки отсылаться тоже медленно. У них много клиентов, канал забит, и мои заявки будут долго улетать на биржу. Я когда-то был сотрудником брокера с единственным сервером. Хорошо помню, как мои многочисленные заявок вешали сервер и у других клиентов, по разным городам и весям из за моего робота медленно уходили заявки. Моя активность приводила к задержкам у клиентов до 5 секунд. То есть я могу столкнуться с таким же дефектом у любого крупного брокера с гигантским количеством клиентов. Открытие - топ брокер, поэтому как раз в группе риска.
Но к моему удивлению, серьёзных претензий к Открытию нет. Скорость улёта-прилёта заявки сегодня была 30-75 миллисекунд на обычный сервер, не выделенный. Заявки уходили с московской виртуалки, измерял через OnTransReply. Теперь перехожу к вопросу. Я научился пинговать. Хе-хе. Пингую, сравниваю. Вот пинг Неттрейдера.
Вот пинг Открытия
Открытие существенно обгоняет. Вопрос 1. О чём говорит это превосходство в скорости? О железе блокера или об интернете брокера или о том и другом сразу? Вопрос 2. У Открытия несколько серверов, но пропинговать получается только первый. На остальных - превышен интервал ожидания. Как их пропинговать? Или это невозможно?
Вот ай пи серверов Открытия. Пингуется только первый.
Спасибо за помощь.
Посмотрите tracert маршрут и Вам будет все ясно. Еще рекомендую посмотреть В квике в информационном окне в расширенном варианте параметр "Задержка данных при обмене с сервером" и сравнить для двух брокеров. ---------------------------- Задержка в 30-75 мс при пинге в 2 мс - это много.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 30.01.2015
12.01.2017 07:51:47
Цитата
Космонавт написал: тестирую эти же колбеки на другом брокере - Открытие. Всё то же самое, но чуть чуть отличается. ОнПарам по прежнему самый быстрый. OnAllTrade приходит вторым , но цифра в миллисекундах почти всегда загадочно совпадает с приходом ОнПарам Вот так:
Цитата
01/10/17 13:10:18,792 APTK пишет OnParam OB 10.31 time_diff=56687 01/10/17 13:10:18,792 APTK пишет OB OnAllTrade 10.31 time=13:10:18 675 675329 time_diff=0 01/10/17 13:10:18,885 APTK пишет OB DataSource 10.31 time_diff=95
редко-редко OnAllTrade приходит с другой цифрой в миллисекундах - на квант позже:
Цитата
01/10/17 12:49:45,674 APTK пишет OnParam OB 10.31 time_diff=288303 01/10/17 12:49:45,690 APTK пишет OB OnAllTrade 10.31 time=12:49:45 485 485692 time_diff=15 01/10/17 12:49:45,690 APTK пишет OB DataSource 10.31 time_diff=0
Ну и колбек ДатаСорс всегда третий. Он самый тормозной у Открытия, но успешно конкурирует (не уступает) с OnAllTrade у предыдущего брокера (НетТрейдер)
Бывает, что всё втроём приходят одновременно (Открытие), но не было случая, чтобы ОнПарам пришёл НЕ первым.
Цитата
01/10/17 13:19:17,807 APTK пишет OnParam OB 10.31 time_diff=8750 01/10/17 13:19:17,807 APTK пишет OB DataSource 10.31 time_diff=0 01/10/17 13:19:17,807 APTK пишет OB OnAllTrade 10.31 time=13:19:17 737 737640 time_diff=0
Не знаю как Вы тестируете, но надо делать так: 1) синхронизируете свой комп от атомных часов При этом надо настроить параметры синхронизации и дождаться когда рассинхронизация станет меньше 10 мс. После этого делаете замеры относительно локального времени компа. В результате Вы получите задержку времени относительно биржевого, а не относительно сервера брокера. ----------------------------- 2) можно дополнительно использовать rdtsc, чтобы измерить скорость исполнения отдельных функций. ----------------------- вот тогда Вы увидите много интересного. например можете увидеть, что информация с различным временем приходит одновременно. --------------------------- Повторю еще раз - информация приходит пакетами и в пакете может быть все и onparam и alltrade, а разбор их зависит в том числе и от порядка вызова функций, возможно onparam вызывается перед alltrade. -------------------------- Но это все мало соответствует реальной задержки данных относительно биржевого времени.
Про МБ, но никто не заприщает делать так. Полагаю Вы знаете, что на бирже торгует брокер, а не его клиенты.
запрещает. у вас есть номер биржевой сделки, если на бирже такой нет - смело в суд
Это вы размечтались. Почитайте регламент, закон о рынке ЦБ, методические указания надзорных органов, ГК РФ и найдите там основания для Вашего смелого похода в суд. кратко поясню - вы подали заявку и указали цену по которой надо купить/продать - брокер исполнил ваше поручение по указанным Вами параметрам. Какие претензии? Никаких. Так как основные параметры - это наименование товара и его цена а не место где этот товар купить. Да и какая вам разница, в каком месте вам купили то, что вы хотели и за сколько Вы хотели? Хоть в китае. Верно?
Ядра процессора
Пользователь
Сообщений: Регистрация: 30.01.2015
12.01.2017 07:27:00
Цитата
Космонавт написал: Станислав, вопрос не про скорость процессора, а про количество ядер. Если при 4 ядрах загрузка ниже 50%, какой смысл держать 4 ядра, может можно понизить до 3?
Теоретически: одно ядро - ввод-вывод с внешних накопителей одно ядро - работа с каналами связи одно ядро - обслуживание основного потока КВИК по ядру на каждый торгуемый инструмент итого примерно 4000 ядер для торгов на ММВБ еще несколько десятков тысяч ядер для торговли на западных площадках правда программу надо писать на CUDA и ставить NVIDIA и это уже будет не КВИК. А для КВИК хватит и двух и даже одного. как говориться, от числа колес скорость велосипеда не зависит.
require "luacom"
ami = luacom.CreateObject ( "Broker.Application" )
ami.Visible = true
aa = ami:LoadDatabase( "D:\\PF\\AmiBroker\\DB\\trade" )
Работает. Но дальше облом...
Код
qq = ami:Import( 0 , "c:\\valg\\rt.txt" )
Ошибки не выдает, но и ничего не делает (в логах импорта Ами просто пусто).
Код
st = ami.Stocks:Add( "RTSI" )
Ошибка - attempt to index field 'Stocks' (a function value)
Может кто что подскажет?
Я для работы с амиброкером делал свои плагины на СИ и для ами и для квика. У амиброкера есть хороший api и хорошее описание.
Ядра процессора
Пользователь
Сообщений: Регистрация: 30.01.2015
11.01.2017 13:32:11
Рекомендую сделать хронометраж а потом принимать решение. Но если нужна действительно скорость то надо уходить на прямое подключение к бирже либо выделенный серевер у брокера (есть предложения у некоторых брокеров)
Николай К Все зависит от алгоритма реализации сервера брокера. Например, никто не запрещает брокеру самому гасить встречные заявки клиентов .
мы же про МБ, да?! тогда странно слышать такое.
Про МБ, но никто не заприщает делать так. Полагаю Вы знаете, что на бирже торгует брокер, а не его клиенты.
Проблема запуска скрипта на Lua, Квик не видит core.dll
Пользователь
Сообщений: Регистрация: 30.01.2015
09.01.2017 18:51:20
Цитата
dmitry dorjiev написал: Да, про ssl это я не то написал, потом с новой библиотекой пробовал только сокет, ошибка была Unknown error. Possible unhandled exception. Про ssl пожалуйста игнорируйте :).
В первом случае не находилась не вызываемая библиотека, а одна из тех, которая используется внутри этой библиотеки. Чтобы найти , что надо еще используйте прогу depends, чтобы найти зависимости.
измерить скорость выставления заявки
Пользователь
Сообщений: Регистрация: 30.01.2015
09.01.2017 14:08:33
Цитата
Космонавт написал: Добрый день. Как быстро моя заявка попала в стакан? Если я засекаю время и пользуюсь OnTrnsReply, то информация о времени придёт увеличенная: заявка улетит на биржу (тратится время), а обратно придёт ответ (тратится время). Мне нет дела знать, сколько шёл ответ, мне надо знать когда заявка появилась в боевой очереди в стакане на бирже. Как это сделать?
Сейчас я считаю так:
Код
function OnTransReply (reply)
orders[reply.trans_id].tr_receive_time = os.clock ()
local latency = (orders[reply.trans_id].tr_receive_time - orders[reply.trans_id].tr_send_time) * 1000
end
ну и перед отправкой засекаю через os.clock() В итоге полученное время дольше, чем есть на самом деле из за того, что ответу нужно идти ко мне в терминал, хотя заявка на бирже уже стоит.
Не факт, что заявка в стакане - это заявка на бирже. Поэтому в стакане заявка может быть моментально, как только ее принял брокер. Все зависит от алгоритма реализации сервера брокера. Например, никто не запрещает брокеру самому гасить встречные заявки клиентов .
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 30.01.2015
09.01.2017 14:03:36
Полагаю, что все общие данные такие как ТВС и ТТП передаются блоками по таймеру. Но в ТВС помещаются все данные за интервал передачи, а в ТТП лишь данные на момент передачи. Интервал передачи ТТП меньше чем интервал ТВС, так как ТТП содержит более быстро меняющиеся данные такие как лучшая цена. Поэтому onParam будет срабатывать чаще.
два робота в одном квике
Пользователь
Сообщений: Регистрация: 30.01.2015
07.01.2017 16:43:03
еще замечу следующее. про быстродействие. Винда не является системой реального времени. А именно к задачам реального времени относятся торговые роботы. Что это означает? Это означает тот факт, что если у вас работает на компе еще несколько приложений, например стоит обозреватель и вы еще на форуме трындите, то квик будет работать тогда, когда ему система даст квант времени. А это может быть и через 100 мс и через секунду. -------------------------- Кроме того, в винде есть механизм уменьшение нагрузки на выход в интернет при коротких пакетах. А заявка - это и есть короткий пакет. Как правило, при действии этого механизма (Алгоритм Нейгла) короткий пакет может отправлять с задержкой 200 мс. ------------------------ Кроме того, при работе через КВИК, все ваши заявки попадают сначала на сервер брокера для проверки лимитов, потом идут на биржу. Как известно, скорость работы ядра сервера КВИК не более 1000 транзакций в секунду. Это означает, что если на сервер пришло в секунду 1000 заявок от клиентов брокера, то последняя попадет на биржу через 1000 мс. ------------------------ Можно долго обсуждать данную тему. Но хочу заметить, что QUIK - это инструмент для подаче поручений брокеру любителями, а не средство профессиональных биржевых игроков , поэтому смотрите на его возможности адекватно его назначению.
два робота в одном квике
Пользователь
Сообщений: Регистрация: 30.01.2015
07.01.2017 16:28:31
"Позвольте пару слов без протокола.." Будем рассматривать работу на многоядерном компе. --------------------------------- Колбеки. Полагаю, что в QLUA сделано так, что одноименные колбеки - это таблица указателей на соответствующие функции в скриптах. Т е например колбек OnOrder. Если запускаем две скрипта в которых стоит этот колбек, то в основном потоке будет стоять последовательно два вызова функций этой функции из каждого скрипта. Как это можно ускорить? Есть несколько способов. Вот для примера два из них, которые я делал сам. ------------------------------ Вариант1. В скриптах создаем пулы потоков для каждого типа колбеков. Внутри колбека запускаем соответствующий поток. При этом потоки можно выделять на каждый инструмент. Сколько инструментов - столько потоков. ----------------- Сложность этого варианта в создании и управлении пулами потоков. --------------------------------- Вариант 2. На каждый колбек пишем свой скрипт. Его так и называем OnOreder, onParam и т д Внутри скрипта функция колбека сразу передает управление в Main. в результате скриптов будет по числу колбеков. Кроме того , для каждого робота пишем свой скрипт. т е к колбекам добавляются скрипты роботов При этом в роботах нет колбеков. ---------- Сложность этого варианта в синхронизации потоков. Создавать потоки не надо, так как они создаются средствами QLUA. ---------------------------
Сергей Дворцов написал: Раундтрип самой быстрой заявки в Квике будет 150 мс
вот мои свежие логи
01/06/17 10:13:06,864 sec_code=MSNG;price=2.4205;client_code=000;balance=0;time=101308;status=3;qty=3;class_code=TQBR;trans_id=532782944;account=Y01+00000B00;exchange_code=;quantity=3;firm_id=MC0020800000;flags=262145;result_msg=(160) Заявка на покупку N 15836586314 зарегистрирована.;brokerref=/1.5774;order_num=15836586314;R=532782944;server_trans_id=329;uid=6695;ordernum=15836586314; 01/06/17 10:13:06,864 532782944 zaderzhka 30.999999988126
01/06/17 10:13:06,973 sec_code=MSNG;price=2.4205;client_code=000;balance=0;time=101308;status=3;qty=3;class_code=TQBR;trans_id=1623615465;account=Y01+00000B00;exchange_code=;quantity=3;firm_id=MC0020800000;flags=262145;result_msg=(160) Заявка на покупку N 15836586321 зарегистрирована.;brokerref=/1.5774;order_num=15836586321;R=1623615465;server_trans_id=329;uid=6695;ordernum=15836586321; 01/06/17 10:13:06,973 1623615465 zaderzhka 31.000000017229
Задержка 30 миллисекунд. Это время между отправкой и получением ответа. Виртуалка в москве, обычный КВИК.
это скорее всего квант винды для процесса. он кратен 10 мс. либо задержка сервера брокера Замечу, что если два скрипта в одном квике, то колбеки будут выполняться последовательно а не параллельно. потому что колбеки исполняются в основном потоке квика и не зависят от числа скриптов. просто для каждого скрипта будет дублироваться вызов колбека. т е колбеков будет в два раза больше. Чтобы колбеки исполнялись параллельно надо внутри колбеков открывать потоки. А луче (я делал именно так) колбеки выносить в отдельные скрипты. В резлутате будет вообще-то, для каждого колбека будет свой поток.
Тэйк-профит: старые песни о защитном спрэде, Возможные сюрпризы при совершении сделки по тэйк-профиту
Zoya Skvorcova написал: Алибек Хакиев , добрый день. Если цена с отступом у Вас 98, то и отнимать спред надо от этой цены.
Спасибо. Означает ли это, что моя лимитированная заявка на продажу в этом случае попадет на биржу по цене не хуже "98 - защитный спред"?
Не забывайте тот факт, что на сервере с такими стопами сотня а то и тысяча клиентов (как правило стопы стоят в одном месте, так как все смотрят графики по одним и тем же книжкам ) Т е Ваш стоп может быть надцатый. И при обвальном рынке ваша заявка на бирже может быть где угодно и когда угодно. 100% Гарантий, что цена будет 98 -защитный спред нет.
Робот на Луа +API брокера
Пользователь
Сообщений: Регистрация: 30.01.2015
28.12.2016 09:31:53
можно вызвать функции питона из луа:
Робот на Луа +API брокера
Пользователь
Сообщений: Регистрация: 30.01.2015
28.12.2016 09:23:20
Вы также можете установить модуль websocket на луа и писать на луа то, что написано в пример на сайте для websocket
Робот на Луа +API брокера
Пользователь
Сообщений: Регистрация: 30.01.2015
28.12.2016 09:18:46
здесь socketio на C++. Можете вставить его в LUA и будете работать из LUA (QUIK) с вашим брокером.