晕!写的一个MT5的EA的执行情况和预想的完全不同,谁帮我看看什么问题。

Discussion in 'MetaTrader' started by wj2000, Sep 11, 2011.

  1. 晕!写的一个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());
    }

    }

    }
    //+------------------------------------------------------------------+
     
  2. 谁帮忙看看?
     
  3. 调试一下,问题不难发现的
     
  4. 怎么调试?编译等都没有问题,就是好像开平仓和预想的不同:confused:
    晕!
     
  5. 在关键位置Print出相关参数的数值,看数值是否正确
     
  6. 这几天偶尔发现我去年写过这个策略的MT5代码,只是因为效果不好放弃了,这几天偶尔可视化运行了一下,发现是因为本来应该是反转策略实际运行时却只平了原有的仓位而没有反向开新仓。
    可查了几天也没找到导致上述问题的代码错误在什么地方。谁熟悉MT5的EA帮忙看看。

    谢谢。

    代码贴在这个帖里了:
    http://www.hylt.net/vb/showthread.php?t=34533
     
  7. 偶不懂MT5語法,不過偶知道MT5的新改變里有一條:不允許對沖對鎖,所以你如果開反向倉,就只是平掉現有倉。如果要反手持倉,還是要加一條新開倉的指令才行。
     
  8. 谢谢,这条规则我知道的,我先在检查看看,不行就至少暂时先采用双倍指令方式应付一下了.
     
  9. 查出来什么原因了,主要是在使用PositionGetDouble() 前需要先检查PositionSelect(symbol)
     
  10. ~结果出来了啊 多余了:)