在上一篇文章中,我们向您介绍了将自定义指标转换为 iCustom 函数的过程,这是将其部署到智能交易系统之前的必要第一步。 我们定义了 iCustom 函数的 6 个不同参数,特别注意最后三个:指标参数、模式和 Shift。
我们使用了将复杂的自定义指标 NonLagMA_7.1 转换为 iCustom 指标函数的示例,并向您介绍了查找其指标参数和模式的演绎发现过程。
在此 MQL4 自定义指标 EA 示例文章中,我们将继续使用 NonLagMA_7.1 示例,并探索将 iCustom 函数编织到不同智能交易系统中的不同方法。 如果您忘记或没有看到 NonLagMA 自定义指标的外观,请查看屏幕截图:
之前,在讨论发现 iCustom 功能的模式参数(线路/信号)的侦探工作时,我指出以红色突出显示的数据表提供了视觉线索。 我们推导出 NonLagMA 是由线本身表示的第一种模式 (mode=0),Up 是由蓝线表示的第二种模式 (mode =1),而 Dn 是由 表示的第三种模式 (mode =2) 红线。 这里没有直观地表示趋势的第四种模式(模式 = 3),但它在代码本身中表示,逻辑是如果趋势 == 1,趋势向上,如果趋势 = -1,趋势向下。
现在您大致了解了 NonLagMA 自定义指标的四种模式,您可以根据不同的模式创建至少三种类型的专家顾问:
与 MA 线本身 (Mode=0) 一起工作的 EA,就像在交叉中一样。
与向上蓝线 (Mode=1) 和 Dn 红线 (Mode=2) 配合使用的 EA,在 NonLagMA 变为蓝色时买入,在变为红色时卖出。
使用趋势信号 (Mode=3) 的 EA,在趋势上升时买入,在趋势下降时卖出。
所有三个 EA 将共享以下相同的外部变量:
外部价格= 0;
外部长度 = 150;
外部 int 位移 = 0; //DispLace 或 Shift
外部双 PctFilter = 0; //十进制动态过滤器
外部颜色 = 1; //颜色模式的切换(1色)
外部 int ColorBarBack = 1; //返回颜色模式
外部双偏差= 0; //上/下偏差
外部警报模式 = 0; //声音警报开关(0-关,1-开)
外部 int WarningMode = 0; //声音警告开关(0-off,1-on)
外部转换 = 1;
我在上一篇文章中回顾了发现上述指标参数的过程,但我将回顾一下。 最简单的方法是将指标源代码中的外部变量复制并粘贴到智能交易系统,然后使用上述标识符填充 iCustom 函数指标,让它们位于第三个参数(指标名称)之后和 最后两个参数(mode 和 shift)。
因此,您将从以下内容转换您的 iCustom 指标:
双 ma = iCustom (NULL,0,”NonLagMA_v7.1″,0,0,Shift);
对此:
double ma = iCustom (NULL, 0, “NonLagMA_v7.1”, Price,Length,Displace, PctFilter, Color, ColorBarBack, Deviation, AlertMode, WarningMode, 0,Shift)。
注意:虽然这个特定指标有 9 个指标参数,但应该指出最重要的一个是长度。 就像移动平均线一样,改变长度会改变 NonLagMA 的基本结构。 其他参数可以保留默认值 0。
NonLagMA EA #1:使用 MA 线信号(模式 = 0)
非滞后均线交叉
Intent //Buy: 当收盘价超过 NonLagMA
//卖出:当收盘价低于 NonLagMA
指标
调用 double macurrent = iCustom(NULL, 0, “NonLagMA_v7.1”, Price,Length,Displace, PctFilter, Color, ColorBarBack, Deviation, AlertMode, WarningMode, 0,Shift)。
double maprevious = iCustom(NULL, 0, “NonLagMA_v7.1”, Price,FastLen,Displace, PctFilter, Color, ColorBarBack, Deviation, AlertMode, WarningMode, 0,Shift+1)。
双 close_current = iClose (NULL,0,Shift);
double close_previous = iClose (NULL,0,Shift+1);
BuyCond if (close_current >= macurrent && close_previous <= maprevious)
SellCond if (close_current <= macurrent && close_previous >= maprevious)
解释:
这里就不多解释了。 我们使用这种 NonLagMA 交叉的方式与我们进行 MA 交叉的方式大致相同。 一个可以表示快速 NonLagMA 穿过/低于慢速 NonLagMA,但出于说明目的,我仅表示当前收盘低于/高于 NonLagMA。 最终结果将或多或少相似。
在指标调用中,请注意我的 iCustom 指标函数(倒数第二个)的模式参数设置为 0。正如我们在上面看到的,0 指的是 NonLagMA 线本身。
请注意,当我表示当前收盘价和上一个收盘价时,我使用了 iClose 函数。 如果您想使用不同时间范围、货币符号或偏移值的收盘价,则 iClose 函数很有用。 如果您使用 Close 或 Bid,您指的只是当前交易品种的当前价格。 在我的例子中,我想使用不同的移位值,当前收盘价 (Shift) 和前一个收盘价 (Shift+1),因此我需要构建一个名为 close_current = iClose (NULL,0,Shift) 的变量,并且 一个名为 close_previous = iClose (NULL,0,Shift+1) 的变量。
NonLagMA EA #2:蓝色 UP 和红色 Dn 颜色变化(模式 1 和 3)
NonLagMA 线颜色变化
Intent //买入:当当前线为蓝色且上一条线为红色时
//卖出:当当前线向下且红色且上一条线向上且蓝色时
指标
调用 double buy_macurrent = iCustom(NULL, 0, “NonLagMA_v7.1”,Price,FastLen、Displace、PctFilter、Color、ColorBarBack、偏差、AlertMode、WarningMode、1、Shift)。
double buy_maprevious = iCustom(NULL, 0, “NonLagMA_v7.1”, Price,FastLen,Displace, PctFilter, Color, ColorBarBack, Deviation, AlertMode, WarningMode, 1,Shift+1)。
double sell_macurrent = iCustom(NULL, 0, “NonLagMA_v7.1”, Price,FastLen,Displace, PctFilter, Color, ColorBarBack, Deviation, AlertMode, WarningMode, 2,Shift)。
double sell_maprevious = iCustom(NULL, 0, “NonLagMA_v7.1”, Price,FastLen,Displace, PctFilter, Color, ColorBarBack, Deviation, AlertMode, WarningMode, 2,Shift+1)。
BuyCond if (sell_maprevious!=EMPTY_VALUE && sell_macurrent==EMPTY_VALUE && buy_macurrent!=EMPTY_VALUE)
SellCond if(buy_maprevious!=EMPTY_VALUE && buy_macurrrent==EMPTY_VALUE && sell_macurrent!=EMPTY_VALUE)
解释:
在指标调用部分,您将看到为 buy_ma(蓝线)和 sell_ma(红线)创建的变量,并通过在最后一个参数 Shift:current 中设置不同来创建每个变量的当前版本和以前的版本 (Shift) 和上一个 (Shift+1)。 buy_ma 与 sell_ma 的区别在于倒数第二个参数,即模式参数。 buy_ma 的众数为 1,正如我们发现的那样,它是蓝色 (UP) 线,而 sell_ma 的众数为 2,正如我们发现的那样,它是红色 (Dn) 线。
当您看到输入条件时,首先让您感到奇怪的是这些 EMPTY_VALUE 单词和感叹号。 您可能会挠头想知道我用所有 EMPTY_VALUE 做了什么。
好吧,在内部,用极客的话说,EMPTY_VALUE 指的是一个函数:
void SetIndexEmptyValue(int index, double value)
此函数将绘图线设置为空值。 数据窗口中不绘制或显示空值。 默认情况下,空值为 EMPTY_VALUE。
用简单的英语来说,EMPTY_VALUE 是指数据窗口没有显示该线/信号/箭头的任何内容。 在 NonLagMA 的情况下,每当线为蓝色时,数据窗口中的 UP 行显示指标数据值,同时数据窗口中的 Dn 行不显示任何内容,空值。 相反,当线为红色时,数据窗口中的 Dn 行显示指标数据值,同时 Up 行不显示任何内容,为空值。
现在,当我们说 buy_macurrent = EMPTY_VALUE 时,我们试图说我们根本不需要蓝线(我们希望它没有价值)。 如果我们说 buy_macurrent! = EMPTY_VALUE,感叹号 (!) 表示“不需要”; 因此,我们不希望蓝线没有价值,或者,换句话说,我们希望蓝线被代表,具有价值。
如果我们用简单的英语看买入条件,我们是在说:我们将在之前的红线确实存在时买入 (sell_maprevious!=EMPTY_VALUE) 而现在它不存在 (sell_macurrent=EMPTY_VALUE) 而蓝线存在 ( buy_macurrent!=EMPTY_VALUE)。
相反,对于卖出条件,我们是说:我们将在之前的蓝线确实存在时买入 (buy_maprevious!=EMPTY_VALUE),而现在它不存在 (buy_macurrent=EMPTY_VALUE),而是存在红线 (sell_macurrent!=EMPTY_VALUE) .
NonLagMA EA #3:趋势变化(模式 4)
非滞后均线趋势
Intent //买入:当当前趋势向上而前一个趋势向下时
//卖出:当当前趋势向上而前一个趋势向下时
指标
调用 double trend_macurrent = iCustom(NULL, 0,”NonLagMA_v7.1″,Price,FastLen,Displace, PctFilter, Color, ColorBarBack, Deviation, AlertMode, WarningMode, 3,Shift)。
double trend_maprevious = iCustom(NULL, 0, NonLagMA_v7.1″,Price,FastLen,Displace, PctFilter, Color, ColorBarBack, Deviation, AlertMode, WarningMode, 3,Shift+1)。
BuyCond if (trend_macurrent==1 && trend_maprevious==-1)
SellCond if (trend_macurrent==-1 && trend_maprevious==1)
解释
上述两个 EA 中的 trend_ma 和之前类型版本之间的区别是倒数第二个参数,模式。 模式是 3,正如我们所发现的,它指的是趋势信号。 趋势信号不会出现在数据窗口中,就像之前的模式一样,但它会出现在指标的代码中:
趋势[shift]=趋势[shift+1];
如果 (MABuffer[shift]-MABuffer[shift+1] > Filter) trend[shift]= 1;
如果 (MABuffer[shift+1]-MABuffer[shift] > Filter) trend[shift]=-1;
该代码计算趋势是如何形成的。 用简单的英语来说,如果 trend = 1,则趋势是多头,如果 trend = -1,则趋势是空头。
将以上内容放入一个入口条件中非常简单。 对于买入条件,我只需要说我希望当前趋势向上 (trend_current==1) 并且之前的趋势向下 (trend_previous==-1)。 对于卖出条件,我只需要说我希望当前趋势向下 (trend_current==-1) 并且之前的趋势向上 (trend_previous==1)。