некорректная работа break ?

 
void Trail(int num, int mode, double SL) {
   int TotalOrd, TekOrd, ticket, spr;
   bool ord=false;
   double StopLoss;
   if (mode==OP_SELL) spr=MarketInfo(Symbol(),MODE_SPREAD);
   StopLoss=NormalizeDouble(SL+spr*Point,Digits);
   TotalOrd = OrdersTotal();
   for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
      if (mode==OP_BUY && OrderMagicNumber()==num && OrderType()==mode) {
         if (OrderStopLoss()<StopLoss && StopLoss<=Bid-(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) {
            for (ticket=0;ticket<5;ticket++) {
               counter++;
               if (OrderStopLoss()==StopLoss) break;
               ord=OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,0,0);
               if (ord) break;
               if (!IsTesting()) Sleep(1000);
            }
         }
      }
      if (mode==OP_SELL && OrderMagicNumber()==num && OrderType()==mode) {
         if (OrderStopLoss()>StopLoss && StopLoss>=Ask+(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) {
            for (ticket=0;ticket<5;ticket++) {
               if (OrderStopLoss()==StopLoss) break;
               ord=OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,0,0);
               if (ord) break;
               if (!IsTesting()) Sleep(1000);
            }
         }
      }
   }
return;
}

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

Проблема возникает в том, что модификация не отменяется следующие 4 раза, если прошла успешно, и не отменяется если Лось уже равен лосю ордера..

подскажите что в коде некорректно ?

вот что пишет :

2008.12.20 18:52:38 2008.06.05 05:01 EA_1.4 EURUSD,M1: OrderModify error 1
2008.12.20 18:52:38 2008.06.05 05:01 EA_1.4 EURUSD,M1: OrderModify error 1
2008.12.20 18:52:38 2008.06.05 05:01 EA_1.4 EURUSD,M1: OrderModify error 1
2008.12.20 18:52:38 2008.06.05 05:01 EA_1.4 EURUSD,M1: OrderModify error 1
2008.12.20 18:52:38 2008.06.05 05:01 EA_1.4 EURUSD,M1: OrderModify error 1
2008.12.20 18:52:38 2008.06.05 05:00 EA_1.4 EURUSD,M1: modify #2 buy 0.10 EURUSD at 1.5391 sl: 1.5392 tp: 0.0000 ok

 
Loknar писал(а) >>

Проблема возникает в том, что модификация не отменяется следующие 4 раза, если прошла успешно

Я вижу не 4 раза, а 5, судя по всему это уже следующий тик.

Loknar писал(а) >>

и не отменяется если Лось уже равен лосю ордера..

А Вы уверены что он равен? Выведите на печать. На всякий случай нормализуйте.

 
Figar0 писал(а) >>

Я вижу не 4 раза, а 5, судя по всему это уже следующий тик.

А Вы уверены что он равен? Выведите на печать. На всякий случай нормализуйте.

Вот, равен :

2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: ERROR : 1, ticket : 4
2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: OrderModify error 1
2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: BUY SL : 1.53920000, OSL : 1.53920000, ord : 0, order ticket : 2
2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: ERROR : 1, ticket : 3
2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: OrderModify error 1
2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: BUY SL : 1.53920000, OSL : 1.53920000, ord : 0, order ticket : 2
2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: ERROR : 1, ticket : 2
2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: OrderModify error 1
2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: BUY SL : 1.53920000, OSL : 1.53920000, ord : 0, order ticket : 2
2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: ERROR : 1, ticket : 1
2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: OrderModify error 1
2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: BUY SL : 1.53920000, OSL : 1.53920000, ord : 0, order ticket : 2
2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: ERROR : 1, ticket : 0
2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: OrderModify error 1
2008.12.20 19:23:52 2008.06.05 05:01 EA_1.4 EURUSD,M1: BUY SL : 1.53920000, OSL : 1.53920000, ord : 0, order ticket : 2
2008.12.20 19:23:52 2008.06.05 05:00 EA_1.4 EURUSD,M1: modify #2 buy 0.10 EURUSD at 1.5391 sl: 1.5392 tp: 0.0000 ok

Да следующий тик, для этого и поставил условие что если равен - сразу break

Выводящая функция :

Print("BUY SL : ",DoubleToStr(StopLoss,8),", OSL : ",DoubleToStr(OrderStopLoss(),8),", ord : ",ord,", order ticket : ",OrderTicket());
 

Добавил :

if (OrderStopLoss()==StopLoss) {Print("TEST"); break;}
else Print("SL : ",StopLoss,", OSL : ",OrderStopLoss());

выводит :

2008.12.20 20:03:14 2008.06.05 05:06 EA_1.4 EURUSD,M1: SL : 1.5392, OSL : 1.5392

баг билда?

 

НЕТ, ругается на тейк

OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,0<-!!!!,0);
надо OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0);
 
Если это возможно, попробуй протестировать, подключившись к Альпари серверу. Есть кое-какие сомнения.
 
И еще, замени
if (OrderStopLoss()==StopLoss) break;
на
if (NormalizeDouble(OrderStopLoss(),Digits)==StopLoss) break;

 

Для проверки на равенство чисел с плавающей точкой сравниваю их разность с переменной Point:

Например:

if(MathAbs(OrderStopLoss()-StopLoss)<Point)
 break;

Не знаю, может пригодится и тебе?

О кстати тут тебе и ссылка на сравнение вещественных чисел высветилась,

 
Roger писал(а) >>
И еще, замени
на

Спасибо, помогло!

Не думал что там может быть больше Digits...

 
Luptator писал(а) >>

Для проверки на равенство чисел с плавающей точкой сравниваю их разность с переменной Point:

Например:

Не знаю, может пригодится и тебе?

О кстати тут тебе и ссылка на сравнение вещественных чисел высветилась,

Ага, спасибо, учту

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