VerticalLineTime-Grok-5min/Indicators/VerticalLineTime-Grok-5min.mq5
2025-06-23 22:09:37 -03:00

93 lines
No EOL
7.6 KiB
MQL5

//+------------------------------------------------------------------+
//| Indicador de Linhas Verticais por Intervalo de Tempo |
//| Desenvolvido para MetaTrader 5 |
//+------------------------------------------------------------------+
#property copyright "Desenvolvido para Grok"
#property link "https://x.ai"
#property version "2.00"
#property indicator_chart_window
#property indicator_plots 0 // Não usa buffers de plotagem
//--- Parâmetros de entrada
input int IntervaloMinutos = 5; // Intervalo entre linhas (minutos)
input color CorLinha = clrRed; // Cor das linhas verticais
input int MaxBarras = 100; // Máximo de barras a processar
//+------------------------------------------------------------------+
//| Função de inicialização do indicador |
//+------------------------------------------------------------------+
int OnInit()
{
// Limpar objetos existentes no gráfico apenas na inicialização
ObjectsDeleteAll(0, "VerticalLine_");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de cálculo do indicador |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
// Limitar o número de barras processadas
int limite = MathMin(rates_total, MaxBarras);
if(limite < 1) return(rates_total); // Evitar processamento se não houver barras
// Obter o tempo da primeira e última barra no intervalo
datetime tempoInicio = time[limite - 1]; // Barra mais antiga
datetime tempoFim = time[0]; // Barra mais recente
// Arredondar tempoInicio para o múltiplo inferior do intervalo
MqlDateTime tempoStruct;
TimeToStruct(tempoInicio, tempoStruct);
int minutosInicio = tempoStruct.min - (tempoStruct.min % IntervaloMinutos);
tempoStruct.min = minutosInicio;
tempoStruct.sec = 0;
datetime tempoBase = StructToTime(tempoStruct);
// Calcular linhas verticais para o intervalo de tempo
datetime tempoAtual = tempoBase;
while(tempoAtual <= tempoFim)
{
string nomeObjeto = "VerticalLine_" + TimeToString(tempoAtual, TIME_MINUTES);
// Verificar se o objeto já existe para evitar duplicatas
if(ObjectFind(0, nomeObjeto) < 0)
{
if(ObjectCreate(0, nomeObjeto, OBJ_VLINE, 0, tempoAtual, 0))
{
ObjectSetInteger(0, nomeObjeto, OBJPROP_COLOR, CorLinha);
ObjectSetInteger(0, nomeObjeto, OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(0, nomeObjeto, OBJPROP_WIDTH, 2);
ObjectSetInteger(0, nomeObjeto, OBJPROP_BACK, false);
}
else
{
Print("Erro ao criar linha vertical em ", TimeToString(tempoAtual), ": ", GetLastError());
}
}
// Avançar para o próximo intervalo
tempoAtual += IntervaloMinutos * 60; // Converter minutos para segundos
}
return(rates_total);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// Remover todas as linhas verticais ao fechar o indicador
ObjectsDeleteAll(0, "VerticalLine_");
}
//+------------------------------------------------------------------+