如何获得MT5指定时间周期的开盘价、收盘价、最高价、最低价? 新评论 瞬间的光辉 2009.11.04 15:05 这个问题要是在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[index]; 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[index]; 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[index]; return(high); } //+------------------------------------------------------------------+ 原文来自:第一MT5编程论坛:http://www.mt5.net.cn原文地址:http://www.mt5.net.cn/read.php?tid=324 附加的文件: openiclosedlownhigh.rar 1 kb 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这个问题要是在MT4里,简直是基础的不能再基础的东西了,但是到了MT5里,却是异常的复杂。
要分两种情况:
1 在编写指标里:
是作为OnCalculate的参数带来的如下代码:
2 在EA里确实异常的复杂:
首先我做了如下测试:
找了半天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)获得。
下面是完整的代码:
原文来自:第一MT5编程论坛:http://www.mt5.net.cn原文地址:http://www.mt5.net.cn/read.php?tid=324