Добрый день. Вчера тестировал скрипт на демо, умышленно на всю котлету. Как и предполагал не зря. При исполнении стоп-заявки робот выставил лимитку, с небольшим отклонением от цены условия срабатывания. Лимитка была отвергнута по причине нехватки средств. (Бред, т.к. нужно было закрыть то количество, которое фактически уже было куплено/продано, но этот вопрос не к вам). Подскажите где отлавливать данный факт и самое главное, как закрывать позицию по рынку, ведь новая лимитная заявка, аврийно-выставленная роботом с отклонением в несколько пунктов от текущей цены также будет отвергнута.
На днях была похожая ситуация, тоже с демо-биржей и с той же диагностикой. Перестали приниматься лимитки, ни купить, ни продать. Поддержка брокера объяснила, что были проблемы на демо-бирже. Через некоторое время лимиты восстановили. Попробуйте пообщаться с брокером.
Кстати, демо-биржа конкурса InvestTrial оказалась удобна для тестирования роботов - участники близки по финансовым возможностям, безумных действий совершить особо не могут, трафик удерживается близко к реальному, но из-за особенностей его реализации результаты получаются завышенные.
Пока все молчат дополню... В функции OnStopOrder имеются флаги, но первые два из указанных ниже никак себя не проявили, сработал только последний.
if bit.band(stop_order.flags,0x400)==0x1 then to_log(tostring(SECCODE).." OnStopOrder(): Стоп-заявка № "..tostring(NO).." сработала, но была отвергнута торговой системой.") end
if bit.band(stop_order.flags,0x800)==0x1 then to_log(tostring(SECCODE).." OnStopOrder(): Стоп-заявка № "..tostring(NO).." сработала, но не прошла контроль лимитов.") end
if bit.band(stop_order.flags,0x2)==0x0 and bit.band(stop_order.flags,0x1)==0x0 then to_log(tostring(SECCODE).." OnStopOrder(): Cтоп-заявка № "..tostring(NO).." исполнена.") end
sav 312 написал: как закрывать позицию по рынку, ведь новая лимитная заявка, аврийно-выставленная роботом с отклонением в несколько пунктов от текущей цены также будет отвергнута.
Для выставления рыночной заявки можно использовать заявку вида: "TAKE_PROFIT_AND_STOP_LIMIT_ORDER", в которой можно заполнить данные только для нужного Вам типа стоп-заявки (стоп-лимит или тейк профит). Для получения правильных параметров такой заявки рекомендуем создать карман транзакции в Рабочем месте QUIK, после чего положив туда заявку такого типа выполнить ее сохранение в *tri файл.
Stanislav Tvorogov написал: Для выставления рыночной заявки можно использовать заявку вида: "TAKE_PROFIT_AND_STOP_LIMIT_ORDER", в которой можно заполнить данные только для нужного Вам типа стоп-заявки (стоп-лимит или тейк профит).
Не совсем понял зачем нужно ещё раз использовать стоп-лимит и тейк-профит, пусть даже нужного мне вида. Моя стоп-заявка, выставленная роботом исполнилась, но лимитка, выставленная исполненной стоп-заявкой была отвергнута, т.е. она даже не появлялась в таблице заявок. В моем скрипте ловится номер заявки, которая была рождена исполненной стоп-заявкой и мониторится ее исполнение, с последующей отправкой смс-уведомления. В моем случае нет номера, т.к. и заявки нет. Возникает несколько вопросов: 1. Почему не сработали флаги, указанные выше? (Моя ошибка или глюк?) Ответ на это вопрос сильно упростил бы мою задачу. 2. Где отлавливать данную ситуацию, раз уж флаги не срабатывают. Как вариант, если в течение определённого времени (ну скажем 5 секунд) не верно условие if stop_order.linkedorder > 0 (т.е. не получили номер заявки, т.к. она не была создана), то кроем позу аварийно. 3. Как закрыть позу аварийно? При выставление роботом рыночной заявки (лимитка с отклонением в несколько шагов от текущей цены) получим такой же результат - нехватка средств по лимитам. Когда ситуация произошла - крыл руками, сначала на 1 лот меньше общего количества, потом оставшийся 1 лот. Совсем не нравится данная логика. 4. Еслиловить в OnTransReply, то по какому параметру? Номера заявки, выставленной стоп-заявкой нет. trans_id тоже не знаю т.к. заявку выставляет не робот, а стоп-заявка, возможно будет = trans_id_stop?
sav 312 написал: Почему не сработали флаги, указанные выше?
Для ответа на Ваш вопрос нужно знать все данные о выставляемых Вами заявках. Рекомендуем посмотреть на параметр "Результат" таблицы стоп-заявок и проверить, соответствует ли он тому, что было возвращено в OnStopOrder.
Цитата
sav 312 написал: Где отлавливать данную ситуацию 4. Еслиловить в OnTransReply, то по какому параметру? Номера заявки, выставленной стоп-заявкой нет. trans_id тоже не знаю т.к. заявку выставляет не робот, а стоп-заявка, возможно будет = trans_id_stop?
sav 312 написал: Почему не сработали флаги, указанные выше?
Для ответа на Ваш вопрос нужно знать все данные о выставляемых Вами заявках. Рекомендуем посмотреть на параметр "Результат" таблицы стоп-заявок и проверить, соответствует ли он тому, что было возвращено в OnStopOrder.
Цитата
sav 312 написал: Где отлавливать данную ситуацию 4. Еслиловить в OnTransReply, то по какому параметру? Номера заявки, выставленной стоп-заявкой нет. trans_id тоже не знаю т.к. заявку выставляет не робот, а стоп-заявка, возможно будет = trans_id_stop?
Данную диагностику возвращает Торговая система. По причинам ее появления рекомендуем обратиться к Вашему брокеру.
Станислав, спасибо, что наконец обратили внимание на мой пост. Ответы к сожалению, Вы дали как-то избирательно. Да и в указанной Вами ветке, ответов на мои вопросы нет. Кстати, прочитал я её, ещё до обращения к Вам. Давайте попробуем иначе... Помогите пожалуйста разобраться с причиной не срабатывания флагов, а дальше самостоятельно решать буду. В таблице стоп-заявок результат - отвергнута ТС.
if bit.band(stop_order.flags,0x400)==0x1 then to_log(tostring(SECCODE).." OnStopOrder(): Стоп-заявка № "..tostring(NO).." сработала, но была отвергнута торговой системой.") end
if bit.band(stop_order.flags,0x800)==0x1 then to_log(tostring(SECCODE).." OnStopOrder(): Стоп-заявка № "..tostring(NO).." сработала, но не прошла контроль лимитов.") end
На указанные выше флаги реакции никакой.
Ниже по коду есть ещё 1 флаг:
if bit.band(stop_order.flags,0x2)==0x0 and bit.band(stop_order.flags,0x1)==0x0 then to_log(tostring(SECCODE).." OnStopOrder(): Cтоп-заявка № "..tostring(NO).." исполнена.") end
Он чётко отработал. Вот и непонятно мне почему, флаги сигнализирующие об исполнении заявки срабатывают, а о том, что отвергнута ТС нет.
sav 312 написал: Станислав, спасибо. Разобрался самостоятельно.
Похоже поторопился я с выводами. Ошибку в коде исправил, но флаги на отвергнутые заявки так и не срабатывают. В любом случае в логах вижу, что стоп-заявка исполнена, но когда заявка рождённая стоп-заявкой выставляется, то запоминается ее номер и т.д. ,а когда отвергнута ТС реакции никакой.
Код
if bit.band(stop_order.flags,0x2)==0x0 and bit.band(stop_order.flags,0x1)==0x0 then
to_log(tostring(SECCODE).." OnStopOrder(): Cтоп-заявка № "..tostring(NO).." исполнена.")
if stop_order.linkedorder > 0 then
OrderNum_CLOSE = stop_order.linkedorder;
to_log(tostring(SECCODE).." OnStopOrder(): Запоминаем номер созданной стоп-заявкой заявки - № "..tostring(OrderNum_CLOSE))
close_pos = 2
elseif bit.band(stop_order.flags,0x400)==0x1 then
to_log(tostring(SECCODE).." OnStopOrder(): Стоп-заявка № "..tostring(NO).." сработала, но была отвергнута торговой системой.")
close_pos = 1
elseif bit.band(stop_order.flags,0x800)==0x1 then
to_log(tostring(SECCODE).." OnStopOrder(): Стоп-заявка № "..tostring(NO).." сработала, но не прошла контроль лимитов.")
close_pos = 1
end
end
Добрый день. у Вас ошибка в коде. Вместо bit.band(stop_order.flags,0x400)==0x1 надо проверять bit.band(stop_order.flags,0x400) ~= 0 Результат битового AND нужно сравнивать не с единицей, а на неравенство с нулем.
Michael Bulychev написал: Добрый день. у Вас ошибка в коде. Вместо bit.band(stop_order.flags,0x400)==0x1 надо проверять bit.band(stop_order.flags,0x400) ~= 0 Результат битового AND нужно сравнивать не с единицей, а на неравенство с нулем.