Подробное объяснение iCustom

 

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

Я новичок в кодинге и многому учусь, однако я столкнулся с чем-то, что не могу понять в данный момент. Я пытаюсь вызвать результат теста в одном из моих индикаторов в ea, чтобы он мог добавить его в свои собственные тесты перед тем, как разместить сделку. ea - это простой кросс скользящих средних. Индикатор - трендовый или диапазонный индикатор. Я прикрепил код индикатора.

Я хотел бы получить помощь и, если возможно, простое объяснение, чтобы я мог понять, как это должно быть настроено внутри индикатора, чтобы ea распознала его. Как только я разберусь с индикатором, я перейду к ea.

Индикатор имеет два теста, в которые я хотел бы добавить функцию iCustom. На данном этапе я хочу добавить ее только в один тест, неважно в какой, так как я пытаюсь понять его. Любой, кто готов помочь и просто объяснить это, был бы очень полезен - я не могу найти в сети ничего, что объясняло бы это так, чтобы я понял. Результат теста может быть просто "истинным".

Заранее спасибо за уделенное время.
Майк

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Yellow
#property  indicator_color2  Red
#property  indicator_width1  1

//---- indicator parameters
extern string PairName = "";   // Leave blank for the pair of the chart, enter other pair name to compare correlated pairs

extern int StdDev.MA.Period=12;  // D1=20
extern int StdDev.MA.Shift=0;    //
extern int StdDev.MA.Method = 0; // 0=SMA 1=EMA 2=Smoothed 3=Linear Weighted
extern int StdDev.MA.Price = 0;  // 0 Close price, 1 Open price, 2 High price, 3 Low price, 4 Median price, (high+low)/2, 5 Typical price, (high+low+close)/3, 6 Weighted close price, (high+low+close+close)/4

extern int MA.Fast.Period = 3;
extern int MA.Fast.Method = 2;   //  0=SMA 1=EMA 2=Smoothed 3=Linear Weighted
extern int MA.Fast.Shift = 0;

extern bool CheckOncePerBar = true;

int i, limit, counted_bars;
static string Pair1;

datetime CurrentTimeStamp;

//---- indicator buffers
double     STDBuffer[];
double     stddevma[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  
   IndicatorDigits(Digits+1);
     
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE); // 
   SetIndexStyle(1,DRAW_LINE);

      
//---- indicator buffers mapping
   SetIndexBuffer(0, STDBuffer);
   SetIndexBuffer(1, stddevma);

   
   if (PairName == "") Pair1 = Symbol();
   else Pair1 = PairName;

//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("SFX TOR: "+Pair1+"("+StdDev.MA.Period+")");
   SetIndexLabel(0,"StdDev");
   SetIndexLabel(1,"StdDev MA");

//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
  {

   counted_bars=IndicatorCounted();
   
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   
//---- macd counted in the 1-st buffer
  for(int i=limit-1; i>=0; i--){
     STDBuffer[i]=iStdDev(Pair1,0,StdDev.MA.Period, StdDev.MA.Shift, StdDev.MA.Method, StdDev.MA.Price, i);
     }
  for(i=limit-1; i>=0; i--){
     stddevma[i] = iMAOnArray(STDBuffer, 0, MA.Fast.Period, MA.Fast.Shift, MA.Fast.Method, i);
     } 
    
//Execute on bar Open
    if( CheckOncePerBar == true ){
      if( CurrentTimeStamp == Time[0] )
         return( 0 );
   }
   
   CurrentTimeStamp = Time [0];
   
//Tests
        
      if( STDBuffer[1] > stddevma[1] ){
      if( STDBuffer[2] <= stddevma[2]){
         PlaySound("alert.wav");
         Alert(Symbol()," M",Period()," 30MCrossing");
         SendMail("30MCrossing","30MCrossing");
      }   
   }
   else{ // if it's not greater then it is either lesser than or equal
      if( STDBuffer[2] >= stddevma[2]){
         PlaySound("alert.wav");
         Alert(Symbol()," M",Period()," 30MCrossing");
         SendMail("30MCrossing","30MCrossing");  
      }
   }
          
//---- done
   return(0);
  }
 

iCustom позволяет вам получить доступ к буферам ваших индикаторов... все просто.

Например, вы пишете советник, стратегия которого основана на двух индикаторах, вы можете встроить код индикатора в советник, это возможно, но немного сложно, поскольку буферы индикаторов не работают в советниках, вам придется использовать массивы и обрабатывать их "как серию" ... альтернативой является запуск индикаторов и доступ к их буферам из советника ... это то, что iCustom облегчает. Никаких изменений в индикаторах не требуется ... ... советник просто получает доступ к нужным ему буферам при нужных ему значениях сдвига. В вызове iCustom он также может передавать любые внешние переменные, необходимые для настройки индикатора, в зависимости от ситуации.

 
RaptorUK:

