Нужна помощь, чтобы заметить небольшую ошибку. - страница 4

 
Если это так, то я прав и в своем первом коде, я вызываю OrderSelect() сразу после первого цикла for ...... Проблема теперь в том, что трейлинг стоп лосс не работает должным образом, и я все еще не знаю, где проблема.
 
juniorlcq: использует цикл обратного отсчета, но с x-- . Я не понимаю, почему вы предлагаете --x, хотя .
  1. x++ читает значение, сохраняет копию, увеличивает значение, сохраняет новое значение в x иизвлекает копию для последующего использования.
  2. ++x читает значение, увеличивает значение, сохраняет новое значение в x.
  3. Для целых чисел это не имеет особого значения. На некоторых платформах последний оператор является единственной инструкцией, что делает его в несколько раз быстрее.
  4. Для классов (как и итераторов) у вас есть дополнительный вызов конструктора и деструктора, что делает его во много раз быстрее.
    Префиксный оператор++
    Постфиксный оператор++
    RaRev* RaRev::operator++(void){         // prefix
       ++mPos;
       return GetPointer(this); // Allow (++It).Get()
    }
    
    RaRev RaRev::operator++(int){               // postfix
       RaRev  orig(this); // Make a copy to return.
       ++this;            // Increment myself.
       return orig;       // Return the original position.
    }
    
    В большинстве реализаций STL вы часто будете видеть "iterator last=end; --end;", а не "iterator last=end--".

 

Скажем, цена поднимается на 600 пунктов от OrderOpenprice(), = StartTraillingStop (200) + 8(xai)*50

код находится здесь:

  if ( xai >= 8 ) 
    {
    if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) )
        {
        if ( OrderStopLoss() == ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * ( xai - 1 ) ) ) * Figure ) ) )
           {
            Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * xai ) ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
       }
    }

но код будет делать все xai от 0 до 8, скажем, код находится на xai = 4; это условие истинно?

if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) )

да, тогда SL будет установлен на : StartTraillinStop (200) + 4(xai)*50 (идет вниз от предыдущего)

тогда xai 5, SL будет установлен на : StartTraillinStop (200) + 5(xai)*50.

и так далее, поэтому невозможно поставить прерывание после установки SL;

 

juniorlcq Ваш код гораздо легче читать, теперь вы его переформатировали. Я переформатировал его немного больше, чтобы сделать его меньше для размещения, я выделил возможные проблемы. Я думаю, что у вас может быть проблема "double == calculated double", которая мешает вашему коду выполнять некоторые траектории. Вы когда-нибудь читали тему о can price != price ?

Наибольшее подозрение у меня вызывают 2-й и 4-й пункты, так как они представляют собой более сложные вычисления.

Поместите операторы Print() после этих вычислений, чтобы проверить, действительно ли они делают == или нет.

Ошибка, известная как ошибка плавающей точки, может сделать их !=, даже если кажется, что они должны быть ==.

