Столкновение экспертов при использовании нескольких пар... - страница 3

 
А, я разобрался!

Мне нужно было вызвать модификацию ордера из функции "int start()", когда вызывается и "If(IsNewCandle())". Таким образом, на КАЖДОМ закрытии часа, "void OrderModify", который модифицирует отложенный ордер, если orderstoploss > iMA-ATR, будет модифицирован и откалиброван соответствующим образом.

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

Это проблема ... (аналогично для OP_SELL)

... и когда вы получаете ошибку 1, это потому, что OrderStopLoss() == BuyStopPrice, поэтому вы изменяете ордер, чтобы иметь то же значение StopLoss, отсюда и ошибка 1, и теперь вы задаетесь вопросом, как с одной стороны OrderStopLoss() == BuyStopPrice, а с другой стороны OrderStopLoss() < BuyStopPrice.

Вы перешли по ссылке в посте и читали его до крови? Держу пари, что нет... https://www. mql5.com/en/forum/146380 если вы будете продолжать игнорировать эту проблему, она будет продолжать вас ловить, и вы будете продолжать терять время... разберитесь с ней, поймите ее, не страдайте от нее больше, будьте счастливы.


кроме как с нулем никогда не сравнивайте двойки на равенство < Может это то, что я искал по WHRoeder...?
if (a > b)
if (a - b > Point / 2.)
if (a >= b)
if (a - b > -Point)
if (a != b)
if (MathAbs(a - b) > Point / 2.)
 
DomGilberto:

кроме как с нулем, никогда не сравнивать двойники на равенство < Может быть, это то, что я искал по WHRoeder...?
Конечно, это будет работать, вы понимаете, почему и в чем проблема?
 
Честно говоря, нет, я не понимаю... Хотя я экспериментировал с выписыванием и распечаткой сравнений...
 
DomGilberto:
Честно говоря, я не понимаю... Хотя я экспериментировал с записью и распечаткой сравнений...

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

Взгляните на это: числа с плавающей запятой

 

Но почему бы NormalizedDouble, Digits не разобраться с этим? Зачем включать лишние ненужные знаки после запятой? Я понимаю, что не нужно использовать NormalizeDouble для предопределенных переменных, но какой смысл использовать NormalizeDouble для не предопределенных переменных, а затем пытаться сравнить их, если они никогда не совпадут :s?

Странно!

Если бы я хотел сделать "If(Bid > OrderOpenPrice())", это бы не сработало? Нужно ли мне делать правила, указанные выше, для каждого оператора сравнения, т.е. "If(Bid - OrderOpenPrice() > Point / 2.)"?


О, и что If(Bid == OrderOpenPrice()), есть ли что-то, что мне нужно сделать с этим утверждением?

 
DomGilberto:

Но почему бы NormalizedDouble, Digits не разобраться с этим? Зачем включать лишние ненужные знаки после запятой? Я понимаю, что вам не нужно использовать NormalizeDouble для предопределенных переменных, но какой смысл использовать NormalizeDouble для не предопределенных переменных, а затем пытаться сравнить их, если они никогда не совпадут :s?

NormalizeDouble не исправляет проблему, он не превращает 1 .51234000001 в 1.51234, он просто "возится" с ним по-другому... поэтому, используя его, вы надеетесь, что он возится со всеми вашими значениями одинаково.

DomGilberto:


Если бы я хотел сделать "If(Bid > OrderOpenPrice())", это бы не сработало? Нужно ли мне делать правила, указанные выше, для каждого оператора сравнения, т.е. "If(Bid - OrderOpenPrice() > Point / 2.)"?

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

ДомЖильберто:

О, и что If(Bid == OrderOpenPrice()), есть ли что-то, что мне нужно сделать с этим утверждением?

Да, он будет страдать от точно такой же проблемы...
 
Ок, спасибо - я значительно уменьшил количество ошибок OrderModify error 1 - однако, я все еще получаю немного время от времени? Похоже, что это из-за недействительности MA_trail? Также, как мне правильно написать "If(Bid == OrderOpenPrice())?
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//Moving Average Trailing Stop Function
//+----------------------------------------------------------------------------------------------------------------------------------------+   
void MA_Trail()

{

   double ATR = iATR(NULL,60,14,1);
   double MA = iMA(NULL,60,MA_Period,0,1,0,1);
   
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   
   double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5);
   double SellStopPrice = NormalizeDouble(SellStopPriceMath,5);

   for(int b=OrdersTotal()-1; b>=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {

               if(OrderType()==OP_BUY)
                  {
                  if(OrderStopLoss() - BuyStopPrice > Point / 2.) continue;
                  if(BuyStopPrice - OrderStopLoss() > Point / 2.)
                     bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                   if(!BuyModify)Print(" Buy Trailing Stop Failed: ", GetLastError());
                   }     

    
               if(OrderType()==OP_SELL)
                  {
                  if(SellStopPrice - OrderStopLoss() > Point / 2. ) continue;
                  if(OrderStopLoss() - SellStopPrice > Point / 2. )
                     bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                  if(!SellModify)Print(" Sell Trailing Stop Failed: ", GetLastError());
                  }
              }   
      }
} 
 
DomGilberto:
Ок, спасибо - я значительно уменьшил количество ошибок OrderModify error 1 - однако, я все еще получаю немного время от времени? Похоже, что это из-за пустоты MA_trail? Также, как мне правильно написать "If(Bid == OrderOpenPrice())?

Ваши глаза недостаточно кровоточат...

Вы можете сделать что-то вроде этого:

!( MathAbs(FirstPrice - SecondPrice) > HalfAPoint )

будьте осторожны !

Отсюда: https://www.mql5.com/en/forum/136997/page4#781986

 
Вы предлагаете это в связи с кодом выше или в связи с "If(Bid == OrderOpenPrice())"?
Причина обращения: