您现在的位置:程序化交易>> 外汇现货>> MT5>> MT5知识>>正文内容

如何获得MT5指定时间周期的开盘价、收盘价、最高价、最低价? [MT4]

  • 这个问题要是在MT4里,简直是基础的不能再基础的东西了,但是到了MT5里,却是异常的复杂。
    要分两种情况:
    1 在编写指标里:
    是作为OnCalculate的参数带来的如下代码:
    复制代码
    1. int OnCalculate (const int rates_total,
    2. const int prev_calculated,
    3. const datetime& time[], // Time
    4. const double& open[], // Open
    5. const double& high[], // High
    6. const double& low[], // Low
    7. const double& close[], // Close
    8. const long& tick_volume[], // Tick Volume
    9. const long& volume[], // Real Volume
    10. const int& spread[] // Spread
    11. );

    2 在EA里确实异常的复杂:
    首先我做了如下测试:
    复制代码
    1. void OnTick()
    2. {
    3. double open,close,low,high;
    4. int Spread;
    5. open=SymbolInfoDouble(Symbol(),SYMBOL_ASK);//得到当前的ask价格
    6. close=SymbolInfoDouble(Symbol(),SYMBOL_BID);//得到当前的bid价格
    7. low=SymbolInfoDouble(Symbol(),SYMBOL_BIDLOW);//注意这里没有时间段参数,这里得到的是一天的最低价。
    8. high=SymbolInfoDouble(Symbol(),SYMBOL_BIDHIGH);//注意这里没有时间段参数,这里得到的是一天的最高价。
    9. }

    找了半天SymbolInfoDouble这个函数根本不能实现得到指定时间周期的open close low high 价格。
    后来我终于找到了解决方法,如下:
    如果系统没有提供如何获得指定周期的开盘,最低价,最低价,那么我只能自己写一个函数来获得了。
    iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)//此函数是我构造的,和MT4中系统自带的iOpen 一样用法。
    iOpen(Symbol(),PERIOD_MN1,0);//表示获得最近一根月线的开盘价。


    iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)//此函数是我构造的,和MT4中系统自带的iLow 一样用法。
    iLow(Symbol(),PERIOD_MN1,0);//表示获得最近一根月线的最低价。

    iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)//此函数是我构造的,和MT4中系统自带的iHigh 一样用法。
    iHigh(Symbol(),PERIOD_MN1,0);//表示获得最近一根月线的最高价。

    至于收盘价其实,和bid价格是一样的所以完全就可以用系统自带的SymbolInfoDouble(Symbol(),SYMBOL_BID)获得。
    下面是完整的代码:
    复制代码
    1. #property copyright "2009, MetaQuotes Software Corp."
    2. #property link "http://www.mt5.net.cn"
    3. #property version "1.00"
    4. double Open[],High[],Low[];
    5. int OnInit()
    6. {
    7. return(0);
    8. }
    9. void OnDeinit(const int reason)
    10. {
    11. }
    12. void OnTick()
    13. {
    14. double open,close,low,high;
    15. open=iOpen(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的开盘价。
    16. close=SymbolInfoDouble(Symbol(),SYMBOL_BID); //表示获得最近一根月线的收盘价。
    17. low=iLow(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的最低价。
    18. high=iHigh(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的最高价。
    19. }
    20. double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
    21. {
    22. double open=0;
    23. ArraySetAsSeries(Open,true);
    24. int copied=CopyOpen(symbol,timeframe,0,Bars(symbol,timeframe),Open); //将指定时间周期的开盘价格复制到指定数组。
    25. if(copied>0 && index<copied) open=Open[index];
    26. return(open);
    27. }
    28. double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
    29. {
    30. double low=0;
    31. ArraySetAsSeries(Low,true);
    32. int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
    33. if(copied>0 && index<copied) low=Low[index];
    34. return(low);
    35. }
    36. double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
    37. {
    38. double high=0;
    39. ArraySetAsSeries(High,true);
    40. int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
    41. if(copied>0 && index<copied) high=High[index];
    42. return(high);
    43. }
    44. //+------------------------------------------------------------------+

    open,close,low,high.rar (1 K) 下载次数:75

【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容