Este artigo explica em detalhes uma tendência quantitativa após a estratégia baseada na análise do volume ratio.
I. Lógica da estratégia
O principal indicador desta estratégia é o volume de alta e baixa.
Calcular o volume total diário.
Marque o volume como volume de touro quando a barra diária se fecha e volume de urso quando se fecha.
Calcular as médias móveis separadamente para os volumes dos touros e dos ursos.
Um sinal de compra é gerado quando o MA do volume de alta cruza acima do MA do volume de baixa, e vice-versa.
O indicador de taxa de variação de preços também é utilizado como filtro, só tendo negociações quando existe uma tendência clara.
Configure stop loss e take profit com base nos sinais para bloquear os lucros.
Ao julgar a direção da tendência através da proporção de volume e filtrando com a taxa de mudança de preço, a qualidade do sinal pode ser melhorada.
II. Vantagens da Estratégia
A maior vantagem desta estratégia é o uso de volume para determinar a direção da tendência, que é um dos métodos mais básicos de tendência.
Além disso, os indicadores de volume podem refletir cedo os sinais de ruptura, sendo relativamente sensíveis.
Por último, a filtragem com taxa de variação de preços também melhora a qualidade do sinal.
III. Riscos potenciais
Embora a estratégia tenha méritos, os seguintes riscos devem ser considerados para a negociação em tempo real:
Em primeiro lugar, os parâmetros dos indicadores de volume devem ser definidos com prudência para evitar falsos sinais.
Em segundo lugar, basear-se apenas num indicador torna-o suscetível a invalidações de preços.
Por último, o risco de um stop loss demasiado próximo ser interrompido prematuramente.
IV. Resumo
Em resumo, este artigo explicou uma estratégia quantitativa usando o volume ratio para determinar tendências. Ele gera sinais de negociação calculadores de médias móveis de volume de alta e baixa. A estratégia tem um certo grau de liderança e sensibilidade, mas precisa ser combinada com outros indicadores para verificação. Além disso, ajuste adequado de parâmetros e gestão prudente do dinheiro também são fundamentais para sua viabilidade.
/*backtest start: 2023-08-14 00:00:00 end: 2023-09-13 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // Based on Volume Flow v3 indicator by oh92 strategy("Volume Flow BF", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0) /////////////// Time Frame /////////////// testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true maType = input(title="Moving Average Type", options=["Simple", "Exponential", "Double Exponential"], defval="Simple") length = input(6, title="MA Length") x = input(3.1, title="Factor For Breakout Candle") // Basic Volume Calcs // vol = volume bull = close>open?vol:0 bear = open>close?vol:0 // Double EMA Function // dema(src, len) => (2 * ema(src, len) - ema(ema(src, len), len)) // BULL Moving Average Calculation bullma = maType == "Exponential" ? ema(bull, length) : maType == "Double Exponential" ? dema(bull, length) : sma(bull, length) // BEAR Moving Average Calculation // bearma = maType == "Exponential" ? ema(bear, length) : maType == "Double Exponential" ? dema(bear, length) : sma(bear, length) ///////////// Rate Of Change ///////////// source = close roclength = input(12, minval=1) pcntChange = input(2, minval=1) roc = 100 * (source - source[roclength]) / source[roclength] emaroc = ema(roc, roclength / 2) isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2)) /////////////// Strategy /////////////// long = bullma > bearma and isMoving() short = bullma < bearma and isMoving() last_long = 0.0 last_short = 0.0 last_long := long ? time : nz(last_long[1]) last_short := short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) last_open_long_signal = 0.0 last_open_short_signal = 0.0 last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1]) last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1]) last_long_signal = 0.0 last_short_signal = 0.0 last_long_signal := long_signal ? time : nz(last_long_signal[1]) last_short_signal := short_signal ? time : nz(last_short_signal[1]) in_long_signal = last_long_signal > last_short_signal in_short_signal = last_short_signal > last_long_signal last_high = 0.0 last_low = 0.0 last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1]) last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1]) sl_inp = input(2.0, title='Stop Loss %') / 100 tp_inp = input(900.0, title='Take Profit %') / 100 take_level_l = strategy.position_avg_price * (1 + tp_inp) take_level_s = strategy.position_avg_price * (1 - tp_inp) since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na slShort = strategy.position_avg_price * (1 + sl_inp) long_sl = in_long_signal ? slLong : na short_sl = in_short_signal ? slShort : na /////////////// Execution /////////////// if testPeriod() strategy.entry("Long", strategy.long, when=long) strategy.entry("Short", strategy.short, when=short) strategy.exit("Long Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0) strategy.exit("Short Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0) ///////////// Plotting ///////////// bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80) bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30) plot(bullma, color=color.lime, linewidth=1, transp=0, title="Bull MA", transp=10) plot(bearma, color=color.red, linewidth=1, transp=0, title="Bear MA", transp=10)