//+------------------------------------------------------------------+ //| Indicador de Linhas Verticais por Intervalo de Tempo | //| Desenvolvido para MetaTrader 5 Raphael Bloch | //+------------------------------------------------------------------+ #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_"); } //+------------------------------------------------------------------+