晕!写的一个MT5的EA的执行情况和预想的完全不同,谁帮我看看什么问题。 本来是想写个Dual Thrust策略的EA,可运行情况完全不同!好像一直无法出现反向开仓的情况?! 1. 在今天的收盘,计算两个值: 最高价-收盘价, 和 收盘价-最低价。然后取这两个值较大的那个,乘以k值0.7。把结果称为 触发值。 2. 在明天的开盘,记录开盘价,然后在价格超过(开盘+触发值)时马上买入,或者价格低于(开盘-触发值)时马上卖空。 3. 没有明确止损。这个系统是反转系统,也就是说,如果在价格超过(开盘+触发值)时手头有一口空单,则买入两口。同理,如果在价格低于(开盘-触发值)时手上有一口多单,则卖出两口。 MT5的EA代码如下: //+------------------------------------------------------------------+ //| Dual_Thrust.mq5 | //| Copyright 2010, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #include <Trade\AccountInfo.mqh> #include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> //--- input parameters input int Input1=0; input double Input2=0.1; input int Input3; input int Input4; input double Lot=0.1; // Lot size #define BAR_COUNT 2 double Trigger_value; int Position_Status = 0; //1 for sell, 2 for buy; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ //--- Minimum allowed volume for trade operations double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); //--- Maximum allowed volume for trade operations double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX); //--- Obtain minimum volume gradation double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP); //--- Get the number of pending orders allowed on the account int max_allowed_orders=(int)AccountInfoInteger(ACCOUNT_LIMIT_ORDERS ); double max_positions_volume=15; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- // double Open[BAR_COUNT],High[BAR_COUNT],Low[BAR_COUNT],Close[BAR_COUNT]; double Open[],High[],Low[],Close[]; if(CopyOpen(_Symbol,PERIOD_CURRENT,0,BAR_COUNT,Open)!=BAR_COUNT || CopyHigh(_Symbol,PERIOD_CURRENT,0,BAR_COUNT,High)!=BAR_COUNT || CopyLow(_Symbol,PERIOD_CURRENT,0,BAR_COUNT,Low)!=BAR_COUNT || CopyClose(_Symbol,PERIOD_CURRENT,0,BAR_COUNT,Close)!=BAR_COUNT) { Print("CopyData failed, no data"); } Trigger_value = 0.7*MathMax((High[BAR_COUNT-2]-Close[BAR_COUNT-2]), (Close[BAR_COUNT-2]-Low[BAR_COUNT-2])); if(SymbolInfoDouble(_Symbol,SYMBOL_BID) > (Open[BAR_COUNT-1]+Trigger_value)) Position_Status =2; //2 for buy if(SymbolInfoDouble(_Symbol,SYMBOL_BID) < (Open[BAR_COUNT-1]-Trigger_value)) Position_Status =1; //1 for sell if(Position_Status==2) //2 for buy { CPositionInfo posinf; CTrade trade; double lot=Lot; if(posinf.Select(_Symbol)) { if(posinf.Type()==POSITION_TYPE_SELL) { lot=lot+posinf.Volume(); // if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),0,0)) trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),0,0); Print(trade.ResultRetcodeDescription()); } } else { if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),0,0)) Print(trade.ResultRetcodeDescription()); } } if(Position_Status==1) //1 for sell { CPositionInfo posinf; CTrade trade; double lot=Lot; if(posinf.Select(_Symbol)) { if(posinf.Type()==POSITION_TYPE_BUY) { lot=lot+posinf.Volume(); // if(!trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),0,0)) trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),0,0); Print(trade.ResultRetcodeDescription()); } } else { if(!trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),0,0)) Print(trade.ResultRetcodeDescription()); } } } //+------------------------------------------------------------------+
这几天偶尔发现我去年写过这个策略的MT5代码,只是因为效果不好放弃了,这几天偶尔可视化运行了一下,发现是因为本来应该是反转策略实际运行时却只平了原有的仓位而没有反向开新仓。 可查了几天也没找到导致上述问题的代码错误在什么地方。谁熟悉MT5的EA帮忙看看。 谢谢。 代码贴在这个帖里了: http://www.hylt.net/vb/showthread.php?t=34533