什么药膏含麝香:如何获得MT5指定时间周期的开盘价、收盘价、最高价、最低价?——梁大鹏 黄金分析师 外汇分...

来源:百度文库 编辑:偶看新闻 时间:2024/04/25 08:10:45
 这个问题要是在MT4里,简直是基础的不能再基础的东西了,但是到了MT5里,却是异常的复杂。
要分两种情况:
1 在编写指标里:
是作为OnCalculate的参数带来的如下代码:
复制代码

   1.
   2. int _disibledevent=SymbolInfoDouble(Symbol(),SYMBOL_ASK);//得到当前的ask价格
   7.    close=SymbolInfoDouble(Symbol(),SYMBOL_BID);//得到当前的bid价格
   8.    low=SymbolInfoDouble(Symbol(),SYMBOL_BIDLOW);//注意这里没有时间段参数,这里得到的是一天的最低价。
   9.    high=SymbolInfoDouble(Symbol(),SYMBOL_BIDHIGH);//注意这里没有时间段参数,这里得到的是一天的最高价。
  10.   }


找了半天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.
   2. #property copyright "2009, MetaQuotes Software Corp."
   3. #property link      "http://www.mt5.net.cn"
   4. #property version   "1.00"
   5. double Open[],High[],Low[];
   6. int _disibledevent=iOpen(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的开盘价。
  17.    close=SymbolInfoDouble(Symbol(),SYMBOL_BID); //表示获得最近一根月线的收盘价。
  18.    low=iLow(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的最低价。
  19.    high=iHigh(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的最高价。
  20.   }
  21. double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  22.   {
  23.    double pen=0;
  24.    ArraySetAsSeries(Open,true);
  25.    int copied=CopyOpen(symbol,timeframe,0,Bars(symbol,timeframe),Open); //将指定时间周期的开盘价格复制到指定数组。
  26.    if(copied>0 && index  27.    return(open);
  28.   }
  29. double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  30.   {
  31.    double low=0;
  32.    ArraySetAsSeries(Low,true);
  33.    int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
  34.    if(copied>0 && index  35.    return(low);
  36.   }
  37. double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  38.   {
  39.    double high=0;
  40.    ArraySetAsSeries(High,true);
  41.    int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
  42.    if(copied>0 && index  43.    return(high);
  44.   }
  45. //+------------------------------------------------------------------+