Почему не отображаются линии тренда?

 

У меня есть следующий код из источника MT4, и я пытаюсь преобразовать его в MT5, чтобы поделиться в CodeBase. Но ящики, которые я пытаюсь построить, не отображаются.

Пожалуйста, помогите мне с кодом здесь.

Код:

void _DarvasBoxes(int limit)
  {
   string gname;

   for(int shift=limit; shift>=0; shift--)
     {
      if(prevtime != iTime(Symbol(), Period(), shift))
        {
         startState[1]   = startState[0];
         confirmState[1] = confirmState[0];
         boxTop[1]       = boxTop[0];
         boxBottom[1]    = boxBottom[0];
         startTime[1]    = startTime[0];
         endTime[1]      = endTime[0];
         ghostHeight[1]  = ghostHeight[0];
         ghostTime[1]    = ghostTime[0];
         ghostTop[1]     = ghostTop[0];
         ghostBottom[1]  = ghostBottom[0];
         hiPrice[1]      = hiPrice[0];
         loPrice[1]      = loPrice[0];
         prevtime        = iTime(Symbol(), Period(), shift);
        }

      for(int j = 0; j < Length; j++)
        {
         HiArray[j] = iMA_Value(shift+j, HIGH);
         LoArray[j] = iMA_Value(shift+j, LOW);
        }

      double hiBoxPrice = iHigh(Symbol(), Period(), shift);
      double loBoxPrice = iLow(Symbol(), Period(), shift);

      if(DarvasMode == 0 || DarvasMode == 2 || DarvasMode == 4)
        {
         hiPrice[0] = iHigh(Symbol(), Period(), shift);
         loPrice[0] = iLow(Symbol(), Period(), shift);
        }
      else
        {
         hiPrice[0] = iClose(Symbol(), Period(), shift);
         loPrice[0] = iClose(Symbol(), Period(), shift);
        }

      trend[shift]  = trend[shift+1];
      botBox[shift] = botBox[shift+1];
      topBox[shift] = topBox[shift+1];

      double upPivot = DarvasPivot(HiArray,0,PivotStrength);
      double loPivot = DarvasPivot(LoArray,1,PivotStrength);

      if(PivotsMode > 0)
        {
         pivotHi[shift+PivotStrength] = EMPTY_VALUE;
         pivotLo[shift+PivotStrength] = EMPTY_VALUE;

         if(upPivot > 0)
            pivotHi[shift+PivotStrength] = upPivot;
         if(loPivot > 0)
            pivotLo[shift+PivotStrength] = loPivot;
        }

      startState[0]   = startState[1];
      confirmState[0] = confirmState[1];
      boxTop[0]       = boxTop[1];
      boxBottom[0]    = boxBottom[1];
      startTime[0]    = startTime[1];
      endTime[0]      = endTime[1];
      ghostHeight[0]  = ghostHeight[1];
      ghostTime[0]    = ghostTime[1];
      ghostTop[0]     = ghostTop[1];
      ghostBottom[0]  = ghostBottom[1];


      if(startState[0] == 0)
        {
         bool allPivotVerify = false;

         bool upPivotVerify = upPivot > 0 && shift+PivotStrength == iHighest(Symbol(),Period(),MODE_HIGH,RollingPeriod,shift+PivotStrength);
         bool loPivotVerify = loPivot > 0 && shift+PivotStrength == iLowest(Symbol(),Period(),MODE_LOW,RollingPeriod,shift+PivotStrength);

         if(DarvasMode < 2)
            allPivotVerify = upPivotVerify;
         else
            if(DarvasMode < 4)
              {
               if(trend[shift] > 0)
                  allPivotVerify = upPivotVerify;
               else
                  allPivotVerify = loPivotVerify;
              }
            else
               allPivotVerify = upPivotVerify || loPivotVerify;

         if(allPivotVerify)
           {
            startTime[0] = iTime(Symbol(), Period(), shift+PivotStrength);
            if(startTime[0] >= endTime[0])
              {
               if(DarvasMode < 2)
                 {
                  boxTop[0] = upPivot;
                  startState[0] = 1;
                 }
               else
                  if(DarvasMode < 4)
                    {
                     startState[0] = 1;
                     if(trend[shift] > 0)
                        boxTop[0] = upPivot;
                     else
                        boxBottom[0] = loPivot;
                    }
                  else
                    {
                     if(upPivotVerify ||(upPivotVerify && loPivotVerify))
                       {
                        boxTop[0] = upPivot;
                        startState[0] = 1;
                       }
                     else
                       {
                        boxBottom[0] = loPivot;
                        startState[0] =-1;
                       }
                    }

               prevTime      = startTime[0];
               prevState     = startState[0];
              }
           }
        }

      if(startState[0] != 0 && confirmState[0] == 0)
        {
         if(DarvasMode < 2)
           {
            if(upPivot > boxTop[0] || hiBoxPrice > boxTop[0])
              {
               startState[0] = 0;
               startTime[0] = 0;
              }
            else
               if(loPivot > 0 && iTime(Symbol(), Period(), shift) > startTime[0])
                 {
                  confirmState[0] = 1;
                  boxBottom[0] = loPivot;
                  confTime = iTime(Symbol(), Period(), shift);
                 }
           }
         else
            if(DarvasMode < 4)
              {

               if(trend[shift] > 0 && (upPivot > boxTop[0] || hiBoxPrice > boxTop[0]))
                 {
                  startState[0] = 0;
                  startTime[0] = 0;
                 }
               else
                  if(trend[shift] < 0 && ((loPivot > 0 && loPivot < boxBottom[0]) || loBoxPrice < boxBottom[0]))
                    {
                     startState[0] = 0;
                     startTime[0] = 0;
                    }
                  else
                     if(iTime(Symbol(), Period(), shift) > startTime[0])
                       {
                        if(trend[shift] > 0 && loPivot > 0)
                          {
                           confirmState[0] = 1;
                           boxBottom[0] = loPivot;
                           confTime = iTime(Symbol(), Period(), shift);
                          }
                        else
                           if(trend[shift] < 0 && upPivot > 0)
                             {
                              confirmState[0] = 1;
                              boxTop[0]    = upPivot;
                              confTime = iTime(Symbol(), Period(), shift);
                             }
                       }
              }
            else
              {
               if(startState[0] > 0 && (upPivot > boxTop[0] || hiBoxPrice > boxTop[0]))
                 {
                  startState[0] = 0;
                  startTime[0] = 0;
                 }
               else
                  if(startState[0] < 0 && ((loPivot > 0 && loPivot < boxBottom[0]) || loBoxPrice < boxBottom[0]))
                    {
                     startState[0] = 0;
                     startTime[0] = 0;
                    }
                  else
                     if(iTime(Symbol(), Period(), shift) > startTime[0])
                       {
                        if(startState[0] > 0 && loPivot > 0 && confirmState[0] == 0)
                          {
                           confirmState[0] = 1;
                           boxBottom[0] = loPivot;
                           confTime = iTime(Symbol(), Period(), shift);
                          }
                        else
                           if(startState[0] < 0 && upPivot > 0 && confirmState[0] == 0)
                             {
                              confirmState[0] = 1;
                              boxTop[0]    = upPivot;
                              confTime = iTime(Symbol(), Period(), shift);
                             }
                       }
              }
        }
      else
         if(startState[0] != 0 && confirmState[0] != 0)
           {
            if(BoxesMode > 0)
              {
               name = UniqueName + " " + TimeToString(startTime[0]);
               DeleteBox(name);

               if(DarvasMode < 2)
                  PlotBox(name,startTime[0],boxTop[0],iTime(Symbol(), Period(), shift),boxBottom[0],STYLE_SOLID,NeutralColor,BoxWidth,0);
               else
                  if(DarvasMode < 4)
                    {
                     if(trend[shift] > 0)
                        PlotBox(name,startTime[0],boxTop[0],iTime(Symbol(), Period(), shift),boxBottom[0],STYLE_SOLID,NeutralColor,BoxWidth,0);
                     else
                        if(trend[shift] < 0)
                           PlotBox(name,startTime[0],boxBottom[0],iTime(Symbol(), Period(), shift),boxTop[0],STYLE_SOLID,NeutralColor,BoxWidth,0);
                    }
                  else
                    {
                     if(startState[0] > 0)
                        PlotBox(name,startTime[0],boxTop[0],iTime(Symbol(), Period(), shift),boxBottom[0],STYLE_SOLID,NeutralColor,BoxWidth,0);
                     else
                        if(startState[0] < 0)
                           PlotBox(name,startTime[0],boxBottom[0],iTime(Symbol(), Period(), shift),boxTop[0],STYLE_SOLID,NeutralColor,BoxWidth,0);
                    }
              }

            upSignal[shift] = EMPTY_VALUE;
            dnSignal[shift] = EMPTY_VALUE;

            double gap = 0.5*MathCeil(iATR_Value(shift)/Point());

            if(hiPrice[0] > boxTop[0])
              {
               trend[shift]    = 1;
               startState[0]   = 0;
               confirmState[0] = 0;
               endTime[0]      = iTime(Symbol(), Period(), shift);
               startTime[0]    = 0;
               if(SignalMode > 0)
                  upSignal[shift] = iLow(Symbol(), Period(), shift) - gap*Point();
              }

            if(loPrice[0] < boxBottom[0])
              {
               trend[shift]    =-1;
               startState[0]   = 0;
               confirmState[0] = 0;
               endTime[0]      = iTime(Symbol(), Period(), shift);
               startTime[0]    = 0;
               if(SignalMode > 0)
                  dnSignal[shift] = iHigh(Symbol(), Period(), shift) + gap*Point();
              }

            if(ChannelMode > 0)
              {
               botBox[shift] = boxBottom[0];
               topBox[shift] = boxTop[0];
              }

            if(endTime[0] != endTime[1])
              {
               if(BoxesMode > 0)
                 {
                  DeleteBox(name);
                  if(trend[shift] > 0)
                    {
                     PlotBox(name,prevTime,boxTop[0],endTime[0],boxBottom[0],STYLE_SOLID,UpTrendColor,BoxWidth,0);
                     PlotBox(name,prevTime,boxTop[0],endTime[0],boxBottom[0],STYLE_SOLID,UpTrendColor,BoxWidth,1);
                    }
                  else
                     if(trend[shift] < 0)
                       {
                        if(DarvasMode < 2)
                          {
                           PlotBox(name,prevTime,boxTop[0],endTime[0],boxBottom[0],STYLE_SOLID,DnTrendColor,BoxWidth,0);
                           PlotBox(name,prevTime,boxTop[0],endTime[0],boxBottom[0],STYLE_SOLID,DnTrendColor,BoxWidth,1);
                          }
                        else
                          {
                           PlotBox(name,prevTime,boxBottom[0],endTime[0],boxTop[0],STYLE_SOLID,DnTrendColor,BoxWidth,0);
                           PlotBox(name,prevTime,boxBottom[0],endTime[0],boxTop[0],STYLE_SOLID,DnTrendColor,BoxWidth,1);
                          }
                       }
                 }

               if(GhostBoxesMode > 0)
                 {
                  ghostTime[0]   = endTime[0];
                  ghostHeight[0] = boxTop[0] - boxBottom[0];
                  prevGhostTime  = ghostTime[0];

                  if(trend[shift] > 0)
                    {
                     ghostBottom[0] = boxTop[0];
                     ghostTop[0]    = ghostBottom[0] + ghostHeight[0];
                    }
                  else
                    {
                     ghostTop[0]    = boxBottom[0];
                     ghostBottom[0] = ghostTop[0] - ghostHeight[0];
                    }
                 }
              }
           }
         else
            if(prevState > 0 && prevTime > 0 && confTime == iTime(Symbol(), Period(), shift))
               DeleteBox(UniqueName+" "+TimeToString(prevTime));


      if(GhostBoxesMode > 0)
        {
         if(trend[shift] > 0)
           {
            gname = UniqueName+" Ghost "+TimeToString(ghostTime[0]);

            if(confirmState[0] == 0 || (confirmState[0] > 0 && confirmState[1] == 0))
              {
               DeleteBox(gname);
               PlotBox(gname,ghostTime[0],ghostTop[0],iTime(Symbol(), Period(), shift),ghostBottom[0],STYLE_DOT,UpTrendColor,1,0);

               if(hiPrice[0] <= ghostTop[0] && ghostTime[0] == iTime(Symbol(), Period(), shift))
                  DeleteBox(UniqueName+" Ghost "+TimeToString(prevGhostTime));

               if(hiPrice[0] > ghostTop[0] && hiPrice[1] <= ghostTop[1])
                 {
                  PlotBox(gname,ghostTime[0],ghostTop[0],iTime(Symbol(), Period(), shift),ghostBottom[0],STYLE_DOT,UpTrendColor,1,1);

                  ghostTime[0]   = iTime(Symbol(), Period(), shift);
                  ghostBottom[0] = ghostTop[0];
                  ghostTop[0]    = ghostBottom[0] + ghostHeight[0];
                  prevGhostTime  = ghostTime[0];
                 }
              }

            if(confirmState[0] > 0)
              {

               PlotBox(gname,ghostTime[0],ghostTop[0],iTime(Symbol(), Period(), shift),ghostBottom[0],STYLE_DOT,UpTrendColor,1,1);
              }
           }
         else
           {
            gname = UniqueName+" Ghost "+TimeToString(ghostTime[0]);

            if(confirmState[0] == 0 || (confirmState[0] > 0 && confirmState[1] == 0))
              {
               DeleteBox(gname);
               PlotBox(gname,ghostTime[0],ghostTop[0],iTime(Symbol(), Period(), shift),ghostBottom[0],STYLE_DOT,DnTrendColor,1,0);

               if(loPrice[0] >= ghostBottom[0] && ghostTime[0] == iTime(Symbol(), Period(), shift))
                  DeleteBox(UniqueName+" Ghost "+TimeToString(prevGhostTime));

               if(loPrice[0] < ghostBottom[0] && loPrice[1] >= ghostBottom[1])
                 {
                  PlotBox(gname,ghostTime[0],ghostTop[0],iTime(Symbol(), Period(), shift),ghostBottom[0],STYLE_DOT,DnTrendColor,1,1);

                  ghostTime[0]   = iTime(Symbol(), Period(), shift);
                  ghostTop[0]    = ghostBottom[0];
                  ghostBottom[0] = ghostTop[0] - ghostHeight[0];
                  prevGhostTime  = ghostTime[0];
                 }
              }

            if(confirmState[0] > 0)
              {

               PlotBox(gname,ghostTime[0],ghostTop[0],iTime(Symbol(), Period(), shift),ghostBottom[0],STYLE_DOT,DnTrendColor,1,1);
              }
           }
        }
     }
  }



