Подробное объяснение iCustom - страница 2

 
NewCoder47:


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

Разве вы не читали, что я написал? " Никаких изменений в индикаторах не требуется... советник просто обращается к нужным ему буферам при нужных ему значениях сдвига."
 
dabbler:
Нет, не можешь. Я только что попробовал. Он не скомпилируется, если вы опустите один из параметров, оставив пустое место между запятыми.
.
Я знал, что должен был исправить последнее утверждение. Уберите запятые для параметров.
 
ubzen:
Я знал, что должен был исправить последнее утверждение. Уберите запятые в параметрах.
.

Я только что создал этот индикатор как TOR.mqh в своей папке индикаторов. Затем я написал следующий код в папке Expert.

void start(){
    iCustom(Symbol(),0,"TOR",0,1);
}
Без передачи каких-либо параметров он выполнился нормально.
 
ubzen:

Я только что создал этот индикатор как TOR.mqh в своей папке индикаторов. Затем я написал следующий код в папке Expert.

Он прекрасно скомпилировался без передачи каких-либо параметров.
Но работает ли он на самом деле?
 
dabbler:
Но работает ли это на самом деле?
Да. Постоянно. Я говорю о внешних значениях. А вы, полагаю, говорите о буферах.
 

Спасибо за помощь, завтра вечером посмотрю и попробую разобраться.

Спасибо

 

Привет, ребята. Кажется, у меня все еще есть некоторые трудности.

Вот код, в индикаторе (я ничего не менял в индикаторе), я показываю то, что я думаю, является соответствующей частью. Пожалуйста, обратите внимание, что они не следуют друг за другом в индикаторе, есть много других, которые я удалил.

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


//---- 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);
     } 

Теперь вот код в советнике

                double FastMA = iMA(NULL,0,FastMAPeriod,0,0,0,0);
                double SlowMA = iMA(NULL,0,SlowMAPeriod,0,0,0,0);
                double     STDBuffer = iCustom(Null,0,"SFX", , ,0,0);
                double     stddevma = iCustom(Null,0,"SFX", , ,1,0);
                

Что я не понимаю, так это часть с параметрами. Какие значения я должен здесь указать? Именно с этой частью у меня возникают трудности. Я хочу использовать значения STDBuffer и stddevma в тесте далее в советнике. Например, включить ли мне Pair1 (которая находится в другом месте индикатора, объявленного как текущий график)? Поскольку она уже объявлена как Null в начале iCustom.

Кроме того, есть ли способ физически увидеть, какие значения посылаются советнику?

Любая помощь будет очень признательна.

Спасибо

 
NewCoder47:

Вот код, в индикаторе (я ничего не менял в индикаторе), я показываю то, что я думаю, является релевантной частью. Пожалуйста, обратите внимание, что они не следуют друг за другом в индикаторе, есть много других, которые я удалил.

Теперь вот код в советнике

Что я не понимаю, так это часть параметров. Какие значения я должен здесь указать? Именно с этой частью у меня возникают трудности. Я хочу использовать значения STDBuffer и stddevma в тесте далее в советнике. Например, включить ли мне Pair1 (которая находится в другом месте индикатора, объявленного как текущий график)? Поскольку она уже объявлена как Null в начале iCustom.

Вы не показали соответствующие части индикатора. Вам нужно показать все внешние операторы и порядок их следования.

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

О, и вы не можете иметь пробелы между запятыми в утверждениях iCustom ; это не будет компилироваться.

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

 
dabbler:

Вы не показали соответствующие части индикатора. Вам нужно показать все утверждения extern И порядок их появления.

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

И еще, в утверждениях iCustom не может быть пробелов между запятыми, это не скомпилируется.

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

Спасибо, Dabbler. Я прикрепил полный советник и индикатор. Я прочитал документацию по 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];
   
          
//---- done
   return(0);
  }

СОВЕТНИК:

//+------------------------------------------------------------------+
//|                                                       Simple.mq4 |
//|                                                       Mike Clegg |
//|                                                                  |
//+------------------------------------------------------------------+

#property copyright "Mike Clegg"


// External variables
extern double LotSize = 1;

extern int MagicNumber = 123;

extern int FastMAPeriod = 12;
extern int SlowMAPeriod = 26;


// Global variables
int BuyTicket;
int SellTicket;


// Start function
int start()
        {
                // Moving averages
                double FastMA = iMA(NULL,0,FastMAPeriod,0,0,0,0);
                double SlowMA = iMA(NULL,0,SlowMAPeriod,0,0,0,0);
                double     STDBuffer = iCustom(NULL,0,"SFX",0,0);
      double     stddevma = iCustom(NULL,0,"SFX",1,0);
                
                // Buy order 
                if(FastMA > SlowMA && BuyTicket == 0 && stddevma > STDBuffer)
                        {PlaySound("alert.wav");
         Alert(Symbol(),"All Crossing",Period(),"All Crossing");
                        }
                                
                return(0);
        }

Пожалуйста, не обращайте внимания на то, что советник выполняет работу индикатора, как я уже сказал, я тестирую в данный момент.

 
NewCoder47:

Спасибо, Дабблер. Я приложил полный советник и индикатор. Я прочитал заявления по iCustom и понял все, кроме части о параметрах, она крайне расплывчата. Советник очень урезан, так как я пока только тестирую.

Спасибо,

Майк.

Индикатор:

СОВЕТНИК:

Пожалуйста, не обращайте внимания на то, что советник выполняет работу индикатора, как я уже сказал, я тестирую в данный момент.


У вас есть несколько отличных советов здесь, и все же вы боретесь.....

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

Так вы узнаете больше всего о проверке команд в MT4. Почитайте здесь https://www.mql5.com/en/forum/138379

сделайте что-то подобное и вы узнаете, как использовать это..... в советниках, которые вы хотите сделать.