Estratégia de acompanhamento de tendências do canal de gravidade central


Data de criação: 2023-09-19 21:30:23 última modificação: 2023-09-19 21:30:23
cópia: 0 Cliques: 747
1
focar em
1617
Seguidores

Visão geral

A estratégia combina o indicador de centro de gravidade e o indicador de canal SSL para permitir o julgamento e o rastreamento de tendências de preços, pertencendo à estratégia de rastreamento de tendências. Ao mesmo tempo, a combinação do stop loss dinâmico do ATR é usada para controlar o risco.

Princípio da estratégia

  1. Indicador de gravidade do centro de cálculo, onde os tracks superiores e inferiores são os limites de tendência para a subida e queda dos preços respectivamente.

  2. Calcule o indicador do canal SSL, com o canal interno como o intervalo de correção e o canal externo como a direção da tendência.

  3. Quando o preço quebra a trajetória ascendente ou canal é julgado como uma tendência ascendente e faz mais; quando o preço quebra a trajetória descendente ou canal é julgado como uma tendência descendente e faz mais.

  4. O ATR dinâmico é usado para rastrear o ponto de parada durante a manutenção da posição, evitando a expansão dos prejuízos.

  5. A combinação de períodos de tempo de retrospectiva produz um sinal de negociação real.

A estratégia usa dois indicadores para determinar a direção da tendência ao mesmo tempo, um para determinar a ruptura e um para confirmar a tendência. A combinação dos dois pode aumentar a precisão do julgamento. O stop loss dinâmico pode ajustar o ponto de parada de acordo com a amplitude de flutuação do mercado e é um meio de controle de risco muito prático.

Análise de vantagens

  1. A utilização de dois indicadores para avaliar as tendências pode melhorar a precisão.

  2. O indicador de centro de gravidade é sensível a mudanças de tendência, e o canal SSL determina a direção da tendência.

  3. O Stop Dinâmico ATR tem a flexibilidade de ajustar o Stop em tempo real de acordo com as flutuações do mercado.

  4. As regras da estratégia são simples, claras, fáceis de entender e implementar.

  5. Os parâmetros podem ser ajustados para diferentes mercados.

  6. A função de detecção está pronta para verificar a eficácia da estratégia.

Análise de Riscos

  1. O indicador de centrífuga e o canal SSL podem falhar, resultando em sinais de transação errados. Outros indicadores podem ser adicionados para confirmação.

  2. O stop loss dinâmico pode ser demasiado radical e pode ser adequadamente relaxado.

  3. A escolha inadequada de períodos de retrospectiva pode levar à ineficácia da estratégia, que precisa ser retrospectiva para diferentes fases do mercado.

  4. Os custos de transação devem ser considerados.

Direção de otimização

  1. Teste diferentes combinações de parâmetros para encontrar o melhor par de parâmetros.

  2. Otimizar o ciclo ATR e o parâmetro do múltiplo de stop-loss dinâmico.

  3. A introdução de outros indicadores para filtragem de sinais, como MACD, KDJ, etc.

  4. Adicionar modelos de aprendizado de máquina para ajudar a determinar a direção das tendências.

  5. Optimizar a gestão de fundos e definir o controle de posições.

  6. Adaptação e otimização de parâmetros para variedades específicas.

Resumir

A estratégia combina o indicador de centro de gravidade com o indicador de canal SSL para julgar a tendência, usando o risco de controle de perda de ATR dinâmico, e é uma estratégia de acompanhamento de tendências viável. Otimizando os parâmetros, introdução de outros indicadores e aprendizado de máquina, a melhoria pode aumentar ainda mais a estabilidade da estratégia e a eficácia em campo.

Código-fonte da estratégia
/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-13 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Thanks to HPotter for the original code for Center of Gravity Backtest
strategy("CoG SSL BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
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

/////////////// SSL Channels /////////////// 
_1 = input(false,  "═════════ SSL ══════════")
len1=input(title="SMA Length 1", defval=12)
len2=input(title="SMA Length 2", defval=13)

smaHigh = sma(high, len1)
smaLow = sma(low, len2)

Hlv = 0
Hlv := close > smaHigh ? 1 : close < smaLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? smaHigh : smaLow
sslUp = Hlv < 0 ? smaLow : smaHigh

///////////// Center of Gravity /////////////
_2 = input(false,  "═════════ CoG ══════════")
Length = input(25, minval=1)
m = input(5, minval=0)
Percent = input(6, minval=0, title="COG %")

xLG = linreg(close, Length, m)
xLG1r = xLG + ((close * Percent) / 100)
xLG1s = xLG - ((close * Percent) / 100)

pos = 0.0
pos := iff(close > xLG1r, 1, iff(close < xLG1s, -1, nz(pos[1], 0))) 
possig = iff(pos == 1, 1, iff(pos == -1, -1, pos))

///////////// Rate Of Change ///////////// 
_3 = input(false,  "══════ Rate of Change ══════")
source = close
roclength = input(2, "ROC Length",  minval=1)
pcntChange = input(10, "ROC % Change", minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Srategy ///////////////
long = possig == 1 or (sslUp > sslDown and isMoving())
short = possig == -1 or (sslUp < sslDown 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])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
_4 = input(false,  "════════ Stop Loss ═══════")
atrLkb = input(1, minval=1, title='ATR Stop Period')
atrMult = input(2, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop = 0.0
longStop :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1]
shortStop = 0.0
shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1]

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L",  strategy.long, when=long)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop=longStop, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop=shortStop, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
p1 = plot(sslDown, linewidth = 1, color=color.red, title="SSL down")
p2 = plot(sslUp, linewidth = 1, color=color.lime, title="SSL up")
fill(p1, p2,  color = not isMoving() ? color.white : sslDown < sslUp ? color.lime : color.red, transp=80)
plot(xLG1r, color=color.lime, title="LG1r")
plot(xLG1s, color=color.red, title="LG1s")
plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=1)
plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=1)
bgcolor(long ? color.green : short ? color.red : not isMoving() ? color.white : na, transp=80)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)