1、以 MQL4 语言程序为原理展示一个以标准 MACD 指标为基础简单的智能交易系统的创建。 在这个智能交易中,我们将看到一些特性的示例,像赢利水平的设定,追踪止损的设置等等。在我们的范例中,通过开仓和管理仓位来完成交易。交易原理: Long (BUY) entry MACD 指标在零以下, 从下至上并且穿过低端的信号线。 Short (SELL) entry MACD 指标在零以上,从上至下并且穿过顶端的信号线。 Long exit 赢利上限的执行,追踪止损的执行或当穿过 MACD 的信号线 (MACD 指标在零以上,从上至下并且穿过顶端的信号线)。 Short exit 赢利上限的执行,追踪
2、止损的执行或当穿过 MACD 的信号线 (MACD 指标在零以下, 从下至上并且穿过低端的信号线)。重要提示:从我们的分析上排除一些 MACD 指标微不足道的变化 (图表上的小 山丘),我们介绍一种补充检测山丘大小的办法如下:指标的大小应该在最低价的最后 5 个单元(5*Point,对于 USD/CHF = 0.0005 和 USD/JPY = 0.05).步骤 1 编写智能交易的描述在智能交易的导航窗口处,点击鼠标右键并且选择在菜单中的“创建新智能交易”。创建智能交易的初始提醒将会询问你进入数据中心。在显示窗口,填写智能交易的名称(名称) - MACD Sample,作者(作者) -指出你的
3、名字, 链接 (连接) -你网页的链接,注解 (注解) - MACD-基本智能交易的测试范例。步骤 2 创建程序的基本结构测试智能交易的源代码将只占据一点位置,但是还是有些量经常很难抓住,特别是我们不是专业的编成工作者 - 另外,我们不需要这些描述,不是吗? :)一个标准智能交易的结构构想,让我们看看以下部分的描述:1. 初始变量2. 初始数据检测o 检测图表,图表中的柱数o 检测外部变量值:标准手, S/L, T/P, T/S3. 对于快速数据通道设置内部变量4. 检测交易终端 是无效的吗?如果是:o 检测: 账户上的可用保证金.o 可能是看涨仓位 (BUY)? 开设看涨仓位并退出5. 可能
4、是卖空仓位 (SELL)?o 开设卖空仓位并退出退出智能交易. 周期循环检验先前开仓o 如果是看涨仓位 应该平仓? 应该重新设定追踪止损? 如果是卖空仓位o 应该平仓?o 应该重新设定追踪止损?返回的结果很简单,只有 4 种。现在让我们尝试一步一步地区完成列出的计划:1. 初始变量所有使用在智能交易程序中的变量必须按照 MetaQuotes Language 4 要求的指定。这就是为什么我们在程序的开始插入初始变量的原因extern double TakeProfit = 50;extern double Lots = 0.1;extern double TrailingStop = 30;e
5、xtern double MACDOpenLevel=3;extern double MACDCloseLevel=2;extern double MATrendPeriod=26;MetaQuotes 语言 4 是需要“外部变量”辅助的。外部变量可以从外部设定,在智能交易程序源代码设定之后不可以修改。提供一个额外的灵活性。在我们的程序中,MATrendPeriod 变量作为外部变量指定。 在程序开始我们插入这个变量。extern double MATrendPeriod=26;2. 检测初始数据该代码部分通常使用在所有的智能交易中。因为是一个标准的检测:/ 初始数据检测/ 确认智能交易运行正
6、常非常重要/图表和用户设置不能出现任何错误 / 变量(Lots, StopLoss, TakeProfit, / TrailingStop) 我们的情况需要检测 TakeProfit/ 图表中少于 100 柱if(BarsSignalCurrent if(ticket0)if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) Print(“BUY 开单 : “,OrderOpenPrice();else Print(“错误 opening BUY order : “,GetLastError(); return(0); 附加的检验山丘的大小上面已
7、经给出了描述。 MACDOpenLevel 变量是一个用户指定变量,它不可能改变程序文本,但是却有很大的灵活性。在程序开始我们插入这个变量的描述。o能交易示范 22010 年 02 月 18 日 星期四 10:15 可能是卖空仓位 (SELL)? 进入卖空仓位的条件: MACD 高于零,向上并且穿过信号线向下。注解如下:/ 尽可能的检测卖空仓位(SELL)if(MacdCurrent0 if(ticket0)if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) Print(“SELL 开单 : “,OrderOpenPrice();else P
8、rint(“错误 SELL 定单开仓 : “,GetLastError(); return(0); return(0); 周期循环检验先前开仓/进入市场的正确性非常重要 / 但是更重要的是安全退出. for(cnt=0;cntOrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);if(OrderType()0 /平仓return(0); /退出o 应该重设追踪止损马?我们设定追踪止损只有在仓位盈利已经超过追踪水平点,并且新的止损水平点好于先前的水平。/ 检测追踪止损if(TrailingStop0) if(Bid-OrderOpenPrice()Point*
9、TrailingStop)if(OrderStopLoss()OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);return(0);我们停止操作符。 如果是卖空仓位else /卖空仓位 应该平仓吗?退出卖空仓位的条件: MACD 穿过信号线,MACD 低于零,向上并且穿过信号线向下。if(MacdCurrentSignalCurrent /平仓return(0); / 退出 应该重设追踪止损吗? 我们设定追踪止损只有在仓位盈利已经超过追踪水平点,并且新的止损水
10、平点好于先前的水平。/ 检测追踪止损if(TrailingStop0) 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);这样一步一步地编写我们的智能交易.智能交易示范 32010 年 02 月
11、 18 日 星期四 10:16步骤 3 集中程序的结果代码让我们打开智能交易的设定:使用按钮打开“属性.“菜单。在窗口内指定运行参量的外部设定:从先前部分集中全部代码:/+-+/| MACD Sample.mq4 |/| Copyright 2005, MetaQuotes Software Corp. |/| http:/ |/+-+extern double TakeProfit = 50;extern double Lots = 0.1;extern double TrailingStop = 30;extern double MACDOpenLevel=3;extern double
12、MACDCloseLevel=2;extern double MATrendPeriod=26;/+-+/| |/+-+int start()double MacdCurrent, MacdPrevious, SignalCurrent;double SignalPrevious, MaCurrent, MaPrevious;int cnt, ticket, total;/ 检测初始化数据/ 确定智能交易在图表中运行正常非常重要/ 用户在外部变量交易中不会产生任何错误/ 外部变量 (标准手数, 止损,赢利, / 追踪止损) 在这种情况下,我们检测图表中赢利水平要小于 100 柱if(BarsSignalCurrent