
交易原理:
- Long (BUY) entry– MACD指标在零下方, 从下至上而且穿过低端的信号线。
| Short (SELL) entry– MACD 指标在零以上,从上至下而且穿过顶端的信号线。
|
- Long exit– 赢利上限的实施,跟踪止损的实施或当穿过 MACD 的信号线 (MACD 指标在零以上,从上至下而且穿过顶端的信号线)。
-
Short exit– 赢利上限的实施,跟踪止损的实施或当穿过 MACD 的信号线 (MACD指标在零下方, 从下至上而且穿过低端的信号线)。
重要提示:从我们的分析上消除一部分 MACD 指标微不足道的改变 (图表上的小 ‘山丘’),我们介绍一种补充检测‘山丘’大小的办法如下:指标的大小应当在最低价的最后5个单元(5*Point,对于 USD/CHF = 0.0005 和 USD/JPY = 0.05).
步骤 1 – 编撰智能交易的描述
在智能交易的导航窗口处,点击鼠标右键而且选择在菜单中的“创建新智能交易”。创建智能交易的初始警示将令询问你进入报告中心。在表明窗口,填写智能交易的名称(名称) – MACD Sample,作者(作者) -表示你的名字, 链接 (连接) -你网页的链接,注解 (注解) – MACD-基本智能交易的试探范例。
-
步骤 2 –创建程序的基本结构
试探智能交易的源代码将只占领一点位置,但是依旧有些量经常很难抓住,尤其是我们不是专业的编成工作者 – 此外,我们不需要这些描述,不是吗?
一个标准智能交易的结构构想,让我们看看下方部分的描述:
- 初始变量
- 初始报告检测
- 检测图表,图表中的柱数
- 检测外部变量值:标准手, S/L, T/P, T/S
- 对于迅速报告通道设置内部变量
- 检测交易终端 – 是无效的吗?假使是:
- 检测: 账户上的可用保证金…
- 或许是看多仓位 (BUY)?
- 开设看多仓位并退出
- 或许是卖空仓位 (SELL)?
- 开设卖空仓位并退出
退出智能交易…
- 周期循环检验先前开仓
- 假使是看多仓位
- 应当平仓?
- 应当从新设定跟踪止损?
- 假使是卖空仓位
- 应当平仓?
- 应当从新设定跟踪止损?
返回的结果很简单,只有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,PR洲际交易所_CLOSE,MODE_MAIN,0);MacdPrevious=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_MAIN,1);SignalCurrent=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_SIGNAL,0);SignalPrevious=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_SIGNAL,1);MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PR洲际交易所_CLOSE,0);MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PR洲际交易所_CLOSE,1);当下,用iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_MAIN,0)代替,您可以在源代码中运用MacdCurrent。
-
检测交易终端 –是空的吗?假使是:在我们的智能交易中,我们仅运用开单和操作挂单。然而,使更安全,我们来认识一种 对于先前定单交易终端检测:
total=OrdersTotal();if(total<1) {-
检测: 账户上的可用保证金…在分析市场情况以前,检测你的账户上可用的自由保证金可以开仓。
if(AccountFreeMargin()<(1000*Lots)) { Print("没有资金.自由保证金 = ", AccountFreeMargin());return(0);} -
或许是看多仓位 (BUY)?进入看多仓位的条件: MACD 差于零, 往上而且穿过信号线朝下。这就是我们在 MQL4中描述的 (注意我们在指标上的业务值保存在先前的变量中):
// 尽或许检测看多仓位 (BUY) if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious MathAbs(MacdCurrent)>(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变量是一个用户指定变量,它不或许更改程序文本,但是却有很大的灵活性。在程序开始我们插入这个变量的描述。
-
或许是卖空仓位(SELL)?进入卖空仓位的条件: MACD好于零,往上而且穿过信号线朝下。注解如下:
// 尽或许的检测卖空仓位(SELL) if(MacdCurrent>0 && MacdCurrentSignalPrevious && MacdCurrent>(MACDOpenLevel*Point) && MaCurrent { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "macd sample",16384,0,Red);if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL 开单 : ",OrderOpenPrice());} else Print("错误SELL定单开仓 : ",GetLastError());return(0);}
return(0);}
-
检测: 账户上的可用保证金…在分析市场情况以前,检测你的账户上可用的自由保证金可以开仓。
-
周期循环检验先前开仓
//进入市场的正确性非常重要// 但是更重要的是安全退出...for(cnt=0;cnt { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);if(OrderType()<=OP_SELL && // 检验开仓 OrderSymbol()==Symbol()) // 检验货币对 {“cnt” – ” 是一个循环的变量务必在程序开始指定如下:
int cnt = 0;
- 假使是看多仓位
if(OrderType()==OP_BUY) // 打开看张仓位 {-
应当平仓吗?退出看多仓位的条件: MACD 穿过信号线, MACD 好于零,往上并穿过信号线朝下。
if(MacdCurrent>0 && MacdCurrentSignalPrevious && MacdCurrent>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);//平仓 return(0);//退出 } -
应当重设跟踪止损马?我们设定跟踪止损只有在仓位盈利已经胜过跟踪水平点,而且新的止损水平点优于先前的水准。
// 检测跟踪止损if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss() { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop, OrderTakeProfit(),0,Green);return(0);} } }
我们停止操作符。
}
-
应当平仓吗?退出看多仓位的条件: MACD 穿过信号线, MACD 好于零,往上并穿过信号线朝下。
- 假使是卖空仓位
else //卖空仓位 {-
应当平仓吗?退出卖空仓位的条件: MACD穿过信号线,MACD差于零,往上而且穿过信号线朝下。
if(MacdCurrent<0 && MacdCurrent>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);}
-
应当平仓吗?退出卖空仓位的条件: MACD穿过信号线,MACD差于零,往上而且穿过信号线朝下。
- 假使是看多仓位
- 假使是看多仓位
如此一步一步地编撰我们的智能交易…
步骤3 – 集中程序的结果代码
让我们打开智能交易的设定:运用按钮打开”属性…”菜单。在窗口内指定运行参数的外部设定:
从先前部分集中全部代码:
//+------------------------------------------------------------------+//| MACD Sample.mq4 |//| Copyright © 2005, MetaQuotes Software Corp. |//| http://www.metaquotes.net/ |//+------------------------------------------------------------------+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,PR洲际交易所_CLOSE,MODE_MAIN,0);MacdPrevious=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_MAIN,1);SignalCurrent=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_SIGNAL,0);SignalPrevious=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_SIGNAL,1);MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PR洲际交易所_CLOSE,0);MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PR洲际交易所_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 && MacdCurrent>(MACDOpenLevel*Point) && MaCurrentif(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL 定单开仓 : ",OrderOpenPrice());} else Print("错误SELL定单开仓 : ",GetLastError());return(0);} return(0);} // 正确进入市场很重要, // 但正确退出市场更重要... for(cnt=0;cntif(OrderType()<=OP_SELL && // 检测开仓 OrderSymbol()==Symbol()) // 检测货币对 { if(OrderType()==OP_BUY) // 看多仓位开仓 { // 需要平仓吗? if(MacdCurrent>0 && MacdCurrentSignalPrevious && MacdCurrent>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);//平仓 return(0);// 退出 } // 检测跟踪止损 if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()return(0);} } } } else // 去卖空仓位 { // 需要平仓吗? if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);// 平仓 return(0);//退出 } // 检测跟踪止损 if(TrailingStop>0) { if((OrderOpenPrice()-Ask)