MQL4. Проблема со сдвигом индикатора.

 

Здравствуйте. Написала индикатор 2 МА с сдвигом в сторону и вверх. Но возникла проблема, когда двигаю индикатор в бок получается так:

 

помогите найти ошибку в коде.

//+------------------------------------------------------------------+
//|                                                   MA2_Signal.mq4 |
//|                                                         Mr. Gold |
//|                                         anna.furmanova@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Mr. Goldt"
#property link      "anna.furmanova@yandex.ru"

//---- Определение индикаторов
#property indicator_chart_window
#property indicator_buffers 4
//---- Цвета
#property indicator_color1 Magenta // 5
#property indicator_color2 Blue        // 7
#property indicator_color3 MediumBlue
#property indicator_color4 Tomato
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 1
#property indicator_width4 1

//--- Параметры
extern int    Period_MA1=5;       // Период быстрой МА
extern int    Period_MA2=7;       // Период медленной МА
extern int    Mode_MA1=1;         // Метод (0 = SMA, 1 = EMA, 2 = SMMA, 3 = LWMA)
extern int    Mode_MA2=1;         // Метод (0 = SMA, 1 = EMA, 2 = SMMA, 3 = LWMA)
extern int    Price_MA1=0;        // Цена (0 = Close, 1 = Open, 2 = High, 3 = Low, 4 = HL/2, 5 = HLC/3, 6 = HLCC/4)
extern int    Price_MA2=1;        // Цена (0 = Close, 1 = Open, 2 = High, 3 = Low, 4 = HL/2, 5 = HLC/3, 6 = HLCC/4)
extern int    Ma_shift_MA1=0;     // Сдвиг по вертикали быстрой МА
extern int    Shift_MA1=0;        // Сдвиг по горизонтали быстрой МА
extern int    Ma_shift_MA2=0;     // Сдвиг по вертикали медленной МА
extern int    Shift_MA2=0;        // Сдвиг по горизонтали медленной МА
extern bool   EnableAlert=true;
extern string SoundFileName = "";

