Stratégie de compression de l'élan de l'ours paresseux


Date de création: 2024-02-02 17:42:58 Dernière modification: 2024-02-02 17:42:58
Copier: 0 Nombre de clics: 1171
1
Suivre
1617
Abonnés

Stratégie de compression de l’élan de l’ours paresseux

Aperçu

La stratégie d’extrusion de la dynamique des ours rouges est une stratégie de négociation quantitative combinant les bandes de Bryn, les canaux de Keltner et les indicateurs de dynamique. Elle utilise les bandes de Bryn et les canaux de Keltner pour déterminer si le marché actuel est en état d’extrusion, puis la génération de signaux de négociation combinés avec les indicateurs de dynamique.

Le principal avantage de cette stratégie est qu’elle permet d’identifier automatiquement le début d’une tendance et de déterminer le moment d’entrée en jeu en fonction de l’indicateur de dynamique. Cependant, il existe également des risques qui nécessitent une optimisation des paramètres pour différentes variétés.

Principe de stratégie

Les stratégies d’extrusion de la dynamique des ours polaires sont évaluées sur la base des trois indicateurs suivants:

  1. Les bandes de Bollinger comprennent les bandes intermédiaires, supérieures et inférieures
  2. Les canaux de Keltner (en anglais: Keltner Channels): ils comprennent le train central, le train supérieur et le train inférieur.
  3. Indicateur de momentum: différence entre le prix actuel et le prix d’il y a n jours

Lorsque la courbe de Boolean est en train de s’écouler en dessous de la courbe de Keltner et que la courbe de Boolean est en train de s’écouler en dessous de la courbe de Keltner, nous considérons que le marché est en état d’extrusion. Cela signifie généralement que la tendance actuelle est sur le point de commencer.

Pour déterminer le moment de l’entrée, nous utilisons l’indicateur de dynamique pour déterminer la vitesse de variation des prix. Il génère un signal d’achat lorsque la dynamique monte au-dessus de sa moyenne et un signal de vente lorsque la dynamique descend au-dessous de sa moyenne.

Analyse des forces stratégiques

Les principaux avantages de la stratégie d’extrusion dynamique des oursons sont:

  1. L’automatisation permet d’identifier le début d’une tendance et d’y accéder plus tôt.
  2. Les résultats de l’enquête ont été publiés dans le journal L’Equipe.
  3. La tendance et le renversement des deux modes de négociation
  4. Paramètres personnalisables, optimisés pour différentes variétés

Analyse des risques

La stratégie d’extrusion de la dynamique de l’ours blanc présente également certains risques:

  1. La zone de Bryn et le canal de Keltner sont plus susceptibles d’émettre de faux signaux.
  2. Les indicateurs de dynamique sont instables et risquent de manquer les meilleurs points d’entrée.
  3. Les paramètres doivent être optimisés, sinon cela ne fonctionnera pas
  4. Les effets sont plus pertinents pour les variétés commerciales

Afin de réduire les risques, il est recommandé d’optimiser les paramètres de longueur des bandes de Bryn et des canaux Keltner, d’ajuster les points d’arrêt, de choisir des variétés de transactions plus liquides et de les vérifier en combinaison avec d’autres indicateurs.

Orientation de l’optimisation de la stratégie

Afin de renforcer encore l’efficacité de la stratégie d’extrusion de la dynamique des ours polaires, les principaux axes d’optimisation sont les suivants:

  1. Combinaison de paramètres pour tester différentes variétés et périodes
  2. Optimisation de la longueur de la ceinture de Brin et du canal Keltner
  3. Optimiser la longueur de l’indicateur de dynamique
  4. Une stratégie de stop-loss différente pour les lots et les lots vides
  5. Ajout d’autres indicateurs pour la vérification du signal

Le test et l’optimisation à plusieurs niveaux permettent d’améliorer considérablement le taux de réussite et la rentabilité de la stratégie.

Résumer

