MQL4价格数据函数详解:掌握这些API轻松获取行情数据

在MQL4编程中,价格数据相关函数用于获取指定货币对在特定时段内的行情数据,是编写指标与脚本的基础工具。

当请求的数据(如货币对名称或时段)与当前图表不一致时,可能因为对应图表未在客户端打开,需要从服务器下载历史数据。此过程中,若历史数据仍在更新,错误信息ERR_HISTORY_WILL_UPDATED(4066)会被记录到last_error变量,此时需重新发起数据请求(可参考ArrayCopySeries()函数示例)。

在策略测试过程中,同一货币对的价格数据以及不同时段的数据(除成交量外)会被高精度模拟。其他时段的成交量与其它货币对的价格数据则不会模拟,但无论何种情况,时段内的柱体总数都会被准确模拟。

iBars() – 获取柱体数量

iBarShift() – 搜索指定柱体

iClose() – 获取收盘价

iHigh() – 获取最高价

iHighest() – 获取最高值所在偏移

iLow() – 获取最低价

iLowest() – 获取最低值所在偏移

iOpen() – 获取开盘价

iTime() – 获取开盘时间

iVolume() – 获取成交量

iBars() – 获取柱体数量

int iBars(string symbol, int timeframe)返回指定图表中柱体(K线)的数量。对于当前图表,柱体数量信息保存在预定义变量Bars中。

参数:

symbol - 要计算数据的货币对名称,NULL表示当前货币对。timeframe - 时间周期,可为时间周期枚举任意值,0表示当前图表周期。示例:

Print("'EURUSD'在PERIOD_H1时段的柱数:",iBars("EUROUSD",PERIOD_H1)); iBarShift() – 搜索指定柱体

int iBarShift(string symbol, int timeframe, datetime time, void exact)根据开盘时间搜索柱体。返回包含指定开盘时间的柱体索引;若未找到,根据exact参数决定返回-1或最近柱体。

参数:

symbol - 要计算数据的货币对名称,NULL表示当前货币对。timeframe - 时间周期,可为时间周期枚举任意值,0表示当前图表周期。time - 柱体的开盘时间。exact - 未发现柱体的返回模式:false返回最近的柱子,true返回-1。示例:

datetime some_time=D'2004.03.21 12:00'; int shift=iBarShift("EUROUSD",PERIOD_M1,some_time); Print("带有打开时间的柱体 ",TimeToStr(some_time)," 是 ",shift);iClose() – 获取收盘价

double iClose(string symbol, int timeframe, int shift)返回指定货币对在指定时段和偏移量下的柱体收盘价。若本地历史数据为空(未加载),函数返回0。对于当前图表,收盘价信息保存在预定义数组Close[]中。

参数:

symbol - 要计算数据的货币对名称,NULL表示当前货币对。timeframe - 时间周期,可为时间周期枚举任意值,0表示当前图表周期。shift - 从指标缓冲区获取值的索引(相对当前柱子的偏移量)。示例:

Print("对于 USDCHF H1当前柱: ",iTime("USDCHF",PERIOD_H1,i),", ", iOpen("USDCHF",PERIOD_H1,i),", ", iHigh("USDCHF",PERIOD_H1,i),", ", iLow("USDCHF",PERIOD_H1,i),", ", iClose("USDCHF",PERIOD_H1,i),", ", iVolume("USDCHF",PERIOD_H1,i));iHigh() – 获取最高价

double iHigh(string symbol, int timeframe, int shift)返回指定货币对在指定时段和偏移量下的柱体最高价。若本地历史数据为空,函数返回0。对于当前图表,最高价信息保存在预定义数组High[]中。

参数:

symbol - 要计算数据的货币对名称,NULL表示当前货币对。timeframe - 时间周期,可为时间周期枚举任意值,0表示当前图表周期。shift - 从指标缓冲区获取值的索引(相对当前柱子的偏移量)。示例:

Print("对于 USDCHF H1当前柱: ",iTime("USDCHF",PERIOD_H1,i),", ", iOpen("USDCHF",PERIOD_H1,i),", ", iHigh("USDCHF",PERIOD_H1,i),", ", iLow("USDCHF",PERIOD_H1,i),", ", iClose("USDCHF",PERIOD_H1,i),", ", iVolume("USDCHF",PERIOD_H1,i));iHighest() – 最高值偏移量

int iHighest(string symbol, int timeframe, int type, void count, void start)根据类型返回指定时间周期内最大值的偏移量。

参数:

symbol - 要计算数据的货币对名称,NULL表示当前货币对。timeframe - 时间周期,可为时间周期枚举任意值,0表示当前图表周期。type - 序列数组识别符,可为序列数据识别符枚举任意值。count - 要计算的周期数(沿着开头柱子到后面柱子的方向)。start - 开始柱子,相对于当前柱子的偏移。示例:

