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允许你访问你的指标缓冲区,就是这么简单。

例如,您正在编写一个基于两个指标的EA,您可以将指标代码构建到EA中,这是可能的,但有点复杂,因为指标缓冲区在EA中不起作用,您必须使用数组,并以 "作为系列 "的方式处理它们 ...... 另一种方法是让指标运行并从EA中访问其缓冲区 ...... 这就是iCustom提供的便利。 不需要改变指标 ......EA只是在它需要的移位值上访问它需要的缓冲区。 在iCustom的调用中,它也可以传递任何需要设置指标的外部变量,如适用。

 
RaptorUK:

iCustom允许你访问你的指标缓冲区,就是这么简单。

例如,您正在编写一个基于两个指标的EA,您可以将指标代码构建到EA中,这是可能的,但有点复杂,因为指标缓冲区在EA中不起作用,您必须使用数组,并以 "作为系列 "的方式处理它们 ...... 另一种方法是让指标运行并从EA中访问其缓冲区 ...... 这就是iCustom提供的便利。 不需要改变指标 ......EA只是在它需要的移位值上访问它需要的缓冲区。 在iCustom的调用中,它也可以传递任何需要设置指标的外部变量。


谢谢你,RaptorUK,然而,我遇到的困难是实际的编码。我是MQL4的新手,只做了几个月,还在学习中 - 所以我需要一个简单的编码解释,以及如何在指标中设置它。

谢谢

邓先生

 

RaptorUK:

iCustom 调用中,它也可以传递任何需要设置指标的外部 变量,如适用。

更正 ...

iCustom 调用中,它

必须

也要传递任何需要用来设置指标的外部 变量,如适用。
 
NewCoder47:


谢谢你,RaptorUK,然而,我遇到的困难是实际编码。我是MQL4的新手,只做了几个月,还在学习中 - 所以我需要一个简单的编码解释,以及如何在指标中 设置它。

谢谢

迈克

你在这里明显缺少的是,你在指标中没有使用iCustom 。该指标是一块独立的代码。你的EA 现在可以通过使用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的新手,只做了几个月,还在学习中 - 所以我需要一个简单的编码解释,以及如何在指标中设置它....。

我认出这个指标是BarrowBoy的Trend_Or_Range指标。理解指标的关键是理解Arrays。我对数组有一种健康的恐惧,直到我意识到我在使用mql4时从第一天起就在使用它们。OrderSelect()和Ma_CrossOver逻辑是制作任何EA首先要了解的一些东西。

正如Raptor和Dabber所指出的。它们只是一连串数字的倒数或正数。指标的附加值是利用了比专家更多的视觉工具。由于这个自定义指标采用了大量的标准指标,如标准偏差 和移动平均线,我建议在EA中进行这些计算。

原因: