请教几个MT5(MQL5)的编写问题,谢谢

Discussion in 'MetaTrader' started by wj2000, Sep 19, 2010.

  1. 请教几个MT5(MQL5)的编写问题,谢谢

    比如有下面一些获得high low open close的函数,如果想获得本周期和上一周期的值,调用下面函数时其中的int index参数应该为什么值?

    本周期的high low open close的值,int index参数应该为0还是1?或者为其他什么值?
    下一周期high low open close的值,int index参数应该是多少?

    谢谢

    double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
    {
    double low=0;
    ArraySetAsSeries(Low,true);
    int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
    if(copied>0 && index<copied) low=Low[index];
    return(low);
    }
    //+------------------------------------------------------------------+
    //| Get the High for specified bar index |
    //+------------------------------------------------------------------+
    double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
    {
    double high=0;
    ArraySetAsSeries(High,true);
    int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
    if(copied>0 && index<copied) high=High[index];
    return(high);
    }

    //+------------------------------------------------------------------+
    //| Get Open for specified bar index |
    //+------------------------------------------------------------------+
    double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
    {
    double open=0;
    ArraySetAsSeries(Open,true);
    int copied=CopyOpen(symbol,timeframe,0,Bars(symbol,timeframe),Open);
    if(copied>0 && index<copied) open=Open[index];
    return(open);
    }

    //+------------------------------------------------------------------+
    //| Get Close for specified bar index |
    //+------------------------------------------------------------------+
    double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
    {
    double close=0;
    ArraySetAsSeries(Close,true);
    int copied=CopyClose(symbol,timeframe,0,Bars(symbol,timeframe),Close);
    if(copied>0 && index<copied) close=Close[index];
    return(close);
    }
     
  2. MT4的BAR柱排序是從右往左計算,當前為0,逆時增加。
    MT5則相反,從左往右計算,圖表上的左邊第一個柱為0,順時增加,rates_total為BAR總數,當前為rates_total-1。
    http://www.mt5.net.cn/read.php?tid=323

    你要的index值應該是rates_total-1和rates_total-2。
     
  3. 谢谢,怪不得我一直搞晕了,都是给mt4误导的。:p
     
  4. 那本周期收盘平仓或开盘平仓怎么写?
     
  5. // Function of a new bar
    bool isNewBar()
    {
    static datetime BarTime;
    bool res = false;
    if(BarTime != Time[0])
    {
    BarTime = Time[0];
    res = true;
    }
    return(res);
    }

    这个判断是否为新一格,可能对你有用
     
  6. 除了LS的方法,還可以判斷BAR數rates_total是否增加來確定是當前柱收盤,新柱開盤。
     
  7. 谢谢,我试试看,反正这次mt5是给搞的头大了。

    另外好像vista的系统有个“怪现象”,过去也发现过,就是vista下编译的同名文件,系统调用的时候还是用的以前编译后的文件,没有采用新文件,就算就手工删除后重新编译后还是调用过去的(指的是同名文件)。以前复制一些更改后的同名文件时也发现有类似的现象。
     
  8. LS那个代码好像是mt4的代码吧?

    另外,判断北京时间21:00-02:00为“可交易开仓时间段”,其他时间段为“不可开仓时间”段怎么写?

    谢谢
     
  9. int h=TimeHour(TimeLocal());

    if((h>=21) || (h<=2))
    {
    OrderSend
    }
     
  10. 是Mt4的,可以按照这种思路修改到mt5
     
  11. 谢谢,这次看来时间来不及了,随便搞搞了。
    http://www.mql5.com/en/articles/81

    MT4的代码:
    int h=TimeHour(TimeLocal());

    if((h>=21) || (h<=2))
    {
    OrderSend
    }

    好像MT5的代码要转换成这样:
    int TimeHourMQL4(datetime date)
    {
    MqlDateTime tm;
    TimeToStruct(date,tm);
    return(tm.hour);
    }

    int h=TimeHourMQL4((TimeLocal());

    if((h>=21) || (h<=2))
    {
    OrderSend
    }
     
  12. nix

    nix

    看你用什么类的,mt5自己带了一个trade类,貌似网站有个mq4tomq5 转换程序。时间太紧了,你来得急?
     
  13. 嘿嘿,时间太紧了,这次胡乱搞搞了。
    自己写的一个day跑8万多,但看了下测试的交易记录好像不少交易和预想的不同,估计是编写问题,后来找到一个现成的修改了参数m5跑了10万多,就是最大持仓数只有5手,看看今天有没有时间修改下,没时间就不动了,只是这样初始手数就是5手风险比较大些,而且后面的利润扩展不足。已经准备放弃自己写的那个不可靠的了,就用那个找来的现成的玩玩。:p
     
  14. 时间延长到莫斯科时间25日
     
  15. 请教前辈:当前柱逆序第21个柱 在MQL4里如果表达?谢谢
     
  16. 得到当前和上一周期的开盘,最高,最低,收盘数据是不是可以按照下面这些代码得到?

    谢谢


    #define BAR_COUNT 2
    double Open[BAR_COUNT],High[BAR_COUNT],Low[BAR_COUNT],Close[BAR_COUNT];

    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");
    }
     
  17. 做成一个script,再运行一下把结果print出来,然后与图表比较一下,就清楚了