iCustom的详细解释 - 页 3

 
NewCoder47:

谢谢Dabbler。我已经附上了完整的EA和指标。我已经阅读了关于iCustom的声明,除了参数部分,其他都明白了。

参数 中的内容是你想用于指标中的外部变量的值......在这种情况下,这些......。

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

让我们再看一下帮助文件。

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

看一下......部分的定义。

... - 参数设置(如果需要)。传递的参数和它们的顺序必须与自定义指标 的声明顺序和外部变量的类型相对应。


你有9个外部 变量,因此需要9个顺序正确、类型正确的参数。

     double     STDBuffer = iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,0,0);
     double     stddevma =  iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,1,0);

很简单。

然后你问:"还有,有没有什么方法可以实际看到哪些值被发送到EA?"

当然可以。

Comment("StdBuffer=" + STDBuffer+"\nstddevma=" + stddevma);
 
dabbler:
 double     STDBuffer = iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,0,0);
 double     stddevma =  iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,1,0);

是的,除了Null 是个错字。

从指标开始,生成代码。

指标
EA
指标文件名不包括扩展名,如果有的话包括空白。
#define SFX "SFX"
#define因为它是常量。定义一次,就不会有错别字。
extern string PairName = "";     // Leave blank for ...

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=Sm...
extern int StdDev.MA.Price = 0;  // 0 Close price, 1 O...
extern int MA.Fast.Period = 3;
extern int MA.Fast.Method = 2;   //  0=SMA 1=EMA 2=Sm ...
extern int MA.Fast.Shift = 0;

extern bool CheckOncePerBar = true;
string  PairName            = "";     
int     StdDev.MA.Period    = 12;  
int     StdDev.MA.Shift     =  0;    
int     StdDev.MA.Method    =  MODE_SMA; 
int     StdDev.MA.Price     =  PRICE_CLOSE;  
int     MA.Fast.Period      =  3;
int     MA.Fast.Method      =  MODE_SMMA;
int     MA.Fast.Shift       =  0;
#define CheckOncePerBar        true;
不影响缓冲区的值,可以成为常量。
   SetIndexBuffer(0, STDBuffer);
   SetIndexBuffer(1, stddevma);
可能需要阅读代码来找到缓冲区的含义。例如。
STDBuffer[i]= iStdDev(...)
stddevma[i] = iMAOnArray(
#define SFX_STD   0
#define SFX_STDMA 1
那么调用是
double     STDBuffer = iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STD, 0)
double     stddevma =  iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STDMA, 0)
 

谢谢你的答复。


 ExtMapBuffer1[i+3] = lower_fractal_7b;     could be used as calculated value when reversal fractal is called?

 
ubzen:
是的。所有的时间。我说的是Extern Values。我猜你说的是缓冲器。

是的,UBZEN。


我也尝试了你的建议,它确实返回了我的指标中所说的值,....

它很简单,很容易添加或使用,没有那些长的参数....,特别是有数组的那个.......。

我在编译参数时可能会迷失方向,而不是你们的............,这里的专业人士。

非常感谢....我找这个答案找了好几天了

 
WHRoeder: 那么,这些调用就是。
double     STDBuffer = iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STD, 0)
double     stddevma =  iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STDMA, 0)
然后应该对其进行封装。
double getSFX(int eBuf, int iBar = 0, int eTF=0){ 
   return( iCustom(NULL, eTF ,SFX,
                      PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                      StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                      MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                   eBuf, iBar) ); 
}
:
double     STDBuffer = getSFX(SFX_STD, 0);
double     stddevma  = getSFX(SFX_STDMA, 0);
:
 
RaptorUK:

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

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

亲爱的RaptorUK(以及其他可能提供帮助的人)。


在引用的帖子中,你描述了在EA中使用自定义指标值的两种方法。第一种是使用iCustom,我已经知道了。第二种是我非常想了解的,因为我以前曾尝试过将自定义指标的代码内化到主指标的主体中,但没有成功。你看,当我把一个指标变成一个函数并让它返回它的最新值(元素0的值)时,我总是得到一个双变量的EMPTY_VALUE,而不是计算值本身。我试着使用iCustom函数,将移位设置为0,即最新的值。当我这样做时,终端开始返回0,并在专家标签中显示错误STACK OVERFLOW。在第二次勾选时,它确实返回了一个值,但在每打印几个[0]值后,它又给出了一个STACK OVERFLOW错误,这不断重复出现。因为iCustom在第一次初始化时返回值0和STACK OVERFLOW(只有在开始提供正确的值之后),我不能在我的EA中使用icustom,因为每次Start()被激活时,它都会为不同的符号调用icustom,并为之调用多个自定义指标。这导致了EA的崩溃。我不明白为什么每当我想让icustom返回最近的值[0]时,我会得到一个STACK OVERFLOW错误,但我肯定想知道。然而,我更喜欢把所有被调用的指标的代码内部化,把它们转化为主指标内的函数。你说过使用数组并以 "作为系列的方式 "处理它们。能否请你详细说明一下?

我已经添加了一个经典的ADX.mq4指标的mq4文件。在里面,ADX的值被打印了两次。一次是由Icustom打印,第二次是由ADX代码打印,该代码已经变成了ADX内部的一个函数。Icustom(ADX)返回一个值,但ADX(symbol,timeframe)却没有。它不断地返回同样的EMPTY_VALUE,即247456457457或其他什么东西,一遍又一遍。请解释为什么会发生这种情况,以及我如何在EA模板和mq4自定义指标文件中补救。


衷心的问候,提前感谢


PS:附件文件似乎不起作用。但你可以从http://www.forexfactory.com/showthre...37#post8569537(我的名字是Codix)下载CallicustomvsFunction示例指标和ADX自定义指标。

附加的文件:
 
  1. 不要重复发帖
  2. 不要劫持其他主题;你的问题不是关于如何使用iCustom。
 

在上面的帖子(https://www.mql5.com/en/forum/138577/page3#627521https://www.mql5.com/en/forum/138577/page3#797401) 中,我使用了点和词的分隔符。

2014年 2月3日(Build 600)以来,这是不允许的。 使用下划线或骆驼字母。

 
whroeder1:

使用下划线或骆驼字母大小写。

我从来不知道这叫骆驼字母。谢谢!