93 lines
No EOL
7.6 KiB
MQL5
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_");
|
|
}
|
|
//+------------------------------------------------------------------+ |