Изображение получено

Я хотел:

Полный код прилагается

Файлы:
 
Есть ли проблема, если я задаю здесь вопросы?
 
jaffer wilson #:
Есть ли проблема, если я задаю здесь вопросы?

нет проблем, Владимира укусила злая собака)

код конечно длинный, 

 
Куда пропал его комментарий? Может кто-нибудь мне помочь? Я не знаю, почему один и тот же код работает на MT4, но не на MT5.
 
jaffer wilson #:
Куда пропал его комментарий? Может кто-нибудь мне помочь? Я не знаю, почему один и тот же код работает на MT4, но не на MT5.

Где функция "void PlotBox(...)"?

 
jaffer wilson #:
Куда пропал его комментарий? Может кто-нибудь мне помочь? Я не знаю, почему один и тот же код работает на MT4, но не на MT5.

Вы неправильно выполняете CopyBuffer. Вы зачем-то постоянно копируете самые ЛЕВЫЕ значения индикатора. Вы неправильно находите текущий бар.

 

Что это?

   SetIndexBuffer(0,  topBox,);
   SetIndexBuffer(1,  botBox);
   SetIndexBuffer(2, pivotHi);
   SetIndexBuffer(3, pivotLo);
   SetIndexBuffer(4,upSignal);
   SetIndexBuffer(5,dnSignal);
   SetIndexBuffer(6,   trend);

