Код получили, предлагаем продолжить обсуждение вопроса в рамках почтовой переписки.
Цитата
А документации совсем нет, где структура данных описана?
Прикрепляли ранее документ МБ с описанием транзакции.
В соответствии в этим документом пробовал именовать поля, не помогло. Хотя там тоже странно, например поле CLIENTCODE. Я использую в новой заявке CLIENT_CODE и оно работает. Исходя из этого непонятно, кто и где осуществляет конверсию полей, либо есть какие-то допустимые варианты написаний. Как например во всех ответах присутствует как ordernum, так и order_num.
Просьба прислать используемый код (или его фрагмент). Информацию можно направить на нашу почту quiksupport@arqatech.com , в этом случае необходимо указать ссылку на данную тему форума в письме.
Просьба прислать используемый код (или его фрагмент). Информацию можно направить на нашу почту quiksupport@arqatech.com , в этом случае необходимо указать ссылку на данную тему форума в письме.
хорошо, подготовлю код. А документации совсем нет, где структура данных описана?
Уточните, пожалуйста, с отправкой какой транзакции возникает проблема? Пример транзакции "Изменение заявки" мы приводили в сообщении #8 этой темы. Если трудности возникают с отправкой другой транзакции, просим описать ситуацию более подробно.
не могли бы вы уточнить, какие поля являются строго обязательными для изменения и какие они могут принимать заданные значения?
Уточните, пожалуйста, с отправкой какой транзакции возникает проблема? Пример транзакции "Изменение заявки" мы приводили в сообщении #8 этой темы. Если трудности возникают с отправкой другой транзакции, просим описать ситуацию более подробно.
Трудности именно с транзакцией "Изменение заявки". Пробовал разные комбинации названия полей и их значений (на русском, на английском), но так и не смог ни разу добиться изменения хотя бы цены активной заявки. Эксперименты ставил на коротком скрипте, который больше ничего не делает, только ставит и пытается изменить заявку.
"Заявка" - номер исходной заявки, параметры которой необходимо изменить.
Цитата
"Примечание" "W1//ORDER_AMEND" это значимое поле с жестко заданным значением?
В параметр "Примечание" помещается код клиента и комментарий к заявке, разделенные слэшем (либо двойным слэшем, в зависимости от настроек брокера).
Цитата
В поле цена "Цена" в качестве десятичного разделителя точка?
Верно.
Цитата
Значение поля "К/П" в случае продажи "Продажа"?
Верно.
Цитата
Как себя ведет эта транзакция в случае если исходная заявка была частично исполнена до изменения?
Точного ответа у нас нет. Вы можете уточнить эту информацию у специалистов Московской биржи
Спасибо, с учетом вашего ответа, стоит ли заморачиваться с реализацией или более надежно отменить старую и поставить новую заявку?
Что-то никак не удается мне победить эту команду. Посмотрите пожалуйста. Вот как у меня формируется транзакция: sell_transaction = { # Все значения должны передаваться в виде строк 'TRANS_ID': str(sell_order_id), # Номер транзакции задается клиентом 'CLIENT_CODE': '62665', # Код клиента. Для фьючерсов его нет 'ACCOUNT': 'L01-00000F00', # Счет 'ACTION': 'NEW_ORDER', # Тип заявки: Новая лимитная/рыночная заявка 'CLASSCODE': class_code, # Код площадки 'SECCODE': symbol, # Код тикера 'OPERATION': 'S', # B = покупка, S = продажа 'PRICE': str(sell_order_lmtPrice), # Цена исполнения. Для рыночных фьючерсных заявок наихудшая цена в зависимости от направления. Для остальных рыночных заявок цена = 0 'QUANTITY': str(int(order_size / lot_size)), # Кол-во в лотах 'TYPE': 'L'}#, # L = лимитная заявка (по умолчанию), M = рыночная заявка
Что тут необходимо передать, чтобы изменить заявку? Я пробовал все из того, что вы писали выше, поля на русском, ничего не получается, мне возвращается моя строка.
Просто не нравится этот вариант, тк есть уникальный trans_id, зачем еще один индекс городить. Пока попробовал переделать все на обработку по trans_id, но остается открытым вопрос как быть если система не вернула order_num за разумное время. Пока что приходится такую заявку "забыть" и идти дальше.
это конечно вариант, но мне он не нравится отсутствием изящества, громоздкостью что ли. Кроме того, как справедливо раньше вы подметили, при работе с питоном приходится экономить операции. На эту проблему накладывается возможное отсутствие trans_id в сообщениях, который я поддерживаю уникальным на своей стороне. Городить два индекса совсем не хотелось. И что делать, если order_num не приходит? Ждать? Сколько? получается заявка в неопределенном статусе может находиться неопределенное время.
Уникальность номеров заявок order_num поддерживается только внутри одного торгового дня. Также как и trade_num для сделок. Получается при использовании этих параметров в качестве индекса может возникнуть ситуация, что записи имеющиеся совпадут по индексу с новыми заявками и сделками дня, что может привести к труднопредсказуемым последствиям. Использовать trans_id в качестве уникального индекса тоже ненадежный способ, т.к. логика его передачи в сообщениях нестабильна. Также например случаются существенные задержки с поступлением OnTransReply и тогда невозможно отменить заявку, т.к. для этого необходим order_num, которого у нас еще может не быть. Кто как решает эту проблему?
К сожалению, для транзакции "Изменение заявки" описание в фиксированном формате не предусмотрено. Рекомендуем использовать описание параметров в универсальном формате, пример которого приведен выше.
Здесь "Заявка" это order_num? "Примечание" "W1//ORDER_AMEND" это значимое поле с жестко заданным значением? В поле цена "Цена" в качестве десятичного разделителя точка? Значение поля "К/П" в случае продажи "Продажа"? Как себя ведет эта транзакция в случае если исходная заявка была частично исполнена до изменения?
Сорри, не только по отмене, но и по исполнению тоже. На самом деле, может прийти несколько сообщений, в некоторых будет 0, а в некоторых корректное значение.
Обратил внимание, что по отмене заявки приходит trans_id=0. Это либо баг, либо недосмотр, т.к. нарушает логику сквозной нумерации. Почему 0? Практически во всех остальных случаях trans_id приходит корректный. Возможно это исправить?
bespalex написал: перебор тоже вариант Чаще всего отключение происходит ровно в 10:00:05. Не знаю, может какое-то технологическое переключение в начале сессии, которое триггерит выкидыш. Не думаю, что если бы дело было в core.dll оно бы так выглядело.
Дело в том, что нет смысла передавать все данные из КВИК через луа в питон. ------------- Моя концепция создания робота такая: ----------- Робот условно содержит две части - я их назвал по аналогии с человеком - спинной и головной мозг. Спинной - это все колбеки в КВИКЕ и все торговые операции в КВИКЕ. Их нет смысла перегонять в питон и обратно. Это фактически автомат стандартных действий, которые не зависят никак от стратегии и тактики торговли. Эту часть я реализую в КВИКЕ на луа + си for lua. ------------------ Головной мозг - это прогнозы, управление капиталом, стратегии торговли можно и нужно реализовывать в дополнительных потоках и приложениях на любых языках, в том числе и питоне. --------------------- Вот для этого организую взаимодействие КВИКа через Луа с python, rust,julia, terra, luajit и т д ================ Сейчас обмен любыми данными делаю через mapping files. Скорость обмена просто аховая, так как это обмен через память . Нет никаких оберток. Поддерживаются все форматы. Строки передаю как хеш. Это фактически два целых числа. Объем данных ограничен лишь объемом дисков. ---------------------- Хочу сделать формирования запроса произвольных данных от сторонних приложений. =========== И еще замечу, что если Вы исполняете скрипт для питона без jit либо трансляции в СИ, то это раз в пять медленнее, чем на луа.
Спасибо, очень познавательно. У меня задача немного проще сейчас: адаптировать существующего робота для работы с Quik. В принципе не сказать, что медленно, цикл проверок на триггер занимает около 50-150мс (вместе со всеми транзакциями). Для моих задач этого пока достаточно. В вашей системе какое время обработки получается?
Если умеете программировать на луа и питон, то делаете обмен данными между приложением на питон и приложением на Луа. Либо ищите такой скрипт. КВИК вообще при этом не требуется. Потом скрипт луа для обмена запускаете в КВИК.
Не очень понял, т.к. QuikPy это и делает. Он работает на питоне в связке с QuikSharp, который запущен в QUIK. Вот между ними связь и теряется периодически.
В документации QuikPy написано: ------------------ Возможные ошибки Если возникают ошибки, связанные с core.dll, то все варианты этой библиотеки выложены в проекте QUIKSharp Путем перебора подбираете подходящую для вас версию core.dll Если возникают ошибки при исполнении LUA скриптов, то, возможно, были обновления в QUIK или LUA. Последняя версия LUA скриптов находится Они не учитывают мои специфические правки, но должны работать без ошибок с последней версией QUIK. Успешного перебора.
перебор тоже вариант Чаще всего отключение происходит ровно в 10:00:05. Не знаю, может какое-то технологическое переключение в начале сессии, которое триггерит выкидыш. Не думаю, что если бы дело было в core.dll оно бы так выглядело.
Если умеете программировать на луа и питон, то делаете обмен данными между приложением на питон и приложением на Луа. Либо ищите такой скрипт. КВИК вообще при этом не требуется. Потом скрипт луа для обмена запускаете в КВИК.
Не очень понял, т.к. QuikPy это и делает. Он работает на питоне в связке с QuikSharp, который запущен в QUIK. Вот между ними связь и теряется периодически.
Не могли бы вы еще привести такой же пример кода для английских наименований полей и их значений? Например, у меня используется 'ACTION': 'NEW_ORDER', а тут как будет для изменения?
У сообщений системы QUIK отсутствуют числовые коды. Просим уточнить, каким образом получена строка "8635230 Вы не можете снять данную заявку"; если есть возможность, прикрепите скриншот данного сообщения в терминале.
Мы можем зарегистрировать пожелание на добавление числовых кодов для сообщений об ошибках, возвращаемых системой QUIK при выполнении транзакций. Для этого просим Вас описать желаемую реализацию.
В качестве примера реализации могу привести IB API: https://interactivebrokers.github.io/tws-api/message_codes.html То есть попросту удобно иметь исчерпывающий перечень сообщений об ошибках с кодами, их удобно обрабатывать. Тем более если необходимые поля в структуре данных имеются.
У сообщений системы QUIK отсутствуют числовые коды. Просим уточнить, каким образом получена строка "8635230 Вы не можете снять данную заявку"; если есть возможность, прикрепите скриншот данного сообщения в терминале.
Мы можем зарегистрировать пожелание на добавление числовых кодов для сообщений об ошибках, возвращаемых системой QUIK при выполнении транзакций. Для этого просим Вас описать желаемую реализацию.
nikolz написал: А зачем Вам QuikSharp? Его делали когда в КВИКЕ не было VMLua. В ту поры был смысл. Сейчас смысла нет, кроме непонятных затыков. Или я не прав?
Я использую QuikPy для python, он коннектится к QuikSharp. Есть какие-то другие решения?
То есть по сути на вашей стороне коды не используются, а только стандартизированные строковые сообщения типа "Превышен лимит по деньгам"? А что за код тогда 8635230, он откуда берется? Или он всегда один и тот же с любыми ошибками? Не очень понятно, почему не присвоить ошибкам коды, как-то строковые обрабатывать не очень элегантно.
Случается так, что периодически отключается клиент от терминала Quik. Соединение с сервером при этом остается рабочим. Подозреваю, что есть какие-то ограничения на количество передаваемых данных, после которого случается падение, тк явление наблюдается в периоды повышенной активности, например на открытии. Кто-нибудь сталкивался? как это лечится?
Просим Вас уточнить, о каких именно ошибках идет речь.
Я постоянно вижу в сообщениях коды, например: (210) Снято заявок: 1. Снято количество: 1. Нельзя снимать: 0. (160) Заявка на покупку N 30534448 зарегистрирована. ОШИБКА: (916) Заявка не может быть отменена. Указанная заявка уже не активна. Текущий статус заявки 'W' также при разборе ответов: 8635230 Вы не можете снять данную заявку и тп Есть документация по всем кодам ошибок и структуре данных об ошибках?
Кто-нибудь пользуется QuikPy? Подключение реализуется: app = QuikPy() В случае потери соединения на стороне Quik, он переходит в режим ожидания подключения клиента. Как корректно восстановить соединение со стороны клиента? При попытке пересоздания app=QuikPy() рушатся треды, т.к. не видят нового подключения.