== действительно на 100% безопасно использовать только с целыми числами, поэтому вы можете изменить == на <= или >= в качестве теста.

  void ProcessTrailingStop()
 {
  bool Result;
  for(int x=(OrdersTotal()-1); x>=0; x--)
  {if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)==True)
   {PointsDetection();
    if(OrderType()==OP_BUY)
    {for(int xai=0; xai<NumberOfTrail; xai++)
     {if(xai==0)
      {if(((OrderClosePrice()-OrderOpenPrice())/Figure)>=StartTrailingStop)
       {if(( OrderStopLoss()==0) || (OrderStopLoss()<(OrderOpenPrice()+(TrailingStop*Figure))))
        {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice()+(TrailingStop*Figure)),OrderTakeProfit(),0,Color);
      }}}
      if(xai==1)
      {if(((OrderClosePrice()-OrderOpenPrice())/Figure)>=(StartTrailingStop+CummulativeValue))
       {if(OrderStopLoss()==(OrderOpenPrice()+(TrailingStop*Figure)))
        {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice()+((TrailingStop+CummulativeValue)*Figure)),OrderTakeProfit(),0,Color);
      }}}
      if(xai>=2)
      {if(((OrderClosePrice()-OrderOpenPrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xai)))
       {if(OrderStopLoss()==(OrderOpenPrice()+(( TrailingStop+(CummulativeValue *(xai-1)))*Figure)))
        {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice()+(( TrailingStop+(CummulativeValue*xai))*Figure)),OrderTakeProfit(),0,Color);
    }}}}}else
    {if(OrderType()==OP_SELL)
     {for(int xaii=0; xaii<NumberOfTrail; xaii++)
      {if(xaii==0)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=StartTrailingStop)
        {if(( OrderStopLoss()==0) || (OrderStopLoss()>(OrderOpenPrice() -(TrailingStop*Figure))))
         {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(TrailingStop*Figure)),OrderTakeProfit(),0,Color);
       }}}
       if(xaii==1)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+CummulativeValue))
        {if(OrderStopLoss()==(OrderOpenPrice() -(TrailingStop*Figure)))
         {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+CummulativeValue)*Figure)),OrderTakeProfit(),0,Color);
       }}}
       if(xaii>=2)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xaii)))
        {if(OrderStopLoss()==(OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure)))
         {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(),0,Color);
 }}}}}}}}}


Также в качестве примечания: Ваш код будет намного эффективнее, если вы вызовете OrderOpenPrice(), OrderStopLoss(), OrderClosePrice() один раз в начале цикла OrderSelect() и присвоите их значения локальным переменным для использования во всем остальном коде. Доступ к локальным переменным намного быстрее, чем к вызовам функций, поэтому вам следует избегать повторных вызовов функций для получения одного и того же результата... Как правило, чем больше розовых надписей в вашем коде, тем медленнее будет работать советник.

 

Я понимаю, я не могу заставить его работать, этот может работать с ордером buy, SL опускаются вниз, как объясняется:

   extern double CummulativeValue = 50.0 ;
   extern int    NumberOfTrail = 100 ;



  void ProcessTrailingStop()
   {
       double Figure = Point;
    color Color = Yellow;
  
    bool Result ;
         for ( int x =  OrdersTotal(); x >= 0 ; x-- )
         {
         if ( OrderSelect ( x , SELECT_BY_POS , MODE_TRADES ) == false) continue;
        if ( OrderType() == OP_BUY )
           {
                 for ( int xai = 0 ; xai < NumberOfTrail ; xai++ )
                     {
                        if ( xai == 0 )
                        {
                           if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= StartTrailingStop )
                           {
                              if ( OrderStopLoss() == 0 ) 
                              {
                               Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( TrailingStop * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                          } } }                        
                  
                        if ( xai == 1 )
                           {
                           if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + CummulativeValue ) )
                           {
                           Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + CummulativeValue ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                          } }                         
                        
                        if ( xai >= 2 )
                           {
                          if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) )
                           {
                           Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * xai ) ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                        } }                         
                     }
                  }
                  
       }}           
 
WHRoeder:
  1. x++ читает значение, сохраняет копию, увеличивает значение, сохраняет новое значение в x иизвлекает копию для последующего использования.
  2. ++x читает значение, увеличивает значение, сохраняет новое значение в x.
  3. Для целых чисел это не имеет особого значения. На некоторых платформах последний вариант является единственной инструкцией, что делает его в несколько раз быстрее.
  4. Для классов (таких как итераторы) у вас есть дополнительный вызов конструктора и деструктора, что делает его во много раз быстрее.
    Префиксный оператор++
    Постфиксный оператор++
    В большинстве реализаций STL вы часто будете видеть "iterator last=end; --end;", а не "iterator last=end--".


Охххххх я не знал об этом . Спасибо WHRoeder :) .

Так значит ли это, что ,

допустим, OrdersTotal() == 3, с циклом обратного отсчета for ( int x = ( OrdersTotal() - 1 ) ; x >= 0 ; x-- ) , x сохранит первое значение как 2, затем продолжит цикл for с 2 и далее, не проходя через OrdersTotal() снова ?

 
SDC:

