1、3. 对于快速数据通道设置内部变量4. 检测交易终端 是无效的吗?如果是:o 检测: 账户上的可用保证金.o 可能是看涨仓位 (BUY)? 开设看涨仓位并退出5. 可能是卖空仓位 (SELL)?o 开设卖空仓位并退出退出智能交易. 周期循环检验先前开仓o 如果是看涨仓位 应该平仓? 应该重新设定追踪止损? 如果是卖空仓位o 应该平仓?o 应该重新设定追踪止损?返回的结果很简单,只有4种。现在让我们尝试一步一步地区完成列出的计划:所有使用在智能交易程序中的变量必须按照 MetaQuotes Language 4 要求的指定。这就是为什么我们在程序的开始插入初始变量的原因extern double
2、 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 变量作为外部变量指定。 在程序开始我们插入这个变量。2. 检测初始数据该代码部分通常
3、使用在所有的智能交易中。因为是一个标准的检测:/ 初始数据检测/ 确认智能交易运行正常非常重要/图表和用户设置不能出现任何错误 / 变量(Lots, StopLoss, TakeProfit, / TrailingStop) 我们的情况需要检测TakeProfit/ 图表中少于100 柱 if(Bars100) Print(少于 100柱); return(0); if(TakeProfit10)赢利少于10 / 检测TakeProfit3. 对于数据的快速通道设置内部变量在源代码中经常需要注意指标值或计算值。简化代码和数据放置在内部变量中。4. int start()5. 6. double
4、 MacdCurrent, MacdPrevious, SignalCurrent;7. double SignalPrevious, MaCurrent, MaPrevious;8. int cnt, ticket, total;9. 10. / 简化代码11. /数据放置在内部变量中12. MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);13. MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);14. SignalCurrent=iMACD(NULL,0,
5、12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);15. SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);16. 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)代替,您可以在源代码中使用 MacdCu
6、rrent。17. 检测交易终端 是空的吗?在我们的智能交易中,我们仅使用开单和操作挂单。不过,使更安全,我们来认识一种 对于先前定单交易终端检测:total=OrdersTotal(); if(total1) 在分析市场状况之前,检测你的账户上可用的自由保证金可以开仓。if(AccountFreeMargin()(1000*Lots)没有资金.自由保证金 = , AccountFreeMargin();进入看涨仓位的条件: MACD 低于零, 向上并且穿过信号线向下。这就是我们在 MQL4中描述的 (注意我们在指标上的业务值保存在先前的变量中):/ 尽可能检测看涨仓位 (BUY) if(Ma
7、cdCurrentSignalCurrent & MacdPrevious MathAbs(MacdCurrent)(MACDOpenLevel*Point) & MaCurrentMaPrevious) ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, macd sample,16384,0,Green); if(ticket0) if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) BUY 开单 :,OrderOpenPrice(); else Print
8、(错误 opening BUY order :,GetLastError();附加的检验山丘的大小上面已经给出了描述。 MACDOpenLevel变量是一个用户指定变量,它不可能改变程序文本,但是却有很大的灵活性。在程序开始我们插入这个变量的描述。o 能交易示范 22010年02月18日 星期四 10:15 可能是卖空仓位(SELL)?进入卖空仓位的条件: MACD高于零,向上并且穿过信号线向下。注解如下:/ 尽可能的检测卖空仓位(SELL) if(MacdCurrent MacdCurrentSignalPrevious & MaCurrent ticket=OrderSend(Symbol
9、(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,16384,0,Red);SELL 开单 :错误SELL定单开仓 :return(0); 周期循环检验先前开仓/进入市场的正确性非常重要 / 但是更重要的是安全退出. for(cnt=0;cnt OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()(MACDCloseLevel*Point) OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); /平仓 /退出o 应该重设追踪止损马?我们设
10、定追踪止损只有在仓位盈利已经超过追踪水平点,并且新的止损水平点好于先前的水平。/ 检测追踪止损if(TrailingStop0) if(Bid-OrderOpenPrice()Point*TrailingStop) if(OrderStopLoss() OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop, OrderTakeProfit(),0,Green);我们停止操作符。 如果是卖空仓位else /卖空仓位 应该平仓吗?退出卖空仓位的条件: MACD穿过信号线,MACD低于零,向上并且穿过信号线向下。if(Ma
11、cdCurrent(Point*TrailingStop) if(OrderStopLoss()(Ask+Point*TrailingStop) | (OrderStopLoss()=0) OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop, OrderTakeProfit(),0,Red);关闭所有残留开仓。这样一步一步地编写我们的智能交易.智能交易示范 316步骤3 集中程序的结果代码让我们打开智能交易的设定:使用按钮打开属性.菜单。在窗口内指定运行参量的外部设定:从先前部分集中全部代码:/+-+/| MACD
12、 Sample.mq4 |/| Copyright 2005, MetaQuotes Software Corp. |/| |/| |int start() double MacdCurrent, MacdPrevious, SignalCurrent; double SignalPrevious, MaCurrent, MaPrevious; int cnt, ticket, total;/ 检测初始化数据/ 确定智能交易在图表中运行正常非常重要/ 用户在外部变量交易中不会产生任何错误/ 外部变量 (标准手数, 止损,赢利, / 追踪止损) 在这种情况下,我们检测图表中赢利水平要小于100
13、柱 / 检测赢利水平/ 简化代码和加速通道/ 数据被放置在内部变量中 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,
14、0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); total=OrdersTotal(); / 没有指定开单 if(AccountFreeMargin()没有资金. 自由保证金 = / 尽可能检测看涨仓位 (BUY) MacdPreviousSignalPrevious & ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) Print(BUY 定单开仓 :错误BUY定单开
15、仓 : / 尽可能检测卖空仓位(SELL) MacdCurrent MaCurrent ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,SELL 定单开仓 : / 正确进入市场很重要, / 但正确退出市场更重要. for(cnt=0;cnt if(OrderStopLoss()Bid-Point*TrailingStop) OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
16、 else / 去卖空仓位 / 平仓 OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);/ 结束对于最后智能交易的确认,只需要指定外部变量值 Lots = 1, Stop Loss (S/L) = 0 (not used), Take Profit (T/P) = 120 (appropriate for one-hour intervals), Trailing Stop (T/S) = 30. 当然,你可以使用自己的值。按 编写按钮,如果没有任何错误信息出现 (你可以从 MetaEditor的列表中复制), 按 保存键保存智能交易。附件:MACD Sample.mq4 (3.8 Kb)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1