// 设置精度为2位小数
int precision = 2;
int old_digits = Digits();
// 获取当前本地时间
datetime currentTime = TimeLocal();
// 输出当前时间
Print("当前时间为:", TimeToString(currentTime));
// 定义要获取的历史数据范围
datetime fromTime = D'2020.01.01 00:00:00'; // 设置开始时间为 2022 年 1 月 1 日 0 点 0 分 0 秒
int barsToCopy = 1000; // 设置要复制的初步历史数据数目
int historyCount = 1000; // 设置要获取的历史数据数目
int startIndex = 0; // 初始化startIndex变量
// 第一次加载历史数据,复制初步历史数据
{MqlRates ratesBuffer[];
int copied = CopyRates(InpSymbol, PERIOD_M5, 0, historyCount, ratesBuffer);
if (copied <= 0) {
// 获取失败的错误代码
Print("copied 未获取到有效数据或复制数据失败,错误代码:",GetLastError());
return;}
if (copied > 0) {Print("copied的值为", copied);}
// 修改 fromTime 变量为第一个复制的柱的时间
fromTime = ratesBuffer[0].time;
// 设置 startIndex 来获取剩余的历史数据
int startIndex2 = iBarShift(InpSymbol, PERIOD_M5, fromTime, false);
if (startIndex2 <= 0){
// 无法获取历史记录
Print("无法获取历史记录,错误代码:", GetLastError());
return;}
if (startIndex2 > 0) {Print("startIndex2的值为", startIndex2,GetLastError());}
// 复制历史数据
MqlRates rates[1000];
int copied2 = CopyRates(InpSymbol, PERIOD_M5, 0, barsToCopy, rates);
if (copied2 <= 0) {
Print("copied2未获取到有效数据或复制数据失败,错误代码为 ", GetLastError());
return;}
// 打印 K 线数据
for (int i = 0; i < copied2; i++) {
Print("K线", i+1);
Print("时间:", TimeToString(rates[i].time, TIME_DATE|TIME_MINUTES));
Print("开盘价:", DoubleToString(rates[i].open, _Digits));
Print("收盘价:", DoubleToString(rates[i].close, _Digits));
Print("最高价:", DoubleToString(rates[i].high, _Digits));
Print("最低价:", DoubleToString(rates[i].low, _Digits));
Print(""); }
// 复制MA指标的值到 maBuffer 数组中
if (ma_handle != INVALID_HANDLE) {
IndicatorRelease(ma_handle);
ma_handle = INVALID_HANDLE;}
//重新创建ma_handle 指标句柄
// 用当前历史数据计算 MA,并将结果存储到 MA 数组中
ma_handle = iMA(InpSymbol, PERIOD_M5, 15, 0, MODE_LWMA, PRICE_HIGH);
if (ma_handle == INVALID_HANDLE) {
Print("无法复制计算MA指标的值,错误代码:", GetLastError());
return;}
if (ma_handle <= 0.000) {
Print("复制计算MA指标值失败",GetLastError());}
else {Print("复制计算MA指标值成功");
// 输出计算结果
Print("当前时间为:", TimeToString(TimeLocal()), ",当前 复制 MA 值为:", ma_handle);}
// 重新计算MA指标值并将结果存储到 MA 数组中
for (int i = 0; i < 1000; i++) {
maBuffer[i] = rates[i].close;}
// 遍历 maBuffer 数组,并查找无效的 MA 值
for (int i = 0; i < ArraySize(maBuffer); i++) {
if (!MathIsValidNumber(maBuffer[i])) {
Print("maBuffer中包含无效的价格值: maBuffer[", i, "] = ", maBuffer[i], "错误代码为:", GetLastError());
return;}}
// 检查MA的值数组长度是否足够
if (ArraySize(maBuffer) < barsToCopy) {
Print("复制 MA 数组长度不足,错误代码:",GetLastError());
return;}
// 设置MA指标数据缓冲区
if (!SetIndexBuffer(0, maBuffer, INDICATOR_DATA)) {
// 输出复制数组数量大小
Print("复制数组数量大小:", copied);
// 输出获取的历史数据k线路数量大小
Print("获取的历史数据k线路数量大小:",startIndex2);
// 输出缓存区大小
Print("缓存区大小:", ArraySize(maBuffer));
// 输出计算结果
Print("MA计算结果:", ma_handle);
// 输出maBuffer中的数据长度
Print("maBuffer数据长度:", ArraySize(maBuffer));
// 检查是否能够设置指标缓存区
Print("无法MA指标数据缓冲区,错误代码:", GetLastError());
return;}
// 将 MA 缓存区中的数据复制到输出缓存区中
int maResult = CopyBuffer(ma_handle, 0, startIndex2-1, copied, maBuffer);
if (maResult == 0) {
Print("输出缓存数组长度不足,应该增加输出缓存数组大小或减小参数值,错误代码:", GetLastError());
return;}
if (maResult < 0) { // 返回值小于0则表示其他错误
Print("复制 MA 指标数组失败,错误代码:",GetLastError());
Print("CopyBuffer() 函数执行出错,错误代码为:", GetLastError(),", ","maResult的值:",maResult);}
if ( ERR_HISTORY_TIMEOUT) { Print("检查传递给 CopyBuffer() 函数的时间范围是否正确",GetLastError());
return;}
- 时间序列挖掘的数据标签(第1部分):通过EA操作图制作具有趋势标记的数据集
- 作为技术分析工具的 MTF 指标
- 用于在EA交易中包含指标的现成模板(第一部分):振荡指标