请观看如何免费下载自动交易
请在Facebook上找到我们!
加入我们粉丝页
有趣的脚本?
因此发布一个链接 -
让其他人评价
喜欢这个脚本? 在MetaTrader 5客户端尝试它
指标

Buffers for each hour (binary) and an hour buffer from 0-23 - for data collection purposes - MetaTrader 5脚本

显示:
47
等级:
(4)
已发布:
MQL5自由职业者 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务

目的

用户可收集数据用于建模。时间虚拟变量经常用于经济建模。下面的简单指标很容易扩展,它将每个小时作为一个二进制缓冲数组向量。最后一个缓冲数组向量存储小时本身。

如果使用 CopyBuffer 等函数将其他指标的数据收集到 CSV 中,该指标就可以将收集到的小时虚拟列作为附加数据。

  • 这是一个简单的代码,适用于收集数据(如用于 ML)的人员,这样您就可以在建模时使用现成的虚拟变量(缓冲区 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;

索引和绘图

为所有作为数据的缓冲区设置索引,并使用循环关闭绘图(尝试使用循环进行索引时出现错误,即不能通过 SetIndexBuffer 传递例如 hourBuffer[q],因此要逐个进行;但循环似乎对 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 函数:
  • 在这里,我们将所有缓冲区置回 0,只将与当前小时对应的缓冲区置 1。这里可能会提高效率,但稍后再说。

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

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

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

       // 1) 将条形图 i 的所有 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("The hour is: ", localHourText);
    }

    // 返回已处理的条数
    return(rates_total);

为注释增添风味的函数

  • 最后是一个注释程序:
  • 这实际上是一个调试检查,但我保留了注释。

string HourToText(int bh) {
string TextHour;

switch(bh)
{
   case 0:
      TextHour = "12 am"; // 以 12 小时格式表示的午夜时刻
      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"; // 正午 12 小时制
      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:
      // 以防 "bh "超出范围 (0..23)
      TextHour = "Unknown";
      break;
}

return TextHour;

请注意,目前只能通过数据窗口显示。


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

由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/54446

2 Moving Averages with Bollinger Bands 2 Moving Averages with Bollinger Bands

"带有布林线的 2 条移动平均线 "是一个自定义 MT5 指标,结合了两条可配置的移动平均线和可选的布林线。当发生交叉时,它会实时生成买入和卖出箭头,并提供可选的警报、声音和电子邮件通知。适用于所有时间框架和符号

Perfect Trailing StopLoss Perfect Trailing StopLoss

将这些代码复制到您正忙着编码的任何 EA 中,您就会有一个拖尾斜线,您唯一需要修改的可能是 InpMagic 用于您的魔法数字,或者您可以直接原样复制我的代码,记住要添加 COrderinfo ord; 和 CPositionInfo pos;

利润最大化 利润最大化

Profit Maximiser(PMax)指标是通过整合超级趋势指标的移动平均线而创建的指标。

承诺 承诺

实现算法异步执行的接口