iCustom позволяет вам получить доступ к буферам ваших индикаторов... все просто.

Например, вы пишете советник, стратегия которого основана на двух индикаторах, вы можете встроить код индикатора в советник, это возможно, но немного сложно, поскольку буферы индикаторов не работают в советниках, вам придется использовать массивы и обрабатывать их "как серию" ... альтернативой является запуск индикаторов и доступ к их буферам из советника ... это то, что iCustom облегчает. Никаких изменений в индикаторах не требуется ... ... советник просто получает доступ к нужным ему буферам при нужных ему значениях сдвига. В вызове iCustom он также может передать любые внешние переменные, необходимые для настройки индикатора.


Спасибо за это RaptorUK, однако именно с кодированием у меня возникают трудности. Я очень новичок в MQL4, занимаюсь им всего пару месяцев и все еще учусь - поэтому мне нужно простое объяснение кодирования и того, как установить его в индикатор.

Спасибо

Майк

 

RaptorUK:

В вызове iCustom можно также передать любые внешние переменные, необходимые для настройки индикатора.

Коррекция ...

В вызове iCustom

ДОЛЖЕН

также передать любые внешние переменные, необходимые для настройки индикатора, если это применимо.
 
NewCoder47:


Спасибо за это RaptorUK, однако именно с кодированием у меня возникают трудности. Я очень новичок в MQL4, занимаюсь им всего пару месяцев и все еще учусь - поэтому мне нужно простое объяснение кодирования и того, как его настроить в индикаторе.

Спасибо

Майк

Вы, очевидно, не понимаете, что в индикаторе не используется iCustom . Индикатор - это отдельный кусок кода. Ваш советник может подглядывать за тем, что происходит в индикаторе, используя команду iCustom .

https://docs.mql4.com/indicators/iCustom

https://forum.mql4.com/42002

 
dabbler:

Коррекция ...

В вызове iCustom

ДОЛЖНО

также передавать любые внешние переменные, которые необходимы для настройки индикатора, если это применимо.
Можно оставить внешние значения пустыми. В этом случае индикатор iCustom() будет использовать значения по умолчанию.
 
dabbler:

Коррекция ...

В вызове iCustom

ДОЛЖНО

также передавать любые внешние переменные, которые необходимы для настройки индикатора, если это применимо.

Я читал разные утверждения по этому поводу... Я никогда не использовал iCustom, поэтому не могу говорить из личного опыта... но верно ли ваше утверждение, даже если внешние переменные по умолчанию - это то, что нужно?
 
RaptorUK:
Я читал разные утверждения по этому поводу... Я никогда не использовал iCustom, поэтому не могу говорить из личного опыта... но верно ли ваше утверждение, даже если внешние переменные по умолчанию - это то, что нужно?
Да. Проблема в том, что последние два параметра iCustom являются решающими, поэтому вы не можете ничего опустить.
 
dabbler:
Да. Проблема в том, что последние два параметра iCustom имеют решающее значение, поэтому нельзя ничего опускать.
Конечно... спасибо.
 
ubzen:
Можно оставить внешние значения пустыми. Тогда индикатор iCustom() будет использовать значения по умолчанию.
Нет, нельзя. Я только что попробовал. Он не скомпилируется, если вы опустите один из параметров, просто оставив пустое место между запятыми.
 
NewCoder47:


.... Я очень новичок в MQL4, занимаюсь им всего пару месяцев и все еще учусь, поэтому мне нужно простое объяснение кодирования и как настроить его в индикаторе.....

Я узнал индикатор как индикатор Trend_Or_Range от BarrowBoy. Ключом к пониманию индикаторов является понимание массивов. У меня был здоровый страх перед массивами, пока я не понял, что использую их с первого дня при работе с mql4. Логика OrderSelect() и Ma_CrossOver - это одни из первых вещей, которые нужно понять, чтобы сделать советника.

Как отметили Raptor и Dabber. Это просто серия цифр, отсчитываемых назад или вперед. Индикаторы обладают дополнительным преимуществом - они используют гораздо больше визуальных инструментов, чем эксперты. Поскольку этот пользовательский индикатор использует множество стандартных индикаторов, таких как стандартное отклонение и скользящие средние, я рекомендую делать эти расчеты внутри советника.