7 часов, кто больше?

Страницы: 1
RSS
7 часов, кто больше?
 
Фрагмент лога от 28 июля:
Код
10:15:01   Заявка на продажу TID=43851120
10:15:02   Продажа по заявке TID=43851120
10:15:03   Дубль заявки TID=43851120
10:15:03   Дубль заявки TID=43851120
10:15:23   Удаляем паспорт заявки TID=43851120
17:26:02   Не нашли - левая сделка TID=43851120
И это, собственно, ерунда - скрипт информацию о сделке скрипт всё-таки получил, дубли отфильтровал (двумя способами), но портфель и кошелёк изменились так, как надо. А вот потери сделок из-за глюков в данных, получаемых в OnTrade, реально ДОСТАЛИ! Даже специально написанный для компенсации этих глюков нечёткий поиск не всегда помогает! Решил пойти на крайние меры: задублировал ID транзакции ещё и в поле COMMENT, которое рассчитываю получить в коллбеке в поле brokerref. Надеюсь, хоть одно из двух полей хоть в одном из трёх или четырёх прерываниях на одно событие будет всё-таки передано правильно, господа разработчики?
 
Зачем так усердно бороться с колбеками, когда проще и, главное, надежней самому обрабатывать записи в таблице trades. Хотя, возможно, каждый должен пройти этот путь сам. Мне хватило одного раза, в самом начале, получив все колбеки за день, после восстановления соединения с брокером.

Технология Event-Driven, Asynchronous Callbacks хороша, когда поведение предсказуемо. А когда нет, то я уже как-нибудь сам, по старинке, найду новую запись в таблице.
 
Nikolay, Я уже писал "зачем так усердно бороться с колбеками" и что не проще и не надежней "самому обрабатывать записи в таблице trades" - ошибки встречаются и там и там. Кстати, последний колбек, который пришёл через 7 часов, был именно "после восстановления соединения с брокером" вместе с несколькими десятками других. Здесь В ПРИНЦИПЕ нет предсказуемого поведения - четверть, если не треть кода моего скрипта посвящена компенсации разных глюков, и это вечный процесс - новые версии Квика штампуются как горячие пирожки. И Вы далеко не всегда сможете "по старинке найти новую запись в таблице". Как правило - да, но и коллбеки, как правило, приходят с верными данными, и работать с ними несравненно удобнее, быстрее и даже надёжнее, чем рыскать по таблицам Квика.
 
О, сколько нам открытий чудных!..

