Скачать MetaTrader 5

Непредусмотренный кодом сдвиг данных в массиве

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Интересуешься социальным трейдингом? Прочти соответствующую статью!
Forex Trader
114255
Forex Trader 2005.10.25 15:59 
Уже писАл, но не получил ни слова в ответ, массив с данными сдвигается

//+------------------------------------------------------------------+
//|                                                  GANN_rvm_v4.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 DeepSkyBlue
#property indicator_color2 Black
#property indicator_color3 DeepSkyBlue
#property indicator_color4 Black
#property indicator_color5 Yellow
#property indicator_color6 DarkSlateBlue
#property indicator_color7 Red
#property indicator_color8 Red
//---- input parameters
extern int       NextTF=15;
extern int       BL_Range=5;
extern int       HLN_Range=3;
extern bool      HLN_UseFullTF=false;
//---- buffers
double HLNUp_sl[];
double HLNDn_sl[];
double HLNUp[];
double HLNDn[];
double BLLev[];
double BLStep[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
//---- 
int NextTFs;
int initfl;
int Displacement;
int dig;
int ArrSize;
int ArrIdx;
int lb,lBars;
double MyArr[][10];
double oldValue;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexStyle(4,DRAW_LINE);
   SetIndexStyle(5,DRAW_LINE);
   SetIndexStyle(6,DRAW_LINE);
   SetIndexStyle(7,DRAW_LINE);
   SetIndexBuffer(0,HLNUp_sl);
   SetIndexBuffer(1,HLNDn_sl);
   SetIndexBuffer(2,HLNUp);
   SetIndexBuffer(3,HLNDn);
   SetIndexBuffer(4,BLLev);
   SetIndexBuffer(5,BLStep);
   SetIndexBuffer(6,ExtMapBuffer7);
   SetIndexBuffer(7,ExtMapBuffer8);
   SetIndexLabel(0,"HLNextUp_sec");
   SetIndexLabel(1,"HLNextDn_sec");
   SetIndexLabel(2,"HLNextUp");
   SetIndexLabel(3,"HLNextDn");
   SetIndexLabel(4,"BalansLevel");
   SetIndexLabel(5,"BalansStep");
   SetIndexLabel(6,"1");
   SetIndexLabel(7,"2");
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexEmptyValue(2,0.0);
   SetIndexEmptyValue(3,0.0);
   SetIndexEmptyValue(4,0.0);
   SetIndexEmptyValue(5,0.0);
   SetIndexEmptyValue(6,0.0);
   SetIndexEmptyValue(7,0.0);
//----
   NextTFs=NextTF*60;
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted();
   int cb,i,limit;
//---- 
   if( initfl!=1 )
   {
      myInit();
      if( initfl!=1 )
      {
         Alert("Индикатор не инициализирован!");
         return(-1);
      }
   }
   if( counted_bars>=0 )
   {
      if( Bars-1-counted_bars<=0 )
      {
         limit=0;
      }
      else
      {
         limit=Bars-1-counted_bars;
      }
   }
   else
   {
      Alert("Сбой! /n counted_bars < 0");
      return(-1);
   }
   //цикл по барам
   for( cb=limit;cb>=0;cb-- )
   {
      //если это первый бар
      if( cb==Bars-1 )
      {
         if( FBar(cb)<0 )
         {
            return(-1);
         }
         continue;
      }
      else
      {
         //если это новый бар
         if( lBars!=Bars || lb!=Bars-1-cb )
         {
            lBars=Bars;
            lb=Bars-1-cb;
            //если он к тому же начало нового бара на старшем т-ф
            if( BBarBegin(cb,NextTF)!=1 )
            {
               if( NewBar(cb)<0 )
               {
                  return(-1);
               }
               //если нулевая запись поменялась на новый бар
               if( oldValue!=MyArr[0][0] )
               {
                  if( cb==0 )
                  {
                     Print("  изменение на новый бар "+oldValue+" "+MyArr[0][0]);
                     oldValue=MyArr[0][0];
                  }
               }
            }
            else
            {
               if( NBBar(cb)<0 )
               {
                  return(-1);
               }
               //если нулевая запись поменялась на новый бар старшего т-ф
               if( oldValue!=MyArr[0][0] )
               {
                  if( cb==0 )
                  {
                     Print("  изменение на новый бар старшего т-ф "+oldValue+" "+MyArr[0][0]);
                     oldValue=MyArr[0][0];
                  }
               }
            }
         }
         else
         {
            if( NewTic(cb)<0 )
            {
               return(-1);
            }
            //если нулевая запись поменялась на тик
            if( oldValue!=MyArr[0][0] )
            {
               if( cb==0 )
               {
                  Print("  изменение на тик "+oldValue+" "+MyArr[0][0]);
                  oldValue=MyArr[0][0];
               }
            }
         }
      }
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+--------------------------------------------------------------------+
//| Функция возвращает истину, если бар является началом бара старшего |
//| т-ф                                                                |
//+--------------------------------------------------------------------+
bool BBarBegin(int bar, int TF)
  {
//---- 
   bool bbegin=0;
   if(TF!=10080)
   {
      if( MathFloor(Time[bar]/NextTFs)*NextTFs>Time[bar+1] )
      {
         bbegin=1;
      }
   }
   else
   {
      if( (MathFloor((Time[bar]+259200)/NextTFs)*NextTFs-259200)>Time[bar+1] )
      {
         bbegin=1;
      }
   }
//----
   return(bbegin);
  }
//+--------------------------------------------------------------------+

//+------------------------------------------------------------------+
// Функция начальной инициализации индикатора                        |
//+------------------------------------------------------------------+
void myInit()
  {
  int ArrSize,Displacement,arcount,i,BR;
//---- 
   //определяем количество баров младшего т-ф содержащихся в баре старшего т-ф
   if( NextTF<10080)
   {
      Displacement=NextTF/Period();
   }
   else
   {
      if( NextTF==10080 )
      {
         Displacement=7200/Period();
      }
      else
      {
         if( NextTF==43200 )
         {
            Displacement=31680/Period();
         }
      }
   }
//---------
   SetIndexShift(0,Displacement);
   SetIndexShift(1,Displacement);
   SetIndexShift(4,Displacement);
   SetIndexShift(5,Displacement);
   SetIndexDrawBegin(0,Displacement*HLN_Range);
   SetIndexDrawBegin(1,Displacement*HLN_Range);
   SetIndexDrawBegin(2,Displacement*HLN_Range);
   SetIndexDrawBegin(3,Displacement*HLN_Range);
   SetIndexDrawBegin(5,0);
   SetIndexDrawBegin(6,Displacement*BL_Range);
//---------
   //если неверно указаны параметры BL_Range,HLN_Range
   if( BL_Range<1 || HLN_Range<1 )
   {
      Alert("Неверно указаны параметры иникатора!");
      return(-1);
   }
   BR=MathMax(BL_Range,HLN_Range);
   //если на графике недостаточно данных
   if( Bars<BR*Displacement )
   {
      Alert("На графике недостаточно данных");
      return(-1);
   }
   //если неверно указан параметр NextTF
   if( NextTF<=Period() )
   {
      Alert("Неверно указан параметр NextTF !/n Значение должно быть больше /n текущего т-ф в минутах");
      return(-1);
   }
   //количество знаков до которых будут округляться расчеты
   dig=Digits;
   //определяем необходимый размер массива и его последний индекс
   ArrSize=BR;
   ArrIdx=BR-1;
   //100 попыток на изменение размера массива
   for( i=0;i<100;i++)
   {
      arcount=ArrayResize(MyArr,ArrSize);
      if( arcount>0 )
      {
         break;
      }
   }
   //100 попыток на инициализацию массива
   for( i=0;i<100;i++)
   {
      arcount=0;
      arcount=ArrayInitialize(MyArr,0.0);
      if( arcount>0 )
      {
         break;
      }
   }
   initfl=1;
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Функция отрабатывающая на каждый тик если это не новый бар       |
//+------------------------------------------------------------------+
int NewTic( int Bar )
  {
//---- 
   int i;
   double sH,sL,sBL;
   if( High[Bar]>MyArr[ArrIdx][3] ) MyArr[ArrIdx][3]=High[Bar];
   if( Low[Bar] <MyArr[ArrIdx][4] ) MyArr[ArrIdx][4]=Low[Bar];
   MyArr[ArrIdx][5]=Close[Bar];
   MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig);
   //цикл по массиву
   for( i=ArrIdx;i>=ArrIdx+1-BL_Range;i-- )
   {
      sBL+=MyArr[i][6];
   }
   MyArr[ArrIdx][7]=NormalizeDouble(sBL/BL_Range,dig);
   for( i=ArrIdx;i>=ArrIdx+1-HLN_Range;i-- )
   {
      sH+=MyArr[i][3];
      sL+=MyArr[i][4];
   }
   MyArr[ArrIdx][8]=NormalizeDouble(sH/HLN_Range,dig);
   MyArr[ArrIdx][9]=NormalizeDouble(sL/HLN_Range,dig);
   //отрисовываем на графике
   for( i=Bars-1-MyArr[ArrIdx][0];i>=Bars-1-MyArr[ArrIdx][1];i-- )
   {
      BLLev[i]=MyArr[ArrIdx][6];
      BLStep[i]=MyArr[ArrIdx][7];
      HLNUp_sl[i]=MyArr[ArrIdx][8];
      HLNDn_sl[i]=MyArr[ArrIdx][9];
   }
   if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 )
   {
      Alert("Сбой расчета индикатора на новом тике!");
      return(-1);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Функция отрабатывающая на первый бар на графике                  |
//+------------------------------------------------------------------+
int FBar( int Bar )
  {
//---- 
   //начинаем записывать в массив
   MyArr[ArrIdx][0]=Bars-1-Bar;
   MyArr[ArrIdx][1]=Bars-1-Bar;
   MyArr[ArrIdx][2]=Open[Bar];
   MyArr[ArrIdx][3]=High[Bar];
   MyArr[ArrIdx][4]=Low[Bar];
   MyArr[ArrIdx][5]=Close[Bar];
   MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig);
   BLLev[Bar]=MyArr[ArrIdx][6];
   if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 )
   {
      Alert("Ошибка просчета 1 бара!");
      return(-1);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Функция отрабатывающая при появлении нового бара 1 раз           |
//+------------------------------------------------------------------+
int NewBar( int Bar )
  {
//---- 
   int i;
   double sH,sL,sBL;
   MyArr[ArrIdx][1]=Bars-1-Bar;
   if( High[Bar]>MyArr[ArrIdx][3] ) MyArr[ArrIdx][3]=High[Bar];
   if( Low[Bar] <MyArr[ArrIdx][4] ) MyArr[ArrIdx][4]=Low[Bar];
   MyArr[ArrIdx][5]=Close[Bar];
   MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig);
   //цикл по массиву
   for( i=ArrIdx;i>=ArrIdx+1-BL_Range;i-- )
   {
      sBL+=MyArr[i][6];
   }
   MyArr[ArrIdx][7]=NormalizeDouble(sBL/BL_Range,dig);
   for( i=ArrIdx;i>=ArrIdx+1-HLN_Range;i-- )
   {
      sH+=MyArr[i][3];
      sL+=MyArr[i][4];
   }
   MyArr[ArrIdx][8]=NormalizeDouble(sH/HLN_Range,dig);
   MyArr[ArrIdx][9]=NormalizeDouble(sL/HLN_Range,dig);
   //отрисовываем на графике
   for( i=Bars-1-MyArr[ArrIdx][0];i>=Bars-1-MyArr[ArrIdx][1];i-- )
   {
      BLLev[i]=MyArr[ArrIdx][6];
      BLStep[i]=MyArr[ArrIdx][7];
      HLNUp_sl[i]=MyArr[ArrIdx][8];
      HLNDn_sl[i]=MyArr[ArrIdx][9];
   }
   if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 )
   {
      Alert("Ошибка просчета нового бара!");
      return(-1);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Функция отрабатывающая при появлении нового бара старшего т-ф    |
//+------------------------------------------------------------------+
int NBBar( int Bar )
  {
//---- 
   int i;
   double sH,sL,sBL;
   //сдиг по стеку в массиве
   for( i=0;i<ArrIdx;i++)
   {
      MyArr[i][0]=MyArr[i+1][0];
      MyArr[i][1]=MyArr[i+1][1];
      MyArr[i][2]=MyArr[i+1][2];
      MyArr[i][3]=MyArr[i+1][3];
      MyArr[i][4]=MyArr[i+1][4];
      MyArr[i][5]=MyArr[i+1][5];
      MyArr[i][6]=MyArr[i+1][6];
      MyArr[i][7]=MyArr[i+1][7];
      MyArr[i][8]=MyArr[i+1][8];
      MyArr[i][9]=MyArr[i+1][9];
   }
   MyArr[ArrIdx][0]=Bars-1-Bar;
   MyArr[ArrIdx][1]=Bars-1-Bar;
   MyArr[ArrIdx][2]=Open[Bar];
   MyArr[ArrIdx][3]=High[Bar];
   MyArr[ArrIdx][4]=Low[Bar];
   MyArr[ArrIdx][5]=Close[Bar];
   MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig);
   //цикл по массиву
   for( i=ArrIdx;i>=ArrIdx+1-BL_Range;i-- )
   {
      sBL+=MyArr[i][6];
   }
   MyArr[ArrIdx][7]=NormalizeDouble(sBL/BL_Range,dig);
   for( i=ArrIdx;i>=ArrIdx+1-HLN_Range;i-- )
   {
      sH+=MyArr[i][3];
      sL+=MyArr[i][4];
   }
   MyArr[ArrIdx][8]=NormalizeDouble(sH/HLN_Range,dig);
   MyArr[ArrIdx][9]=NormalizeDouble(sL/HLN_Range,dig);
   //отрисовываем на графике
   BLLev[Bar]=MyArr[ArrIdx][6];
   BLStep[Bar]=MyArr[ArrIdx][7];
   HLNUp_sl[Bar]=MyArr[ArrIdx][8];
   HLNDn_sl[Bar]=MyArr[ArrIdx][9];
   if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 )
   {
      Alert("Ошибка просчета нового бара старшего т-ф!");
      return(-1);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий