Индикатор i2MACross

 

Здравствуйте, нужна помощь с индикатором. Заказывал у программиста очень простой индикатор, который должен давать звуковой сигнал при касании Moving Average. Мне он нужен был для того, чтобы при касании EMA 33 я мог услышать сигнал и подойти к компьютеру для оценки ситуации, в общем для того, чтобы не сидеть все время у компа и не выжидать момента касания. В итоге программист сделал мне индикатор, который с этой функцией якобы успешно справляется. Как я ни пытался его настроить, он сигналит где угодно только не при касании МА, либо вообще не сигналит. Программист же утверждает, что   индикатор работает корректно и сигналит там где нужно, а у меня во всех компах где я его проверял поселились чудо вирусы, мешающие работать именно одному этому индикатору. Ниже я привожу код индикатора, проверьте пожалуйста кто-нибудь у себя, будет ли срабатывать алерт при касании скользящей с настройками по умолчанию, или нет. Заранее благодарен вам


//+------------------------------------------------------------------+
//|                                                    i2MACross.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   2

#property indicator_label1  "UP"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "DN"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrDeepPink
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
  
/*
   Это пересечение двух МА, по умолчанию у быстрой период равен 1, получается цена.

   MA2FastPeriod - Период быстрой MA, период 1  - это просто цена как есть
   MA2FastShift - Смещение быстрой MA
   MA2FastMethod - Метод быстрой MA
   MA2FastPrice - Цена быстрой MA
   MA2SlowPeriod - Период медленной MA
   MA2SlowShift - Смещение медленной MA
   MA2SlowMethod - Метод медленной MA
   MA2SlowPrice - Цена медленной MA

*/  

/*

   Добавлен параметр:
   AlertsBar - бар на котором проверяется стрелка для алерта.
   Может быть значение 1 - сформированный бар или 0 - формирующийся бар.
   Но и на формирующемся баре алерт выполняется тлько один раз за бар,
   после этого стрелка может исчезнуть, потом снова появиться, но алерта не будет.
   Если же каждый раз открывать алерт, он замучает. Или предложите какой-нибудь
   свой вариант.
*/

/*
   ZeroBarArrow - ставить стрелку на нулевом баре.
*/


input bool                             Alerts               =  true;   
input int                              AlertsBar            =  0;
input bool                             ZeroBarArrow         =  false;  
input int                              MA2FastPeriod        =  1;                /*MA2FastPeriod*/ // Период быстрой MA, период 1  - это просто цена как есть
input int                              MA2FastShift         =  0;                /*MA2FastShift*/  // Смещение быстрой MA
input ENUM_MA_METHOD                   MA2FastMethod        =  MODE_SMA;       /*MA2FastMethod*/ // Метод быстрой MA
input ENUM_APPLIED_PRICE               MA2FastPrice         =  PRICE_CLOSE;    /*MA2FastPrice*/  // Цена быстрой MA
input int                              MA2SlowPeriod        =  33;             /*MA2SlowPeriod*/ // Период медленной MA
input int                              MA2SlowShift         =  1;                /*MA2SlowShift*/  // Смещение медленной MA
input ENUM_MA_METHOD                   MA2SlowMethod        =  MODE_EMA;       /*MA2SlowMethod*/ // Метод медленной MA
input ENUM_APPLIED_PRICE               MA2SlowPrice         =  PRICE_CLOSE;    /*MA2SlowPrice*/  // Цена медленной MA

//--- indicator buffers

double MA2FastBuf[];
double MA2SlowBuf[];
double BuyBuf[];
double SellBuf[];

int MA2FastHand;
int MA2SlowHand;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(){

   SetIndexBuffer(0,BuyBuf,INDICATOR_DATA);
   SetIndexBuffer(1,SellBuf,INDICATOR_DATA);
  
   SetIndexBuffer(2,MA2FastBuf,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,MA2SlowBuf,INDICATOR_CALCULATIONS);
  
   PlotIndexSetInteger(0,PLOT_ARROW,233);
   PlotIndexSetInteger(1,PLOT_ARROW,234);
  
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,10);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-10);
  
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
  
   MA2FastHand=iMA(NULL,PERIOD_CURRENT,MA2FastPeriod,MA2FastShift,MA2FastMethod,MA2FastPrice);
   MA2SlowHand=iMA(NULL,PERIOD_CURRENT,MA2SlowPeriod,MA2SlowShift,MA2SlowMethod,MA2SlowPrice);  
      if(MA2FastHand==INVALID_HANDLE || MA2SlowHand==INVALID_HANDLE){
         Alert("Неудалось загрузить индикатор, повторите попытку");
         return(-1);
      }
  
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const datetime & time[],
                 const double & open[],
                 const double & high[],
                 const double & low[],
                 const double & close[],
                 const long & tick_volume[],
                 const long & volume[],
                 const int & spread[]
               ){
   static bool error=true;
   int start,start2;
      if(prev_calculated==0){
         error=true;
      }
      if(error){
         start=MathMax(MA2FastPeriod+MA2FastShift,MA2SlowPeriod+MA2SlowShift);
         start2=start+1;
         error=false;
      }
      else{
         start=prev_calculated-1;
      }
      if(CopyBuffer(MA2FastHand,0,0,rates_total-start,MA2FastBuf)==-1 ||
         CopyBuffer(MA2SlowHand,0,0,rates_total-start,MA2SlowBuf)==-1){
         error=true;
         return(0);
      }
      for(int i=start2;i<rates_total;i++){
         BuyBuf[i]=0;
         SellBuf[i]=0;
            if(MA2FastBuf[i]>MA2SlowBuf[i] && MA2FastBuf[i-1]<=MA2SlowBuf[i-1]){
               BuyBuf[i]=low[i];
            }
            if(MA2FastBuf[i]<MA2SlowBuf[i] && MA2FastBuf[i-1]>=MA2SlowBuf[i-1]){
               SellBuf[i]=high[i];
            }        
      }
     
      if(Alerts){
         static datetime lt=0;
            if(lt==0){
               lt=time[rates_total-1];
            }
            if(lt!=time[rates_total-1]){
               if(BuyBuf[rates_total-1-AlertsBar]!=0){
                  lt=time[rates_total-1];
                  Alert(MQL5InfoString(MQL5_PROGRAM_NAME)+"("+_Symbol+","+fNameTimeFrame(Period())+"): UP");
               }
               if(SellBuf[rates_total-1-AlertsBar]!=0){
                  lt=time[rates_total-1];
                  Alert(MQL5InfoString(MQL5_PROGRAM_NAME)+"("+_Symbol+","+fNameTimeFrame(Period())+"): DN");
               }        
            }
      }
     
      if(!ZeroBarArrow){
         BuyBuf[rates_total-1]=0;
         SellBuf[rates_total-1]=0;
      }
     
   return(rates_total);
}

//+------------------------------------------------------------------+

string fNameTimeFrame(ENUM_TIMEFRAMES arg){
      if(arg==0 || arg==PERIOD_CURRENT){
         arg=Period();
      }
      switch(arg){
         case PERIOD_M1:return("M1");
         case PERIOD_M2:return("M2");
         case PERIOD_M3:return("M3");
         case PERIOD_M4:return("M4");
         case PERIOD_M5:return("M5");
         case PERIOD_M6:return("M6");
         case PERIOD_M10:return("M10");
         case PERIOD_M12:return("M12");
         case PERIOD_M15:return("M15");
         case PERIOD_M20:return("M20");
         case PERIOD_M30:return("M30");
         case PERIOD_H1:return("H1");
         case PERIOD_H2:return("H2");
         case PERIOD_H3:return("H3");
         case PERIOD_H4:return("H4");
         case PERIOD_H6:return("H6");
         case PERIOD_H8:return("H8");
         case PERIOD_H12:return("H12");
         case PERIOD_D1:return("D1");
         case PERIOD_W1:return("W1");
         case PERIOD_MN1:return("MN1");
         default:return("M"+IntegerToString(arg));
      }
}

Automated Trading and Strategy Testing
Automated Trading and Strategy Testing
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
Файлы:
 

Bene_Nota 2012.05.23 12:45

Да, действительно индикатор глючит!

Я так глянул, совершенно безграмотно написан.

 

А не подскажите куда хотя бы смотреть, чтоб исправить его?
 
Bene_Nota:

А не подскажите куда хотя бы смотреть, чтоб исправить его?

Все исправил. Там вообщем делов то на 5 мин.

P.S. Заказывайте впредь индикаторы на этом форуме.

Файлы:
 
Спасибо большое. Дело в том, что работал с программистом уже на протяжении четырех лет, заказывал проекты в сотни раз сложнее, и все нормально делали и решали все мелочи. А тут что-то вдруг не заладилось из-за копеечного индикатора...
 
pusheax:

...

Я так глянул, совершенно безграмотно написан.

Ваши мегаэкспертные оценки просто потрясают! Очень "грамотный" подход - тоже впечатляет. Все непонятное - взять и выкинуть.
 
й
 
kittilu:
й

В аналы форума, и приз зрительских симпатий за самое эффективное набивание рейтинга :)

Хотя не судите строго, новичков нужно лелеять.

 
Urain:

В аналы форума, и приз зрительских симпатий за самое эффективное набивание рейтинга :)

Хотя не судите строго, новичков нужно лелеять.

Ну, вот долелеялись... Теперь чуть ли не в каждой ветке по одному (максимум два) слову штамповка идёт. Но "Й" однозначно хит сезона. )))
 
tol64:
Ну, вот долелеялись... Теперь чуть ли не в каждой ветке по одному (максимум два) слову штамповка идёт. Но "Й" однозначно хит сезона. )))
Так вечный бан никто пока еще не отменял :)
 
Interesting:
Так вечный бан никто пока еще не отменял :)

Будет, как в анекдоте "Муха и слон":

- Вечный кайф!

 )))

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