Este artigo detalha uma estratégia de quantificação baseada na taxa de transação para determinar a direção da tendência. A estratégia gera um sinal de compra e venda por meio do cálculo de uma linha média de transação muito vazia.
Princípios estratégicos
O indicador central da estratégia é o volume de tráfego de tráfego. Os passos de cálculo são os seguintes:
Calcule o volume de transações do dia.
Quando a linha K é considerada como multi-cabeça, o volume de transação é registrado como volume de transação multi-cabeça (Bull Volume).
Quando a linha K é considerada vazia, o volume de transação é registrado como o volume de transação do lado vazio (Bear Volume).
Calcule a média móvel da transação entre os lados e o lado vazio.
Quando uma média móvel de múltiplos lados atravessa uma média móvel de lados vazios, gera um sinal de compra; ao contrário, gera um sinal de venda.
A taxa de variação de preços é filtrada através de indicadores de taxa de variação de preços e só é negociada quando há uma clara tendência de preços.
De acordo com a configuração do sinal, o ponto de parada de perda para bloquear o lucro.
Desta forma, a direção da tendência pode ser determinada pela proporção de volume de transação, auxiliando a filtragem com indicadores de taxa de variação de preço, o que pode melhorar a qualidade do sinal. A configuração de stop loss também permite que cada transação tenha uma perda controlada.
A vantagem estratégica
A principal vantagem dessa estratégia é que o volume de transações é usado para determinar a direção da tendência, sendo uma das formas mais básicas de determinar a tendência. O volume de transações pode refletir o comportamento dos participantes no mercado.
Além disso, o indicador de volume de transação também pode refletir sinais de ruptura com antecedência, sendo mais sensível. Comparado ao uso apenas do indicador de preços, ele pode capturar uma reversão de tendência mais cedo.
Por fim, a filtragem em combinação com o índice de variação de preços também melhorou a qualidade do sinal.
C. Riscos potenciais
Apesar das vantagens desta estratégia, há riscos que devem ser considerados no mercado real:
Em primeiro lugar, é preciso ter cuidado ao definir os parâmetros do indicador de volume de negócios para evitar falsos sinais.
Em segundo lugar, a confiança em apenas um indicador torna os preços inválidos. Deverá ser verificado por vários conjuntos de indicadores.
Por fim, a configuração de stop loss muito próxima pode levar ao risco de quebra do stop loss.
Quatro conteúdos, resumo
Este artigo detalha uma estratégia de quantificação que utiliza a taxa de transação para determinar a tendência. Pode gerar sinais de negociação através da computação de uma linha de transação de volume médio. A estratégia tem certa precedência, mas também precisa ser verificada em conjunto com outros indicadores.
/*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)