Рустем (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
BlaZed написал:
Цитата
Владимир написал:
А что, собссно, нельзя реализовать на луа?
Например автологин и прохождение двухфакторной авторизации на "чистом" луа без доп. библиотек и сторонних утилит даже на представляю как сделать.
А это весьма нужный функционал для автоматизации на мой взгляд.
А чм вы автологинитесь ?
При помощи w32.dll ?
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
BlaZed написал:
Нет четкого триггера.
Есть только определенная вероятность того, что данные получены.

Я, например, опрашиваю таблицу, пока ее размер не станет больше нуля, но не дольше заданного времени.
Если время прошло, а таблица все-еще пустая, то считаем что позиций нет.

Метод весьма далек от идеала, но лучшего не нашел.

PS: В свое время рассматривал еще один вариант.
Перед проверками поставить один лот на покупку по минимально возможной цене (чтобы точно не сработала заявка), и тут же снять его.
После чего ждать пока в таблице позиций не появится нужный инструмент, а он обязан будет появиться.

Спасибо за подробный и конструктивый ответ.
Я видимо положу один контракт в портфель "навечно", чтобы наверняка знать, что если ответ getNumberOf('FUTURES_CLIENT_HOLDING') = 0, значит еще не подгрузились данные по портфелю.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
nikolz написал:
прикольно, что вам помогают, а вы с претензиями что  не врубаетесь и виновато зеркало.
Прошу прощения за неуместный выпад с моей стороны.

Я менял вопрос пытаясь его уточнить, т.к. не получал ответа на свой вопрос.
Цитата
Если у брокера есть ваши деньги либо активы колбеки будут при загрузке и обновлении экрана.
Ну а если ничего нет, то на экране тоже все пусто.
Не совсем понял про "экран".
Программа на LUA ничего не знает про экран, а пытается понять ситуацию посредством API.

Цитата
Я Вам уже сказал что данные приходят самые свежие.
Если Вы уже купили что-то то это уже есть в таблице
а таблица всегда придет вся
никто не станет вам посылать по кусочкам.
Да, я видел этот ваш ответ.
Но они не отвечанет на мой вопрос о том, как понять что все начальные данные при коннекте (и его восстановлении) полученны.
Судя по всему, вы сначала запускаете QUIK  и после того как он получил все данные - вы сами ручками запускаете скрипт.
Т.е. вы визуально убедились что данные подгрузились.

Мой вопрос касается ситуации, когда человек не участвует в этом процессе.

Например, запустили QUIK и он сам автоматом запустил скрипт, т.к. он был запущен при последнем выходе из QUIK.
Или QUIK потерял соединения с сервером и переустановил его.
В обоих случаях в QUIK приходят все данные заново. Это занимаети до пол-минуты и больше.

Вопрос:
Как при этом программа может узнать, что пришли все колбеки по эккаунту и все данные адекватные ?
(например API предполагает, что отсутствие колбека по инструменту в портфеле надо трактовать как отсутствие позиции по нему.)
Что является для программы триггером что можно начать анализировать данные и торговать ?
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
Владимир написал:
И разговариваю я с ним только на языке sendTransaction-OnTrade-getParamEx.
У меня для принятия решения о торговле, надо еще знать состояние портфеля - есть ли в нем уже позиция и какого она размера ? :)
С момента последнего запуска могло пройти время, и состояние портфеля могло измениться  - могли сработать лимитные заявки.
Можно конечно при запуске отлавливать бывшие OnTrade(), но мы всеравно упираемся в проблему описанную мной выше - полученные данные окончательные, или это еще не все onTrade() прилетели.

