Вопрос по коду.

 

Написал Трэйл для советника, принцип прост - если bid+0.0001==OrderTakeProfit(), ордер модифицируется, повышая takeprofit и stoploss. Проблема в том, что bid "какой то не правильный", посмотрите на скриншоты. В момент закрытия сделок buy по take'у, функция пишет, что бид на самом деле равен 1.1223(с плюсом в один пункт, строка "order don't ready..."), при этом синяя линия находится в цене 1.1229. Почему такой рассинхрон - это вопрос.

Значения ДОЗначения ПОСЛЕ

Сам код TrailBuy =

void TrailBuy(){ //Повышает трэйлы ордеров бай

      double StopLoss;

      bool SL;

      

      Print("TrailBuy has started for order#",OrderTicket());

      if (OrderTakeProfit()==MarketInfo(Symbol(),MODE_BID)+0.0001){

         Print("  order ready to changed");

         while (SL!=true){

            StopLoss=OrderTakeProfit()-StopLevel;

            if (OrderOpenPrice()<StopLoss) SL=true;

               else StopLoss-0.0001;

            Print("  find stop-loss = ",StopLoss);

         }

         if (!OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit()+TakeLevel,0,clrNavy)){

            Print("  modificate has crashed...");

            if (GetLastError()==130) StopLoss=StopLoss+0.0001;

               Print("  ...stop-loss up to ",StopLoss);

            if (GetLastError()==1) Print("   Trailbuy:",OrderTicket());

               Print("  ...invalid ticket ",OrderTicket());

         }

         else{

            Print(" Order№",OrderTicket()," has changed TrailBuy - take:",OrderTakeProfit()," stop:",OrderStopLoss()," and StopLoss=",StopLoss);

         }

      }

      else Print("   order don't ready to changed need - ",OrderTakeProfit(),"/",MarketInfo(Symbol(),MODE_BID)+0.0001);

   }



код Trail(откуда вызывается TrailBuy) = 

void Trail(){ //узел, контролирует усреднение и повышение тэйков

      if (check_Trail){

         for (int i=0;i<=OrdersTotal();i++){

            OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

            if (OrderMagicNumber() == MN){

               if (OrderType()==0)TrailBuy();

               if (OrderType()==1)TrailSell();

            }

            Averaging('s');

            Averaging('b');

            check_Trail=false;

         }

      }

   }
 

Вариант 1: 

На графике цены одни в реальности смотри что отображается в Обзоре рынка;

Бид он и есть Bid. Зачем вызывать через МаркетInfo/ Хотя и так можно. 

Наверняка на 4-х знаке используется StopLevel. А возможно и Freezlevel;

for (int i=0;i<=OrdersTotal();i++)

.Здесь потенциальная ошибка. Всего ордеров может быть 5, но по порядковому номеру отсчет начнется с 0. поэтому 

либо 

for (int i=0;i<=OrdersTotal();i++)

либо 

for (int i=0;i<OrdersTotal();i++)

Если не будет соблюдаться вот это правило 

if (OrderTakeProfit()==MarketInfo(Symbol(),MODE_BID)+0.0001)

то всегда будет надпись 

else Print("   order don't ready to changed need - ",OrderTakeProfit(),"/",MarketInfo(Symbol(),MODE_BID)+0.0001);

на каждом тике.

Зачем это надо - не понятно. 


 
Dmitiry Ananiev:

Вариант 1: 

На графике цены одни в реальности смотри что отображается в Обзоре рынка;

Бид он и есть Bid. Зачем вызывать через МаркетInfo/ Хотя и так можно. 

Наверняка на 4-х знаке используется StopLevel. А возможно и Freezlevel;

.Здесь потенциальная ошибка. Всего ордеров может быть 5, но по порядковому номеру отсчет начнется с 0. поэтому 

либо 

либо 

Если не будет соблюдаться вот это правило 

то всегда будет надпись 

на каждом тике.

Зачем это надо - не понятно. 


И плюс к этому еще нужно напомнить о правильном сравнении вещественных чисел. Условие:

if (OrderTakeProfit()==MarketInfo(Symbol(),MODE_BID)+0.0001)

далеко не всегда будет срабатывать, даже если в по задумке автора оно должно срабатывать. Я бы это условие переписал так:

if (MathAbs(OrderTakeProfit() - (MarketInfo(Symbol(),MODE_BID)+0.0001)) < Point() / 10) то...

То есть точное соответствие вещественных чисел во многих случаях получить невозможно. Нужно сравнивать их разность с некоторой дельтой. Точность этой дельты выбирается в каждом случае по-разному.

 
Ihor Herasko:

И плюс к этому еще нужно напомнить о правильном сравнении вещественных чисел. Условие:

далеко не всегда будет срабатывать, даже если в по задумке автора оно должно срабатывать. Я бы это условие переписал так:

То есть точное соответствие вещественных чисел во многих случаях получить невозможно. Нужно сравнивать их разность с некоторой дельтой. Точность этой дельты выбирается в каждом случае по-разному.


еще и рынок, редко когда ходит точно по одному пункту - пролетит мимо)
сравнивать надо >=