
A estratégia de negociação de percentual de volume de transação é um sistema de negociação integrado que combina análise de volume de transação, filtragem de comportamento de preço, detecção de ruptura e lógica de stop loss/stop. O núcleo da estratégia é identificar o momento em que o volume de transação se expande ou se contrai, através do cálculo de um indicador semelhante ao Williams % R do volume de transação (RVPR), em combinação com um filtro de dupla equilíbrio (Fast and Slow Moving Averages). A estratégia é ainda mais precisa com o filtro de comportamento de preço configurável, baseado em diferentes tipos de gráficos de arbitragem.
O princípio central desta estratégia é a conversão de dados de volume de transação em intervalos percentuais, usando um método de cálculo semelhante ao Williams %R para analisar a relação entre o volume de transação atual e seu alcance histórico. A estratégia usa os seguintes componentes-chave para gerar sinais de transação:
O oscilador de volume de negócios relativo %R: compara o volume de negócios atual com os níveis mais altos e mais baixos do volume de negócios histórico, e calcula a posição relativa. Este indicador é semelhante ao Williams %R no domínio dos preços, mas aplica-se aos dados de volume de negócios.
Filtragem de média móvel dupla: a estratégia usa duas médias móveis de volume de transação ((rápido e lento) e vários algoritmos de suavização podem ser escolhidos ((SMA, EMA, JMA, T3, Super Smoother, etc.). Quando o volume de transação é maior do que a média rápida e a média rápida é maior do que a média lenta, o sinal de volume de transação ascendente pode ser um sinal múltiplo; e vice-versa.
Filtros de comportamento de preços: filtra os sinais de negociação de acordo com diferentes formas de filtragem:
Atravessar o filtro: seletivamente excluir transações próximas ao ponto mais alto/mais baixo das 5 barras, para evitar transações de risco/retorno fraco.
Sistema de parada e travagem: mecanismo de parada / travagem dinâmico baseado no ATR (Amplitude Real Média), que pode ser configurado multiplicando para ajustar a distância entre a parada e a travagem.
Tempo de saída: opção de sair da negociação após um determinado número de rodadas.
Os critérios de entrada multihead incluem: volume de transação maior do que a média móvel rápida, média móvel rápida maior do que a média móvel lenta, volume de transação relativo% R maior do que a margem, preço passando pelo filtro de direção multihead, e opcionais abaixo do ponto de ruptura mais recente. Os critérios de entrada em branco são o oposto, e a posição parada é acionada em condições de saída definidas.
Análise multidimensional: a estratégia combina volume de transação, comportamento de preços e stop loss/stop loss dinâmicas para fornecer uma estrutura abrangente de análise de mercado.
Altitude customizável: A estratégia oferece vários parâmetros para ajuste, incluindo controle de direção de negociação, diferentes modelos de filtragem de comportamento de preços, seleção de tipos de médias móveis de volume de transação, etc., permitindo que o comerciante personalize de acordo com seu próprio estilo e preferências de mercado.
Filtragem de entrada inteligente: Combinando a dinâmica de volume de transação e os padrões de comportamento de preços, a estratégia é capaz de identificar oportunidades de transação de maior probabilidade e evitar sinais de transação de baixa qualidade.
Mecanismos de saída flexíveis: a estratégia oferece opções de saída baseadas em tempo e preço, incluindo saída de barras fixas e stop loss / stop loss dinâmico baseado em ATR, o que torna a gestão de risco mais flexível e eficaz.
Adaptação a diversos contextos de mercado: através de diferentes modelos de comportamento de preços (simples, filtrados, radicais, internos), a estratégia pode ser adaptada a diferentes condições de mercado, incluindo tendências e mercados intermédios.
Integração de indicadores de alta tecnologia: a estratégia integra vários tipos de médias móveis avançadas, como JMA, T3 e Super Smoother, que são excelentes em reduzir o ruído e capturar tendências reais.
Risco de otimização de parâmetros: uma vez que a estratégia contém vários parâmetros ajustáveis, existe o risco de otimização excessiva, o que pode levar a um excelente desempenho de retrospectiva histórica, mas a um fraco desempenho em tempo real. A solução é o uso de testes prospectivos e análise de robustez para garantir que os parâmetros permaneçam estáveis em diferentes condições de mercado.
Risco de Falso Breakout: A explosão de volume de negócios não é necessariamente sempre acompanhada de um movimento de preços sustentável, e a estratégia pode produzir um sinal errado em uma falsa ruptura. Este risco pode ser reduzido adicionando indicadores de confirmação adicionais ou atrasando a entrada.
Dependência do cenário de mercado: a estratégia pode ter um desempenho inconsistente em diferentes cenários de mercado (como alta volatilidade vs baixa volatilidade). Recomenda-se testar a estratégia em várias condições de mercado antes de implementá-la.
Risco de disparo de stop loss: o stop loss com base no ATR pode ser desencadeado quando a volatilidade aumenta de forma súbita. Considere o uso de um multiplicador de stop loss com ajuste de volatilidade ou a configuração de stop loss em pontos críticos de suporte / resistência pode ser mais eficaz.
O tempo de saída não é flexível: a saída de um número fixo de barras pode fechar uma negociação lucrativa cedo demais ou fechar uma negociação perdedora tarde demais. O tempo de saída pode ser considerado dinamicamente ajustado em combinação com a tendência ou o indicador de dinâmica.
Complexidade de cálculo: A estratégia usa vários algoritmos de média móvel complexos e combinações de condições, o que pode aumentar a carga de cálculo e causar atrasos na execução. Em negociações em tempo real, pode ser necessário simplificar alguns indicadores computacionalmente intensivos.
Ajustamento dinâmico da barreira: a estratégia atual usa uma barreira de R% de volume de negócios relativo fixo ((27), que pode ser considerada para realizar o ajuste automático da barreira de adaptação, de acordo com a recente volatilidade do volume de negócios. Isso permitirá que a estratégia se adapte melhor a diferentes condições de mercado e mudanças sazonais.
Confirmação de múltiplos prazos: A introdução de sinais de confirmação de prazos mais elevados, com negociação apenas na direção da tendência maior, pode aumentar a taxa de vitória da estratégia e a taxa de retorno do risco. Por exemplo, o sinal de múltiplos prazos na linha horária só é executado quando a linha do dia está em alta.
Análise da qualidade do volume de transação: além do volume de transação relativo, pode ser adicionado um indicador de difusão do volume de transação ou análise da distribuição do volume de transação para avaliar a qualidade do volume de transação e não apenas a quantidade. Isso ajuda a distinguir entre a confirmação de tendências saudáveis no volume de transação e os sinais de potencial esgotamento.
Paradas inteligentes: As paradas básicas do ATR atual podem ser melhoradas para sistemas mais inteligentes, como paradas baseadas em posições de suporte/resistência críticas, ou usando paradas ajustadas por volatilidade, apertando as paradas em períodos de baixa volatilidade e relaxando as paradas em períodos de alta volatilidade.
Integração da estrutura de mercado: a integração da análise da estrutura de preços (como suporte/resistência, linhas de tendência, canais de preços) na estratégia pode melhorar a qualidade dos pontos de entrada e saída.
Melhoria do gerenciamento de risco: realização de ajustes dinâmicos no tamanho da posição, com base na atual volatilidade do mercado e no desempenho da estratégia recente, aumentando a posição em ambientes de alta taxa de vitória e diminuindo a posição em períodos de incerteza.
Integração de aprendizado de máquina: o uso de algoritmos de aprendizado de máquina para otimizar dinamicamente os parâmetros da estratégia ou prever quais filtros de comportamento de preço são mais eficazes nas condições atuais do mercado pode melhorar ainda mais a performance da estratégia.
A estratégia de negociação de percentual de volume de transação é um sistema de negociação abrangente e flexível que fornece uma ferramenta poderosa para os comerciantes identificarem oportunidades de mercado potenciais, combinando análise de volume de transação, filtros de comportamento de preços múltiplos e tecnologias de gerenciamento de risco dinâmico. O principal benefício da estratégia é sua adaptabilidade e personalização, permitindo que os comerciantes ajusten de acordo com as preferências pessoais e as condições do mercado.
A estratégia é especialmente adequada para os comerciantes que procuram sinais de reversão ou continuação da tendência com base na confirmação de volume de transação. Usando o indicador de volume de transação relativo do estilo Williams % R, a estratégia é capaz de identificar pontos de aumento de volume de transação, que geralmente representam mudanças significativas no sentimento do mercado ou aceleração da tendência.
Apesar de oferecer muitos benefícios, os traders devem estar atentos aos potenciais riscos de otimização excessiva e à dependência do ambiente de mercado. Através de testes e ajustes contínuos, combinados com a orientação de otimização recomendada, os traders podem aumentar ainda mais a solidez e a rentabilidade a longo prazo desta estratégia.
/*backtest
start: 2024-07-04 00:00:00
end: 2025-07-02 08:00:00
period: 1d
basePeriod: 1d
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/
// © GabrielAmadeusLau
//@version=6
strategy("Relative Volume Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// === Input: Trade Direction === //
tradeDirection = input.string("Long Only", title="Trade Direction", options=["Long Only", "Short Only", "Both"], group="Strategy Settings")
dirBarModeL = input.string("Simple", title="Long Directional Bar Mode", options=["Simple", "Filtered", "Aggressive", "Inside", "Filtered & Aggressive", "Filtered & Aggressive & Inside", "Without"], group="Strategy Settings")
dirBarModeS = input.string("Inside", title="Short Directional Bar Mode", options=["Simple", "Filtered", "Aggressive", "Inside", "Filtered & Aggressive", "Filtered & Aggressive & Inside", "Without"], group="Strategy Settings")
useBreakout = input.bool(true, "Use Breakout Filter", group="Strategy Settings")
useSLTP = input.bool(false, "Use Stop Loss & Take Profit", group="Strategy Settings")
atrSLMult = input.float(1, "ATR SL Multiplier", step = 0.05, group="Strategy Settings")
atrTPMult = input.float(1.75, "ATR TP Multiplier", step = 0.05, group="Strategy Settings")
// === Input: MA Function Selector === //
// — T3 Moving Average Function —
// src = input source (e.g. rsi1, close, etc.)
// length = smoothing length (period)
// a = T3 alpha (commonly between 0.7 and 0.9)
t3(src, length, a) =>
e1 = ta.ema(src, length)
e2 = ta.ema(e1, length)
e3 = ta.ema(e2, length)
e4 = ta.ema(e3, length)
e5 = ta.ema(e4, length)
e6 = ta.ema(e5, length)
c1 = -a * a * a
c2 = 3 * a * a + 3 * a * a * a
c3 = -6 * a * a - 3 * a - 3 * a * a * a
c4 = 1 + 3 * a + a * a * a + 3 * a * a
c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3
// == Jurik MA == //
jma(float src, int length, float power, float phase) =>
phaseRatio = phase < -100 ? 0.5 : phase > 100 ? 2.5 : phase / 100 + 1.5
beta = 0.45 * (length - 1) / (0.45 * (length - 1) + 2)
alpha = math.pow(beta, power)
JMA = 0.0
e0 = 0.0
e0 := (1 - alpha) * src + alpha * nz(e0[1])
e1 = 0.0
e1 := (src - e0) * (1 - beta) + beta * nz(e1[1])
e2 = 0.0
e2 := (e0 + phaseRatio * e1 - nz(JMA[1])) * math.pow(1 - alpha, 2) + math.pow(alpha, 2) * nz(e2[1])
JMA := e2 + nz(JMA[1])
//===== 2 Pole Super Smoother Filter =====//
superSmoother(float Series, float Period) =>
var float ALPHA = math.pi * math.sqrt(2.0) / Period
var float BETA = math.exp(-ALPHA )
var float COEF2 = -math.pow(BETA, 2)
var float COEF1 = math.cos( ALPHA ) * 2.0 * BETA
var float COEF0 = 1.0 - COEF1 - COEF2
float sma2 = math.avg(Series, nz(Series[1], Series))
float smooth = na, smooth := COEF0 * sma2 +
COEF1 * nz(smooth[1]) +
COEF2 * nz(smooth[2])
// === MA Selector === //
ma(source, length, type) =>
type == "SMA" ? ta.sma(source, length) :
type == "EMA" ? ta.ema(source, length) :
type == "SMMA (RMA)"? ta.rma(source, length) :
type == "WMA" ? ta.wma(source, length) :
type == "VWMA" ? ta.vwma(source, length) :
type == "HMA" ? ta.hma(source, length) :
type == "ALMA" ? ta.alma(source, length, 0.85, 6) :
type == "LSMA" ? ta.linreg(source, length, 0) :
type == "Optimal MA"? math.avg(ta.alma(source, length, 0.85, 6), ta.rma(source, length), ta.sma(source, length)) :
type == "JMA" ? jma(source, length, 2, 50) :
type == "Super Smoother" ? superSmoother(source, length) :
type == "T3" ? t3(source, length, 0.7) :
na
// === Input Parameters === //
rvolRLength = input.int(112, title="Relative Volume %R Length", minval=1, group="Relative Volume", tooltip="%R used for scaling from 0 to 100, I prefer 73 or 112.")
rvolmaTypeInput = input.string("Optimal MA" , "Type", options = ["None", "SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA", "HMA", "ALMA", "LSMA", "Optimal MA", "JMA", "Super Smoother", "T3"], group = "Relative Volume")
rvolFastLength = input.int(7, title="Relative Volume Fast MA", minval=1, group="Relative Volume")
rvolSlowLength = input.int(161, title="Relative Volume Slow MA", minval=1, group="Relative Volume")
exitBars = input.int(18, title="Bars Until Exit", group="Strategy Settings", tooltip="Exit trade after N bars")
rvolThreshold = input.int(27, "Minimum Relative Volume %R Threshold", group="Relative Volume")
// === Williams %R for Volume === //
wpr(src, length) =>
max_ = ta.highest(src, length)
min_ = ta.lowest(src, length)
(100 * (src - max_) / (max_ - min_)) * -1
// === Volume MAs === //
rvol = wpr(volume, rvolRLength)
rvolFast = ma(volume, rvolFastLength, rvolmaTypeInput)
rvolSlow = ma(volume, rvolSlowLength, rvolmaTypeInput)
// === Price Action Filters === //
up = close > open
upRange = low > low[1] and close > high[1]
upRange_Aggr = close > close[1] and close > open[1]
insideDayUp = close < close[1] and close[1] < close[2] and close[2] < close[3] and close[3] < close[4] and close[4] < close[5] //and not (close > close[1])
down = close < open
downRange = high < high[1] and close < low[1]
downRange_Aggr= close < close[1] and close < open[1]
insideDayDown = close > close[1] and close[1] > close[2] and close[2] > close[3] and close[3] > close[4] and close[4] > close[5] //and not (close < close[1])
breakoutHigh = ta.highest(high, 5)
breakoutLow = ta.lowest(low, 5)
// === Mode-Based Filter Logic === //
longBarOK =
dirBarModeL == "Simple" ? up :
dirBarModeL == "Filtered" ? upRange :
dirBarModeL == "Aggressive"? upRange_Aggr :
dirBarModeL == "Inside"? insideDayUp :
dirBarModeL == "Filtered & Aggressive" ? upRange or upRange_Aggr :
dirBarModeL == "Filtered & Aggressive & Inside" ? upRange or upRange_Aggr or insideDayUp :
dirBarModeL == "Without" ? true : false
shortBarOK =
dirBarModeS == "Simple" ? down :
dirBarModeS == "Filtered" ? downRange :
dirBarModeS == "Aggressive"? downRange_Aggr :
dirBarModeS == "Inside"? insideDayDown :
dirBarModeS == "Filtered & Aggressive"? downRange or downRange_Aggr or insideDayDown :
dirBarModeS == "Filtered & Aggressive & Inside"? upRange_Aggr or insideDayDown :
dirBarModeS == "Without" ? true : false
// === Entry & Exit Logic === //
longCondition = volume > rvolFast and rvolFast > rvolSlow and longBarOK and rvol > rvolThreshold and (not useBreakout or close < breakoutHigh)
shortCondition = volume < rvolFast and rvolFast < rvolSlow and shortBarOK and rvol < (100 - rvolThreshold) and (not useBreakout or close > breakoutLow)
exitLongCondition = strategy.opentrades > 0 and strategy.opentrades.entry_bar_index(0) + exitBars <= bar_index and strategy.opentrades.entry_id(0) == "Long"
exitShortCondition = strategy.opentrades > 0 and strategy.opentrades.entry_bar_index(0) + exitBars <= bar_index and strategy.opentrades.entry_id(0) == "Short"
atr = ta.atr(math.round(math.avg(rvolFastLength, rvolSlowLength)))
longSL = useSLTP ? close - atrSLMult * atr : na
longTP = useSLTP ? close + atrTPMult * atr : na
shortSL = useSLTP ? close + atrSLMult * atr : na
shortTP = useSLTP ? close - atrTPMult * atr : na
// === Strategy Execution === //
if (tradeDirection == "Long Only" or tradeDirection == "Both")
if (longCondition)
strategy.entry("Long", strategy.long, stop=longSL, limit=longTP)
if (tradeDirection == "Short Only" or tradeDirection == "Both")
if (shortCondition)
strategy.entry("Short", strategy.short, stop=shortSL, limit=shortTP)
if (exitLongCondition)
strategy.close("Long")
if (exitShortCondition)
strategy.close("Short")
// === Plotting === //
plot(rvol, title="Relative Volume %R", color=color.orange, style = plot.style_columns, format = format.price)
plot(rvolFast, title="Fast Volume MA", color=color.green, format = format.volume)
plot(rvolSlow, title="Slow Volume MA", color=color.red, format = format.volume)