Ожидание выполнения функции OrderClose() - страница 2

 

Всем доброго времени суток. Не могу разобраться почему не срабатывает OrderClose... В журнале ничего не пишет. В чем может быть проблема?

for (int pos=0; pos<OrdersTotal(); pos ++) { // Пробежим по циклу и узнаем сколько открытых сделок у этого робота
      bool select =  OrderSelect(pos, SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { // Если есть открытые, то прибавим их к переменной
         if (OrderType()==1) { // Если ордер открыт на продажу
            PosSale++;
         }
         if (OrderType()==0) { // Если ордер открыт на покупку
            PosBuy++;
         }
         ticket = OrderTicket(); // ID ордера
      }
   }
   
   if (OrderProfit()>10) {
      close = OrderClose(ticket,Lot,Ask,3);
      if(close<0) Print("ERROR = ", (string)GetLastError());
   }
 
officeoff:

Всем доброго времени суток. Не могу разобраться почему не срабатывает OrderClose... В журнале ничего не пишет. В чем может быть проблема?

 

Возможно, причина в том, что забыли включить проверку профита и приказ на закрытие в тело цикла.

И рекомендую поменять порядок перебора ордеров на обратный, чтобы исключить накладки с пропусканием ордеров. 

 
evillive:

Возможно, причина в том, что забыли включить проверку профита и приказ на закрытие в тело цикла.

И рекомендую поменять порядок перебора ордеров на обратный, чтобы исключить накладок с пропусканием ордеров. 

А что такое проверка профита? Я так думал, что если прибыль по ордеру > 10$ тогда, сделка закроется.

Да и у меня в коде есть другие условия для закрытия сделок. Например:

 
officeoff:

Всем доброго времени суток. Не могу разобраться почему не срабатывает OrderClose... В журнале ничего не пишет. В чем может быть проблема?

 

Так, наскидку:

1. OrderClose возвращает тип bool, меньше нуля он не бывает

2. Почему-то всегда закрытие идет по курсу Ask, хотя, вроде бы, должны встречаться и сделки Buy и сделки Sell

3. Значение Lot верное?

4. Результат OrderSelect принимается в переменную select и... все?

 
officeoff:

А что такое проверка профита? Я так думал, что если прибыль по ордеру > 10$ тогда, сделка закроется.

Да и у меня в коде есть другие условия для закрытия сделок. Например: 

Вот ваша проверка профита, или это не ваш код, раз вы не знаете что где? 

if (OrderProfit()>10) {
      close = OrderClose(ticket,Lot,Ask,3);
      if(close<0) Print("ERROR = ", (string)GetLastError());
   }

 Это должно быть в теле цикла, или что такое "тело цикла" вам тоже не понятно? Это блок фигурных скобок, в которых заключены инструкции, выполняемые каждую итерацию цикла. Так вот, профит тоже вроде для каждого ордера проверять надо, на случай, если его уже того, закрыть может надобно.

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

А  по OrderClose() выше уже писали, закрывать надо по цене закрытия, а не тупо всегда по АСК, лучше брать OrderClosePrice(), эта функция всегда возвращает правильную цену закрытия, что подтверждено на практике, да и разработчики подтвердили, что это работает.

Также по OrderSelect(), все действия после этого, должны  быть также заключены в блок фигурных скобок. И что за манера, скобки эти так безалаберно ставить, что их и не увидеть попарно, и не сосчитать правильно...

Вот исправленный код:

for (int pos=OrdersTotal()-1; pos>=0; pos --) 
{ // Пробежим по циклу и узнаем сколько открытых сделок у этого робота
   if(OrderSelect(pos, SELECT_BY_POS,MODE_TRADES))
   {   
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) 
      { // Если есть открытые, то прибавим их к переменной
         if (OrderType()==1) 
         { // Если ордер открыт на продажу
            PosSale++;
         }
         if (OrderType()==0) 
         { // Если ордер открыт на покупку
            PosBuy++;
         }
         if (OrderProfit()>10)
         {
           if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3)) Print("ERROR = ", (string)GetLastError());
         } 
      }
   }
}
 
evillive:

Вот ваша проверка профита, или это не ваш код, раз вы не знаете что где? 

 Это должно быть в теле цикла, или что такое "тело цикла" вам тоже не понятно? Это блок фигурных скобок, в которых заключены инструкции, выполняемые каждую итерацию цикла. Так вот, профит тоже вроде для каждого ордера проверять надо, на случай, если его уже того, закрыть может надобно.

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

А  по OrderClose() выше уже писали, закрывать надо по цене закрытия, а не тупо всегда по АСК, лучше брать OrderClosePrice(), эта функция всегда возвращает правильную цену закрытия, что подтверждено на практике, да и разработчики подтвердили, что это работает.