double val; // 在20个连续柱子范围内计算最大值 // 在当前图表上从第4个至第23个的索引 val=High[iHighest(NULL,0,MODE_HIGH,20,4)];iLow() – 获取最低价

double iLow(string symbol, int timeframe, int shift)返回指定货币对在指定时段和偏移量下的柱体最低价。若本地历史数据为空,函数返回0。对于当前图表,LMAX官网最低价信息保存在预定义数组Low[]中。

参数:

symbol - 要计算数据的货币对名称,NULL表示当前货币对。timeframe - 时间周期,可为时间周期枚举任意值,0表示当前图表周期。shift - 从指标缓冲区获取值的索引(相对当前柱子的偏移量)。示例:

Print("对于 USDCHF H1当前柱: ",iTime("USDCHF",PERIOD_H1,i),", ", iOpen("USDCHF",PERIOD_H1,i),", ", iHigh("USDCHF",PERIOD_H1,i),", ", iLow("USDCHF",PERIOD_H1,i),", ", iClose("USDCHF",PERIOD_H1,i),", ", iVolume("USDCHF",PERIOD_H1,i));iLowest() – 最低值偏移量

int iLowest(string symbol, int timeframe, int type, void count, void start)根据类型返回指定时间周期内最小值的偏移量。

参数:

symbol - 要计算数据的货币对名称,NULL表示当前货币对。timeframe - 时间周期,可为时间周期枚举任意值,0表示当前图表周期。type - 序列数组识别符,可为序列数据识别符枚举任意值。count - 要计算的周期数(沿着开头柱子到后面柱子的方向)。start - 开始柱子,相对于当前柱子的偏移。示例:

double val; // 在20个连续柱子范围内计算最小值 // 在当前图表上从第4个至第23个的索引 val=Low[iLowest(NULL,0,MODE_LOW,20,4)];iOpen() – 获取开盘价

double iOpen(string symbol, int timeframe, int shift)返回指定货币对在指定时段和偏移量下的柱体开盘价。若本地历史数据为空,函数返回0。对于当前图表,开盘价信息保存在预定义数组Open[]中。

参数:

symbol - 要计算数据的货币对名称,NULL表示当前货币对。timeframe - 时间周期,可为时间周期枚举任意值,0表示当前图表周期。shift - 从指标缓冲区获取值的索引(相对当前柱子的偏移量)。示例:

Print("对于 USDCHF H1当前柱: ",iTime("USDCHF",PERIOD_H1,i),", ", iOpen("USDCHF",PERIOD_H1,i),", ", iHigh("USDCHF",PERIOD_H1,i),", ", iLow("USDCHF",PERIOD_H1,i),", ", iClose("USDCHF",PERIOD_H1,i),", ", iVolume("USDCHF",PERIOD_H1,i));iTime() – 获取开盘时间

datetime iTime(string symbol, int timeframe, int shift)返回指定货币对在指定时段和偏移量下的柱体开盘时间。若本地历史数据为空,函数返回0。对于当前图表,开盘时间信息保存在预定义数组Time[]中。

参数:

symbol - 要计算数据的货币对名称,NULL表示当前货币对。timeframe - 时间周期,可为时间周期枚举任意值,0表示当前图表周期。shift - 从指标缓冲区获取值的索引(相对当前柱子的偏移量)。示例:

Print("对于 USDCHF H1当前柱: ",iTime("USDCHF",PERIOD_H1,i),", ", iOpen("USDCHF",PERIOD_H1,i),", ", iHigh("USDCHF",PERIOD_H1,i),", ", iLow("USDCHF",PERIOD_H1,i),", ", iClose("USDCHF",PERIOD_H1,i),", ", iVolume("USDCHF",PERIOD_H1,i));iVolume() – 获取成交量

double iVolume(string symbol, int timeframe, int shift)返回指定货币对在指定时段和偏移量下的柱体成交量。若本地历史数据为空,函数返回0。对于当前图表,成交量信息保存在预定义数组Volume[]中。

注:该成交量并非真实成交量,而是基于tick价格变动次数估算的值。tick价格变动越快,表示成交量越大;变动越慢,成交量越小。

参数:

symbol - 要计算数据的货币对名称,NULL表示当前货币对。timeframe - 时间周期,可为时间周期枚举任意值,0表示当前图表周期。shift - 从指标缓冲区获取值的索引(相对当前柱子的偏移量)。示例:

Print("对于 USDCHF H1当前柱: ",iTime("USDCHF",PERIOD_H1,i),", ", iOpen("USDCHF",PERIOD_H1,i),", ", iHigh("USDCHF",PERIOD_H1,i),", ", iLow("USDCHF",PERIOD_H1,i),", ", iClose("USDCHF",PERIOD_H1,i),", ", iVolume("USDCHF",PERIOD_H1,i));