La stratégie d’extrusion dynamique des ours blancs intègre de multiples indicateurs de jugement, permettant d’identifier efficacement le moment où la tendance commence. Cependant, il existe également un certain risque, nécessitant une optimisation des paramètres pour les différentes variétés de transactions. Grâce à des tests et des optimisations continus, la stratégie peut devenir un système de trading algorithmique efficace.

Code source de la stratégie
/*backtest
start: 2024-01-31 00:00:00
end: 2024-02-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mtahreemalam original strategy by LazyBear

strategy(title = 'SQM Strategy, TP & SL',
         shorttitle = 'Squeeze.M Strat',
         overlay = true,
         pyramiding = 0,
         default_qty_type = strategy.percent_of_equity,
         default_qty_value = 100,
         initial_capital = 1000,
         commission_type=strategy.commission.percent, 
         commission_value=0.0,
         process_orders_on_close=true,
         use_bar_magnifier=true)
//Strategy logic
strategy_logic = input.string("Cross above 0", "Strategy Logic", options = ["LazyBear", "Cross above 0"])

// Date Range
testPeriodSwitch = input(false, "Custom Backtesting Date Range",group="Backtesting Date Range")
i_startTime = input(defval = timestamp("01 Jan 2022 00:01 +0000"), title = "Backtesting Start Time",group="Backtesting Date Range")
i_endTime = input(defval = timestamp("31 Dec 2022 23:59 +0000"), title = "Backtesting End Time",group="Backtesting Date Range")
timeCond = true
isPeriod = testPeriodSwitch == true ? timeCond : true

//// Stoploss and Take Profit Parameters
// Enable Long Strategy
enable_long_strategy = input.bool(true, title='Enable Long Strategy', group='SL/TP For Long Strategy', inline='1')
long_stoploss_value = input.float(defval=5, title='Stoploss %', minval=0.1, group='SL/TP For Long Strategy', inline='2')
long_stoploss_percentage = close * (long_stoploss_value / 100) / syminfo.mintick
long_takeprofit_value = input.float(defval=5, title='Take Profit %', minval=0.1, group='SL/TP For Long Strategy', inline='2')
long_takeprofit_percentage = close * (long_takeprofit_value / 100) / syminfo.mintick

// Enable Short Strategy
enable_short_strategy = input.bool(true, title='Enable Short Strategy', group='SL/TP For Short Strategy', inline='3')
short_stoploss_value = input.float(defval=5, title='Stoploss %', minval=0.1, group='SL/TP For Short Strategy', inline='4')
short_stoploss_percentage = close * (short_stoploss_value / 100) / syminfo.mintick
short_takeprofit_value = input.float(defval=5, title='Take Profit %', minval=0.1, group='SL/TP For Short Strategy', inline='4')
short_takeprofit_percentage = close * (short_takeprofit_value / 100) / syminfo.mintick

//// Inputs
//SQUEEZE MOMENTUM STRATEGY
length = input(20, title='BB Length', group = "Squeeze Momentum Settings")
mult = input(2.0, title='BB MultFactor', group = "Squeeze Momentum Settings")
source = close
lengthKC = input(20, title='KC Length', group = "Squeeze Momentum Settings")
multKC = input(1.5, title='KC MultFactor', group = "Squeeze Momentum Settings")
useTrueRange = input(true, title='Use TrueRange (KC)', group = "Squeeze Momentum Settings")
signalPeriod=input(5, title="Signal Length", group = "Squeeze Momentum Settings")
show_labels_sqm = input(title='Show Buy/Sell SQM Labels', defval=true, group = "Squeeze Momentum Settings")
h0 = hline(0)

// Defining MA
ma = ta.sma(source, length)

// Calculate BB
basis = ma
dev = mult * ta.stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
range_1 = useTrueRange ? ta.tr : high - low
rangema = ta.sma(range_1, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC


// SqzON | SqzOFF | noSqz
sqzOn = lowerBB > lowerKC and upperBB < upperKC
sqzOff = lowerBB < lowerKC and upperBB > upperKC
noSqz = sqzOn == false and sqzOff == false

// Momentum
val = ta.linreg(source - math.avg(math.avg(ta.highest(high, lengthKC), ta.lowest(low, lengthKC)), ta.sma(close, lengthKC)), lengthKC, 0)

red_line = ta.sma(val,signalPeriod)
blue_line = val

// lqm = if val > 0
//         if val > nz(val[1])
        // long_sqm_custom
        // if val < nz(val[1])
        // short_sqm_custom
// Plots
//plot(val, style = plot.style_line, title = "blue line", color= color.blue, linewidth=2)
//plot(ta.sma(val,SignalPeriod), style = plot.style_line, title = "red line",color = color.red, linewidth=2)

//plot(val, color=blue, linewidth=2)
//plot(0, color=color.gray, style=plot.style_cross, linewidth=2)
//plot(red_line, color=red, linewidth=2)

//LOGIC
//momentum filter
//filterMom = useMomAverage ? math.abs(val) > MomentumMin / 100000 ? true : false : true
//}

////SQM Long Short Conditions
//Lazy Bear Buy Sell Condition
// long_sqm_lazy = (blue_line>red_line)
// short_sqm_lazy = (blue_line<red_line)

long_sqm_lazy = ta.crossover(blue_line,red_line)
short_sqm_lazy = ta.crossunder(blue_line,red_line)


//Custom Buy Sell Condition
dir_sqm = val < 0 ? -1 : 1
long_sqm_custom = dir_sqm == 1 //and dir_sqm[1] == -1
short_sqm_custom = dir_sqm == -1 //and dir_sqm[1] == 1

long_sqm = strategy_logic == "LazyBear" ? long_sqm_lazy : long_sqm_custom 
short_sqm = strategy_logic == "LazyBear" ? short_sqm_lazy : short_sqm_custom 


// Plot Stoploss & Take Profit Levels
long_stoploss_price = strategy.position_avg_price * (1 - long_stoploss_value / 100)
long_takeprofit_price = strategy.position_avg_price * (1 + long_takeprofit_value / 100)
short_stoploss_price = strategy.position_avg_price * (1 + short_stoploss_value / 100)
short_takeprofit_price = strategy.position_avg_price * (1 - short_takeprofit_value / 100)
plot(enable_long_strategy and not enable_short_strategy ? long_stoploss_percentage : na, color=color.red, style=plot.style_linebr, linewidth=2, title='Long SL Level')
plot(enable_long_strategy and not enable_short_strategy ? long_takeprofit_percentage : na, color=color.green, style=plot.style_linebr, linewidth=2, title='Long TP Level')
plot(enable_short_strategy and not enable_long_strategy ? short_stoploss_price : na, color=color.red, style=plot.style_linebr, linewidth=2, title='Short SL Level')
plot(enable_short_strategy and not enable_long_strategy ? short_takeprofit_price : na, color=color.green, style=plot.style_linebr, linewidth=2, title='Short TP Level')


// Long Strategy
if long_sqm and enable_long_strategy == true
    strategy.entry('Long', strategy.long)
    strategy.exit('Long  SL/TP', from_entry='Long', loss=long_stoploss_percentage, profit=long_takeprofit_percentage)
    strategy.close('Long', comment = "L. CL")

// Short Strategy
if short_sqm and enable_short_strategy == true 
    strategy.entry('Short', strategy.short)
    strategy.exit('Short SL/TP', from_entry='Short', loss=short_stoploss_percentage, profit=short_takeprofit_percentage)
    strategy.close('Short', comment = "S.Cl")

plot_sqm_long = long_sqm and not long_sqm[1]
plot_sqm_short = short_sqm and not short_sqm[1]

plotshape(plot_sqm_long and show_labels_sqm, title='Buy', style=shape.labelup, location=location.belowbar, size=size.normal, text='Buy', textcolor=color.new(color.white, 0), color=color.new(color.green, 0))
plotshape(plot_sqm_short and show_labels_sqm, title='Sell', style=shape.labeldown, location=location.abovebar, size=size.normal, text='Sell', textcolor=color.new(color.white, 0), color=color.new(color.red, 0))

// Date Range EXIT
if (not isPeriod) 
    strategy.cancel_all()
    strategy.close_all()