Цитата
Владимир написал:
А какие проблемы "проинициализировать свои данные при запуске робота"? Они же свои!
Так и хочется избежать что-то делать ручками :)
Хочется программно проинициализировать.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
Владимир написал:
Рустем , Я говорил об ошибках в коде не в смысле потери соединения, а в том, что "QUIK подвисает примерно раз в 2 дня". А уж то, что он при потере связи самостоятельно восстанавливает соединение, я видел тыщу раз - хотя бы по его диагностике "соединение установлено" или "соединение установить не удалось". Любой браузер делает примерно то же самое.
В API браузера есть возможность повторить запрос.
А тут программе приходит событие onDisconnected() и все.. Ничего сделать нельзя.
Можно только надеяться, что QUIK восстановит соединениеи и придет OnConnected()
Но QUIK не всегда восстанавливает соединение.
Никакого програмного способа переконнектиться к серверу, API не предоставляет.
Что делаете вы в таком случае ?
Цитата
Вот уж что-что, а "наблюдение за процессом глазами" есть просто дискредитация самой идеи автоматической торговли. В моём скрипте есть даже "спящий режим", когда скрипт вообще ничего не показывает "для глаз", а только потихоньку тикает таймер, чтобы показать, что скрипт работает, а не висит.
100%. На нормальном API от IB  у меня робот работает с 2008 года, не требуя никакого вмешательства.

Цитата
Вот уж что-что, а "наблюдение за процессом глазами" есть просто дискредитация самой идеи автоматической торговли. В моём скрипте есть даже "спящий режим", когда скрипт вообще ничего не показывает "для глаз", а только потихоньку тикает таймер, чтобы показать, что скрипт работает, а не висит.
У меня тоже есть и отслеживаются состояния размещения заявки.
И я их тестирую на обрывах соединения. Если бы QUIK не рвал связь раз в 10 мин, я бы сам ее рвал, чтобы отладить код для обработки таких событий.
При переходе от одного статуса к другому (например, с "послал на сервер" к "получил подтверждение от сервера"), нужен таймаут. Иначе программа подвиснет в ожидании того, что QUIK ей может никогда не прислать. Выход по таймауту - это повод оставовить торговлю до разбирательства.
Вот таких "выходов" с QUIK очень много.

Но даже не в этом вопрос, а в том, как проинициализировать свои данные при запуске робота.

Например, при последнем подключении я имел позицию в 1 лот и разместил лимитную заявку на ее продажу.
Статус заявки был - "получил подтверждение от сервера".

Далее по какой-то причине пришлосm перезапустить QUIK.

После подключения к серверу (onConnected), ф-я getNumberOf("futures_client_holding") выдет 0.
Ладно, знаю что она врет и жду пока getInfoParam('LASTRECORDTIME') не "догонит" локальное время компьютера.
Но там надо задавать различие в несколько секунд.
Если дельту времени задать равным 0 - то из-за разницы между серверным временем и локальным можно подвиснуть навсегда.
(наблюдал различие в несколько секунд между серверным временем и локальным. Локальная машина имеет активную синхронизаци с службой времени).
А если поставить несколько секунд, то опять проблема - getNumberOf("futures_client_holding") выдет 0 еще некоторое время,
которое может быть больше этих нескольких секунд, т.к. нет гарантии что именно в этот момент сервер не начал подтормаживать.
Поставить задержку от балды - это гарантированный способ получить черных лебедей Насима Талеба.

На какое событие в такой ситуации вы смотрите, чтобы быть уверенным, что у вас актуальная инфа о позиции в портфеле после запуска скрипта ?

Как я писал выше, очень бы помогло событие onDataLoaded() которое бы приходило после загрузки всех начальных данных.
Ну и getNumberOf("futures_client_holding") должен выдавать nil а не 0, пока все данные не погрузились.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
nikolz написал:

фантазия не имеет границ.
Вы придумываете как спать на потолке.
данные приходят блоками, а это не одно число а много.
Я Вам уже сказал что данные приходят самые свежие.
Если Вы уже купили что-то то это уже есть в таблице
а таблица всегда придет вся
никто не станет вам посылать по кусочкам.
-------------------
Не надо придумывать то, что не бывает никогда.
================
По Вашим рассказам могу сделать вывод, что у вас либо плохой канал связи либо перегружен процессор.
Ищите решение Ваших проблем в этом направлении а не придумывайте сказки.
Никто не спорит с тем, что данные как-то приходят.
И в общем-то свежие должны быть.

Вы так много в этой ветке понаписали, копистали всякие описания, но так и не ответили на мой вопрос:

