
A estratégia é um sistema de negociação quantitativa baseado na análise de vários prazos, que utiliza principalmente o indicador MACD, o indicador RSI, a linha média VWAP e o filtro de taxa de flutuação ATR para executar negociações em 30 minutos e 1 hora. A estratégia suporta ações de alta e baixa, confirmando sinais de cruzamento de indicadores técnicos em diferentes prazos e combinando filtragem de condições de taxa de flutuação para melhorar a qualidade da negociação.
O princípio central da estratégia é filtrar sinais de baixa qualidade por meio de confirmação de múltiplos termos, e inclui principalmente os seguintes componentes-chave:
Multiframe de tempo MACD sinal de cruzamento:
O RSI está a comprar e a vender mais do que o normal.:
Confirmação de posicionamento de preço de VWAP duplo:
Filtro de taxa de flutuação:
Mecanismo de saída em vários níveis:
Através desta filtragem e confirmação de condições em vários níveis, a estratégia visa capturar oscilações de curto e médio prazo com uma clara direção, enquanto filtra os sinais de baixa qualidade, melhorando a taxa de vitória e a taxa de lucro.
Confirmação do Multi-TemposA estratégia é capaz de identificar melhor as tendências reais e reduzir o impacto das falsas, através da combinação de sinais de 30 minutos e 1 hora. Em particular, a função de confirmação de tendências MACD de 1 hora ajuda a evitar a negociação de grandes tendências.
Adaptabilidade da taxa de flutuaçãoO filtro de taxa de flutuação ATR garante que a estratégia entre apenas quando o mercado está dinâmico o suficiente para evitar a negociação em intervalos de baixa flutuação, o que reduz efetivamente o risco de oscilações na zona morta.
Mecanismos de saída flexíveisA estratégia inclui não apenas um stop loss fixo, mas também um mecanismo de saída dinâmica baseado em uma inversão de indicadores, o que permite uma saída em tempo hábil para proteger os lucros quando o preço não atingiu o stop loss, mas o mercado começou a se reversão.
Confirmação de dupla localização de preços: o pedido de que o preço esteja simultaneamente acima do VWAP em dois períodos de tempo (do over) ou abaixo do over (do under), o que confirma ainda mais a dinâmica e a direção do preço, reduzindo a falsa ruptura.
Gestão de risco embutidaA estratégia inclui um mecanismo de stop loss e gerenciamento de posições (5% de participação em cada transação por defeito), o que ajuda a controlar a abertura de risco de cada transação e a proteger o capital.
Desafios de baixa taxa de vitóriasA estratégia pode ter problemas de baixa taxa de vitória, como descrito na nota do código. Isso ocorre porque a filtragem de múltiplos condicionantes, embora melhore a qualidade do sinal, também reduz significativamente a frequência de negociação, resultando em uma quantidade de amostragem menor e significância estatística limitada.
Sensibilidade do parâmetroA estratégia usa vários parâmetros ajustáveis, incluindo o comprimento MACD, o limiar RSI, os parâmetros do filtro ATR, etc. Pequenas mudanças nesses parâmetros podem ter um impacto significativo no desempenho da estratégia, com o risco de otimização excessiva.
Limitação de percentual fixo de stop lossO uso da mesma proporção de stop ((1.5%) e stop ((0.5%) para todos os cenários de mercado pode não ser adequado para diferentes cenários de volatilidade. Em mercados de alta volatilidade, o stop pode ser muito apertado; em mercados de baixa volatilidade, o stop pode ser muito longo.
Retardo de vários quadros temporaisO uso de sinais com um período de tempo mais longo (por exemplo, 1 hora) como confirmação pode introduzir um atraso, resultando em oportunidades de entrada perdidas ou saída atrasada.
Falta de adaptação ao mercadoA estratégia não inclui mecanismos para distinguir entre diferentes cenários de mercado (trends/vibrações) e pode não funcionar bem em determinadas condições de mercado.
Solução:
Optimização de stop loss dinâmicoA mudança de um stop loss de porcentagem fixa para um valor dinâmico baseado no ATR, por exemplo, usando 1,5×ATR como stop, 3×ATR como stop. Isso permite que a estratégia se adapte melhor a diferentes ambientes de volatilidade do mercado, oferecendo um stop loss mais flexível em períodos de alta volatilidade e apertando o stop loss em períodos de baixa volatilidade.
Classificação do cenário de mercadoIntrodução de mecanismos de identificação de ambientes de mercado, diferenciando mercados de tendência e mercados de turbulência. Pode-se usar o ADX, a largura de banda de Brin ou a relação de preço com a média móvel de longo prazo para identificar o estado do mercado e, de acordo com isso, ajustar os parâmetros de estratégia ou até mesmo mudar completamente a lógica de negociação.
Otimização do tempo de entradaA estratégia atual: A entrada de uma linha K atual que ocorre em um cruzamento MACD pode enfrentar um ponto de deslizamento ou um atraso na execução. Considere a entrada na próxima abertura da linha K após a confirmação do cruzamento, ou configure um preço de limite para entrar em uma região de preço específica para obter um melhor preço de execução.
Filtro de tempoAumentar o filtro de horário de negociação para evitar períodos de negociação específicos com baixa eficiência. Por exemplo, é possível evitar negociações em períodos de baixa ou irregular liquidez, como o final do horário da Ásia ou o horário de transição entre a Europa e os EUA.
Parâmetros do indicador adaptadosPor exemplo, os parâmetros mais curtos do MACD podem ser usados em mercados de alta volatilidade e os mais longos em mercados de baixa volatilidade.
Classificação de intensidade do sinal: Estabelecer um sistema de pontuação de intensidade para os sinais de entrada, baseado em vários fatores (como o tamanho do MACD, o desvio RSI, a distância VWAP, etc.) para puntuar os sinais, executando apenas transações cuja intensidade ultrapasse um determinado limite, ou ajustando o tamanho da posição de acordo com a dinâmica da intensidade do sinal.
Aprendizagem de máquinaIntrodução de modelos de aprendizagem de máquina para prever quais sinais são mais propensos a gerar negociações lucrativas, identificando os conjuntos de padrões mais valiosos com base em modelos de treinamento de dados históricos. Isso pode melhorar a adaptabilidade e a taxa de vitória da estratégia.
Essas melhorias visam melhorar a robustez, adaptabilidade e desempenho a longo prazo da estratégia, mantendo sua lógica central inalterada. Através dessas melhorias, a estratégia pode responder melhor a mudanças em diferentes ambientes e condições de mercado.
A estratégia de negociação MACD-RSI de taxa de flutuação cruzada de quadros múltiplos é um sistema de negociação abrangente projetado para identificar oportunidades de negociação de alta qualidade através da combinação de vários indicadores técnicos e sinais de vários quadros temporais. A vantagem central da estratégia reside no seu mecanismo de confirmação de sinais em vários níveis e na sua função de gerenciamento de risco embutida, que permite controlar o risco ao mesmo tempo em que capta a flutuação dos preços.
Apesar dos desafios de baixa taxa de vitória, a estratégia mantém o valor esperado positivo, aumentando a receita da média de negociações lucrativas. A performance da estratégia é esperada para melhorar ainda mais, através da implementação de medidas de otimização recomendadas, especialmente o stop loss dinâmico, a classificação do ambiente de mercado e a classificação da intensidade do sinal.
A estratégia é adequada para os comerciantes de curto e médio prazo, especialmente aqueles que buscam uma metodologia de negociação sistematizada baseada em análise técnica e que dão importância à gestão de riscos. O mecanismo de confirmação condicional da estratégia, embora reduza a frequência de negociação, aumenta a qualidade de cada transação, o que está de acordo com a filosofia de negociação “menos é mais”, com ênfase na qualidade e não na quantidade.
Na prática, é recomendável que os comerciantes testem a estratégia em um ambiente simulado, especialmente para testar a eficácia de várias medidas de otimização, e depois aplicá-las com cautela à negociação em ações reais. Ao mesmo tempo, a monitorização contínua das mudanças nas condições de mercado e o ajuste dos parâmetros da estratégia em tempo hábil ajudarão a manter um desempenho estável a longo prazo.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-06-08 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GentlemanOfTrading
//@version=6
strategy(title = "ETH Day Trader", overlay = true, margin_long = 100, margin_short = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 5)
// ==== 1) USER INPUTS ====
// MACD/RSI lengths
fastLen = input.int(12, title="MACD Fast EMA Length", minval=1)
slowLen = input.int(26, title="MACD Slow EMA Length", minval=1)
signalLen = input.int(9, title="MACD Signal EMA Length", minval=1)
rsiLen = input.int(14, title="RSI Length", minval=1)
// RSI thresholds
rsiThreshLong30 = input.int(55, title="RSI30m > (Long)", minval=1, maxval=100)
rsiThreshShort30= input.int(45, title="RSI30m < (Short)", minval=1, maxval=100)
rsiThresh1h = input.int(50, title="RSI1h Threshold", minval=1, maxval=100)
// ATR filter (30m)
atrLen = input.int(14, title="ATR Length (30m)", minval=1)
atrMaLen = input.int(20, title="ATR MA Length (30m)", minval=1)
// Take Profit / Stop Loss (percent)
tpPerc = input.float(1.5, title="Take Profit (%)", minval=0.1) / 100
slPerc = input.float(0.5, title="Stop Loss (%)", minval=0.1) / 100
// Toggle whether to use 1h trend confirmation
use1hTrend = input.bool(true, title="Use 1h MACD Trend Confirmation?")
// ==== 2) FETCH INDICATORS ON 30m ====
// We assume this script is applied on a chart ≤ 30m (e.g. 15m or 5m),
// but if you apply it on a 30m chart it still works: security() with "30" just returns the same bar.
[macd30m, macdSig30m, _] = ta.macd(close, fastLen, slowLen, signalLen)
rsi30m = ta.rsi(close, rsiLen)
atr30m = ta.atr(atrLen)
// ==== 3) FETCH INDICATORS ON 1h & VWAPs via request.security() ====
// --- 1h MACD & RSI ---
[macd1h, macdSig1h, _] = request.security(syminfo.tickerid, "60", ta.macd(close, fastLen, slowLen, signalLen), lookahead=barmerge.lookahead_off)
rsi1h = request.security(syminfo.tickerid, "60", ta.rsi(close, rsiLen), lookahead=barmerge.lookahead_off)
// --- 30m VWAP & 1h VWAP (session VWAP) ---
vwap30m = request.security(syminfo.tickerid, "30", ta.vwap(close), lookahead=barmerge.lookahead_off)
vwap1h = request.security(syminfo.tickerid, "60", ta.vwap(close), lookahead=barmerge.lookahead_off)
// ==== 4) BUILD VOLATILITY FILTER (30m ATR vs ATR MA) ====
atr30m_ma = ta.sma(atr30m, atrMaLen)
volatilityOK = atr30m >= atr30m_ma
// ==== 5) MULTI-TIMEFRAME CROSS CONDITIONS ====
// 30m MACD cross signals
longCross30m = ta.crossover(macd30m, macdSig30m)
shortCross30m = ta.crossunder(macd30m, macdSig30m)
// 1h MACD trend confirmation
macdTrendUp1h = macd1h > macdSig1h
macdTrendDown1h = macd1h < macdSig1h
// ==== 6) ENTRY & EXIT CONDITIONS ====
// LONG ENTRY:
// • 30m MACD crossover
// • 30m RSI > rsiThreshLong30
// • (optionally) 1h MACD line > 1h MACD signal
// • Price > 30m VWAP AND Price > 1h VWAP
// • 30m ATR ≥ 30m ATR MA (volatility filter)
longEntryCond =
longCross30m
and (rsi30m > rsiThreshLong30)
and (close > vwap30m)
and (close > vwap1h)
and volatilityOK
and (use1hTrend ? macdTrendUp1h : true)
// LONG EXIT:
// • fixed TP/SL
// OR • 30m MACD crossunder
// OR • 1h MACD falls below signal (trend flipped)
var float entryPriceLong = na
longExitCond = false
if (strategy.position_size > 0)
// Price-based TP / SL checks
entryPriceLong := nz(entryPriceLong[1], strategy.position_avg_price)
longTPprice = entryPriceLong * (1 + tpPerc)
longSLprice = entryPriceLong * (1 - slPerc)
// check TP/SL first
longExitTP = high >= longTPprice
longExitSL = low <= longSLprice
// fallback: MACD crossunder on 30m OR 1h trend flips
macdTrendFlip1h = macdTrendUp1h and (macd1h < macdSig1h)
macdCross30m = shortCross30m
longExitCond := longExitTP or longExitSL or macdCross30m or macdTrendFlip1h
else
entryPriceLong := na // reset when no position
// SHORT ENTRY:
// • 30m MACD crossunder
// • 30m RSI < rsiThreshShort30
// • (optionally) 1h MACD line < 1h MACD signal
// • Price < 30m VWAP AND Price < 1h VWAP
// • 30m ATR ≥ 30m ATR MA (volatility filter)
shortEntryCond =
shortCross30m
and (rsi30m < rsiThreshShort30)
and (close < vwap30m)
and (close < vwap1h)
and volatilityOK
and (use1hTrend ? macdTrendDown1h : true)
// SHORT EXIT:
// • fixed TP/SL
// OR • 30m MACD crossover
// OR • 1h MACD flips up
var float entryPriceShort = na
shortExitCond = false
if (strategy.position_size < 0)
entryPriceShort := nz(entryPriceShort[1], strategy.position_avg_price)
shortTPprice = entryPriceShort * (1 - tpPerc)
shortSLprice = entryPriceShort * (1 + slPerc)
// check TP/SL first
shortExitTP = low <= shortTPprice
shortExitSL = high >= shortSLprice
macdTrendFlipUp1h = macdTrendDown1h and (macd1h > macdSig1h)
macdCrossUp30m = longCross30m
shortExitCond := shortExitTP or shortExitSL or macdCrossUp30m or macdTrendFlipUp1h
else
entryPriceShort := na // reset when no position
// ==== 7) EXECUTE STRATEGY ORDERS WITH LABELS & ALERTS ====
// — Long Entry —
if (longEntryCond and strategy.position_size == 0)
strategy.entry("Long", strategy.long)
label.new(bar_index, low, text="Buy (LT)", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, yloc=yloc.belowbar)
alert("Buy (LT)", alert.freq_once_per_bar_close)
// — Long Exit —
if (strategy.position_size > 0 and longExitCond)
strategy.close("Long")
label.new(bar_index, high, text="Sell (LT)", style=label.style_label_down, color=color.new(color.red, 0), textcolor=color.white, yloc=yloc.abovebar)
alert("Sell (LT)", alert.freq_once_per_bar_close)
// — Short Entry —
if (shortEntryCond and strategy.position_size == 0)
strategy.entry("Short", strategy.short)
label.new(bar_index, high, text="Sell (ST)", style=label.style_label_down, color=color.new(color.red, 0), textcolor=color.white, yloc=yloc.abovebar)
alert("Sell (ST)", alert.freq_once_per_bar_close)
// — Short Exit —
if (strategy.position_size < 0 and shortExitCond)
strategy.close("Short")
label.new(bar_index, low, text="Buy (ST)", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, yloc=yloc.belowbar)
alert("Buy (ST)", alert.freq_once_per_bar_close)
// ==== 8) OPTIONAL PLOTTING (for debugging) ====
// We’ve removed any `transp`/`opacity` arguments. Instead, we use `color.new(baseColor, α)`
// for transparency, where α = 0 is fully opaque and α = 255 is fully transparent.
// 30m VWAP
plot(vwap30m, title = "VWAP 30m", color = color.new(color.teal, 80)) // ~31% transparentlinewidth= 1
// 1h VWAP
plot(vwap1h, title = "VWAP 1h", color = color.new(color.fuchsia, 80), linewidth= 1) // ~31% transparent
// 30m ATR vs ATR_MA
plot(atr30m, title = "ATR 30m", color = color.new(color.orange, 80))
plot(atr30m_ma, title = "ATR30m MA", color = color.new(color.yellow, 80))
// 30m MACD Histogram (bars)
plot(macd30m - macdSig30m, title = "MACD Histogram (30m)", style = plot.style_columns, color = (macd30m - macdSig30m >= 0 ? color.new(color.green, 80) : color.new(color.red, 80)))
// 1h MACD Histogram (area)
h1 = request.security(syminfo.tickerid, "60", macd1h - macdSig1h, lookahead=barmerge.lookahead_off)
plot(1, title = "MACD Hist (1h)", style = plot.style_area, color = (h1 >= 0 ? color.new(color.green, 80) : color.new(color.red, 80)))