Stratégie de suivi de tendance du canal de gravité central


Date de création: 2023-09-19 21:30:23 Dernière modification: 2023-09-19 21:30:23
Copier: 0 Nombre de clics: 747
1
Suivre
1617
Abonnés

Aperçu

Cette stratégie combine l’indicateur du centre de gravité et l’indicateur du canal SSL pour permettre le jugement et le suivi des tendances des prix, et appartient à la catégorie des stratégies de suivi des tendances.

Principe de stratégie

  1. Indicateur de gravité du centre de calcul, dans lequel le haut et le bas de la trajectoire sont respectivement les limites de la tendance à la hausse et à la baisse des prix.

  2. Calculer l’indicateur du canal SSL, l’intérieur du canal étant la zone d’ajustement, l’extérieur du canal étant la direction de la tendance.

  3. Lorsqu’un prix franchit une trajectoire ou un canal, il est jugé comme une tendance à la hausse et fait plus; lorsqu’un prix franchit une trajectoire ou un canal, il est jugé comme une tendance à la baisse et fait moins.

  4. L’ATR dynamique est utilisé pour suivre les arrêts lors de la tenue d’une position afin d’éviter l’expansion des pertes.

  5. Les signaux de transaction réels sont générés en combinant les périodes de rétro-analyse.

La stratégie utilise deux indicateurs pour déterminer la direction de la tendance, l’un pour déterminer la rupture et l’autre pour confirmer la tendance. La combinaison des deux améliore l’exactitude du jugement. Le stop-loss dynamique peut être ajusté en fonction de l’ampleur des fluctuations du marché et constitue un moyen de contrôle du risque très pratique.

Analyse des avantages

  1. L’utilisation de ces deux indicateurs permet d’améliorer la précision des tendances.

  2. L’indicateur de centre de gravité est sensible aux changements de tendance et le canal SSL détermine la direction de la tendance.

  3. Le stop ATR dynamique est flexible et permet d’ajuster le stop en temps réel en fonction des fluctuations du marché.

  4. Les règles de la stratégie sont simples, claires, faciles à comprendre et à mettre en œuvre.

  5. Les paramètres sont optimisés et peuvent être adaptés à différents marchés.

  6. La fonction de détection est prête pour vérifier l’efficacité de la stratégie.

Analyse des risques

  1. Il est possible que l’indicateur de centre de gravité et la passerelle SSL ne fonctionnent pas, ce qui entraîne une erreur de signal de transaction. D’autres indicateurs peuvent être ajoutés pour la confirmation.

  2. Les stop-loss dynamiques peuvent être trop radicaux et peuvent être allégés de manière appropriée.

  3. Un mauvais choix de la période de rétroaction peut entraîner une mauvaise efficacité de la stratégie, ce qui nécessite un retour sur investissement pour les différentes phases du marché.

  4. L’impact sur les coûts des transactions doit être pris en compte.

Direction d’optimisation

  1. Testez différentes combinaisons de paramètres pour trouver la meilleure paire de paramètres.

  2. Optimisation des paramètres ATR et multiplicatifs des périodes et des périodes de stop-loss dynamiques.

  3. Il est possible d’introduire d’autres indicateurs pour filtrer le signal, tels que MACD, KDJ, etc.

  4. Ajout de modèles d’apprentissage automatique pour aider à déterminer la direction des tendances.

  5. Optimisation de la gestion des fonds et mise en place d’un contrôle des positions.

  6. Adaptation et optimisation des paramètres pour les variétés spécifiques.

Résumer

Cette stratégie, combinant des indicateurs de centre de gravité et des indicateurs de canal SSL pour juger des tendances, utilise des risques de contrôle de perte ATR dynamiques, et est une stratégie de suivi de tendances viable. L’amélioration de la stabilité et de l’efficacité de la stratégie peut être améliorée par l’optimisation des paramètres, l’introduction d’autres indicateurs et l’apprentissage automatique.

Code source de la stratégie
/*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)