Jump to content
Sign in to follow this  
NewAlex

Off quotes

Recommended Posts

NewAlex

Здравствуйте!

Получил такое сообщение в логе:

2016.08.03 17:59:01.365 '9824526': order #1435033884 buy 0.10 EURUSD closing at 0.00000 failed [Off quotes].

Вкратце: тестирую советник на ECN демке (в тестере не потестить - мультивалютник и еще пара нюансов).

Было открыто 3 ордера (на разные пары). Заметил ошибку, тормознул советник, ордера остались открыты. Перезапустил советник. При инициализации он на всякий случай пытается закрыть открытые ордера (если есть). Есть маленький косяк (имхо, некритичный): т.к. он не знает, в какую сторону был открыт ордер (да-да, можно проверить, знаю), то пытается закрыть и по цене ASK, и по цене BID.

После этого руками тоже не закрыть было... пришлось SL и TP ставить близко к цене и ждать....

 

Код инициализации ниже:

   int total=OrdersTotal();
   for (int j=0; j<total; j++)
   {  if (OrderSelect(j, SELECT_BY_POS))
      { 
         if (OrderMagicNumber()==magic)  
         {
                  if (!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,Red))
                     Print("OrderClose Error: ",GetLastError());
                  if (!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,Red))
                     Print("OrderClose Error: ",GetLastError());
        }
      }
   }

 

В "основном" коде (где обработка тиков) ничего критичного нет: ордера открываются/закрываются при выполнении условий; условия выполняются редко, все переменные, которые там используются, инициализируются нормально...

 

Вроде как, к заявленным условиям по off quotes мой случай не относится: не начало сессии (да и вообще, закрытие ордера), ликвидность есть (на демке же она эмулируется?), новостей особых не было... под незаявленные условия тоже не подходит - не пипсовщик...

 

Есть еще какие-то причины?

 

Заранее спасибо :)
 

Share this post


Link to post
Share on other sites
AntFX

При маркет исполнении цена открытия и закрытия вообще не учитываются. Открытие и закрытие по рынку происходит по текущей рыночной цене. Там вроде бы 0 можно выставить с тем же успехом. А вообще в OrderClose в качестве цены закрытия нужно указывать OrderClosePrice(). Ошибка закрытия может быть связана с некорректной работой демо-серверов. На них бывают временные глюки.


1

Share this post


Link to post
Share on other sites
NewAlex

спасибо, стало понятнее :)

а с практической стороны что посоветуете? если что, на нано не хочу тестировать - для советника критичен спред (даже не сама величина, а отличия от того, на что в итоге планируется ставить).

Share this post


Link to post
Share on other sites
AntFX

посоветую обработку результата выполнения OrderClose и задержку в 5 секунд после Off quotes перед следующей попыткой, и так 5 раз )

Edited by AntFX

1

Share this post


Link to post
Share on other sites
NewAlex

спасибо. ок. полагаю, что я уловил намек зачем нужна задержка в 5 сек :)

остальное - понятно

Share this post


Link to post
Share on other sites
YanaGold

 

Попробуйте перебирать ордера при закрытии не с самого первого, а с последнего

for (int j=total-1; j>=0; j--)

Share this post


Link to post
Share on other sites
NewAlex

YanaGold, а в чем смысл? или просто танцы с бубном?

Share this post


Link to post
Share on other sites
Shcherbakov Evgeniy

У меня такую штуку выдавало когда на кросах пытался выставить отложку на 100 пп (пятизнак)от цены, поставил 120 пп ошибка пропала, думаю условия брокера. Что у Вас не знаю, поделился своим ;)


Тем, кто ищет легких денег, неизменно приходится платить за привилегию послужить окончательным доказательством того, что в нашем черством мире легких денег просто не бывает.

 

Эдвин Лефевр

Share this post


Link to post
Share on other sites
YanaGold

У меня такую штуку выдавало когда на кросах пытался выставить отложку на 100 пп (пятизнак)от цены, поставил 120 пп ошибка пропала, думаю условия брокера. Что у Вас не знаю, поделился своим ;)

Смысл в том, что когда Вы закрываете позицию, то число позиций сокращается, а цикл при этом продолжает с того же номера и пропускает позиции (не выбирает их) и соответственно не закрывает.

Share this post


Link to post
Share on other sites
Rumpelstiltskin

посоветую обработку результата выполнения OrderClose и задержку в 5 секунд после Off quotes перед следующей попыткой, и так 5 раз )

 

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

5 раз по 5 секунд не дает гарантии, в вечном цикле тоже не повесить, а закрыть очень хочется :)

 

Как быть?

Share this post


Link to post
Share on other sites
ToB. CyxoB

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

5 раз по 5 секунд не дает гарантии, в вечном цикле тоже не повесить, а закрыть очень хочется :)

 

Как быть?

А почему в вечном цикле не повесить?

Share this post


Link to post
Share on other sites
AntFX

5 раз по 5 секунд не дает гарантии, в вечном цикле тоже не повесить, а закрыть очень хочется   Как быть?