Программа запустилась при старте QUIK.
Да, пришла пачка колбеков, но в ней нет колбека по конкретной позиции, скажем "CNZ2", которой программа активно торгует.
Как программа может понять что это означает:
- в портфеле нет позиций "CNZ2" и ждать бесполезно
или
-  колбек по данной позиции еще просто не успел прийти и надо еще подождать ?
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
Владимир написал:
Рустем, Ну, если "QUIK раз в 5-10 минут теряет соединение", то не только о скоростной торговле, но и вообще о торговле лучше забыть до появления нормального канала связи. То, что он ещё и "подвисает примерно раз в 2 дня", скорее всего, вызвано ошибками в Вашем коде. Автоматический перезапуск без выяснения причин предыдущего вылета лично я считаю глупостью. Наконец, QUIK  в принципе  непригоден для высокоскоростной торговли (да и слава богу, ибо такая торговля есть полное дерьмо) - здесь время измеряется секундами. Конечно, народ на этом форуме периодически впадает в маразм и занимается очередной ловлей микросекунд, но всё это чушь собачья.
QUIK без всякого моего кода раз в 5-10 минут теряет соединение.
Канал хороший - 300 mbps, ping до сервера <5ms.
Отдельный выделенный комп под QUIK.
Сегодня конечно проверю из другой точки, чтобы быть на 100% увекренным что дело не в канале.
Но на форумах есть такие же жалобы.

Конечно неправильно делать автоматический перезапуск без выяснения причин, но ответа на вопрос - почему QUIK не восстановил соединение мы никогда не получим...
Это скорее вынужденное, отчаянное решение.
Не хочется к нему прибегать, потому и смотрю в сторону других решений, кроме связки QUIK-LUA.

Торговля у меня конечно не миллисекундная, но если нет достоверной инфы про позицию портфеля, то торговать никаким таймфреймом невозможно, без активного наблюдения за процессом глазами.
Чего хотелось бы избежать....
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
Владимир написал:
Рустем, Так и в моём случае расхождения портфеля неприемлемы.  :: И торговля тоже не особо редкая - почти всегда более сотни сделок в сутки, бывает и по 5-6-7. Да, рассогласование - вещь весьма неприятная, но довольно редкая. А вот "альтернативные решения" как раз и дают во много раз больше ошибок - там ведь действительно бывают задержки в десятки минут и даже более. Для активной торговли это фактически смертный приговор.
У меня QUIK кроме того что раз в 5-10 минут теряет соединение и потом по пол-минуты его восстанавливает (брокер Финам), еще и подвисает примерно раз в 2 дня.
Судя по чатам, я не один с такими проблемами.
Если на нем оставаться, надо еще внешний watchdog писать, чтобы его перезапускал.

Под альтернативными решениями я имел в виду те, что расчитанны на высокоскоростную торговлю.
Смотрю, изучааю. Пока не видно сюрпризов.
Но по хорошему понятно станет недели через 2.
Пока приходится писать парсеры на всякие дурацкие XML-и :)
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
Владимир написал:
Рустем, Мой ответ: ждать бесполезно. Я вообще отказался от программного контроля состояния портфеля со стороны брокера. Во-первых, потому, что утилита эта глючит со страшной силой. Во-вторых, потому, что она частенько врёт: мой скрипт самостоятельно ведёт учёт бумаг и денег, и при рассогласовании портфелей (а это довольно редкая ситуация, раз-другой в неделю по всем тикерам, а их у меня в портфеле болтается в районе полусотни) ошибки в данных бывают не только у меня (скажем, не пришло прерывание OnTrade или где-то задержалось на полчасика), но и у брокера (не успел обновить данные, и через некоторое время рассогласовании пропадает даже при полном отсутствии сделок по этой бумаге с моей стороны). Или вот убивающий пример на прошлой неделе: купил у меня скрипт фьюч Норникеля. Гляжу - и в таблице заявок, и в таблице сделок, и у меня в логе куплен один лот, а в состоянии портфеля их показано два. НУ НЕ ПОКУПАЛ Я ВТОРОЙ ЛОТ ПО ЭТОЙ БУМАГЕ! Через какое-то время скрипт этот фьюч продал, гляжу - в портфеле всё равно +1. Наконец, мне это надоело (прошло часов пять, не меньше), и я руками продал второй, в портфеле стало пусто. На следующий день запускаю скрипт, а у меня там... правильно, -1! Пришлось снова купить руками. И это важнейшие данные, содержимое портфеля! А уж связываться с этим говном ради каких-то сраных свечей... да в миллион раз дешевле, проще, надёжнее, быстрее посчитать их самому. Слава богу, я с самого начала поступил именно так.
Владимир, спасибо за разъяснения.
В моем случае расхождения портфеля неприемлимы.
Торговля частая, если будет рассогласование, робот наторгует неправильно и в ненужную сторону :)
Пойду изучать альтернативные решения.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
nikolz написал:

