17评论

3收藏

MT5指定时间周期的开盘价、收盘价、最高价、最低价

avatar 编程逆袭仔 | 10791 人阅读 | 17 人评论 | 2013-11-22

这个问题要是在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);
  • }
  • //+------------------------------------------------------------------+
""
还没有人打赏,支持一下

评论|共 17 个

孤独一笑

发表于 2013-11-24 00:09:17 | 显示全部楼层

随便看看……

iwzzb

发表于 2014-11-4 13:03:34 | 显示全部楼层

研究研究

桐澄楠安

发表于 2014-11-19 12:18:32 | 显示全部楼层

想学EA,拜师,谁收了我吧

hqdqxqbk

发表于 2014-11-24 15:44:23 | 显示全部楼层

看看,看看。谢谢。你要发,我也要发。

高卷佛伽

发表于 2014-11-25 15:44:32 | 显示全部楼层

感谢分享

外汇大猫

发表于 2017-7-10 21:21:10 | 显示全部楼层

楼主联系方式多少啊?

kunwe

发表于 2020-4-5 21:33:01 | 显示全部楼层

前排支持下分享

蒲公英的约定

发表于 2020-8-23 10:00:32 | 显示全部楼层

谢谢楼主分享

hapy389

发表于 2020-8-31 16:48:30 | 显示全部楼层

12下一页
您需要登录后才可以回帖 登录 | 注册 微信登录

EA之家评论守则