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

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

止盈执行,或追踪止损执行,或当价格再次穿越MACD信号线时(MACD指标位于零轴以上,自上而下穿越高端信号线)。
止盈执行,或追踪止损执行,或当价格再次穿越MACD信号线时(MACD指标位于零轴以下,自下而上穿越低端信号线)。
重要提示:为了从分析中排除MACD指标的微弱变动(图表上的小“山丘”),
我们引入一种补充检测“山丘”大小的方式:指标的波动范围应至少覆盖最后5个最小价格变动单位
(5*Point,例如 USD/CHF = 0.0005,USD/JPY = 0.05)。
步骤 1 – 编写智能交易的描述

步骤 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
让我们打开智能交易的设置:使用按钮打开“属性…”菜单。在窗口内指定外部变量运行参数:

将先前部分的全部代码集中起来:
//+------------------------------------------------------------------+ //| 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
对于最终智能交易的确认,只需指定外部变量值 “Lots = 1″, “Stop Loss (S/L) = 0″(不使用), “Take Profit (T/P) = 120″(适用于一小时周期), “Trailing Stop (T/S) = 30″。当然,你可以根据自己的需要调整数值。按“编写”按钮,如果没有任何错误信息出现(可从MetaEditor的列表中复制),按“保存”键保存智能交易。若想进一步了解EA相关内容,可参考cbcx官网获取更多资料。
资深外汇分析师
由多名资深外汇分析师组成的专业团队,拥有平均15年以上的市场分析经验,擅长技术分析和基本面分析相结合的交易策略。