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)
return(0);
// Vamos recalcular a partir da primeira barra não processada
int start = (prev_calculated > 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!
Publicações relacionadas
- Calendário Econômico: Monitoramento e Cache para Testes de Estratégia no MetaTrader 5
- EquiPeak Drawdown Tracker: Controle Eficiente para Seus EAs no MetaTrader 5
- Média Móvel Exponencial Quádrupla: Indicador para MetaTrader 5
- Utilitário de Informações de Séries e Taxas para MetaTrader 5: Maximize Seu Trading
- Níveis Históricos: O Indicador Essencial para MetaTrader 5