Также по OrderSelect(), все действия после этого, должны  быть также заключены в блок фигурных скобок. И что за манера, скобки эти так безалаберно ставить, что их и не увидеть попарно, и не сосчитать правильно...

Вот исправленный код:

 

Я думал, что когда люди тырят код, там нет комментариев на каждой строке )))

Про фигурные скобки... Ну знаете 10 лет работал на php, никто никогда не говорил что правильно ставить скобки так ))) Мне, например, вообще не нравится чтобы скоба переносилась на отдельную строку.

Не до конца понимаю, почему проверка профита должна быть внутри цикла.  У меня есть переменная ticket, в ней хранится номер ордера. Дальше на его основе я могу узнать то, что мне нужно, открыть, отредактировать, закрыть и т.д.. Почему нельзя сделать так?

 
officeoff:


Не до конца понимаю, почему проверка профита должна быть внутри цикла.  У меня есть переменная ticket, в ней хранится номер ордера. Дальше на его основе я могу узнать то, что мне нужно, открыть, отредактировать, закрыть и т.д.. Почему нельзя сделать так?

Да ну? И какой тикет из нескольких будет храниться после окончания цикла? Последний из обработанных, не так ли? Ну и как с остальными быть?

Или у вас всегда только один ордер в работе по каждому символу? Тогда можно и после цикла, но надо хотя бы проверить, не был ли ордер закрыт предыдущей попыткой, на прошлом тике. Ну и возврат функции OrderClose() - bool, никак меньше нуля не бывает.

 
evillive:

Да ну? И какой тикет из нескольких будет храниться после окончания цикла? Последний из обработанных, не так ли? Ну и как с остальными быть?

Или у вас всегда только один ордер в работе по каждому символу? Тогда можно и после цикла, но надо хотя бы проверить, не был ли ордер закрыт предыдущей попыткой, на прошлом тике. Ну и возврат функции OrderClose() - bool, никак меньше нуля не бывает.

Ой, извините. Я же забыл уточнить что есть только 1 ордер. На счет OrderClose(), вас понял. Спасибо.

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

if(iOpen(Symbol(),PERIOD_M5,1)<ma && iClose(Symbol(),PERIOD_M5,1)>ma && ma_two<ma && PosBuy==0 && Bid>iOpen(Symbol(),PERIOD_M5,0)) { // Пересечение сверху вниз - Покупка
         TP = Bid+Profit*Point;
         order = OrderSend(Symbol(), OP_BUY, Lot, Ask, 5, 0, TP, "Покупка по MA", Magic, 0, Red); // Открываем сделку на покупку
         return;
      }
 
officeoff:  забыл уточнить что есть только 1 ордер... вставил Comment, он выводится, а сделка не открывается...
if(Условие)
{ 
  Alert("Покупка");  
  TP = Bid+Profit*Point;                     //  TP=0 SL=0
  order = OrderSend(Symbol(), OP_BUY, Lot, Ask, 5, 0, 0, "Покупка по MA", Magic, 0, Red); // Открываем сделку на покупку
  Alert(GetLastError);
  return;
}
Если ордер один - цикл убрать. Если в дальнейшем планируется увеличить количество ордеров - проверки и реакции внести в цикл. Использовать тестер стратегий.
Если счет типа ECN, то ордер открывать с нулевыми стопами (SL и TP), а после открытия модифицировать.
Иначе ошибка 130 Неправильные стопы.  Смотрим в журнале:
2016.10.06 10:18:32.378    '9848132': order #1440223863 buy 2.00 GBPUSD at 1.27248 was modified -> sl: 1.27165 tp: 1.27345
2016.10.06 10:18:31.809    '9848132': modify order #1440223863 buy 2.00 GBPUSD at 1.27248 sl: 0.00000 tp: 1.27345 -> sl: 1.27165 tp: 1.27345
2016.10.06 10:05:18.435    '9848132': order was opened : #1440223863 buy 2.00 GBPUSD at 1.27223 sl: 0.00000 tp: 0.00000

2016.10.06 10:05:17.585    '9848132': order buy market 2.00 GBPUSD sl: 0.00000 tp: 0.00000

 
officeoff:

Ой, извините. Я же забыл уточнить что есть только 1 ордер. На счет OrderClose(), вас понял. Спасибо.

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

 

Даже если это единственный ордер в терминале, не вижу причин выводить приказ на закрытие за рамки  цикла, но это ваш выбор.

Насчёт неооткрывающегося ордера, неужели даже ради интереса лень выводить код ошибки после торгового приказа? Это же первое, что следует делать при написании советника, которого планируется выводить в торговлю.

И ещё рекомендуется принтовать в журнал расчётные данные, для облегчения процесса отладки.

Причина обращения: