помогите исправить код

 

случайно обнаружил в индикаторе ошибку - сигнал появляется с запозданием на 2 бара. в параметрах это должен регулировать установленный фильтр Ds - по его окончании и должен появляться сигнал, но этот сигнал появляется через 2+Ds бара после пересечения линий. Вот эти 2 бара лишние и есть необходимость убрать. Все что смог сам исправить - отметил в комментариях (две строчки) и это вроде правит ошибку, если верить тестеру, но волнуюсь за коректность работы индикатора на реале. 

Помогите исправить ошибку корректно

 for(int i=0; i<ArraySize(trends); i++)
     {
      if(trends[i].try==false)
        {
         ObjectDelete(0, "fline_"+IntegerToString(trends[i].num));
         if(DelLine==false && trends[i].rez==1)
            CreateLine("fline_"+IntegerToString(trends[i].num), sbw,false,trends[i].tmL, trends[i].valL,trends[i].tmR, trends[i].valR, eSSL3, eWSL3, Clr3);
         else
            if(DelLine==false && trends[i].rez==2)
               CreateLine("fline_"+IntegerToString(trends[i].num), sbw,false,trends[i].tmL, trends[i].valL,trends[i].ttm, trends[i].ppm, eSSL3, eWSL3, Clr3);
         ClassDelete(i);
         i=-1;
         continue;
        }

      if(trends[i].try==true)
        {
         max=iBarShift(Symbol(), 0, trends[i].shift)-1;
         srt=iBarShift(Symbol(), 0, trends[i].tmR);
         for(int j=max; j>0; j--)
           {
            if(srt-j>Live)
              {
               trends[i].try=false;
               i=-1;
               break;
              }
            if(trends[i].type==1)
              {

               val=trends[i].valR-((srt-j)*trends[i].step);

               if(trends[i].prob==true)
                 {
                  if(irsi(j)<val || irsi(j)>LevelUp)
                    {
                     trends[i].try=false;
                     i=-1;
                     break;
                    }
                  if(iBarShift(Symbol(), 0, trends[i].shift)-j>=Ds-2)   //в оригинале ...=Ds, я изменил на ...=Ds-2  для не запаздывания сигнала на 2 бара
                    {
                     trends[i].try=false;
                     trends[i].rez=2;
                     trends[i].ttm=Time[j];
                     trends[i].ppm=val;
                     if(RevSig==false)
                       {
                        UpBuffer[j-1]=20;
                        dtm2=Time[j-1];
                        zAlert(Time[j-1],TimeToString(Time[j-1])+" "+Symbol()+" Buy, период RSI="+IntegerToString(RSIP)+", уровни составляют "+DoubleToString(LevelDn,2)+" и "+DoubleToString(LevelUp,2));
                       }
                     else
                        if(RevSig==true)
                          {
                           DnBuffer[j-1]=20;
                           dtm2=Time[j-1];
                           zAlert(Time[j-1],TimeToString(Time[j-1])+" "+Symbol()+" Sell, период RSI="+IntegerToString(RSIP)+", уровни составляют "+DoubleToString(LevelDn,2)+" и "+DoubleToString(LevelUp,2));
                          }
                     i=-1;
                     break;
                    }
                 }

               if(trends[i].prob==false)
                 {
                  trends[i].shift=Time[j];
                  if(irsi(j)>val)
                    {
                     if(srt-j>=Lprob)
                        trends[i].prob=true;
                     else
                        if(srt-j<Lprob)
                          {
                           trends[i].try=false;
                           i=-1;
                           break;
                          }
                    }
                  else
                     if(val<LevelDn || irsi(j)>LevelUp)
                       {
                        trends[i].try=false;
                        i=-1;
                        break;
                       }
                 }
              }

            if(trends[i].type==2)
              {
               val=trends[i].valR+((srt-j)*trends[i].step);

               if(trends[i].prob==true)
                 {
                  if(irsi(j)>val || irsi(j)<LevelDn)
                    {
                     trends[i].try=false;
                     i=-1;
                     break;
                    }
                  if(iBarShift(Symbol(), 0, trends[i].shift)-j>=Ds-2)   //в оригинале ...=Ds, я изменил на ...=Ds-2  для не запаздывания сигнала на 2 бара
                    {
                     trends[i].try=false;
                     trends[i].rez=2;
                     trends[i].ttm=Time[j];
                     trends[i].ppm=val;
                     if(RevSig==false)
                       {
                        DnBuffer[j-1]=20;
                        dtm2=Time[j-1];
                        zAlert(Time[j-1],TimeToString(Time[j-1])+" "+Symbol()+" Sell, период RSI="+IntegerToString(RSIP)+", уровни составляют "+DoubleToString(LevelDn,2)+" и "+DoubleToString(LevelUp,2));
                       }
                     else
                        if(RevSig==true)
                          {
                           UpBuffer[j-1]=20;
                           dtm2=Time[j-1];
                           zAlert(Time[j-1],TimeToString(Time[j-1])+" "+Symbol()+" Up, период RSI="+IntegerToString(RSIP)+", уровни составляют "+DoubleToString(LevelDn,2)+" и "+DoubleToString(LevelUp,2));
                          }
                     i=-1;
                     break;
                    }
                 }

               if(trends[i].prob==false)
                 {
                  trends[i].shift=Time[j];
                  if(irsi(j)<val)
                    {
                     if(srt-j>=Lprob)
                        trends[i].prob=true;
                     else
                        if(srt-j<Lprob)
                          {
                           trends[i].try=false;
                           i=-1;
                           break;
                          }
                    }
                  else
                     if(val>LevelUp || irsi(j)<LevelDn)
                       {
                        trends[i].try=false;
                        i=-1;
                        break;
                       }
                 }
              }
           }
        }
     }
  }

