外汇智能EA交易策略及cbcx官网应用

CBCX 分析团队
资深外汇分析师
阅读 收藏
专业分析

交易基本原理:

做多(买入)入场条件 – MACD指标位于零轴以下,自下而上穿越低端信号线。

外汇智能EA交易策略及cbcx官网应用(图1)

做空(卖出)入场条件 – MACD指标位于零轴以上,自上而下穿越高端信号线。

外汇智能EA交易策略及cbcx官网应用(图2)

止盈执行,或追踪止损执行,或当价格再次穿越MACD信号线时(MACD指标位于零轴以上,自上而下穿越高端信号线)。

止盈执行,或追踪止损执行,或当价格再次穿越MACD信号线时(MACD指标位于零轴以下,自下而上穿越低端信号线)。

重要提示:为了从分析中排除MACD指标的微弱变动(图表上的小“山丘”),

我们引入一种补充检测“山丘”大小的方式:指标的波动范围应至少覆盖最后5个最小价格变动单位

(5*Point,例如 USD/CHF = 0.0005,USD/JPY = 0.05)。

步骤 1 – 编写智能交易的描述

外汇智能EA交易策略及cbcx官网应用(图3)

步骤 2 – 创建程序的基本结构

测试智能交易的源代码仅占用少量篇幅,但其中一些细节可能不易掌握,尤其对于非专业编程人员而言。然而,我们并不需要事无巨细地了解所有细节,不是吗?

一个标准智能交易的结构设想,让我们来看一下以下部分的描述:

1、初始变量

所有在智能交易程序中使用的变量必须按照MetaQuotes Language 4的要求进行定义。因此,我们在程序开始处插入初始变量。

extern double TakeProfit = 50; extern double Lots = 0.1; extern double TrailingStop = 30; extern double MACDOpenLevel=3; extern double MACDCloseLevel=2; extern double MATrendPeriod=26;MetaQuotes语言4需要借助“外部变量”。外部变量可以从外部设置,在智能交易程序源代码设定后不可修改。

这提供了额外的灵活性。在我们的程序中,MATrendPeriod变量被指定为外部变量。在程序开始处我们插入这个变量。

extern double MATrendPeriod=26;

2、初始数据检测

检测图表以及图表中的柱数。

检测外部变量值:标准手数、止损、止盈、追踪止损。

3、为快速数据通道设置内部变量

4、检测交易终端是否为空。如果是:

检测账户上的可用保证金…

是否可以开立看涨仓位(买入)?

开立看涨仓位并退出。

是否可以开立卖空仓位(卖出)?

开立卖空仓位并退出。

退出智能交易…

5、循环检验先前开仓

如果是看涨仓位:

是否应平仓?

是否应重新设定追踪止损?

如果是卖空仓位:

是否应平仓?

是否应重新设定追踪止损?

返回的结果很简单,只有4种情况。

现在让我们尝试逐步完成列出的计划:

逐步编写我们的智能交易…

初始变量:所有在智能交易程序中使用的变量必须按照MetaQuotes Language 4的要求进行定义。因此,我们在程序开始处插入初始变量 extern double TakeProfit = 50; extern double Lots = 0.1; extern double TrailingStop = 30; extern double MACDOpenLevel=3; extern double MACDCloseLevel=2; extern double MATrendPeriod=26;MetaQuotes语言4需要借助“外部变量”。外部变量可以从外部设置,在智能交易程序源代码设定后不可修改。这提供了额外的灵活性。在我们的程序中,MATrendPeriod变量被指定为外部变量。在程序开始处我们插入这个变量。extern double MATrendPeriod=26;检测初始数据:该代码部分通常用于所有智能交易中,因为这是一项标准检测:// 初始数据检测 // 确保智能交易运行正常至关重要 // 图表和用户设置不应出现任何错误 // 变量(Lots, StopLoss, TakeProfit, // TrailingStop)在我们的情况中需要检测TakeProfit // 图表中少于100柱 if(Bars<100) { Print("少于 100柱"); return(0); } if(TakeProfit<10) { Print("赢利少于10"); return(0); // 检测TakeProfit }对于数据的快速通道,设置内部变量:在源代码中经常需要引用指标值或计算值。为了简化代码并将数据存入内部变量。int start() { double MacdCurrent, MacdPrevious, SignalCurrent; double SignalPrevious, MaCurrent, MaPrevious; int cnt, ticket, total; // 简化代码 //数据存入内部变量 MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);现在,您可以用MacdCurrent代替iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0)来使用。检测交易终端是否为空?如果是:在我们的智能交易中,我们仅使用开单和操作挂单。不过,为了更安全,我们引入一种对先前订单交易终端检测的方法:total=OrdersTotal(); if(total<1) {return(0); } 检测账户上的可用保证金…在分析市场状况之前,检测账户上可用的自由保证金是否可以开仓。if(AccountFreeMargin()<(1000*Lots)) { Print("没有资金.自由保证金 = ", AccountFreeMargin()); return(0); }是否可以开立看涨仓位(买入)?进入看涨仓位的条件:MACD低于零,向上并穿过信号线。在MQL4中描述如下(注意指标数值已保存在先前的变量中):// 尽可能检测看涨仓位 if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious(MACDOpenLevel*Point) && MaCurrent>MaPrevious) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "macd sample",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY 开单 : ",OrderOpenPrice()); } else Print("错误 opening BUY order : ",GetLastError()); return(0); }附加检验“山丘”的大小已在上面给出描述。MACDOpenLevel变量是一个用户指定变量,无需改变程序文本即可调整,提供了很大的灵活性。在程序开始处我们插入这个变量的描述。是否可以开立卖空仓位(卖出)?进入卖空仓位的条件:MACD高于零,向上并穿过信号线。注解如下:// 尽可能检测卖空仓位 if(MacdCurrent>0 && MacdCurrentSignalPrevious && MathAbs(MacdCurrent)>(MACDOpenLevel*Point)&& MaCurrent0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL 开单 : ",OrderOpenPrice()); } else Print("错误SELL定单开仓 : ",GetLastError()); return(0); } 循环检验先前开仓://进入市场的正确性非常重要 // 但更重要的是安全退出... for(cnt=0;cnt0 && MacdCurrentSignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平仓 return(0); //退出 }是否应重设追踪止损?我们设定追踪止损只有在仓位盈利已超过追踪水平点,并且新的止损水平点优于先前的水平时。// 检测追踪止损 if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()SignalCurrent && MacdPrevious(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); //平仓 return(0); // 退出 }是否应重设追踪止损?我们设定追踪止损只有在仓位盈利已超过追踪水平点,并且新的止损水平点优于先前的水平时。// 检测追踪止损 if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()<(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop, OrderTakeProfit(),0,Red); return(0); } } }这样逐步编写我们的智能交易…步骤3 – 集中程序的最终代码