Если у брокера есть ваши деньги либо активы колбеки будут при загрузке и обновлении экрана.
Вопрос же не в том, приходят ли вообще колбеки.
Да, они как-то приходят.
Но по ним нельзя понять состояние портфеля.

За время отсутствия коннекта позиция могла быть продана или куплена по ранее размещенной в системе заявке, маржинколу, дейстями юзера и т.д. и т.п.

Программа запустилась при старте QUIK.
Да, пришла пачка колбеков, но в ней нет колбека по конкретной позиции, скажем "CNZ2", которой программа активно торгует.
Как программа может понять что это означает:
- в портфеле нет позиций "CNZ2" и ждать бесполезно
или
-  колбек по данной позиции еще просто не успел прийти и надо еще подождать ?
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
nikolz написал:

----------------
При подключении,  сервер передает клиенту всю необходимую для него информацию.
-------------------------------
Если у Вас есть деньги или активы на фьючерсах, то вы получите по ним информацию.
------------------------
при приходе этой информации вызывается соответствующий колбек.
------------------------
Если колбеков не было то и в таблицах будет пусто.
---------------------
Т е не было колбеков - ждемс.
-----------------------
Пришли данные вызываются колбеки.
------------------
Для фьючерсов  это:
 OnFuturesClientHolding - изменение позиции
 OnFuturesLimitChange - изменение ограничений
 При этом информация в них самая свежая,
свежее только в яме на бирже.
------------------

Спасибо что потратили время и постарались разжевать.
Но я не нашел в нем ответа на мой вопрос:

Подключился к серверу и жду колбеков.
Их все нет и нет.
Как понять что это означает:
- в портфеле нет позиций и ждать бесполезно
или
- оно еще просто не успело прийти и надо еще подождать ?


Ваше предложение
Цитата
getInfoParam( "SERVERTIME")=="" do sleep(1000) end --ждемс
не работает - я приводил выше логи, которые показывают что даже если значение не пустое, это не означает что QUIK уже все получил и выдает верные значения.

Предложение Nikolay
Цитата
процесс ожидания можно построить на том, чтобы время последнего переданного пакета "догнало" время сервера.
тоже не работает, т.к. значения полей совпадают и запаздывают одновременно.(тоже видно по приведенным логам)
Можно было бы сверять с локальным временем, но и тут засада.
Время серверов (QUIK же к разным серверам брокера может подключиться) отличается от локального. Бывает что на несколько секунд (это при том что на локальной машине стоит активная синхронизация).
Поэтому "запаздывание" можно отловить только с точностью до нескольких секунд.
Это означает что мы не можем распознать наличие небольшого запаздывания.
Т.е. опять же, получим от QUIK недостоверную инфу о состоянии портфеля.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
nikolz написал:

колбеки есть.
для futures_client_holding
это OnFuturesClientHolding(TABLE fut_pos)

И как они помогуют понять, что завершилась передача данных по портфелю ?

Если это событие не пришло - то как понять что это означает:
- в портфеле нет позиций
или
- оно еще просто не успело прийти ?
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
Kolossi написал:
Интересно, если CreateDataSource получает, к примеру, часовую свечу с временем текущего часа равной текущему часу сервера, можно ли считать что загрузка завершена?
Неизвестна последовательность загрузки данных.
Скорее всего она вообще не определена.
То, что загрузилась последняя свеча, не означает что данные по портфелю загрузились.
Если бы последовательность данных была предопределенной, то разработчики не хранили бы скромное молчание в ответ на вопрос "как узнать что все данные загрузились ?", а просто бы указали на какие данные надо смотреть, чтобы быть уверенным, что все остальные дынные уже загрузились.

А всего-то надо сделать кол-бек ф-ю onDataLoaded()
И никаких проблем с совместимостью в зад это не создаст :)
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
nikolz написал:

попробуйте так:
while  getInfoParam( "SERVERTIME")=="" do sleep(1000) end --ждемс
Пробовал.
Не помогает.
См. мой ответ выше.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
Nikolay написал:
Всегда надо помнить, что Вы работаете с терминалом, получающим данные с сервера. Т.е. после установки соединения начинается передача данных. Вполне естественно, что сразу после установки соединения (Handshaking) данные еще не начали передаваться.
Да вроде не первый день/год/десятидетие програмы пишем и все это знаем.
А еще знаем, что протокол ассинхронной передачи данных по ненадежным каналам связи должен быть организован так, чтобы в каждый момент было понимание о консистентности данных.
Цитата
К сожалению терминал не предоставляет методов контроля окончания передачи данных, о чем на этом форуме много раз вели дискуссию. Но можете воспользоваться одним способом: у каждого переданного пакета данных с сервера есть "его время". Поэтому процесс ожидания можно построить на том, чтобы время последнего переданного пакета "догнало" время сервера.
Он не только не предоставляет методов контроля окончания передачи данных, но и возвращает неверную информацию.
Если у терминала нет информации о количестве инструментов, то он должен возвращать nil, а не 0.

> процесс ожидания можно построить на том, чтобы время последнего переданного пакета "догнало" время сервера.

Имеется в виду getInfoParam('LASTRECORDTIME') и getInfoParam('SERVERTIME') ?
Специально вел логи этих значений в случае когда возвращается getNumberOf("futures_client_limits") = 0
Эти времена совпадают, и не "замораживаются."
Код
2022-11-09 17:03:03.145425 INFO   : DEBUG: Connection time: 00:00:12,  Server time: 17:02:56, Last record time: 17:02:56
2022-11-09 17:03:03.192271 INFO   : DEBUG: Connection time: 00:00:12,  Server time: 17:02:56, Last record time: 17:02:56
...
2022-11-09 17:03:24.779087 INFO   : DEBUG: Connection time: 00:00:34,  Server time: 17:03:02, Last record time: 17:03:02
2022-11-09 17:03:24.794704 INFO   : DEBUG: Connection time: 00:00:34,  Server time: 17:03:03, Last record time: 17:03:03

Начало лога начинается с  "Connection time: 00:00:12", в силу того, что до этого было ожидание:
- события onConnect(),
- флага isConnected()
- состояния статуса разрешения торговли по инструменту:
  getParamEx(class, sec, "TRADINGSTATUS") -- состояние сессии
  getParamEx(class, sec, "STATUS") -- статус торговли


Сейчас я точно знаю, что в моей корзине есть инструмент и жду getNumberOf("futures_client_limits") ~= 0  
Но в общем случае это не верно.
И нет никакого способа програмно это узнать...

Единственное что приходит в голову, это положить в корзину какой нибудь инстумент "навечно", чтобы значть что ответ  getNumberOf("futures_client_limits") = 0 означает что пока нет информации по корзине.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Цитата
Рустем написал:
Уважаемые,

После перезапуска терминала, если автозапускается скрипт, то ф-я getNumberOf("futures_client_holding") выдет 0, хотя на эккаунте есть позиции.
Есть какой-то способ проверить, что все данные пользоватьеля подгузились ?
Cитуация оказалась гораздо хуже, чем я думал.
getNumberOf("futures_client_holding") = 0 приходит довольно часто после переустановления прерванного соединения терминалом.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Соответственно, это значение возвращается уже после того как соединение установленно.
isConnected == 1
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Уважаемые,

После перезапуска терминала, если автозапускается скрипт, то ф-я getNumberOf("futures_client_holding") выдет 0, хотя на эккаунте есть позиции.
Есть какой-то способ проверить, что все данные пользоватьеля подгузились ?
Страницы: 1
Наверх