Помогите реализовать! Пишу советник с внешним индикатором Aroon UP&DOWN

 

Здравствуйте!

Я изучаю язык mql и столкнулся с такой проблемой, как работать с внешними индикаторами, состоящими из нескольких линий. Например, с таким как Aroon Up&Down.

Конкретно я хочу реализовать такой механизм: покупаем, когда синяя линия выше красной, продаем наоборот.

Я знаю, как пользоваться функцией iCustom, и могу подгружать такие индикаторы, как Laguerre, SSRC и др, и заставлять программу что-то делать (например открывать) ордер по пересечению этим индикатором какого-то уровня. Но как работать с индикатором, состоящим из нескольких линий? Ниже я приложу скриншоты и исходник этого кода.

Дайте, пожалуйста кто может, элементарную наводящую подсказку, какой участок в коде индикатора связан с соответствующими линиями? Если я пойму закономерность, дальше ужу разберусь.

Я так понимаю, что в данном случае надо создавать 2 переменные типа double для каждой линии. Но как их связать с этими линиями?

Помогите, пожалуйста, заранее огромное спасибо!

Индикатор Aroon - внешний вид

//+------------------------------------------------------------------+
//|                                         Custom Aroon Up & Dn.mq4 |
//|                                                        rafcamara |
//|                 Upgraded by Andriy Moraru from www.earnforex.com |
//+------------------------------------------------------------------+
#property  copyright "rafcamara"
#property  link      "rafcamara@yahoo.com"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  DodgerBlue
#property  indicator_color2  Red

//---- indicator parameters
extern int AroonPeriod = 14;
extern bool MailAlert = false;  //Alerts will be mailed to address set in MT4 options
extern bool SoundAlert = false; //Alerts will sound on indicator cross

//---- indicator buffers
double     AroonUpBuffer[];
double     AroonDnBuffer[];

int LastBars = 0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- 2 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(0, AroonUpBuffer);
   SetIndexBuffer(1, AroonDnBuffer);

   //---- drawing settings
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1);
  SetIndexDrawBegin(0,200);
  SetIndexDrawBegin(1,200);
   IndicatorDigits(1);
   
   //---- name for DataWindow and indicator subwindow label
   IndicatorShortName("Aroon Up & Dn("+AroonPeriod+")");
   //---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Aroon Up & Dn                                                    |
//+------------------------------------------------------------------+
int start()  
  {
   double   AroonUp,AroonDn;
   int      ArPer,limit,i;     
   int      UpBarDif,DnBarDif;
   int      counted_bars=IndicatorCounted(); 
   ArPer=AroonPeriod;                  //Short name
   
   //---- check for possible errors
   if(counted_bars<0) return(-1);
   if(AroonPeriod<1) return(-1);      
   //---- initial zero
   if(counted_bars<1)
     {
      for(i=1;i<=ArPer;i++) AroonUpBuffer[Bars-i]=0.0;
      for(i=1;i<=ArPer;i++) AroonDnBuffer[Bars-i]=0.0;
     } 

   //---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   //----Calculation---------------------------
   for( i=0; i<limit; i++)
   {
           int HH = Highest(NULL,0,MODE_HIGH,ArPer,i);   //Periods from HH         
           int LL = Lowest(NULL,0,MODE_LOW,ArPer,i);              //Periods from LL

      UpBarDif = i-HH;                         //Period substraction
      DnBarDif = i-LL;                            //Period substraction
      
      AroonUpBuffer[i]=100+(100/ArPer)*(UpBarDif);            //Adjusted Aroon Up
      AroonDnBuffer[i]=100+(100/ArPer)*(DnBarDif);            //Adjusted Aroon Down

      if (LastBars != Bars)
      {
         if ((AroonUpBuffer[0] > AroonDnBuffer[0]) && (AroonUpBuffer[1] <= AroonDnBuffer[1]))
         {
            if (MailAlert) SendMail("Aroon Up & Down Indicator Alert", "The indicator produced a cross (Blue ABOVE Red) on " + Year() + "-" + Month() + "-" + Day() + " " + Hour() + ":" + Minute());
            if (SoundAlert) Alert("Aroon Up & Down produced a cross (Blue ABOVE Red)");
         }
         else if ((AroonUpBuffer[0] < AroonDnBuffer[0]) && (AroonUpBuffer[1] >= AroonDnBuffer[1]))
         {
            if (MailAlert) SendMail("Aroon Up & Down Indicator Alert", "The indicator produced a cross (Blue BELOW Red) on " + Year() + "-" + Month() + "-" + Day() + " " + Hour() + ":" + Minute());
            if (SoundAlert) Alert("Aroon Up & Down produced a cross (Blue BELOW Red)");
         }
         LastBars = Bars;
      }
   }
   return(0);
  }
Файлы:
 
В ините смотрите имена массивов указывемых при вызове SetIndexBuffer. Первый параметр SetIndexBuffer определяет индекс буфера. Если  0 - линия будет на первом месте во вкладке "цвета" и т.д.
 
crocuta:

Здравствуйте!

Я изучаю язык mql и столкнулся с такой проблемой, как работать с внешними индикаторами, состоящими из нескольких линий. Например, с таким как Aroon Up&Down.

Конкретно я хочу реализовать такой механизм: покупаем, когда синяя линия выше красной, продаем наоборот.

Я знаю, как пользоваться функцией iCustom, и могу подгружать такие индикаторы, как Laguerre, SSRC и др, и заставлять программу что-то делать (например открывать) ордер по пересечению этим индикатором какого-то уровня. Но как работать с индикатором, состоящим из нескольких линий? Ниже я приложу скриншоты и исходник этого кода.

Дайте, пожалуйста кто может, элементарную наводящую подсказку, какой участок в коде индикатора связан с соответствующими линиями? Если я пойму закономерность, дальше ужу разберусь.

Я так понимаю, что в данном случае надо создавать 2 переменные типа double для каждой линии. Но как их связать с этими линиями?

Помогите, пожалуйста, заранее огромное спасибо!

Нулевой буфер - голубой, первый буфер - красный.

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

расшифрую: iCustom(Symbol(), Period(), "Имя вашего индюкатора",
                                     ...через запятую все внешние параметры индикатора в соответствии с их типом,
                                    1
- единица для красной линии (1-й буфер),
                                    1 - единица для первого бара);

При вызове iCustom() в его параметр mode для голубой линии впишите 0, для красной впишите 1. Последним параметром вписывайте номер бара, с которого хотите считать данные буфера индикатора

 
Ура!!!! Спасибо. Видел я этот буфер-муфер, буду разбираться! Низкий поклон!))