首页 技术指标 帖子

MetaTrader 5 每小时缓冲区指标使用指南

附件
54446.zip (66.85 KB, 下载 0次)

目的

这个指标旨在帮助交易者收集数据,以便进行建模。在经济建模中,时间虚拟变量是常见的做法。下面这个简单的指标可以轻松扩展,提供一个二进制缓冲区数组向量,每个小时都有一个对应的缓冲区。最终的缓冲区数组向量存储了当前小时的值。

如果你正在使用其他指标的数据并将其保存为CSV文件,例如通过CopyBuffer函数,这个指标允许你将当前小时作为额外数据的虚拟列添加。

  • 这是一个简单的代码,适合那些需要收集数据的朋友,比如为了机器学习的目的,你可以拥有现成的虚拟变量(缓冲区0到23),或者当前小时变量(缓冲区24),以便用于建模。

代码解析

  • 首先声明缓冲区数量和绘图数量为25:

#property indicator_chart_window
#property indicator_buffers 25
#property indicator_plots 25

缓冲区标签

  • 为数据窗口划分缓冲区标签:

#property indicator_label1 "Hour 00"
#property indicator_label2 "Hour 01"
#property indicator_label3 "Hour 02"
#property indicator_label4 "Hour 03"
#property indicator_label5 "Hour 04"
#property indicator_label6 "Hour 05"
#property indicator_label7 "Hour 06"
#property indicator_label8 "Hour 07"
#property indicator_label9 "Hour 08"
#property indicator_label10 "Hour 09"
#property indicator_label11 "Hour 10"
#property indicator_label12 "Hour 11"
#property indicator_label13 "Hour 12"
#property indicator_label14 "Hour 13"
#property indicator_label15 "Hour 14"
#property indicator_label16 "Hour 15"
#property indicator_label17 "Hour 16"
#property indicator_label18 "Hour 17"
#property indicator_label19 "Hour 18"
#property indicator_label20 "Hour 19"
#property indicator_label21 "Hour 20"
#property indicator_label22 "Hour 21"
#property indicator_label23 "Hour 22"
#property indicator_label24 "Hour 23"
#property indicator_label25 "Hour"

缓冲区声明

  • 接下来声明缓冲区并创建一个整数变量来计算当前小时:

double hourBuffer0[];
double hourBuffer1[];
double hourBuffer2[];
double hourBuffer3[];
double hourBuffer4[];
double hourBuffer5[];
double hourBuffer6[];
double hourBuffer7[];
double hourBuffer8[];
double hourBuffer9[];
double hourBuffer10[];
double hourBuffer11[];
double hourBuffer12[];
double hourBuffer13[];
double hourBuffer14[];
double hourBuffer15[];
double hourBuffer16[];
double hourBuffer17[];
double hourBuffer18[];
double hourBuffer19[];
double hourBuffer20[];
double hourBuffer21[];
double hourBuffer22[];
double hourBuffer23[];
double hourBuffer[];
int bar_hour;

索引和绘图设置

为所有缓冲区设置数据索引,并通过循环关闭绘图(尝试在循环中进行索引时出现错误,无法将例如 hourBuffer[q] 传递给 SetIndexBuffer,所以逐一设置;但循环似乎在 PlotIndexSetInteger 中有效)。

// 将缓冲区分配给索引,隐藏于图表,显示于数据窗口
SetIndexBuffer(0, hourBuffer0, INDICATOR_DATA);
SetIndexBuffer(1, hourBuffer1, INDICATOR_DATA);
SetIndexBuffer(2, hourBuffer2, INDICATOR_DATA);
SetIndexBuffer(3, hourBuffer3, INDICATOR_DATA);
SetIndexBuffer(4, hourBuffer4, INDICATOR_DATA);
SetIndexBuffer(5, hourBuffer5, INDICATOR_DATA);
SetIndexBuffer(6, hourBuffer6, INDICATOR_DATA);
SetIndexBuffer(7, hourBuffer7, INDICATOR_DATA);
SetIndexBuffer(8, hourBuffer8, INDICATOR_DATA);
SetIndexBuffer(9, hourBuffer9, INDICATOR_DATA);
SetIndexBuffer(10, hourBuffer10, INDICATOR_DATA);
SetIndexBuffer(11, hourBuffer11, INDICATOR_DATA);
SetIndexBuffer(12, hourBuffer12, INDICATOR_DATA);
SetIndexBuffer(13, hourBuffer13, INDICATOR_DATA);
SetIndexBuffer(14, hourBuffer14, INDICATOR_DATA);
SetIndexBuffer(15, hourBuffer15, INDICATOR_DATA);
SetIndexBuffer(16, hourBuffer16, INDICATOR_DATA);
SetIndexBuffer(17, hourBuffer17, INDICATOR_DATA);
SetIndexBuffer(18, hourBuffer18, INDICATOR_DATA);
SetIndexBuffer(19, hourBuffer19, INDICATOR_DATA);
SetIndexBuffer(20, hourBuffer20, INDICATOR_DATA);
SetIndexBuffer(21, hourBuffer21, INDICATOR_DATA);
SetIndexBuffer(22, hourBuffer22, INDICATOR_DATA);
SetIndexBuffer(23, hourBuffer23, INDICATOR_DATA);
SetIndexBuffer(24, hourBuffer, INDICATOR_DATA);

