Ошибка OrderModify ERROR 1 при изменения уровня стопа функцией трейлингстопа! Как исправить? - страница 3

 
rsi:
Рецепт простой: вместо

if((OrderStopLoss()>... ) писать if((OrderStopLoss()-1.0*Point)>... ),

а вместо

if((OrderStopLoss()<... ) писать if((OrderStopLoss()+1.0*Point<... )

Вместо 1.0* можно, наверное, и 0.5*  и 5.0* - на любителя.




Привет. Будь добр, объясни суть итих изменений. Мне вот действительно помогло, только не совсем понятно - как?
 
price=NormalizeDouble(priceA,Digits);
stop=NormalizeDouble(stopA,Digits);
profit=NormalizeDouble(profitA,Digits);
if(OrderSelect(ticketS[0],SELECT_BY_TICKET)==true)
   if(OrderOpenPrice()!=price || OrderStopLoss()!=stop || OrderProfit()!=profit)
      OrderModify(OrderTicket(),price,stop,profit,0,CLR_NONE);

всё равно выдаёт ошибку 1

получается что if(.. || .. || ..) не срабатывает

и такое if((<> || <> )|| <>) тоже не срабатывает

 
PSIH:

всё равно выдаёт ошибку 1

получается что if(.. || .. || ..) не срабатывает

и такое if((<> || <> )|| <>) тоже не срабатывает


Не стОит проверять абсолютное равенсnво или неравенство чисел типа double. Поскольку мы имеем дело с ценами, которые имеют шаг Point, то, мы можем считать, что две цены равны, если абсолютная разность их значений меньше, скажем, чем 0.5*Point. Поэтому, оператор

if(OrderOpenPrice()!=price || OrderStopLoss()!=stop || OrderProfit()!=profit)

правильно записать, как

if( (MathAbs(OrderOpenPrice()-price)>lvl) || (MathAbs(OrderStopLoss()-stop)>lvl) || (MathAbs(OrderProfit()-profit)>lvl) )

Где переменную lvl следует определить выше, как, например:

double lvl = 0.5*Point;
 

что-то зациклились на этой ошибке..

преодолеть данную ошибку может только здравый смысл..

никакие проверки не помогут избежать ее, по той простой причине, что ошибка возникает, если изменение уровней стопов происходит слишком часто, т.е.

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

суть в том, что даже если новые уровни стопов корректны и требуют изменения (по условию трала), то цена может дернуться в сторону уже имеющегося

уровня стопа и изменение будет не по той цене (расчетной на момент изменения), а по цене с учетом реального движения цен..

изменившись в соответствии с реалиями, уровни стопа по факту могут быть стать теми же, что есть на момент изменения уровня и вуаля ошибка 1

 
Dmitriy:
Semica, ОГРОМНОЕ СПАСИБО! Ну почему таким доступным языком нельзя написать весь мануал к MT4?! Дорогие разработчики представьте что перед группой писателей стоит задача написать самый интересный рассказ не важно какой но с одним условием писать на идише! Как вы думаете выявит ли такой отбор действительно самого талантливого писателя или всё же победит только тот, кто знает идиш? В ваших же интересах достич максимально популярности MT4 - так напишите же наконец за 3 года полный и доступный хелп вместо записок соседу разработчику, вернувшемуся после отпуска для того чтобы он наверстал упущенное. А это выглядит именно так, если программисты со стажем не могут с первого раз понять, что к чему, и только методом "научного тыка" проясняют ситуацию. ПОЖАЛУЙСТА ПРИСЛУШАЙТЕСЬ! Все вам скажут только СПАСИБО!

Это исправление меняет логическую основу советника, то есть, если раньше на ура Ваш советник брал огромную прибыль и не обращал внимание на этот (своего рода), пустяк с сервером, то когда становится все правильно - прибыль исчезает и приходится его дорабатывать, или отказываться от такого рода затеи. Так что этот атрибут надо исправлять сразу и уже только потом делать какие-либо расчеты из этого, то есть, этой ошибки не должно быть в расчетах. Так что, все что не нужно: нормализуем и умножаем на ноль и скорей всего(это я еще не проверял, но предполагаю), то что не надо менять - умножать на единицу.

И я вот, последний раз очень часто менял тайк-профит и все получалось. Так что от частоты не зависит правильность.

 

вот рабочий трал

void TrailingPositions()

  {

   datetime t=0;

   double SLoss=0;

   double   TStop=NormalizeDouble(TrailingStop*Point,Digits());

   double   TStep=NormalizeDouble(TrailingStep*Point,Digits());   

   

   for(int i=OrdersTotal()-1;i>=0;i--)

     {

      if(OrderSelect(i,SELECT_BY_POS))

        {

         if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

           {

            if(OrderType()==OP_BUY)

              {

               if(Bid-OrderOpenPrice()>TStop)

                 {

                  if(OrderStopLoss()<Bid-(TStop+TStep))

                    {

                     SLoss=NormalizeDouble(Bid-TStop,Digits());

                     if(OrderStopLoss()!=SLoss)

                       {

                        if(OrderOpenTime()>t)

                        {

                           t=OrderOpenTime();

                           if(!OrderModify(OrderTicket(),OrderOpenPrice(),SLoss,0,0,Blue))

                             {

                              Print("BUY Trailing Stop False! Error = ",GetLastError());

                             }

                        }    

                       }

                    }

                 }

              }

            if(OrderType()==OP_SELL)

              {

               if(OrderOpenPrice()-Ask>TStop)

                 {

                  if(OrderStopLoss()>Ask+(TStop+TStep) || OrderStopLoss()==0)

                    {

                     SLoss=NormalizeDouble(Ask+TStop,Digits());

                     if(OrderStopLoss()!=SLoss)

                       {

                        if(OrderOpenTime()>t)

                           {

                              t=OrderOpenTime();

                              if(!OrderModify(OrderTicket(),OrderOpenPrice(),SLoss,0,0,Blue))

                                {

                                 Print("SELL Trailing Stop False! Error = ",GetLastError());

                                }

                           }    

                       }

                    }

                 }

              }

           }

        }

     }

  }

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