MetaTrader5
Colección de Datos Horarios en MetaTrader 5: Buffers Binarios para Traders
Propósito Si eres trader, probablemente ya sepas lo importante que es tener datos precisos para tus análisis. Este indicador simple que te presento permite recolectar datos en un formato fácil de utilizar, donde cada hora se almacena como un vector de buffers binarios. Además, se incluye un último buffer que almacena la hora en sí. Cuando recolectes datos de otros indicadores, por ejemplo, a un archivo CSV utilizando funciones como CopyBuffer, este indicador te permite añadir columnas auxiliares para la hora que estás recolectando. ¡Así puedes tener todo más organizado! Este código es ideal para quienes buscan recopilar datos, ya sea para modelar o para fines de aprendizaje automático, ya que tendrás variables dummy listas (buffers de 0 a 23) y una variable de hora (buffer 24) que puedes usar en tus modelos. Análisis del Código Se comienza declarando el número de buffers y de gráficos a 25: #property indicator_chart_window
#property indicator_buffers 25
#property indicator_plots 25 Etiquetado de Buffers Se delinearon las etiquetas de los buffers para la ventana de datos: #property indicator_label1 "Hora 00"
#property indicator_label2 "Hora 01"
#property indicator_label3 "Hora 02"
#property indicator_label4 "Hora 03"
#property indicator_label5 "Hora 04"
#property indicator_label6 "Hora 05"
#property indicator_label7 "Hora 06"
#property indicator_label8 "Hora 07"
#property indicator_label9 "Hora 08"
#property indicator_label10 "Hora 09"
#property indicator_label11 "Hora 10"
#property indicator_label12 "Hora 11"
#property indicator_label13 "Hora 12"
#property indicator_label14 "Hora 13"
#property indicator_label15 "Hora 14"
#property indicator_label16 "Hora 15"
#property indicator_label17 "Hora 16"
#property indicator_label18 "Hora 17"
#property indicator_label19 "Hora 18"
#property indicator_label20 "Hora 19"
#property indicator_label21 "Hora 20"
#property indicator_label22 "Hora 21"
#property indicator_label23 "Hora 22"
#property indicator_label24 "Hora 23"
#property indicator_label25 "Hora" Declaraciones de Buffers A continuación, se declaran los buffers y una variable entera para la hora del día que se calculará más adelante. 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; Indexación y Dibujo de Gráficos Se configura el índice para todos los buffers como datos y se desactiva el dibujo en el gráfico mediante un bucle. Al intentar hacer la indexación con un bucle, se presentó un error al pasar, por ejemplo, hourBuffer[q] a SetIndexBuffer, por lo que se hizo uno por uno; pero el bucle funciona bien para PlotIndexSetInteger, que es útil. // Asignar buffers a índice, ocultar del gráfico, mostrar en la ventana de datos
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); Función OnCalculate y Bucle del Programa Ahora pasamos a la función OnCalculate: Aquí se reinician todos los buffers a cero y se cambia solo el correspondiente a la hora actual a uno. Posiblemente haya una ganancia de eficiencia a obtener aquí, pero eso será para más adelante. if (rates_total 0 ? prev_calculated - 1 : 0);
for (int i = start; i < rates_total; i++) {
// Calcular hora (0..23) para la barra i
bar_hour = (int)((time[i] % 86400) / 3600);
// 1) Establecer TODOS los 24 buffers para la barra i a 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) Ahora establecer SOLO el buffer coincidente a 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("La hora es: ", localHourText);
}
// Retornar número de barras procesadas
return (rates_total); Función para Añadir Estilo al Comentario Por último, una función para generar un comentario: Esto es, en efecto, un chequeo de depuración, pero he decidido dejarlo. 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 = "Desconocido"; break;
}
return TextHour;
} Ten en cuenta que esto solo se muestra a través de la ventana de datos por el momento. ¡Feliz Navidad y próspero Año Nuevo 2025 a todos!
2024.12.25