for(int i = 0; i < 24; i++) {
    PlotIndexSetInteger(i, PLOT_DRAW_TYPE, DRAW_NONE);
    PlotIndexSetInteger(i, PLOT_SHOW_DATA, true);
}

return(INIT_SUCCEEDED);

OnCalculate 函数循环与程序

  • 接下来是 OnCalculate 函数:
  • 在这里我们将所有缓冲区重置为零,仅将对应当前小时的缓冲区值设置为1。这里可能会有效率提升,但可以留到后面再考虑。

if(rates_total <= 0)
    return(0);

// 从第一个未处理的条形图重新计算
int start = (prev_calculated > 0 ? prev_calculated - 1 : 0);

for(int i = start; i < rates_total; i++) {
    // 计算当前条形图的小时 (0..23)
    bar_hour = (int)((time[i] % 86400) / 3600);

    // 1) 将当前条形图的所有24个缓冲区设置为0
    hourBuffer0[i] = 0.0;
hourBuffer1[i] = 0.0;
hourBuffer2[i] = 0.0;
hourBuffer3[i] = 0.0;
hourBuffer4[i] = 0.0;
hourBuffer5[i] = 0.0;
hourBuffer6[i] = 0.0;
hourBuffer7[i] = 0.0;
hourBuffer8[i] = 0.0;
hourBuffer9[i] = 0.0;
hourBuffer10[i] = 0.0;
hourBuffer11[i] = 0.0;
hourBuffer12[i] = 0.0;
hourBuffer13[i] = 0.0;
hourBuffer14[i] = 0.0;
hourBuffer15[i] = 0.0;
hourBuffer16[i] = 0.0;
hourBuffer17[i] = 0.0;
hourBuffer18[i] = 0.0;
hourBuffer19[i] = 0.0;
hourBuffer20[i] = 0.0;
hourBuffer21[i] = 0.0;
hourBuffer22[i] = 0.0;
hourBuffer23[i] = 0.0;
hourBuffer[i] = EMPTY_VALUE;

    // 2) 现在只将对应的缓冲区设置为1
    switch(bar_hour) {
        case 0: hourBuffer0[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 1: hourBuffer1[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 2: hourBuffer2[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 3: hourBuffer3[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 4: hourBuffer4[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 5: hourBuffer5[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 6: hourBuffer6[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 7: hourBuffer7[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 8: hourBuffer8[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 9: hourBuffer9[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 10: hourBuffer10[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 11: hourBuffer11[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 12: hourBuffer12[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 13: hourBuffer13[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 14: hourBuffer14[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 15: hourBuffer15[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 16: hourBuffer16[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 17: hourBuffer17[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 18: hourBuffer18[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 19: hourBuffer19[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 20: hourBuffer20[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 21: hourBuffer21[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 22: hourBuffer22[i] = 1.0; hourBuffer[i] = bar_hour; break;
        case 23: hourBuffer23[i] = 1.0; hourBuffer[i] = bar_hour; break;
    }

    string localHourText = HourToText(bar_hour);
    Comment("当前小时是: ", localHourText);
}

// 返回处理的条形图数量
return(rates_total);

添加注释功能的实现

  • 最后,提供一个用于生成注释的程序:
  • 这实际上是一个调试检查,但我保留了注释部分。

string HourToText(int bh) {
    string TextHour;
    switch(bh) {
        case 0: TextHour = "12 am"; break;
        case 1: TextHour = "1 am"; break;
        case 2: TextHour = "2 am"; break;
        case 3: TextHour = "3 am"; break;
        case 4: TextHour = "4 am"; break;
        case 5: TextHour = "5 am"; break;
        case 6: TextHour = "6 am"; break;
        case 7: TextHour = "7 am"; break;
        case 8: TextHour = "8 am"; break;
        case 9: TextHour = "9 am"; break;
        case 10: TextHour = "10 am"; break;
        case 11: TextHour = "11 am"; break;
        case 12: TextHour = "12 pm"; break;
        case 13: TextHour = "1 pm"; break;
        case 14: TextHour = "2 pm"; break;
        case 15: TextHour = "3 pm"; break;
        case 16: TextHour = "4 pm"; break;
        case 17: TextHour = "5 pm"; break;
        case 18: TextHour = "6 pm"; break;
        case 19: TextHour = "7 pm"; break;
        case 20: TextHour = "8 pm"; break;
        case 21: TextHour = "9 pm"; break;
        case 22: TextHour = "10 pm"; break;
        case 23: TextHour = "11 pm"; break;
        default: TextHour = "未知"; break;
    }
    return TextHour;
}

请注意,这个注释功能目前只在数据窗口中显示。


祝大家圣诞快乐,2025年新年快乐!

相关帖子

评论 (0)