Почему эксперт на демо торгует не как в тестере

 
Собственно вопрос... каковы могут быть причины. Почему один и тот же алгоритм работает по разному. Журнал смотрел, там тишина... даже ни каких попыток модификации ордера.
 

Вот из тестера, произошла частичная фиксация прибыли с переносом стопа в безубыток (как собственно и было задумано)

 

В то время как на реале эксперт все еще держит позицию, при этом условие фиксации есть и сейчас (давно уже есть)

 

 

Вот условие фиксации 2/3 позиции

 if (OrderType()==OP_BUY && Orders_Total==1 &&
             (BID-OpenPrice)>(OpenPrice-StopLoss) && OrderLot==Lot*3)
            {
             res = OrderClose (Ticket, OrderLot*2/3, BID, 20, 0);
             if (res)
               {
                Alert ("Фиксация прибыли по ",Symb);
                Modify_0 = true;
               }         
            }

 Почему этот алгоритм работает в тестере (1 скрин) и не работает в реале (2 скрин)?

 
Europa:

Вот условие фиксации 2/3 позиции

Почему этот алгоритм работает в тестере (1 скрин) и не работает в реале (2 скрин)?


Избегайте использования сравнения на равенство для переменных с типом double.
 
Где вы задаёте Orders_Total? Когда вы задаёте BID? Почему не округляете OrderLot*2/3? Почему вы не посмотрите лог?
 
vitali_yv:
Где вы задаёте Orders_Total? Когда вы задаёте BID? Почему не округляете OrderLot*2/3? Почему вы не посмотрите лог?


Считаю только ордера "своего" символа

 for(i=OrdersTotal();i>=0;i--)   
      {  
       if (OrderSelect(i,SELECT_BY_POS)==true)  
         { 
          if (OrderSymbol() != Symbol()) continue;                                       
          else Orders_Total = Orders_Total+1;
         } 
      }            

 

double BID = MarketInfo(Symbol(),MODE_BID);

Про ордер лот знаю что лот 0,3 отсюда 0,3*2/3 = 0,2

в логах ничего 

Да и еще уж чтоб вопросов не было

OpenPrice = OrderOpenPrice();
          Ticket = OrderTicket();
          OrderLot = OrderLots();
          StopLoss = OrderStopLoss();
          TakeProfit = OrderTakeProfit();
          Symb = OrderSymbol();
 
PapaYozh:

Избегайте использования сравнения на равенство для переменных с типом double.


А как быть? Например?
 

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

Например этот нормализует и приведет в порядок цену для четырехзнака и пятизнака:

NormalizeDouble(Bid, Digits);
 
Europa:


А как быть? Например?

делать их разность и сравнивать с нулем, т.е. если, например, разность значений двух переменных больше нуля, то, соответственно, значение первой переменной больше второй .
 
Europa:


в логах ничего

Значит сделайте, чтоб было.
 
Europa:

Вот условие фиксации 2/3 позиции

res = OrderClose (Ticket, OrderLot*2/3, BID, 20, 0);              

В этой строке мне не нравится "OrderLot*2/3". Перепишите её хотя бы как "NormalizeDouble (OrderLot*2/3, 2)".

А чтобы понять, заходит советник в условие или нет, можно воткнуть контрольный Print или Alert. 

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