juniorlcq Ваш код гораздо легче читать, теперь вы его переформатировали. Я переформатировал его немного больше, чтобы сделать его меньше для размещения, я выделил возможные проблемы. Я думаю, что у вас может быть проблема "double == calculated double", которая мешает вашему коду выполнять некоторые траектории. Вы когда-нибудь читали тему о can price != price ?

У меня наибольшее подозрение вызывают 2-й и 4-й пункты, так как они являются более сложными вычислениями.

Поместите операторы Print() после этих вычислений, чтобы увидеть, действительно ли они делают == или нет.

Ошибка, известная как ошибка плавающей точки, может сделать их !=, даже если кажется, что они должны быть ==.

== действительно на 100% безопасно использовать только с целыми числами, поэтому вы можете изменить == на <= или >= в качестве теста.



Нет, я не читал эту тему раньше. Только сейчас нашел.

То, что вы предложили, звучит логично. Если подумать, то иногда при рисовании линий в MT4 на свойствах цены она не показывает 5-значную цену, а иногда показывает что-то большее.

Но вот одна из моих плавающих сделок на предыдущем счете, я распечатал ее, чтобы посмотреть, как выглядит двойник с помощью простой кодировки печати. Странный MQL4 я думаю @.@ ?

Я все еще думаю, как мне модифицировать часть double == double ......

SDC:


Также в качестве примечания: ваш код будет намного эффективнее, если вы вызовете OrderOpenPrice(), OrderStopLoss(), OrderClosePrice() один раз в начале цикла OrderSelect() и присвоите их значения локальным переменным для использования во всем остальном коде. Доступ к локальным переменным намного быстрее, чем к вызовам функций, поэтому вам следует избегать повторных вызовов функций для получения одного и того же результата... Как правило, чем больше в коде розовых надписей, тем медленнее будет работать советник.

Ооо, я не знал, что будет огромная разница в скорости исполнения, спасибо за руководство SDC. Буду модифицировать в соответствии с вашим руководством после того, как след стоп начал работать.

 

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

       if(xaii>=2)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xaii)))
        {Print("debug2.1: first condition true");
         if(OrderStopLoss()==(OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure)))
         {Print("debug2.2: second condition true");
          Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(),0,Color);
         }else
         {Print("debug2.2: second condition false");
          Print("debug2.2: val1=",OrderStopLoss()," val2=",OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure));
 }}}}}}}}}

Возможно, это что-то покажет, вы можете сделать что-то подобное и с другими условиями ==.

 
SDC:

Попробуйте заменить последний блок кода на эту отладочную версию. Вы можете сделать что-то подобное с xa

Возможно, это что-то покажет, вы можете сделать что-то подобное и с другими условиями ==.


Да, проблема вылезла наружу, это проблема " double == calculated double problem ". Спасибо, что указали на проблему SDC.

Спасибо ffoorr за то, что указали на ту же проблему ранее, но я не отредактировал ее правильным образом и думал, что проблема не в этом.

У меня вопрос, мне нужно некоторое предложение, для 2-го и 3-го if во втором цикле for, лучше ли поместить в него оператор "between"? Например, OrderStopLoss() >= x + 1 && x - 1 ? Или лучше просто использовать >= или <= ?

 

Надеюсь, WHR не прочитает это, он будет в ярости, но я собираюсь сказать вам попробовать NormalizeDouble() .... это должно сделать эти условия равными, когда они должны быть равными. Не должно быть необходимости делать это и для стороны OrderStopLoss(), но если они все еще не равны, когда должны, вы можете попробовать сделать это для обеих сторон условия.....

       if(xaii>=2)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xaii)))
        {Print("debug2.0: condition true");
         if(OrderStopLoss()==NormalizeDouble((OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure)),Digits));
         {Print("debug2.1: condition true");
          Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(),0,Color);
         }else
         {Print("debug2.1: condition false");
          Print("debug2.1: val1=",OrderStopLoss()," val2=",OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure));
 }}}}}}}}}
Причина обращения: