Русский
preview
Previsão de barras Renko com a ajuda de IA CatBoost

Previsão de barras Renko com a ajuda de IA CatBoost

MetaTrader 5Experts |
112 4
Yevgeniy Koshtenko
Yevgeniy Koshtenko

Introdução

No silêncio do meu escritório, apenas a tela do monitor permanece iluminada. O terminal MetaTrader 5 entrega mais um lote de ticks, e o algoritmo que desenvolvi transforma metodicamente o caos do mercado em um sistema organizado de barras Renko. Três horas da manhã, a hora em que verdadeiras estratégias de trading nascem. Passo a mão pelo queixo por fazer e tomo um gole do café já frio, meu preferido, "Carte Noire". A precisão do modelo, 59.27%, é uma vitória. Uma verdadeira vitória para quem entende a natureza imprevisível dos mercados financeiros.


Quando a análise tradicional se tornou impotente

Quase 10 anos atrás, entrei no mercado acreditando que a análise técnica era a escritura sagrada do trader. Eu desenhava linhas de suporte e resistência, acompanhava cruzamentos de médias móveis, procurava divergências no RSI e no MACD, mas ano após ano via a eficácia desses métodos diminuir. O mercado mudava, algoritmos de alta frequência transformavam sua natureza, e as metodologias clássicas já não forneciam a vantagem de antes.

Certa vez, após uma semana especialmente ruim de trading, fiz a mim mesmo uma pergunta: e se todos os livros de análise técnica escritos no século passado hoje não passarem de literatura ficcional envolvente? Essa pergunta levou a uma revisão radical da minha abordagem ao trading e, no fim, à criação de um sistema de previsão de barras Renko baseado em aprendizado de máquina.


Barras Renko — o zen digital do trader

Foi na primeira vez que encontrei gráficos Renko, em uma conferência em Cingapura. Um trader japonês, cujo nome prometi jamais revelar, mostrou seu terminal com blocos retangulares incomuns no lugar das velas tradicionais. "Isto é Renko", disse ele, "gráficos que mostram apenas o que importa — o movimento do preço".

Em um mundo saturado de informação, os gráficos Renko oferecem um zen digital, uma limpeza do ruído, do fator tempo, de tudo que distrai do verdadeiro movimento do mercado. Cada novo bloco é formado apenas quando o preço percorre uma distância específica para cima ou para baixo. Nessa simplicidade reside uma força extraordinária.

Comecei a experimentar gráficos Renko em diversos instrumentos. EURUSD, GBPUSD, DAX, S&P 500 — em todos eles era possível enxergar a estrutura do mercado de forma mais clara e limpa. Mas a análise manual exigia tempo, algo que sempre falta. Foi então que recorri ao aprendizado de máquina.


CatBoost — o algoritmo que conquistou os mercados mundiais

A escolha do algoritmo foi tão importante quanto a escolha da estratégia de trading. Depois de testar dezenas de diferentes modelos de aprendizado de máquina, optei pelo CatBoost, um algoritmo de gradient boosting desenvolvido pela Yandex. Foi amor à primeira execução do modelo.

# Инициализация модели CatBoost
params = {
    'iterations': 300,
    'learning_rate': 0.05,
    'depth': 5,
    'loss_function': 'Logloss',
    'random_seed': 42,
    'verbose': False
}

model = CatBoostClassifier(**params)
model.fit(X_train, y_train, eval_set=(X_test, y_test), early_stopping_rounds=30, verbose=False)

O CatBoost não apenas trabalha bem com características categóricas, o que é crucial para analisar padrões de barras Renko. Ele também é resistente ao sobreajuste, algo raro para algoritmos tão poderosos, e funciona rápido o suficiente para permitir que a modelo seja reentreinada diariamente com dados frescos.

Meu experimento começou com o carregamento dos dados de EURUSD dos últimos 60 dias, com mais de 12000 barras de cinco minutos. Esses dados foram transformados em 11578 barras Renko, com tamanho de bloco otimizado pelo algoritmo em 0.00028 unidades de preço. A preparação dos atributos resultou em 11572 amostras para o treinamento da modelo.

E então chegou o momento da verdade, o lançamento do treinamento do modelo CatBoost nos dados preparados.


Revelação nos números: o que mostrou o experimento

Quando o algoritmo concluiu o treinamento e eu vi os resultados, foi como uma iluminação. A precisão da modelo no conjunto de teste foi de 59.27%. Para alguém pouco familiarizado com trading, esse número pode parecer modesto. Mas para quem conhece a estatística implacável do mercado financeiro, isso é um resultado extraordinário.

Vale lembrar o famoso estudo da Universidade de Michigan, que mostrou que a maioria dos fundos de gestão ativa não consegue superar a simples estratégia "compre e segure". E nesses fundos trabalham analistas brilhantes, com doutorado e acesso a informações privilegiadas. Nesse contexto, uma precisão de 59.27% não é apenas boa, é fenomenal.

Mas ainda mais surpreendente foi a análise de importância dos atributos. Contrariando todos os dogmas da análise técnica, os indicadores de volume se mostraram muito mais importantes do que os padrões de preço. "Last_volume", com importância de 18.36, "avg_volume" com 14.23 e "volume_ratio" com 12.81 ocuparam as três primeiras posições. Só depois vinham os indicadores dos movimentos sequenciais de preço.

Aliás, agora me lembrei e acrescentei isto: algumas vezes vi, em uma das redes sociais mais conhecidas, um trader de sucesso que dizia que o Graal estava na divisão do volume em blocos Renko e em clusters de volume. Talvez esses resultados realmente não sejam aleatórios e façam sentido?


A arte de criar barras Renko

O trabalho com gráficos Renko começa pela definição do tamanho ideal do bloco. É como ajustar um microscópio, pois um aumento pequeno demais não permite enxergar detalhes, enquanto um aumento excessivo distorce o quadro geral. O tamanho do bloco Renko é, de certo modo, a resolução com que observamos o mercado.

# Создание Ренко-баров с адаптивным размером блока
def create_renko_bars(df, brick_size=None):
    if brick_size is None:
        # Расчет ATR для определения размера блока
        df['tr'] = np.maximum(
            df['high'] - df['low'],
            np.maximum(
                np.abs(df['high'] - df['close'].shift(1)),
                np.abs(df['low'] - df['close'].shift(1))
            )
        )
        df['atr'] = df['tr'].rolling(window=14).mean()
        brick_size = df['atr'].mean() * 0.5
        print(f"Размер блока Ренко: {brick_size:.5f}")
    
    # Создание Ренко-баров
    renko_bars = []
    current_price = df.iloc[0]['close']
    # ... остальной код

Depois de inúmeros experimentos, cheguei à conclusão de que a melhor forma de definir o tamanho do bloco é por meio do indicador ATR (Average True Range, Média de Amplitude de Variação). Essa abordagem torna o tamanho do bloco adaptável à volatilidade atual do instrumento.

No caso do EURUSD, o algoritmo determinou o tamanho de bloco ideal como 0.00028 unidades de preço, o que corresponde a aproximadamente 2.8 pontos. À primeira vista isso parece insignificante, mas é justamente essa granularidade que permite captar movimentos relevantes e filtrar o ruído do mercado.

Criar barras Renko não é apenas converter dados de preço de maneira mecânica. É a arte de extrair sinal do ruído, de destacar o movimento significativo no meio do oceano de oscilações. E, quando vi os dados transformados desenhados no gráfico, surgiu diante de mim uma imagem cristalina do mercado, uma escada de blocos vermelhos e verdes refletindo o verdadeiro movimento do preço, sem distorções causadas pelo fator tempo.


Formação de atributos: o que realmente importa para a previsão

O sucesso de qualquer modelo de aprendizado de máquina depende em grande medida da qualidade e da relevância dos atributos. Para prever a direção do próximo Renko-bar, desenvolvi um sistema multinível de atributos que considera tanto o histórico dos movimentos quanto características de volume.

# Подготовка признаков для модели
def prepare_features(renko_df, lookback=5):
    features = []
    targets = []
    
    for i in range(lookback, len(renko_df) - 1):
        window = renko_df.iloc[i-lookback:i]
        
        feature_dict = {
            # Направления последних n баров
            **{f'dir_{j}': window['direction'].iloc[-(j+1)] for j in range(lookback)},
            
            # Статистика по движениям
            'up_ratio': (window['direction'] > 0).mean(),
            'max_up_streak': window['consec_up_streak'].max(),
            'max_down_streak': window['consec_down_streak'].max(),
            'last_up_streak': window['consec_up_streak'].iloc[-1],
            'last_down_streak': window['consec_down_streak'].iloc[-1],
            
            # Объем
            'last_volume': window['volume'].iloc[-1],
            'avg_volume': window['volume'].mean(),
            'volume_ratio': window['volume'].iloc[-1] / window['volume'].mean() 
                if window['volume'].mean() > 0 else 1
        }
        
        features.append(feature_dict)
        
        # Направление следующего бара (1 - вверх, 0 - вниз)
        next_direction = 1 if renko_df.iloc[i+1]['direction'] > 0 else 0
        targets.append(next_direction)
    
    return pd.DataFrame(features), np.array(targets)

Primeiro incluí os atributos óbvios, como as direções dos últimos vários blocos. Depois adicionei métricas estatísticas, como a proporção de blocos ascendentes e descendentes, o comprimento dos movimentos consecutivos em uma direção, as séries máximas. E, por fim, incluí os indicadores de volume, como o volume do último bloco, o volume médio do período e a relação entre o volume atual e a média.

Foram exatamente os indicadores de volume que, para minha surpresa, se mostraram os most important na previsão. Isso transformou meu entendimento da análise de preços. Durante anos, eu, como a maioria dos traders, focava nas formas das velas, nos padrões, nas linhas de tendência. E a resposta estava o tempo todo nos volumes, um indicador frequentemente ignorado no Forex devido à natureza descentralizada do mercado.

O conjunto final de atributos incluiu 14 parâmetros, o que se mostrou ideal em termos de equilíbrio entre a complexidade da modelo e sua capacidade preditiva. Mais atributos levavam ao sobreajuste, menos, a perda de precisão.


Previsão em ação: da teoria à prática

A modelo construída não entrega apenas um prognóstico binário da direção do próximo bloco, ela também fornece a probabilidade desse movimento. No último exemplo, a modelo previu queda com probabilidade de 69.35%, o que é um prognóstico bastante confiante, mas insuficiente para gerar um sinal de trading (para o qual defini um limiar de 75%).

# Прогнозирование следующего бара
def predict_next_bar(model, renko_df, lookback=5, feature_names=None):
    if len(renko_df) < lookback:
        return {"error": "Недостаточно данных"}
    
    window = renko_df.iloc[-lookback:]
    
    feature_dict = {
        **{f'dir_{j}': window['direction'].iloc[-(j+1)] for j in range(lookback)},
        'up_ratio': (window['direction'] > 0).mean(),
        'max_up_streak': window['consec_up_streak'].max(),
        'max_down_streak': window['consec_down_streak'].max(),
        'last_up_streak': window['consec_up_streak'].iloc[-1],
        'last_down_streak': window['consec_down_streak'].iloc[-1],
        'last_volume': window['volume'].iloc[-1],
        'avg_volume': window['volume'].mean(),
        'volume_ratio': window['volume'].iloc[-1] / window['volume'].mean() 
            if window['volume'].mean() > 0 else 1
    }
    
    X_pred = pd.DataFrame([feature_dict])
    
    # Проверяем, что все признаки присутствуют
    if feature_names:
        for feature in feature_names:
            if feature not in X_pred.columns:
                X_pred[feature] = 0
        X_pred = X_pred[feature_names]
    
    prob = model.predict_proba(X_pred)[0]
    prediction = model.predict(X_pred)[0]
    
    return {
        'prediction': 'UP' if prediction == 1 else 'DOWN',
        'probability': prob[prediction],
        'prob_up': prob[1],
        'prob_down': prob[0],
        'signal': 'BUY' if prob[1] > 0.75 else 
                 'SELL' if prob[0] > 0.75 else 
                 'NEUTRAL'
    }

Entretanto, o verdadeiro valor não está em um único prognóstico, mas no funcionamento da estratégia como um todo. Os últimos cinco barras Renko mostram uma dinâmica interessante: três quedas consecutivas, seguidas de duas altas. Esse microtendência de alta, combinada com uma previsão de baixa com probabilidade elevada, porém insuficiente para disparar um sinal, indica possível consolidação e incerteza no mercado.

É exatamente nesses momentos que o risco aumenta, e o sistema identificou corretamente esse estado, não gerando um sinal operacional apesar da probabilidade relativamente alta de queda.


Olhando sob o capô: a arquitetura do sistema

O sistema desenvolvido é um mecanismo multicamadas, no qual cada componente desempenha seu papel dentro do conjunto de previsão. Vamos analisar os elementos-chave dessa arquitetura.

python# Основная функция
def main():
    # Получение данных EURUSD
    print("Загрузка данных EURUSD из MetaTrader5...")
    df = get_mt5_data(symbol='EURUSD', days=60)
    
    if df is None or len(df) == 0:
        print("Не удалось получить данные")
        return
    
    print(f"Загружено {len(df)} баров")
    
    # Создание Ренко-баров
    print("Создание Ренко-баров...")
    renko_df, brick_size = create_renko_bars(df)
    print(f"Создано {len(renko_df)} Ренко-баров")
    
    # Подготовка признаков
    print("Подготовка признаков...")
    X, y = prepare_features(renko_df)
    print(f"Подготовлено {len(X)} образцов")
    
    # Обучение модели
    print("Обучение модели...")
    model, X_test, y_test = train_model(X, y)
    
    # Прогноз следующего бара
    feature_names = X.columns.tolist()
    prediction = predict_next_bar(model, renko_df, feature_names=feature_names)
    
    print("\nПРОГНОЗ СЛЕДУЮЩЕГО РЕНКО-БАРА:")
    for k, v in prediction.items():
        print(f"{k}: {v}")
    
    # Информация о последних барах
    print("\nПоследние 5 Ренко-баров:")
    print(renko_df.tail(5)[['time', 'open', 'close', 'direction']])

A base do sistema é o módulo de carregamento de dados do MetaTrader 5. A integração com o MetaTrader 5 permite receber dados de mercado atualizados em um modo próximo do tempo real. Esse módulo utiliza a API oficial do MetaTrader 5, o que garante confiabilidade e estabilidade de operação. 

A camada seguinte é a transformação das barras temporais padrão em Renko. O algoritmo calcula o tamanho ideal do bloco com base no ATR e executa a transformação considerando volumes e tempo. Um diferencial dessa implementação é o cálculo dos movimentos consecutivos e de suas características diretamente no processo de formação das barras Renko, o que aumenta a eficiência de todo o sistema. 

O núcleo do sistema é o módulo de formação de atributos e treinamento da modelo. Aqui, cada Renko-bar é convertido em um conjunto de características numéricas que são então alimentadas no algoritmo CatBoost. A seleção dos parâmetros ótimos da modelo é realizada por validação cruzada, levando em conta a natureza específica das séries temporais financeiras. 

Por fim, o módulo de previsão recebe a modelo treinada e os dados atuais, formula o prognóstico e, ao atingir o limiar definido de confiança, gera o sinal de trading. 

Toda a sistema foi escrita em Python utilizando as bibliotecas numpy, pandas, MetaTrader 5 e catboost. A escolha do Python se deve não apenas à conveniência no desenvolvimento, mas também às amplas possibilidades de análise de dados e visualização de resultados. 


Conclusões e perspectivas: o futuro do trading algorítmico

Após desenvolver e testar a sistema de previsão de barras Renko, cheguei a várias conclusões importantes que podem mudar a maneira como você enxerga o trading algorítmico. 

Em primeiro lugar, os métodos clássicos de análise técnica perdem em eficiência para os algoritmos modernos de aprendizado de máquina. Uma precisão de 59.27% pode parecer pouco impressionante, mas supera de forma consistente os resultados da maioria dos indicadores técnicos ao longo de longos períodos. 

Em segundo lugar, os indicadores de volume mostraram-se muito mais importantes do que os padrões de preço para prever o movimento do mercado. Isso contradiz muitos livros clássicos de trading, mas é confirmado pelos resultados de modelagem em dados reais. 

Em terceiro lugar, os gráficos Renko realmente limpam os dados de preço do ruído, permitindo que algoritmos de aprendizado de máquina identifiquem padrões mais estáveis no movimento do mercado. 

Mas o mais importante é que isso é apenas o começo. Vejo um enorme potencial para o desenvolvimento futuro da sistema. É possível incluir dados fundamentalistas, eventos de notícias, análise de sentimento de mercado obtida por meio de redes sociais. É possível expandir para outros instrumentos e timeframes. É possível criar um conjunto (ensemble) de modelos para aumentar ainda mais a precisão das previsões. 


Conclusão

O mundo do trading algorítmico está à beira de uma nova revolução, e a combinação de gráficos Renko com algoritmos modernos de aprendizado de máquina pode se tornar um de seus motores. Convido todos os que se interessam pelo tema a se aprofundarem no mundo dos dados, dos algoritmos e das previsões. O futuro do trading já chegou, e ele é algorítmico. 

Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/17531

Arquivos anexados |
RenkoPredict.py (9.13 KB)
Últimos Comentários | Ir para discussão (4)
Aliaksandr Kazunka
Aliaksandr Kazunka | 15 mai. 2025 em 19:12
Não é possível obter mais de 63%. Quaisquer que sejam os sinais adicionados. 63 para forex é um fiasco
Yevgeniy Koshtenko
Yevgeniy Koshtenko | 15 mai. 2025 em 22:22
sportoman #:
Não é possível obter mais de 63%. Quaisquer que sejam os sinais adicionados. 63 para forex é um fiasco