//---- Буферы
double FastMA[];
double SlowMA[];
double CrossUp[];
double CrossDown[];
  static int bBuy  = 0;
  static int bSell = 0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
  //---- Установка параметров прорисовки
  //     Средние
  SetIndexStyle( 0, DRAW_LINE );
  SetIndexStyle( 1, DRAW_LINE );
  //     Сигналы
  SetIndexStyle( 2, DRAW_ARROW, EMPTY );
  SetIndexArrow( 2, 233 );
  SetIndexStyle( 3, DRAW_ARROW, EMPTY );
  SetIndexArrow( 3, 234 );
  
  //---- Задание буферов
  SetIndexBuffer( 0, FastMA    );
  SetIndexBuffer( 1, SlowMA    );
  SetIndexBuffer( 2, CrossUp   );
  SetIndexBuffer( 3, CrossDown );
  
  IndicatorDigits( MarketInfo( Symbol(), MODE_DIGITS ) );
  
  //---- Название и метки
  IndicatorShortName( "MA2_Signal(" + Period_MA1 + "," + Period_MA2 );
  SetIndexLabel( 0, "MA("+ Period_MA1 + "," + Period_MA2+")" + Period_MA1 );
  SetIndexLabel( 1, "MA(" + Period_MA1 + "," + Period_MA2+")" + Period_MA2 );
  SetIndexLabel( 2, "Buy"  );
  SetIndexLabel( 3, "Sell" );
  
  return ( 0 );
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
  
  bool   bConditionUp;
  bool   bConditionDown;
  double Range;
  double AvgRange;
  int    iLimit;
  int    i;
  int    counter;
  int    counted_bars = IndicatorCounted();
  
  //---- check for possible errors
  if ( counted_bars < 0 ) 
    return ( -1 );
  
  //---- last counted bar will be recounted
  if ( counted_bars > 0 ) counted_bars--;
  
  iLimit = Bars - counted_bars;

  for ( i = iLimit; i >=0; i-- ) {
    FastMA[i] = iMA( NULL, 0, Period_MA1, 0, Mode_MA1, Price_MA1, i+Shift_MA1);
    SlowMA[i] = iMA( NULL, 0, Period_MA2, 0, Mode_MA2, Price_MA2, i+Shift_MA2);
    AvgRange = 0;
    bConditionUp = 0;
    bConditionDown = 0;
    FastMA[i]=FastMA[i] + Ma_shift_MA1*Point ;
    SlowMA[i]=SlowMA[i] + Ma_shift_MA2*Point;
    for ( counter = i; counter <= i + 9; counter++ ) {
      AvgRange += MathAbs( High[ counter ] - Low[ counter ] );
    }
    Range = AvgRange/10;
      bConditionUp   = ( FastMA[i+1] >= SlowMA[i+1] ) &&
                       ( FastMA[i+2] <= SlowMA[i+2] ) &&
                       ( FastMA[i] > SlowMA[i]); // пересечение вверх
      bConditionDown = ( FastMA[i+1] <= SlowMA[i+1] ) &&
                       ( FastMA[i+2] >= SlowMA[i+2] ) &&
                       ( FastMA[i] < SlowMA[i]); // пересечение вниз
    if ( bConditionUp) {//
      CrossUp[i+1] = SlowMA[i+1]-Range * 0.75;
      CrossDown[i+1] = EMPTY_VALUE; 
      bConditionDown = false;
    }
    
    if ( bConditionDown) {//
      CrossDown[i+1] = SlowMA[i+1]+Range * 0.75;
      CrossUp[i+1] = EMPTY_VALUE;
      bConditionUp = false;
    } 
    
    if (!bConditionUp && !bConditionDown) {
      CrossDown[i+1] = EMPTY_VALUE;
      CrossUp[i+1] = EMPTY_VALUE;
    } 
    
    if (bConditionUp && !bBuy==1 && i==0 && EnableAlert){
      bBuy  = 1;  // установка флага покупки
      bSell = 0; // сброс флага продажи
      Alert (Symbol()," ",Period(),"M  Achtung BUY "); // звуковой сигнал
      if ( SoundFileName != "" ) PlaySound( SoundFileName );
    }
    if (bConditionDown && !bSell==1 && i==0 && EnableAlert){
      bBuy  = 0;  // установка флага покупки
      bSell = 1; // сброс флага продажи
      Alert (Symbol()," ",Period(),"M   Achtung SELL "); // звуковой сигнал
      if ( SoundFileName != "" ) PlaySound( SoundFileName );
    }
    //Comment ("Buy-"+bBuy+"\nSell-"+bSell);
  } // for
   
  //return ( 0 );
}
//for buy
//      if (bBuy==0 && i < 1 && EnableAlert) {
//        //Alert (Symbol()," ",Period(),"M  Achtung BUY "); // звуковой сигнал
//         Alert ("Buy-",bBuy," ",i," ",EnableAlert);        
//        if ( ExtSoundFileName != "" ) PlaySound( ExtSoundFileName );
//      }

//      if (bSell==0 && i < 1 && EnableAlert) {
//         //Alert (Symbol()," ",Period(),"M   Achtung SELL "); 
//         Alert ("Sell-",bSell," ",i," ",EnableAlert);
//         if ( ExtSoundFileName != "" )    PlaySound( ExtSoundFileName );
//      } 
Файлы:
 
Anna_89:

Здравствуйте. Написала индикатор 2 МА с сдвигом в сторону и вверх. Но возникла проблема, когда двигаю индикатор в бок получается так:

 

помогите найти ошибку в коде.

PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
 
Anna_89:

Здравствуйте. Написала индикатор 2 МА с сдвигом в сторону и вверх. Но возникла проблема, когда двигаю индикатор в бок получается так:

 

помогите найти ошибку в коде.

Для исправления некорректной отрисовки необходимо в init() добавить

  SetIndexEmptyValue(0,0);
  SetIndexEmptyValue(1,0);
Файлы:
Причина обращения: