Вы ведь понимаете, что никак. На то они и анонимные торги, что никто не знает чьи это заявки. Более того, по одной цене могут стоять как ваши заявки, так и других трейдеров. Соответственно вы не знаете именно заявки будет мэчить биржа: ваши с вашими или ваши с "чужими".
В общем рецепт тут только один: не "заранее проверять", а продумать стратегию что делать в случае обнаружения кросс-сделки и стратегию эту реализовать в скрипте. Тем более, что между "проверкой" и реальным выставлением заявки все может повернуться так, что часть заявок других трейдеров будет снята и результат проверки окажется недействительным, т.е. опять получим кросс. С которым опять надо будет бороться как-то.
Как известно, QLua работает вот по такой модели: https://quik2dde.ru/viewtopic.php?id=16 В этой схеме не прописан один быть может не совсем очевидный нюанс, хотя понятно, что иначе и не сделать.
Сначала выполняется "скрипт целиком" ([BODY] на схеме). Выполняется он и в том смысле, что в глобальное пространство имён Lua-машины добавляются определённые в Lua-скрипте функции. Далее QLua перебирает все объекты глобального хранилища, и находит там функции с предопределёнными названиями. Для всех найденных известных функций-callback'ов "в уме" QLua проставляет признак: "для этого события callback определён, а для этого - нет".
После, когда возникает какое-либо событие, которое должно привести к вызову callback-функции, сначала проверяется: а для этого события с этом скрипте мы нашли требуемую callback-функцию после выполнения [BODY]? Нашли - вызываем её, не нашли - не вызываем.
Соответственно, если мы в нашем Lua-скрипте определяем глобальную функцию OnStop только в тот момент, когда первый раз вызовется OnInit - то это будет уже "поздно". QLua уже пометил себе, что функция OnStop - не найдена, вызывать её не следует.
Вот и вся разгадка.
Осталось лишь узнать мнение начальника транспортного цеха, зачем он использует столь изощрённый синтаксис. Какова хитрая цель? Быть может все будет полезно?
Александр Волфовиц написал: Обновился QUIK до 8-й версии и "обрадовал" ошибкой:
На предыдущей версии работали 6 скриптов безо всяких проблем.
Судя по тексту ошибки - проблема в библиотеке luacdll Её или вы, или кто-то явно сделал на основе примера вот отсюда https://quik2dde.ru/viewtopic.php?id=18
Для QUIK 8 вашу библиотеку надо пересобрать для платформы x64. По указанной ссылке уже обновлены сборки и все требуемые файлы для возможности собирать библиотеки для x64 платформы, с архиве с исходниками.
Только надо именно вашу библиотеку пересобрать! Из ваших исходников! Если вы сами её делали - возьмите исходники, обновите файлы проекта и lib-файлы и пересоберите. Если делал кто-то другой - обратитесь к нему, пусть из исходников пересоберёт на основе примеров по указанной ссылке.
Олег написал: SleepWaitForSingleObjectWaitForMultipleObject и т.д.При выходе потока из спячки ОС Windows вернет управление в тот же самый поток или в любой другой свободный поток из рабочего пула потоков Windows?
Разумеется по выходу из указанных функций произойдёт возврат ровно в этот же поток, иначе и не может быть.
Вообще вы куда-то не туда роете, не теми какими-то вопросами задаётесь. Вы расскажите чего хотите добиться - возможно, вам предложат решение. Это будет более плодотворный путь.
Олег написал: Программа QUIK создает потоки для каждого скрипта напрямую через CreateThread или берет из пула потоков, предоставляемых Windows.Например, через QueueUserWorkItem ?
Windows предоставляет всем нам единственную функцию для создания потоков: CreateThread Так что в любом случае поток создаётся в итоге через неё.
Андрей написал: Также, хотел бы спросить, не будет ли убытка в случае операции подачи заявки и практически моментального снятия?
Этот вопрос следует задать вашему брокеру. Обязательно уточнив про какой рынок идёт речь (каким типом инструментов в торгуете). Общего ответа нет, зависит от брокера и рынка (биржи)
Речь про подключение к QUIK через клиентский терминал?
Если так, то не понятно зачем это может быть нужно. Клиент QUIK настолько далеко от шлюзового подключения к бирже сервером, что что-либо тут контролировать вы всё равно не сможете.
Дмитрий, вас тут зачем-то обманывают. Правильный ответ такой: робот должен корректно работать при абсолютно любом порядке срабатывания call-back'ов. Потому как порядок в разное время и у разных брокеров и на разном вашем канале может быть совершенно любым (особенно во время большой активности на рынке). И когда ваш робот в критический момент не сработает (не закроет позицию, например) из-за того, что вы заложились в нём только на определённый порядок срабатывания call-back'ов - то вам тут не помогут и даже не посочувствуют. Лишь скажут, что "мы не обещали определённый порядок".
Так что расслабляться в этом месте не следует, при проектировании робота следует исходить лишь из того, что call-back'и могут сработать в абсолютно любом порядке. Скажу больше, в некоторых случаях некоторые call-back'и могут вовсе не сработать (да, и такое бывает, пусть и не часто), но и в таких случаях робот должен либо корректно жить, либо ярко зажигать красную лампочку для ручного вмешательства и принятия решения и том, что делать с набранными позами здесь и сейчас.
В инструкции указана необходимость скачивать msvcp60.dll Что-то мне подсказывает, что это уже не актуально. Если это так - удалите из инструкции информацию про msvcp60.dll, плиз
Открыто несколько окон графиков с одним инструментом (но разными тайфреймами, например). А хоть и с разными инструментами. Есть ли возможность рисовать линию тренда в одном окне и чтобы такая же ровно линия тренда появлялась в другом окне? А при изменении таких линий тренда - ест ли возможность, чтобы в других окнах они тоже изменялись?
s_mike@rambler.ru написал: Стати, ни разу не получилось увидеть, как скрипт qlua, будучи запущенным из терминала, крутился бы на другом ядре. Возможно, дело в установленных ос или железе.
цикл, запущенный в main(), вполне себе крутится на отдельном ядре. (Есть нюанс куда его приткнет ОС, но в любом случае отдельно)
_sk_ написал: А как-нибудь смёржить в терминале последние 3000 свечей с сервера и имеющиеся в наличии накопленные данные нельзя? Задача не кажется сложной.
в общем случае весь график полностью может быть изменен на сервере (при сбоях в расчетах), поэтому мержить сложно быдет. хотя, если просто заменять данными с сервера, а то, чего нет на сервере - просто не трогать...
Зарегистрируйте пожелание: "Передавать в function OnAllTrade(alltrade) признак 'перезаказано заново' " (т.е. в тот вызов OnAllTrade, который случился первым после нажатия кнопки "перезаказать" - должен передаться признак "всё поехало заново") Или пожелание в такой вариации: "Сделать новую call-back функцию, которая будет вызываться в момент нажатия кнопки "перезаказать".
Беда в том, что эта настройка ни от чего вас не страхует. Вы на нее слишком надеетесь. если требуется гарантированная торговля без плеча - надо требовать у брокера отключение для вас такового. тогда контроль будет на стороне сервера и вы точно не залезите в заемные средства
бывают арки античные. Они вызывают восхищение своим изяществом и совершенством. а бывают арки новосибирские, не обладающие ни одниб из указанных достоинств. мне одно любопытно: неужели не шевелится от таких советов "у нас что-то не то в этом месте"? судя по постоянству подобных предложений костылей - нет, не шевелится
У меня есть смутное воспоминание, что от версии это не зависит. Зависит от "удачи", которая, кстати, может и отвернуться. Так что настоятельно рекомендуется чуть поправить скрипты - и жить счастливо.
Ну в самом деле, это ж просто:
Код
tbl_trades = {}
fuction OnTrade(trade)
if tbl_trades[trade.trade_number] ~= nil then
exit
end
tbl_trades[trade.trade_number] = 1
...
Код для примера, названия полей не проверял, надо верные названия подставить, здесь просто идея.
A.T. написал: Пожалуйста, учтите также момент, что если я ввожу объем заявки больший, чем рассчитано max (по органичению "Исходя из собственных средств"), нужно автоматически, молча и без предупреждений выставлять max, а не то, что ошибочно вписано. Если вписан меньший или равный max объем, то соответственно то, что вписано.
По-моему это логично и очевидно. Иначе смысл флажка "Исходя из собственных средств" не учитывается вовсе.
Абсолютно не логично. Вы сами в явном виде прописали объем. Исходя из чего вдруг вписанная вами явно цифра в заявке должна игнорироваться??
Про что галка "исходя из собственных средств" - уже сказано.
Время изменения стакана получаемого через OnQuotes, OnQuotes - есть ли возможность параллельно с чтением стакана, получить точное время торгового сервера, когда он возник/изменился
Время изменения стакана получаемого через OnQuotes, OnQuotes - есть ли возможность параллельно с чтением стакана, получить точное время торгового сервера, когда он возник/изменился
Рождается на сервере брокера. Выше был намек. ну и потом, это ведь очевидно, что сервер и терминал общаются по протоколу, отличному от биржевого. хотя бы потому, что бирж много, а терминал - один.
Парни, у вас очевидный косяк квик позволяет запускать несколько терминалов, но только из разных директорий. Это вы различаете. но пути в диалогах открытия/сохранения файлов имеют как бы глобальные настройки на любую копию терминала. И это косяк! надо сделать так, чтобы квики из разных папок имели свои устоновки пути, куда сохраняются/открываются файлы. но! Это должно быть опционально! Возможно
Зачем себя так мучать двойными кликами, если вы на самом деле подтверждение игнорируете. Просто отключите его F9 - Торговля - Заявки - снять Запрашивать подтверждение
А "Исходя из собственных средств" - это про другое. Если вы указали объём - то он и будет использован. Не указывайте объем, просто нажмите на кнопку, где посчитан максимум лотов - и вот тогда параметры заявки будут такие, что рассчитаются "исходя из собственных средств" (если галка такая стоит).
Что касается флажка "Исходя только из собственных средств", то он относится лишь к функционалу расчета доступного количества в клиентском терминале, не более.
А т.к. вы сами явно указали объём заявки - то на такой объем заявка и выставилась. Так что не понятно опять же, что не так. (хотя, чтобы этот объём вообще как-то учелся - требуется еще нажать кнопку, где рассчитан максимум; это если мы про режим Т+2 говорим; вы как-то про режим не уточнили, а ведь акции торгуются в разных режимах)
Кстати, а зачем проигрывать звуки при помощи скриптов, если для сделок есть готовое событие в терминале? или эти события не срабатывают для сделок/заявок, получившихся из скриптов?
А точно требуется вызывать DestroyTable для таблицы, связанной с окном, которое и так закрывается? Я думал таблица при этом автоматически уничтожится. Или это не так?