MetaTrader5
Buffers Horários para Coleta de Dados no MetaTrader 5
Objetivo Se você está buscando coletar dados para modelagem, este indicador é uma mão na roda! Ele cria um vetor de buffers binários para cada hora do dia, facilitando a inclusão de colunas de hora em suas análises. Praticamente um facilitador para quem trabalha com modelos econômicos! Ao coletar dados de outros indicadores, por exemplo, usando a função CopyBuffer, este indicador possibilita a adição de colunas de hora como dados extras. Uma ótima maneira de enriquecer suas análises! Um código simples para quem coleta dados, especialmente se você está pensando em Machine Learning. Com ele, você já tem uma variável dummy (buffers de 0 a 23) ou uma variável de hora (buffer 24) pronta para uso em modelagem. Explorando o Código Começamos declarando o número de buffers e plots como 25: #property indicator_chart_window
#property indicator_buffers 25
#property indicator_plots 25 Rotulagem dos Buffers Definimos os rótulos dos buffers para a janela de dados: #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" Declaração dos Buffers Em seguida, declaramos os buffers e uma variável inteira para a hora do dia, que será calculada posteriormente. 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; Indexação e Desenho dos Gráficos Setamos o índice para todos os buffers como dados, e desabilitamos o desenho usando um loop. É importante notar que tentar fazer a indexação via loop apresentou erro, então fizemos isso manualmente. No entanto, o loop funcionou perfeitamente para PlotIndexSetInteger. // Atribuindo buffers ao índice, ocultando do gráfico, mostrando na janela de dados
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);} Função OnCalculate e Loop do Programa A seguir, passamos para a função OnCalculate: Nela, zeramos todos os buffers e alteramos somente o correspondente à hora atual para um. if(rates_total 0 ? prev_calculated - 1 : 0);
for(int i = start; i < rates_total; i++)
{
// Calcular hora (0..23) para a barra i
bar_hour = (int)((time[i] % 86400) / 3600);
// 1) Zerar TODOS os 24 buffers para a barra i
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) Agora setamos APENAS o buffer correspondente para 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("A hora é: ", localHourText);
}
// Retornar número de barras processadas
return(rates_total);} Função para adicionar sabor ao comentário Por último, um programa para um comentário: Isso é, na verdade, um cheque de depuração, mas deixei o comentário como está. string HourToText(int bh) {
string TextHour;
switch(bh)
{
case 0:
TextHour = "12 am"; // meia-noite em formato de 12 horas
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"; // meio-dia em formato de 12 horas
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:
// Apenas para o caso de 'bh' estar fora do intervalo (0..23)
TextHour = "Desconhecido";
break;
}
return TextHour;
} Note que isso só exibe atualmente através da janela de dados. Feliz Natal e um próspero Ano Novo de 2025 a todos!
2024.12.25