создал советника по пересечению 2 EMA, нужен совет - страница 4

 
prupru:

У меня теперь более серьезная проблема, мой брокер склонен частично исполнять ордера.

Уважаемый клиент,

Настоящим сообщаем, что Ваша сделка была открыта частично (2.32 лота из 15.84) по цене 587.318.

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

С уважением,

Брокер.

вот что говорят в службе поддержки:

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

Я понимаю, как закрыть все ордера, несмотря на их частичное закрытие, нужно просто сделать Close all Orders while OrdersTotal() > 0, но я не знаю, что делать, когда ордера открываются частично.

edit:

Только что понял, что мне нужно проверить правильность ордеров Symbol и magicnumber, это немного сложнее.

edit: вот функция close all orders, которая должна закрывать ордера даже при частичном закрытии


//Close all my Orders
void CloseAllOrders()
{
int notMyOrders = 0;

 while (OrdersTotal()>notMyOrders)
 {
 notMyOrders = 0;
 for(int i = OrdersTotal()-1; i >= 0 ; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
   if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) {notMyOrders++; continue;}
   if(OrderType()<= 1)CloseOrder();
         
   }
 }
return;
}  
переписано
 
deVries:

переписано


вау!

это немного сложно для меня, я прочитал это 4 или 5 раз, прежде чем понял. Спасибо!

и... что происходит, если OrderSelect возвращает false?

Как часто OrderSelect возвращает false? Возможно ли это вообще?

 
prupru:


Ух ты!

Это немного сложно для меня, я прочитал это 4 или 5 раз, прежде чем понял. Спасибо!

и... что происходит, если OrderSelect возвращает false?

Как часто OrderSelect возвращает false? Возможно ли это вообще?


for(int i = OrdersTotal()-1; i >= 0 ; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;

i= 0

возвращается из цикла

i = -1

if(OrderSelect(-1,SELECT_BY_POS,MODE_TRADES)==false) break; // ==> заканчиваем проверку сделок, прерываем цикл

следующий CloseOrder()

//CloseOrder
void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,Slippage,CLR_NONE))
  {
   Print("Close order error: ",GetLastError());
   Print("Type ", OrderType()," PR ",PR, " Ask ", Ask, " Bid ", Bid, " OrderTicket ", OrderTicket(), " OrderLots ", OrderLots());
  }
return;}
//--------------------------- end of close order

какие общие ошибки могут быть возвращены из GetLastError()

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

Что можно сделать, чтобы избежать многих таких ситуаций?

 
deVries:


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

Пока не знаю. Мне нужно все обдумать.

Сейчас я столкнулся с другой проблемой.

Я поставил своего советника на VPS windows 2003 и теперь он выдает ошибку "завершен по таймауту", но я никогда не видел такой ошибки на своем домашнем компьютере.

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

То есть, программа проверяет открытие нового бара, trailingstop = 0, поэтому вызов функции трейлинг-стопа не происходит, затем, если новый бар открылся, она проверяет пересечение EMA, пересечения нет (в те разы, когда я получал ошибки таймаута, линии EMA были далеки от пересечения), поэтому программа возвращает(0).

Нет никаких циклов! Как она может быть завершена по таймауту?

 
prupru:

пока не знаю. Мне нужно все обдумать.

Сейчас я столкнулся с другой проблемой.

Я поставил советника на VPS windows 2003 и теперь он выдает ошибку "завершен по таймауту", но я никогда не видел такой ошибки на своем домашнем компьютере.

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

То есть, программа проверяет открытие нового бара, trailingstop = 0, поэтому вызов функции трейлинг-стопа не происходит, затем, если новый бар открылся, она проверяет пересечение EMA, пересечения нет (в те разы, когда я получал ошибки таймаута, линии EMA были далеки от пересечения), поэтому программа возвращает(0).

Нет никаких циклов! Как она может быть завершена по таймауту?


это не цикл?

while(!IsTradeAllowed()) Sleep(10);
 
deVries:


это не цикл?


Я имею в виду, что во время завершения работы советника линии EMA были далеки от пересечения, поэтому функция NewOrder не была вызвана, поэтому цикл, о котором вы говорите (который находится внутри функции NewOrder), не был запущен.

добавлено условие IsStopped

while( (!IsTradeAllowed()) && (!IsStopped()) ) Sleep(10);
while ( (LotRemains>0) && (!IsStopped()) )
while ( (OrdersTotal()>0) && (!IsStopped()) ) 
 
возможно, ошибка таймаута выскакивает, потому что у меня закончились ресурсы процессора VPS. Я перешел на более дорогой тарифный план и не вижу их, пока не запущу что-нибудь тяжелое, например windows uodate.