MT5指定时间周期的开盘价、收盘价、最高价、最低价
这个问题要是在MT4里,简直是基础的不能再基础的东西了,但是到了MT5里,却是异常的复杂。要分两种情况:
1 在编写指标里:
是作为OnCalculate的参数带来的如下代码:
复制代码
[*]
[*]int OnCalculate (const int rates_total,
[*]const int prev_calculated,
[*]const datetime& time[], // Time
[*]const double& open[], // Open
[*]const double& high[], // High
[*]const double& low[], // Low
[*]const double& close[], // Close
[*]const long& tick_volume[], // Tick Volume
[*]const long& volume[], // Real Volume
[*]const int& spread[] // Spread
[*]);
2 在EA里确实异常的复杂:
首先我做了如下测试:
复制代码
[*]
[*]void OnTick()
[*]{
[*]double open,close,low,high;
[*]int Spread;
[*]open=SymbolInfoDouble(Symbol(),SYMBOL_ASK);//得到当前的ask价格
[*]close=SymbolInfoDouble(Symbol(),SYMBOL_BID);//得到当前的bid价格
[*]low=SymbolInfoDouble(Symbol(),SYMBOL_BIDLOW);//注意这里没有时间段参数,这里得到的是一天的最低价。
[*]high=SymbolInfoDouble(Symbol(),SYMBOL_BIDHIGH);//注意这里没有时间段参数,这里得到的是一天的最高价。
[*]}
找了半天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)获得。
下面是完整的代码:
复制代码
[*]
[*]#property copyright "2009, MetaQuotes Software Corp."
[*]#property link "http://www.mt5.net.cn"
[*]#property version "1.00"
[*]double Open[],High[],Low[];
[*]int OnInit()
[*]{
[*]return(0);
[*]}
[*]void OnDeinit(const int reason)
[*]{
[*]}
[*]void OnTick()
[*]{
[*]double open,close,low,high;
[*]open=iOpen(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的开盘价。
[*]close=SymbolInfoDouble(Symbol(),SYMBOL_BID); //表示获得最近一根月线的收盘价。
[*]low=iLow(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的最低价。
[*]high=iHigh(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的最高价。
[*]}
[*]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;
[*]return(open);
[*]}
[*]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;
[*]return(low);
[*]}
[*]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;
[*]return(high);
[*]}
[*]//+------------------------------------------------------------------+
随便看看…… 研究研究 想学EA,拜师,谁收了我吧 看看,看看。谢谢。你要发,我也要发。 感谢分享 楼主联系方式多少啊? 前排支持下分享 谢谢楼主分享 {:1_186:}{:1_186:}{:1_186:}
页:
[1]
2