Consegui mais de 75% no Midas (multimodular, em que muitos módulos combinam seus sinais em um único sinal). Mas então surge outro problema - sinais uma vez por mês e meio)))) Quanto mais confiável o sinal, menos frequentemente ele ocorre... É por isso que comecei a esquecer a alta taxa de ganhos em robôs recentes, tento prever a profundidade dos movimentos para assumir o risco de lucrar em 1:3, 1:4, etc. Configurei as marcas de modo que elas dessem bônus aos modelos por meio de DQN para a marcação correta de movimentos profundos..... Isso acabou resultando no robô LSTM Europe.

Aliaksandr Kazunka
Aliaksandr Kazunka | 17 mai. 2025 em 21:10
Yevgeniy Koshtenko #:

Consegui mais de 75% no Midas (multimodular, em que muitos módulos combinam seus sinais em um único sinal). Mas aí surge outro problema - sinais uma vez por mês e meio)))) Quanto mais confiável o sinal, menos frequentemente ele ocorre... É por isso que comecei a esquecer a alta lucratividade nos robôs recentes, tento prever a profundidade dos movimentos para assumir o risco de lucrar em 1:3, 1:4, etc. Configurei as marcas de modo que elas dessem bônus aos modelos por meio de DQN para a marcação correta de movimentos profundos..... Isso acabou resultando no robô LSTM Europe.

75 no LTSM em lookback = 5 bars_ahead = 1, mas isso é para negociação binária, não para forex.

Vladimir Perervenko
Vladimir Perervenko | 18 mai. 2025 em 18:46

Então, onde está a IA? Ou você elevou o catbust a esse nível?

Você deveria fazer um teste ou algo assim. 58% está bom? Essa precisão é apenas uma referência. O principal indicador é o equilíbrio no teste com base nos sinais recebidos.

Isso não é interessante.

Do básico ao intermediário: Sobrecarga de operadores (III) Do básico ao intermediário: Sobrecarga de operadores (III)
Neste artigo será demonstrado como podemos implementar a sobrecarga tanto de operadores lógicos como também de operadores relacionais. Fazer isto demanda um certo cuidado e uma boa dose de atenção. Já que um simples deslize durante a implementação do que será a sobrecarga de tais operadores, pode vir a pôr todo um código em condição de ser totalmente jogado no lixo. Já que se a sobrecarga vier a ter problemas. Toda uma base de dados criada em cima dos resultados gerados pelo seu código deverá ser completamente descartada, ou no mínimo totalmente revisada.
Análise espectral singular unidimensional Análise espectral singular unidimensional
O artigo aborda os aspectos teóricos e práticos do método de análise espectral singular (SSA), que constitui um método eficaz de análise de séries temporais e permite representar a estrutura complexa da série como uma decomposição em componentes simples, tais como tendência, oscilações sazonais (periódicas) e ruído.
Simulação de mercado: A união faz a força (II) Simulação de mercado: A união faz a força (II)
Até o momento, a aplicação que estava sendo desenvolvida nesta sequência de artigos. Visava apenas e tão somente simular a parte gráfica. Mas para um sistema mais completo, onde temos a possibilidade de experimentar um Expert Advisor dentro do serviço de replay/simulador. Precisamos também fazer a simulação do servidor de negociação. Você notará, que a simulação usará o mínimo do mínimo possível. Mas se você, meu caro leitor, desejar, poderá completar as partes que faltam. Mas como isto não fará diferença para o que estou disposto a mostrar. Já temos mais do que o suficiente para desenvolver o que foi planejado.
Desenvolvendo um Expert Advisor de Breakout Baseado em Eventos de Notícias do Calendário em MQL5 Desenvolvendo um Expert Advisor de Breakout Baseado em Eventos de Notícias do Calendário em MQL5
A volatilidade tende a atingir picos em torno de eventos de notícias de alto impacto, criando oportunidades significativas de breakout. Neste artigo, iremos delinear o processo de implementação de uma estratégia de breakout baseada em calendário. Abordaremos tudo, desde a criação de uma classe para interpretar e armazenar dados do calendário, o desenvolvimento de backtests realistas utilizando esses dados e, por fim, a implementação do código de execução para negociação ao vivo.