к "писателю" за исправлением не обращаюсь из-за его вечных проблем с интернетом и, кажется, "языковым" барьером

 
Shoker:

случайно обнаружил в индикаторе ошибку - сигнал появляется с запозданием на 2 бара. в параметрах это должен регулировать установленный фильтр Ds - по его окончании и должен появляться сигнал, но этот сигнал появляется через 2+Ds бара после пересечения линий. Вот эти 2 бара лишние и есть необходимость убрать. Все что смог сам исправить - отметил в комментариях (две строчки) и это вроде правит ошибку, если верить тестеру, но волнуюсь за коректность работы индикатора на реале. 

Помогите исправить ошибку корректно

к "писателю" за исправлением не обращаюсь из-за его вечных проблем с интернетом и, кажется, "языковым" барьером

Тут вряд ли стоило лезть в код. Да и этого куска мало для выяснения сути. Совет простой: Если лифт увозит на 2 этажа выше, нажимайте кнопку на 2 единицы меньше. Надо на четвертый - нажимайте 2. Я понятно выразился?

 

сигнал скорее всего появляется именно тогда когда он может быть определён однозначно и неизменно. Это визуально кажется что "опоздание на 1-2 бара". Просто спустя 1-2 бара положение линий уже не изменится, поэтому скорее всего именно так.

Вряд-ли автор кода идиот.

 
a007 #:

Тут вряд ли стоило лезть в код. Да и этого куска мало для выяснения сути. Совет простой: Если лифт увозит на 2 этажа выше, нажимайте кнопку на 2 единицы меньше. Надо на четвертый - нажимайте 2. Я понятно выразился?


спасибо. Думал также, от того и спустил на 2 этажа ниже добавив "-2"
 
Maxim Kuznetsov #:

сигнал скорее всего появляется именно тогда когда он может быть определён однозначно и неизменно. Это визуально кажется что "опоздание на 1-2 бара". Просто спустя 1-2 бара положение линий уже не изменится, поэтому скорее всего именно так.

Вряд-ли автор кода идиот.


с определением сигнала в определенный момент из-за перерисовки - это предусмотренно. Фильтр проверяет условие для отмены сигнала и должен это делать не с момента появления сигнала, а с момента наступления условий формирования сигнала.