
Cette stratégie utilise la croisée de deux moyennes mobiles pour juger de la variation des tendances du marché et effectuer des opérations de vente et d’achat en fonction de la tendance. Faire plus lorsque la courte moyenne traverse la longue moyenne et faire moins lorsque la courte moyenne traverse la longue moyenne pour suivre la tendance.
Le cœur de la stratégie est constitué de deux moyennes mobiles: une moyenne rapide (avec un cycle de 32 par défaut) et une moyenne lente (avec un cycle de 32 par défaut, qui peut être ajustée par paramètres). Lorsque le cours de clôture franchit le canal formé par ces deux moyennes, il s’agit d’un renversement de tendance, ce qui génère un signal d’achat et de vente:
Par cette méthode d’équilibrage, la stratégie peut suivre la tendance, en tenant des ordres en hausse et des ordres vides en baisse, jusqu’à ce que la tendance se retourne.
Pour les risques ci-dessus, il est possible d’envisager d’ajouter des filtres appropriés, tels que des filtres ATR ou de l’amplitude d’onde réelle moyenne, pour réduire la survente dans les marchés volatiles; mettre en place des arrêts raisonnables, contrôler les pertes ponctuelles; Optimiser en permanence les paramètres pour s’adapter au marché. Cependant, les limites de la stratégie elle-même sont difficiles à contourner complètement.
Les optimisations ci-dessus peuvent améliorer la capacité de la stratégie à faire face à des marchés complexes, mais il convient de noter que l’optimisation excessive peut entraîner un ajustement de la courbe et entraîner une mauvaise performance future.
Les stratégies de suivi de tendance bi-linéaire permettent de capturer les tendances en croisant les mêmes lignes. Elles sont simples, faciles à utiliser et largement applicables. Cependant, elles ne fonctionnent pas bien dans les marchés instables, ne répondent pas aux conditions extrêmes et ont plus de difficulté à optimiser les paramètres.
/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
//study(title="Demo - SSL Basic", shorttitle="Demo - SSL Basic", overlay=true)
strategy(title='Demo - SSL Basic', shorttitle='Demo - SSL Basic', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, commission_value=0.15)
// Backtest Date Range
start_date_long = input(title='Backtest Long Start Date', defval=timestamp('01 Jan 2018 00:00 +0530'))
end_date_long = input(title='Backtest Long End Date', defval=timestamp('25 Jan 2030 00:00 +0530'))
backtest_range = true
// Inputs
maType = input.string(title='SSL MA Type', options=['SMA', 'EMA', 'WMA'], defval='SMA')
sslLen = input(title='SSL Length', defval=32)
showCross = input(title='Show Crossover?', defval=true)
showEntry = input(title='Show Entry?', defval=true)
showTrend = input(title='Show Trend Colors?', defval=true)
// Calc MA for SSL Channel
calc_ma(close, len, type) =>
float result = 0
if type == 'SMA' // Simple
result := ta.sma(close, len)
result
if type == 'EMA' // Exponential
result := ta.ema(close, len)
result
if type == 'WMA' // Weighted
result := ta.wma(close, len)
result
result
// Add SSL Channel
maHigh = calc_ma(high, sslLen, maType)
maLow = calc_ma(low, sslLen, maType)
Hlv = int(na)
Hlv := close > maHigh ? 1 : close < maLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? maHigh : maLow
sslUp = Hlv < 0 ? maLow : maHigh
ss1 = plot(sslDown, title='Down SSL', linewidth=2, color=showTrend ? na : color.red)
ss2 = plot(sslUp, title='Up SSL', linewidth=2, color=showTrend ? na : color.lime)
// Conditions
longCondition = ta.crossover(sslUp, sslDown)
shortCondition = ta.crossover(sslDown, sslUp)
// Strategy
if shortCondition
strategy.close('Long', comment='Long Exit', alert_message='JSON')
if longCondition
strategy.close('Short', comment='Short Exit', alert_message='JSON')
if backtest_range and longCondition
strategy.entry('Long', strategy.long, comment='Long Entry', alert_message='JSON')
if backtest_range and shortCondition
strategy.entry('Short', strategy.short, comment= 'Short Entry', alert_message='JSON')
// Plots
fill(ss1, ss2, color=showTrend ? sslDown < sslUp ? color.new(color.lime, transp=75) : color.new(color.red, transp=75) : na, title='Trend Colors')