Ордеру ведь не прикажешь "ордер, закройся!". Если операция долго не выполняется, лучше прекратить попытки и попытаться информировать о ситуации пользователя (алерты, емейлы и т.д.).

1

Share this post


Link to post
Share on other sites
Rumpelstiltskin

Ордеру ведь не прикажешь "ордер, закройся!". Если операция долго не выполняется, лучше прекратить попытки и попытаться информировать о ситуации пользователя (алерты, емейлы и т.д.).

 

Алертить на почту и в мобильный терминал возможность есть, но я могу спать, например, в этот момент.

Пока вижу такой выход: пробовать с таймаутом несколько раз, потом выставлять флаг, что нужно закрыть и на каждом тике пробовать закрыть. Если ордер не найден или закрылся, флаг снимается.

 

 

 

А почему в вечном цикле не повесить?

Потому что это нагружает систему и может привести к зацикливанию, а если закрытие ордера происходит на клозе дня, перед выходными, то такой цикл может все выходные молотить и греть воздух.

Share this post


Link to post
Share on other sites
ToB. CyxoB

Алертить на почту и в мобильный терминал возможность есть, но я могу спать, например, в этот момент.

Пока вижу такой выход: пробовать с таймаутом несколько раз, потом выставлять флаг, что нужно закрыть и на каждом тике пробовать закрыть. Если ордер не найден или закрылся, флаг снимается.

 

 

 

Потому что это нагружает систему и может привести к зацикливанию, а если закрытие ордера происходит на клозе дня, перед выходными, то такой цикл может все выходные молотить и греть воздух.

из всего я понял, что ты просто не умеешь пользовать вечные циклы. Решение элементарное. 

Share this post


Link to post
Share on other sites
Rumpelstiltskin

из всего я понял, что ты просто не умеешь пользовать вечные циклы. Решение элементарное. 

 

Например?

Share this post


Link to post
Share on other sites
ToB. CyxoB

Например?

циклы можно организовать через while - и подвесить систему...даже с паузами...все равно работа советника остановится в этом цикле

а можно через if....

 

или лучше всего функцию закрытия сделать отдельным советником...который следит только за позициями....закрылись-не закрылись..и тп...

Share this post


Link to post
Share on other sites
Rumpelstiltskin

циклы можно организовать через while - и подвесить систему...даже с паузами...все равно работа советника остановится в этом цикле

а можно через if....

 

или лучше всего функцию закрытия сделать отдельным советником...который следит только за позициями....закрылись-не закрылись..и тп...

 

Вечные циклы и паузы - т.к. называемые слипы - огромное зло в мире программирования. 

 

Делать отдельный советник - это добавлять связи между советниками, что усложняет систему и её настройку, т.к. второй советник должен как-то получать информацию о том, что сделку необходимо закрыть. Кроме того, это ещё один открытый чарт в терминале, который пожирает ресурсы. Мне это всё не нужно.

Share this post


Link to post
Share on other sites
ToB. CyxoB

Вечные циклы и паузы - т.к. называемые слипы - огромное зло в мире программирования. 

 

Делать отдельный советник - это добавлять связи между советниками, что усложняет систему и её настройку, т.к. второй советник должен как-то получать информацию о том, что сделку необходимо закрыть. Кроме того, это ещё один открытый чарт в терминале, который пожирает ресурсы. Мне это всё не нужно.

у тебя реальные система-фобии. Связь добавляется на раз-два....глобальными переменными, и никакие ресурсы на это не тратятся.

 

Вечные циклы тоже можно облагородить...включи счетчик...назначь максимуму....после - выход  и  вход на новых условиях...и тп....

Share this post


Link to post
Share on other sites
Rumpelstiltskin

у тебя реальные система-фобии. Связь добавляется на раз-два....глобальными переменными, и никакие ресурсы на это не тратятся.

 

Вечные циклы тоже можно облагородить...включи счетчик...назначь максимуму....после - выход  и  вход на новых условиях...и тп....

 

Дело Ваше, как писать. Я своё мнение высказал, что предложенное Вами решение влечет оверхед по перформансу и лишние связи.

Share this post


Link to post
Share on other sites
ToB. CyxoB

Дело Ваше, как писать. Я своё мнение высказал, что предложенное Вами решение влечет оверхед по перформансу и лишние связи.

Вообще-то это Ваше дело, а не мое:) И походу очень сложное, если во главу угла ставится ...перформанс. :)

Share this post


Link to post
Share on other sites
AntFX

 

 

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

Ну так нужно анализировать ошибку же. Если ошибка ERR_MARKET_CLOSED, то прекращать попытки. 

Повторение на каждом тике можно конечно сделать, но это значит в каждый советник встраивать дополнительную подсистему для работы с ошибками исполнения. На мой взгляд, это избыточно. Можно конечно со всех концов по 10 раз перестраховаться, а потом в один прекрасный день какой-нибудь мегарегулятор помножит ваши капиталы на ноль какой-нибудь интервенцией. ) На мой взгляд, достаточно анализировать код возврата и делать несколько попыток повторения операции, если ошибка это позволяет. А если все попытки закончились неудачей, оповещать пользователя и прекращать работу.

  • Thanks 1

1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×