CopyRates
CopyRates
获取 MqlRates 结构的历史序列,按指定品种-周期,按指定数量,并存储到矩阵或向量当中。 元素顺序倒计时,从现在到过去,这意味着起始位置等于 0 表示当前柱线。
复制数据,以便将最久远的元素放置在矩阵/向量的开头。 有三个函数选项。
依据初始位置和所需元素的数量进行访问
bool matrix::CopyRates(
string symbol, // 品名
ENUM_TIMEFRAMES period, // 周期
ulong rates_mask, // 指定所请求序列的标志组合
ulong start, // 复制初始柱线的起始索引
ulong count // 要复制的数量
);按初始日期和所需元素的数量进行访问
bool matrix::CopyRates(
string symbol, // 品名
ENUM_TIMEFRAMES period, // 周期
ulong rates_mask, // 指定所请求序列的标志组合
datetime from, // 起始日期
ulong count // 要复制的数量
);按所需时间间隔的初始日期和最终日期进行访问
bool matrix::CopyRates(
string symbol, // 品名
ENUM_TIMEFRAMES period, // 周期
ulong rates_mask, // 指定所请求序列的标志组合
datetime from, // 起始日期
datetime to // 结束日期
);向量方法
依据初始位置和所需元素的数量进行访问
bool vector::CopyRates(
string symbol, // 品名
ENUM_TIMEFRAMES period, // 周期
ulong rates_mask, // 指定所请求序列的标志组合
ulong start, // 复制初始柱线的起始索引
ulong count // 要复制的数量
);按初始日期和所需元素的数量进行访问
bool vector::CopyRates(
string symbol, // 品名
ENUM_TIMEFRAMES period, // 周期
ulong rates_mask, // 指定所请求序列的标志组合
datetime from, // 起始日期
ulong count // 要复制的数量
);按所需时间间隔的初始日期和最终日期进行访问
bool vector::CopyRates(
string symbol, // 品名
ENUM_TIMEFRAMES period, // 周期
ulong rates_mask, // 指定所请求序列的标志组合
datetime from, // 起始日期
datetime to // 结束日期
);参数
- symbol
[输入] 品种。
- period
[输入] 周期。
- rates_mask
[输入] 指定所请求序列类型的标志的 ENUM_COPY_RATES 枚举组合。当复制到向量时,只能指定来自 ENUM_COPY_RATES 枚举中的一个值,否则会发生错误。
- start
[输入] 第一个复制的元素索引。
- count
[输入] 复制的元素数量。
- from
[输入] 对应于第一个元素的柱线时间。
- to
[输入] 对应于最后一个元素的柱线时间。
返回值
如果成功则返回 true,否则返回 false(如果出现错误)。
注意
如果所请求数据的区间完全超出服务器上的可用数据,则该函数返回 false。 如果数据超出 TERMINAL_MAXBARS 之外(图表上的最大柱数),则该函数也会返回 false。
当请求数据来自 EA 或脚本时,如果终端在本地没有相应的数据,则启动从服务器下载,或者如果可以从本地历史构建数据但尚未准备好,则开始构建必要的时间序列。 该函数按时间返回准备好的直至期满的数据量,然而历史记录下载将继续,并且在下一个类似请求期间,该函数会返回更多数据。
按开始日期和所需项目数量请求数据时,仅返回日期小于(之前)或等于指定日期的数据。 设置间隔时要考虑多一秒。 换句话说,返回值的任何柱线的开盘日期(交易量、点差、开盘价、最高价、最低价、收盘价或时间)始终等于或小于指定的日期。
当请求给定日期范围内的数据时,仅返回请求间隔内的数据。 设置间隔时要考虑多一秒。 换句话说,返回的任何柱线的开盘时间(交易量、点差、指标缓冲区值、开盘价、最高价、最低价、收盘价或时间)始终位于请求的区间内。
例如,如果当日是一周中的星期六,则当尝试设置 start_time=Last_Tuesday 和 stop_time=Last_Friday 复制周线时间帧数据时,函数会返回 0,因为周线时间帧的开盘时间始终落在星期日,故没有一个周线柱线落在指定范围内。
如果您需要获取对应于当前未完成柱线的数值,那么您可以采用第一种调用形式指示 start_pos=0 和 count=1。
ENUM_COPY_RATES
ENUM_COPY_RATES 枚举包含指定要传递给矩阵或数组的数据类型的标志。 标志组合允许在一个请求中从历史记录中获取多个序列。 矩阵中行的顺序将与 ENUM_COPY_RATES 枚举中值的顺序相对应。 换言之,含有最高价数据的行在矩阵中将始终高于含有最低价数据的行。
| ID | 值 | 说明 |
|---|---|---|
| COPY_RATES_OPEN | 1 | 开盘价序列 |
| COPY_RATES_HIGH | 2 | 最高价序列 |
| COPY_RATES_LOW | 4 | 最低价序列 |
| COPY_RATES_CLOSE | 8 | 收盘价序列 |
| COPY_RATES_TIME | 16 | 时间序列(柱线开盘时间) 获取向量和矩阵(vectord 和 matrixf)的浮点型的时间会导致 ~100 秒的缺失,因为浮点精度受到严重限制,并且大于1«24 的整数无法在浮点数中准确表示。 |
| COPY_RATES_VOLUME_TICK | 32 | 跳价的成交量 |
| COPY_RATES_VOLUME_REAL | 64 | 交易成交量 |
| COPY_RATES_SPREAD | 128 | 点差 |
| 组合 | ||
| COPY_RATES_OHLC | 15 | 开盘价、最高价、最低价、和收盘价序列 |
| COPY_RATES_OHLCT | 31 | 开盘价、最高价、最低价、收盘价、和时间序列 |
| 数据排列 | ||
| COPY_RATES_VERTICAL | 32768 | 序列沿垂直轴复制到矩阵中。接收到的序列值将在矩阵中垂直排列,即最早的数据将位于第一行,而最新的数据将位于矩阵的最后一行。 使用默认复制时,序列会沿水平轴添加到矩阵中。 该标识仅在复制到矩阵时适用。 |
示例:
//+------------------------------------------------------------------+
//| 脚本程序 start 函数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 获取报价至矩阵
matrix matrix_rates;
if(matrix_rates.CopyRates(Symbol(), PERIOD_CURRENT, COPY_RATES_OHLCT, 1, 10))
Print("matrix rates: \n", matrix_rates);
else
Print("matrix_rates.CopyRates failed. Error ", GetLastError());
//--- 检查
MqlRates mql_rates[];
if(CopyRates(Symbol(), PERIOD_CURRENT, 1, 10, mql_rates)>0)
{
Print("mql_rates array:");
ArrayPrint(mql_rates);
}
else
Print("CopyRates(Symbol(), PERIOD_CURRENT,1, 10, mql_rates). Error ", GetLastError());
//--- 获取报价至向量 = 无效调用
vector vector_rates;
if(vector_rates.CopyRates(Symbol(), PERIOD_CURRENT, COPY_RATES_OHLC, 1, 15))
Print("vector_rates COPY_RATES_OHLC: \n", vector_rates);
else
Print("vector_rates.CopyRates COPY_RATES_OHLC failed. Error ", GetLastError());
//--- 获取收盘价至向量
if(vector_rates.CopyRates(Symbol(), PERIOD_CURRENT, COPY_RATES_CLOSE, 1, 15))
Print("vector_rates COPY_RATES_CLOSE: \n", vector_rates);
else
Print("vector_rates.CopyRates failed. Error ", GetLastError());
};
/*
matrix rates:
[[0.99686,0.99638,0.99588,0.99441,0.99464,0.99594,0.99698,0.99758,0.99581,0.9952800000000001]
[0.99708,0.99643,0.99591,0.9955000000000001,0.99652,0.99795,0.99865,0.99764,0.99604,0.9957]
[0.9961100000000001,0.99491,0.99426,0.99441,0.99448,0.99494,0.9964499999999999,0.99472,0.9936,0.9922]
[0.99641,0.99588,0.99441,0.99464,0.99594,0.99697,0.99758,0.99581,0.9952800000000001,0.99259]
[1662436800,1662440400,1662444000,1662447600,1662451200,1662454800,1662458400,1662462000,1662465600,1662469200]]
mql_rates array:
[time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume]
[0] 2022.09.06 04:00:00 0.99686 0.99708 0.99611 0.99641 4463 0 0
[1] 2022.09.06 05:00:00 0.99638 0.99643 0.99491 0.99588 4519 0 0
[2] 2022.09.06 06:00:00 0.99588 0.99591 0.99426 0.99441 3060 0 0
[3] 2022.09.06 07:00:00 0.99441 0.99550 0.99441 0.99464 3867 0 0
[4] 2022.09.06 08:00:00 0.99464 0.99652 0.99448 0.99594 5280 0 0
[5] 2022.09.06 09:00:00 0.99594 0.99795 0.99494 0.99697 7227 0 0
[6] 2022.09.06 10:00:00 0.99698 0.99865 0.99645 0.99758 10130 0 0
[7] 2022.09.06 11:00:00 0.99758 0.99764 0.99472 0.99581 7012 0 0
[8] 2022.09.06 12:00:00 0.99581 0.99604 0.99360 0.99528 6166 0 0
[9] 2022.09.06 13:00:00 0.99528 0.99570 0.99220 0.99259 6950 0 0
vector_rates.CopyRates COPY_RATES_OHLC failed. Error 4003
vector_rates COPY_RATES_CLOSE:
[0.9931,0.99293,0.99417,0.99504,0.9968399999999999,0.99641,0.99588,0.99441,0.99464,0.99594,0.99697,0.99758,0.99581,0.9952800000000001,0.99259]
*/