Николай Камынин написал: Рекомендую сделать хронометраж а потом принимать решение. Но если нужна действительно скорость то надо уходить на прямое подключение к бирже либо выделенный серевер у брокера (есть предложения у некоторых брокеров)
у открытия есть. мне дали 20 дней тестов бесплатно
На виртуалке стоят два КВИКа двух брокеров: Неттрейдер и Открытие. версии одинаковые - 7.5.072 Рынки включены одинаковые, всё отфильтровано одинаково. Почему такая разница в загрузке памяти? КВИК открытия жрёт 200 мегабайт, квик неттрейдера 8 Вечер, торги на мамбе закрыты, робот торгует только на ММВБ, все роботы ВЫКЛЮЧЕНЫ!!! таблицы всех сделок прогружены в обоих квиках, новых данных не поступает, фортс точно выключен везде. Как это объяснить?
Станислав, вопрос не про скорость процессора, а про количество ядер. Если при 4 ядрах загрузка ниже 50%, какой смысл держать 4 ядра, может можно понизить до 3?
тестирую эти же колбеки на другом брокере - Открытие. Всё то же самое, но чуть чуть отличается. ОнПарам по прежнему самый быстрый. 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
Сергей, значит есть закономерности, которых Вы не знаете. Ведь по какой то причине ОнПарам опережает все другие колбеки, хотя и обновляется срезами.
Возможно это как раз зависит от брокера. Мой брокер - например - обновляет Текущую таблицу часто раз в 25 миллисекунд, а другой брокер раз в 100 миллисекунд. Но причина по которой ОнПарам быстрее обезличенных сделок и ДатаСорса по прежнему не ясна.
Тестирую три колбека на предмет прихода цены последней сделки. Удивительно, но OnParam всегда реаигрует быстрее. Не было случая чтобы его кто то опередил.
Код
function OnAllTrade (alltrade)
if string.find(ticker_list,alltrade.sec_code)~=nil then
last_price[alltrade.sec_code]=alltrade.price
if alltrade.sec_code==speed_check then
time_diff=os.clock()-remember_time
remember_time=os.clock()
local datatime_table=alltrade.datetime
toLog (log, speed_check.." пишет OnAllTrade "..alltrade.price.." time="..datatime_table.hour..":"..datatime_table.min..":"..datatime_table.sec.." "..datatime_table.ms.." "..datatime_table.mcs.." time_diff="..math.ceil(time_diff*1000))
end
end
end
function OnParam (class, sec)
if string.find(ticker_list,sec)~=nil then --and class=="TQBR" нужен если есть классы с такими же акци¤ми.
if sec==speed_check and last_price[sec]~=getParam(sec,'last') then
time_diff=os.clock()-remember_time
remember_time=os.clock()
toLog (log, speed_check.." пишет OnParam "..getParam(sec,'last').." time_diff="..math.ceil(time_diff*1000))
end
if last_price[sec]~=getParam(sec,'last') then
last_price[sec]=getParam(sec,'last')
end
end
end
function mycallbackforallstocks(class,sec,index)
local num_candles=ds[sec]:Size()
if index==num_candles then
if sec==speed_check then
time_diff=os.clock()-remember_time
remember_time=os.clock()
toLog (log, speed_check.." пишет DataSource "..ds[sec]:C(num_candles).." time_diff="..math.ceil(time_diff*1000))
end
last_price[sec]=ds[sec]:C(num_candles)
end
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
вот логи с результатами (выборка). Единственное что плохо и странно - в некоторых случаях OnParam не срабатывает, хотя должен:
Код
01/09/17 10:59:18,762 APTK пишет OnParam 10.32 time_diff=2437 --долго не было сделки
01/09/17 10:59:18,794 APTK пишет DataSource 10.32 time_diff=32
01/09/17 10:59:18,794 APTK пишет OnAllTrade 10.32 time=10:59:18 668 668769 time_diff=0
01/09/17 10:59:18,794 APTK пишет OnAllTrade 10.32 time=10:59:18 668 668769 time_diff=0
01/09/17 11:01:26,475 APTK пишет OnParam 10.35 time_diff=39949 --долго не было сделки
01/09/17 11:01:26,585 APTK пишет OnAllTrade 10.33 time=11:1:26 537 537267 time_diff=109
01/09/17 11:01:26,585 APTK пишет OnAllTrade 10.34 time=11:1:26 537 537267 time_diff=0
01/09/17 11:01:26,585 APTK пишет OnAllTrade 10.34 time=11:1:26 537 537267 time_diff=0
01/09/17 11:01:26,585 APTK пишет OnAllTrade 10.35 time=11:1:26 537 537267 time_diff=0
01/09/17 11:01:26,803 APTK пишет DataSource 10.35 time_diff=219
01/09/17 11:01:36,314 APTK пишет OnParam 10.36 time_diff=3827 --долго не было сделки
01/09/17 11:01:36,314 APTK пишет DataSource 10.36 time_diff=0
01/09/17 11:01:36,314 APTK пишет OnAllTrade 10.36 time=11:1:36 196 196312 time_diff=0
01/09/17 11:01:36,314 APTK пишет OnAllTrade 10.36 time=11:1:36 196 196947 time_diff=0
OnParam не пришёл!!!!
01/09/17 11:05:55,150 APTK пишет OnAllTrade 10.37 time=11:5:55 349 349008 time_diff=158045
01/09/17 11:05:55,259 APTK пишет DataSource 10.37 time_diff=109
01/09/17 11:11:47,931 APTK пишет OnParam 10.35 time_diff=352672 --долго не было сделки
01/09/17 11:11:47,931 APTK пишет OnAllTrade 10.35 time=11:11:48 153 153625 time_diff=0
01/09/17 11:11:48,025 APTK пишет DataSource 10.35 time_diff=95
01/09/17 11:12:21,931 APTK пишет OnAllTrade 10.35 time=11:12:22 265 265944 time_diff=33906
01/09/17 11:12:22,024 APTK пишет DataSource 10.35 time_diff=95
01/09/17 11:15:27,376 APTK пишет OnAllTrade 10.35 time=11:15:27 778 778281 time_diff=185352
01/09/17 11:15:27,470 APTK пишет DataSource 10.35 time_diff=94
Вопрос 1: почему OnParam не всегда срабатывает, хоть и было изменение цены? (у меня в ОнПарам фильтр - не реагировать если цена прежняя). Я бы отказался от других колбеков, раз они медленные, но получается ОнПарам иногда даёт сбои. Вопрос 2: у других участников форума тоже OnParam срабатывает первым? Или это зависит от брокера? Спасибо.
ticker_list = "AFKS,AFLT,AGRO,ALRS,APTK,.... и ещё много акций....."
function OnTransReply(reply)
if reply.sec_code~="ABRD" then --пришлось отфильтровывать
if orders[reply.trans_id]==nil then
else
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
toLog (log, reply.trans_id.." x="..orders[reply.trans_id].x_number.." zaderzhka "..latency)
end
end
end
внутри main:
for sec in string.gmatch(ticker_list,"%a+") do
--анализ
--отсылаем заявку, засекаем время
end
В ticker_list никакой Абрау Дюрсо нет, но она прилипает к каждому реплаю.
Старатель, сделайте доброе дело - конкретизируйте то, что хотели сказать вот здесь. Вас ведь что то смутило в этом варианте? По вашему две виртуалки всё равно будут получать данные последовательно, а не параллельно? Это для меня самый загадочный момент в этой дискуссии.
Цитата
Обе виртуалки стоят на одном физическом сервере с одним сетевым интерфейсом? Оба квика подключены к одному серверу QUIK? За счёт чего предполагается получить "выигрыш я в скорости"?
Разработчики, прошу, не отмалчивайтесь. Откуда берётся этот постоянный трэш с Абрау Дюрсо? Все колбеки по транзакциям приходят в двойном виде: ABRD + правильный
П.С. Вариант №2 был бы для меня самым комфортным. Одна виртуалка, на ней стоят два КВИКа, в одном робот ФОРТС, в другом робот ММВБ. Но Старатель чуть выше писал что это не поможет, а мне не понятно почему.
Добрый день. 1. Можно ли средствами Луа разлогиниваться и перелогиниваться в КВИКе? 2. Если да, то можно ли выбирать нужный сервер из числа предложенных роботом? Спасибо
swerg написал: если жи колбеки короткие и быстрые - то смысла разносить нет.
Колбек, о котором идёт речь - SetUpdateCallback к функции дата сорс. Внутри него считается несложны индикатор. Центром прибыли и главной денежной машинкой является робот на ММВБ. Я хочу дать ему полное преимущество. Попутно я экспериментирую с точно таким же роботом для ФОРТС. Денег он даёт меньше, но сделки на ФОРТС сыпятся чаще, я боюсь что он отбирает скорость от робота ММВБ. Поэтому я хочу исключить его "вредоносность" для робота на ММВБ. Это и есть суть моей проблемы.
Давайте воспользуемся бритвой Оккама.Усложнять решение можно только если это необходимо. 1 решение самое простое. Его дал Н.Камынин. Внутри одного КВИКа создать 2 скрипта без функции main. В каждом из них сидит свой колбек. Первый ФОРТС, второй ММВБ. Они раздают информацию на двух роботов ММВБ и ФОРТС. Старатель вроде как отвергает этот вариант. 2 решение немного сложнее: два КВИКа с разными ЮИДами, в каждом из которых крутится свой робот. ФОРТС в одном КВИКе, ММВБ в другом. 3 решение самое сложное (я сейчас им пользуюсь). Две виртуалки, в каждой из которой сидит свой КВИК со своим роботом. Но и тут Старатель опровергает преимущества, но толком не объясняет почему.
Вот я и прошу уважаемых собеседников дать ответ что лучше с точки зрения скорости. Скрипт ФОРТС не должен мешать роботу на ММВБ.
Старатель написал: Космонавт , Как я полагаю параллельного получения колбэков с одного сервера QUIK не добиться (разработчики меня поправят, если ошибаюсь) даже на нескольких терминалах.
интересно что скажут разработчики. Неужели брокер раздает данные пользователям последовательно, а не параллельно?
Ок. То есть именно увеличение частоты процессора? Я думал идти по пути увеличения числа ядер. Но у меня и так при 4 ядрах загрузка процессора около 25 или 30 процентов. Увеличить частоту на виртуалке как раз можно, там есть опция перейти на более дорогое железо.
П.С. с отправкой заявок та же ерунда. Она все время разная с большим разбросом от 40 до 1500 мс. Поэтому тяжело сравнивать при разных условиях, ведь даже при одинаковых уаловиях нет стабильности
Посоветуйте, как сделать такой мониторинг. Дело в том, что скорость общения квика с брокером всегда меняется. В эту минуту она хорошая, в Информационном окне показатель 0.04, а через минуту 0.4. Поэтому я и пытаюсь получить не эмпирический ответ, а ответ на основе логики, теории и здравого смысла. Так как опыты дают слишком разные результаты. С Рождеством! Старатель, в любом случае спасибо за ответы, я сейчас с интересом читаю ваши комменты в других ветках.
Старатель, вы хорошо поступите, если из задавальщика вопросов превратитесь в отвечальщика. Вот я сейчас трачу время на набор бессмысленного компентария. А ведь свою глубокую мысль про бессмысленность двух виртуалок вы уже могли давно изложить, и мы бы двигались дальше. Ок. Объясните пожалуйста почему 2 виртуалки не дают преимушества в скорости.
Николай Камынин, я кажется понял вашу мысль. Вы создаёте скрипт с колбеками, без функции main? Скрипт заполняет данными файл. А рядом крутится торговый робот с функцией main, который считывает данные из файла? То есть если я создаю: 1. Отдельный скрипт с колбеком ДатаСорс для ммвб 2. Отдеьный скрипт с колбеком ДатаСорс для фортс 3. Отдельный скрипт - торговый робот (без колбеков, берёт данные из файла от соседних колбеков), то они не конкурируют, а работают параллельно?
это скорее всего квант винды для процесса. он кратен 10 мс. либо задержка сервера брокера
это разница между отправкой заявки и получением реплая через OnTransReply. Разве это не ответ на вопрос как долго заявка летела в систему, а потом шёл обратно ответ? Пусть даже это число кратно 10 мс (квант). Общее представление ведь оно даёт.
Чтобы колбеки исполнялись параллельно надо внутри колбеков открывать потоки. А луче (я делал именно так) колбеки выносить в отдельные скрипты. В резлутате будет вообще-то, для каждого колбека будет свой поток.
Не уловил мысль. 1. Расскажите пожалуйста как внутри колбеков открывать потоки 2. Если колбеки выносить в отдельные скрипты, то чем это принципиально отличается от моего варианта, когда внутри одного квика крутится первый робот на фортс и второй робот на ММВБ? Колбеки как раз разнесены по разным скриптам. Разве это не тот вариант, который Вы предложили? П.С. Я очень плохо ориентируюсь в терминах железа и программирования, извините пожалуйста если я что то не понимаю.
Космонавт написал: Уже арендовал вторую, теперь ммвб-шный робот на одной виртуалке, фортс-робот на второй. Процессора хватает, памяти хватает, скорость интернета немыслимо хороша. Как оценить скорость срабатывания колбеков и понять выиграл я в скорости или равнозначно?
Обе виртуалки стоят на одном физическом сервере с одним сетевым интерфейсом? Оба квика подключены к одному серверу QUIK? За счёт чего предполагается получить "выигрыш я в скорости"?
Не понял последний вопрос. Что вас смутило? Обе виртуалки арендую у UltraVDS, Брокер один, сервер у него один.
Сергей Дворцов написал: Раундтрип самой быстрой заявки в Квике будет 150 мс и это на хостинге у брокера, поэтому что два Квика, что три - один фиг... Поэтому используйте один Квик не не морочьте себе голову... Если нужно скорость, то на Плазу....
мой вопрос не про заявки, а про анализ рыночной информации
Добрый день. Как быстро моя заявка попала в стакан? Если я засекаю время и пользуюсь 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() В итоге полученное время дольше, чем есть на самом деле из за того, что ответу нужно идти ко мне в терминал, хотя заявка на бирже уже стоит.
добрый день. прошу подсказать как корректно написать на луа
Код
test_table={}
test_table.s=1
next_table={}
next_table.[test_table.s]=3 --иными словами в этой строчке создать элемент next_table[1] и присвоить значение 3
swerg написал: Мы про хочется/не хочется или результат? вы уж определитесь. В любом случае нужны тексты в вашей конкретной инфраструктуре.
Да, мы про результат. Уже арендовал вторую, теперь ммвб-шный робот на одной виртуалке, фортс-робот на второй. Процессора хватает, памяти хватает, скорость интернета немыслимо хороша. Как оценить скорость срабатывания колбеков и понять выиграл я в скорости или равнозначно?
Господа, прошу дать совет в выборе конфигурации виртуалки. Арендую у UltraVDS. Пользовался конфигурацией 4 ядра (2,2 Ггц), 4 гб оперативки. Загрузка процессора всегда была ниже 30%. Оперативной памяти тоже использовалось мало, намного меньше 4 Гб. Я решил ради экономии уменьшить конфигурацию до 2 ядра, 2 гига оперативки. Пользуюсь. Всё хорошо. Проц загружен меньше 50%, памяти хватает. Вопрос 1. От понижения железа станут ли роботы медленнее реагировать на события? Колбек DataSourse, приход данных в стакан, колбек OnParam, колбек таблицы всех сделок? У меня такая стратегия, что чем быстрее реакция на события, тем лучше она зарабатывает, поэтому я готов вернуться на старую конфигурацию, если это реально влияет. Вопрос 2. Стоит ли играться с настройками "Приоритет"? Это в диспетчере задач, где выставляется приоритет для процессов. Если да, то какому процессу давать повышенный приоритет: info.exe, winRos или обоим? Спасибо. С Новым Годом!!!
если речь про скорасть реакции на события - то два разных квика будут быстрее наверное. Потому что колбеки будут работать параллельно. А процессоры нынче все многоядерные. но ресурсов два квика будут есть побольше, чем один.
Да, нужна быстрая реакция на события. При этом не хочется нагромождение из второго КВИКа или второй виртуалки. Только если это действительно даст ускорение реакции. Когда произойдёт нужная ситуация на рынке, мне нужно сразу выставить заявку.
swerg написал: Потому что колбеки будут работать параллельно.
Точно? Ведь информация через сетевой интерфейс будет поступать не параллельно.
По мотивам этой реплики ещё уточняющий вопрос. Если у меня в одном КВИКе работает один единственный ММВБ-шный робот по дата-сорс колбеку. И я по недогадливости не отключил приём данных ФОРТС (Система-Заказ данных). И текущая таблица по ФОРТС тоже открыта. Значит, пока принимается сделка ФОРТС, сделка ММВБ ждёт и становится в очередь?
добрый вечер. С наступающими! Выбираю между двумя вариантами: 1. два скрипта (фортс+ММВБ) внутри одного КВИКА 2. скрипт фортс внутри одного КВИКа (свой UID), скрипт ММВБ внутри другого КВИКа (другой, отдельный UID). Нужно выбрать тот вариант, который будет работать быстрее.
Оба скрипта работают с DataSource по колбеку.
Наводящий вопрос. Если два скрипта (один фортс, другой ММВБ) крутятся внутри одного КВИКа, то в какой очерёдности обрабатываются новые сделки ФОРТС и ММВБ? Обрабатывается сделка ММВБ, и тут подоспела сделка ФОРТС. Сделка ФОРТС начнёт обрабатываться параллельно или будет ждать, пока обработается ММВБ? Иными словами будет очередь или параллельная работа? Спасибо.
добрый день. У меня три скрипта. Код одинаковый, отличаются только настройки и таймрфейм - пятниминутки в одном, часовик в другом, дневки в третьем. Робот работает по колбеку в каждом из 3 случаев. Набор бумаг одинаковый. То есть при получении данных по каждой новой бумаге он три раза обновляет дата сорс. Я хочу объединить эти роботы в один скрипт, и чтобы колбек был один. Будет ли один колбек обновлять три DataSource?
Сейчас работа с дата сорс выглядит вот так.
Код
function mycallbackforallstocks(class,sec,index)
local num_candles=ds[sec]:Size()
if index==num_candles then
...................................
end
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
Есть ли надёжные способы проверки DataSource на успех, чтобы идти дальше только после успешного заказа данных? Спасибо.
Сначала проверьте наличие самого инструмента вызовом любой функции, например, получите его статические параметры или любой другой функцией. Если вернется значение успеха - CreateDataSource вам гарантированно создаст подписку на инструмент.
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
return ds[sec]
end
DataSource(class,sec,tf)
sleep (10000)
дальнейшие действия... Засыпание на 10 секунд нужно чтобы дата сорс гарантированно прогрузился. Есть ли надёжные способы проверки DataSource на успех, чтобы идти дальше только после успешного заказа данных? Спасибо.
swerg написал: Если я все верно понял, то надо просто научиться слать http-запросы что вполне реально, подойдут примерно те же библиотеки,что для отправки почты