Почему не указываете тип буфера?

Справка:

ENUM_INDEXBUFFER_TYPE

ID

Description

INDICATOR_DATA

Data to draw

INDICATOR_COLOR_INDEX

Color

INDICATOR_CALCULATIONS

Auxiliary buffers for intermediate calculations

 
Зачем Вы используете CopyXXX функции, когда у Вас всё есть в OnCalculate?
 
Vitaly Muzichenko # :

Где функция "void  PlotBox (...)"?

Вы найдете его в прикрепленном файле. Я попытался ввести необходимый код, но это было слишком долго.

 
Vladimir Karputov # :

Вы неправильно выполняете CopyBuffer. Вы зачем-то постоянно копируете самые ЛЕВЫЕ значения индикатора. Вы неправильно находите текущий бар.

Я не получил этого предложения. Подскажите, пожалуйста, в какой части я это сделал?

 
Vladimir Karputov # :

Что это?

Почему не указываете тип буфера?

Справка:

ENUM_INDEXBUFFER_TYPE

ID

Description

INDICATOR_DATA

Data to draw

INDICATOR_COLOR_INDEX

Color

INDICATOR_CALCULATIONS

Auxiliary buffers for intermediate calculations

Если я не упомянул тип, по умолчанию используется INDICATOR_DATA.