|
以 MQL4语言程序为原理展示一个以标准MACD 指标为基础简单的智能交易系统的创建。 在这个智能交易中,我们将看到一些特性的示例,像赢利水平的设定,追踪止损的设置等等。在我们的范例中,通过开仓和管理仓位来完成交易。
交易原理:
BUY– MACD指标在零以下, 从下至上并且穿过低端的信号线。
SELL– MACD指标在零以上,从上至下并且穿过顶端的信号线。
Long exit – 赢利上限的执行,追踪止损的执行或当穿过 MACD 的信号线 (MACD 指标在零以上,从上至下并且穿过顶端的信号线)。
Short exit – 赢利上限的执行,追踪止损的执行或当穿过 MACD 的信号线 (MACD指标在零以下, 从下至上并且穿过低端的信号线)。
初始变量
所有使用在智能交易程序中的变量必须按照 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 是需要“外部变量”辅助的。外部变量可以从外部设定,在智能交易程序源代码设定之后不可以修改。提供一个额外的灵活性。
- 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);
复制代码 现在,用 iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0)代替,您可以在源代码中使用 MacdCurrent。
检测交易终端 –是空的吗?如果是:
在我们的智能交易中,我们仅使用开单和操作挂单。不过,使更安全,我们来认识一种对于先前定单交易终端检测:
- total=OrdersTotal();
- if(total<1)
- {
复制代码 在分析市场状况之前,检测你的账户上可用的自由保证金可以开仓。- if(AccountFreeMargin()<(1000*Lots))
- {
- Print("没有资金.自由保证金 = ", AccountFreeMargin());
- return(0);
- }
复制代码 尽可能检测看涨仓位 (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);
- }
复制代码 尽可能的检测卖空仓位(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);
- }
复制代码 周期循环检验先前开仓
- for(cnt=0;cnt
- {
- OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
- if(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()
- {
- OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,
- OrderTakeProfit(),0,Green);
- return(0);
- }
- }
- }
复制代码 如果是卖空仓位应该平仓吗
- 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);
- }
- }
- }
复制代码 关闭所有残留开仓。
|
|