让我们打开智能交易的设置:使用按钮打开“属性…”菜单。在窗口内指定外部变量运行参数:

外汇智能EA交易策略及cbcx官网应用(图4)

将先前部分的全部代码集中起来:

//+------------------------------------------------------------------+ //| MACD Sample.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //+------------------------------------------------------------------+ extern double TakeProfit = 50; extern double Lots = 0.1; extern double TrailingStop = 30; extern double MACDOpenLevel=3; extern double MACDCloseLevel=2; extern double MATrendPeriod=26; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double MacdCurrent, MacdPrevious, SignalCurrent; double SignalPrevious, MaCurrent, MaPrevious; int cnt, ticket, total; // 检测初始化数据 // 确定智能交易在图表中运行正常非常重要 // 用户在外部变量交易中不会产生任何错误 // 外部变量 (标准手数, 止损,赢利, // 追踪止损) 在这种情况下,我们检测图表中赢利水平要小于100 柱 if(Bars<100) { Print("少于 100柱"); return(0); } if(TakeProfit<10) { Print("赢利少于10"); return(0); // 检测赢利水平 } // 简化代码和加速通道 // 数据被放置在内部变量中 MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1); total=OrdersTotal(); if(total<1) { // 没有指定开单 if(AccountFreeMargin()<(1000*Lots)) { Print("没有资金. 自由保证金 = ", AccountFreeMargin()); return(0); } // 尽可能检测看涨仓位 (BUY) if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious(MACDOpenLevel*Point) && MaCurrent>MaPrevious) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY 定单开仓 : ",OrderOpenPrice()); } else Print("错误BUY定单开仓 : ",GetLastError()); return(0); } // 尽可能检测卖空仓位(SELL) if(MacdCurrent>0 && MacdCurrentSignalPrevious && MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL 定单开仓 : ",OrderOpenPrice()); } else Print("错误SELL定单开仓 : ",GetLastError()); return(0); } return(0); } // 正确进入市场很重要, // 但正确退出市场更重要... for(cnt=0;cnt0 && MacdCurrentSignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平仓 return(0); // 退出 } // 检测追踪止损 if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()SignalCurrent && MacdPrevious(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // 平仓 return(0); //退出 } // 检测追踪止损 if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()<(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } } return(0); } // 结束

对于最终智能交易的确认,只需指定外部变量值 “Lots = 1″, “Stop Loss (S/L) = 0″(不使用), “Take Profit (T/P) = 120″(适用于一小时周期), “Trailing Stop (T/S) = 30″。当然,你可以根据自己的需要调整数值。按“编写”按钮,如果没有任何错误信息出现(可从MetaEditor的列表中复制),按“保存”键保存智能交易。若想进一步了解EA相关内容,可参考cbcx官网获取更多资料。

CBCX 分析团队

资深外汇分析师

由多名资深外汇分析师组成的专业团队,拥有平均15年以上的市场分析经验,擅长技术分析和基本面分析相结合的交易策略。

相关分析

立即开启您的外汇交易之旅

加入我们的交易社区,享受专业的交易服务和优惠活动