Сегодня попробовал прогнать алгоритм по историческим данным - не работает. С чего бы вдруг? Всегда работал, и вот опять. И изменения в коде были вроде как косметические. Причём внешне делает вид, что работает, но считав первые 70 строк из файла данных, остальные читать не хочет (их там порядка 6 миллионов). Чем занимается - непонятно. Стал разбираться - глаза на лоб: локальная переменная в main портится! Та самая, которая внутри бесконечного цикла крутится. Она у меня изменяется от 1 до 8 и управляет вызовом обработчиков. Для балансировки нагрузки на процессор обработчики вызываются со сдвигом: 4 раза в секунду – обработчик стека прерываний. Каждое нечётное срабатывание (2 раза в секунду) – обработчик стека заявок, каждое второе и шестое – секундный (не пересекаясь с 0.5-секундным), каждое восьмое – 2-секундный (не пересекаясь ни с секундным ни с 0.5-секундным). Всё это тыщу лет как отлажено и всегда работало без нареканий. Отключил все модули - работает. Стал подключать по одному - затыкается. И память вдруг стала жрать со страшной силой, раз в 10 больше, чем обычно. Стал выводить значение счётчика - ОБА-НА!
Код
1213456178121345617812134
RUR: 0.00+50000.00=50000.00/0.00 V=50000.00
USD: 0.00+0.00=0.00/0.00 V=0.00
EUR: 0.00+0.00=0.00/0.00 V=0.00
FUT: 0.00+20000.00=20000.00/0.00 V=20000.00
RES: 0.00+0.00=0.00/0.00 V=0.00
Отрубил всё к чертям собачьим, даже обнуление счётчика, и тут меня ожидал удар ниже пояса:
Код
277995
277996
RUR: 0.00+50000.00=50000.00/0.00 V=50000.00
277997
277998
277999
278000
USD: 0.00+0.00=0.00/0.00 V=0.00
278001
278002
EUR: 0.00+0.00=0.00/0.00 V=0.00
278003
278004
278005
278006
FUT: 0.00+20000.00=20000.00/0.00 V=20000.00
278007
278008
278009
RES: 0.00+0.00=0.00/0.00 V=0.00
278010
278011
Или, если оставить обнуление и только его:
Код
123456781
RUR: 0.00+50000.00=50000.00/0.00 V=50000.00
234
USD: 0.00+0.00=0.00/0.00 V=0.00
5678
EUR: 0.00+0.00=0.00/0.00 V=0.00
12345
FUT: 0.00+20000.00=20000.00/0.00 V=20000.00
6781
RES: 0.00+0.00=0.00/0.00 V=0.00
2
Теперь поясняю, что это значит: по OnStop у меня сбрасывается на диск дамп состояния портфеля и в лог выводится состояние кошелька по каждой валюте - вот это самое, что мы видим. Выводится, повторяю, В КОЛЛБЕКЕ: function OnStop()local i;for i=0,4 do F:write(string.format("%s: %1.2f+%1.2f=... А значение счётчика выводится В МЕЙНЕ! Получается, что OnStop в цикле между своими F:write отдаёт управление в main, а потом каким-то образом снова захватывает его себе или как? У меня просто крыша едет, в голове не укладывается, как вообще может такое происходить.

И тут меня осенило: в боевом режиме в цикле мейна стоит sleep(250), а при работе по историческим данным этой задержки нет (в результате чего двухмесячный тиковый массив пролетает за пару минут). Поставил туда sleep(1) и - О, ЧУДО!
Код
1234567812345
RUR: 0.00+50000.00=50000.00/0.00 V=50000.00
USD: 0.00+0.00=0.00/0.00 V=0.00
EUR: 0.00+0.00=0.00/0.00 V=0.00
FUT: 0.00+20000.00=20000.00/0.00 V=20000.00
RES: 0.00+0.00=0.00/0.00 V=0.00
Версия Квика СТАРАЯ, много раз по историческим данным работала, в Интернет вообще не входил, биржа не работает. Кто-нить может подсказать, ЧО ВАЩЕ ЗДЕСЬ ТВАРИЦЦА?!
 
два года назад вы спрашивали
Цитата
Владимир написал:
Господа, объясните мне, дураку, на кой вам всё это надо? Торговля на бирже - процесс медленный, вдумчивый, процессы длятся месяцами, даже годами, и потому задержка на минуту, час, день, неделю существенно на результат не влияет. Вы что, делаете сотни и тысячи сделок в час? Но ведь даже в этом случае времени просто ВАГОН! Одно ядро, два, десять, тысяча, C или Lua - ну какая разница?! Не понимаю...

в посте где было объяснение, зачем собственно нужен sleep
Цитата
Владимир написал:
Поставил туда sleep(1) и - О, ЧУДО!
...
ЧО ВАЩЕ ЗДЕСЬ ТВАРИЦЦА?!

но прошло ещё пару дней, и снова на ту же тему
Цитата
Владимир написал:
Нафига вам всё это нужно, господа? Я потратил недели две, чтобы вынести всё, что можно, в поток main и уже практически забыл про вылеты скрипта или отвисания Квика. Не говоря уже о том, что я буквально с первого же дня постулировал: никаких библиотек, никаких других языков - скрипт должен работать на любой версии Квика и любой версии языка. И никаких стаканов, никаких свечей, никаких графиков, никаких сокетов. А все вопросы синхронизации/блокировки выполняются самим скриптом, у которого для этого заведены соответствующие стеки и флаги. Ведь наша задача - получить рабочую версию торговой программы, а не вести бесконечную борьбу с глюками всех мастей и размеров.

то есть понимание за два года и явное столкновение с проблемой так и не пришло.
 
чтоб не искать -
2 года назад
https://forum.quik.ru/messages/forum10/message49035/topic5852/#message49035
(ответ - в примере прямо над вопросом!)

в этом году
https://forum.quik.ru/messages/forum10/message64731/topic5823/#message64731
 
Павел Bosco, И что? Подтверждаю каждую запятую в своих текстах - в т.ч. двухлетней давности. Что сказать-то хотели? И я никогда НЕ спрашивал, зачем собственно нужен sleep - я спрашивал ЧО ВАЩЕ ЗДЕСЬ ТВАРИЦЦА?!
Страницы: 1
Читают тему
Наверх