Stratégie de chaîne de volatilité à double rupture

Auteur:ChaoZhang est là., Date: 2024-01-31 à 10h24
Les étiquettes:

img

Résumé

La stratégie du canal de volatilité à double rupture calcule les bandes intermédiaires, supérieures et inférieures du canal et utilise des indicateurs de tendance et de volume pour déterminer la direction et l'élan du marché.

La logique de la stratégie

L'indicateur de base de cette stratégie est le canal de volatilité basé sur les statistiques des lignes de bougies. La bande du milieu adopte l'algorithme de moyenne mobile et les bandes supérieures et inférieures adoptent la méthode de la plage moyenne vraie pour capturer dynamiquement les limites des fluctuations de prix.

Plus précisément, lorsque le prix franchit la voie inférieure dans le canal, la ligne +DI du DMI dépasse la ligne -DI et le benchmark ADX défini, et le volume de négociation augmente, un signal d'achat est généré.

Analyse des avantages

Le plus grand avantage de cette stratégie est la capture de la direction de rupture majeure des prix. Le jugement de rupture double peut efficacement éviter les marchés latéraux et les chocs et réduire le nombre de stops-loss.

En outre, l'introduction d'indicateurs auxiliaires DMI et volume joue également un bon rôle de filtrage, évitant de faux signaux.

Analyse des risques

Le plus grand risque de la stratégie de double rupture est qu'elle ne peut pas juger des renversements du marché. Si un renversement en forme de V se produit sur le marché, le point de stop-loss peut être facilement déclenché. En outre, des paramètres incorrects peuvent également avoir un impact négatif sur le système de trading.

Pour faire face aux risques, nous pouvons optimiser davantage les paramètres et réduire les stop-loss pour réduire les risques.

Directions d'optimisation

La stratégie présente également un grand potentiel d'optimisation, qui peut être amélioré dans les aspects suivants:

  1. Optimisation des paramètres, tels que le réglage des longueurs DI et ADX des DMI, des réglages de période et de multiplicateur des canaux de volatilité, etc.

  2. Augmenter les conditions de filtrage, telles que la combinaison du MACD et d'autres indicateurs afin d'éviter de fausses ruptures

  3. Mettre en œuvre un suivi automatique des prises de bénéfices et des arrêts de pertes afin de contrôler davantage les risques

  4. Optimiser les paramètres et les règles de filtrage pour différents produits

Résumé

En général, la stratégie de canal de volatilité à double rupture est un système de rupture efficace. Elle peut déterminer efficacement la direction et l'élan de la tendance principale, et a un grand potentiel d'optimisation et de contrôle des risques. Si elle est améliorée et optimisée systématiquement, la stratégie peut générer des bénéfices réguliers à long terme.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Original Idea by: Wunderbit Trading

//@version=5
strategy('Keltner Channel ETH/USDT 1H', overlay=true, initial_capital=1000, pyramiding=0, currency='USD', default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.07)


/// TREND
ribbon_period = input.int(46, 'Period', step=1)

leadLine1 = ta.ema(close, ribbon_period)
leadLine2 = ta.sma(close, ribbon_period)

// p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
// p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
// fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)

//Upward Trend
UT = leadLine2 < leadLine1
DT = leadLine2 > leadLine1

///////////////////////////////////////INDICATORS

// KELTNER //
source = close
useTrueRange = input(true)
length = input.int(81, step=1, minval=1)
mult = input.float(2.5, step=0.1)

// Calculate Keltner Channel
ma = ta.sma(source, length)
range_1 = useTrueRange ? ta.tr : high - low
rangema = ta.sma(range_1, length)
upper = ma + rangema * mult
lower = ma - rangema * mult

plot(ma, title='Middle', color=color.new(color.orange, 0))
p1 = plot(upper, title='Upper', color=color.new(color.orange, 0))
p2 = plot(lower, title='Lower', color=color.new(color.orange, 0))
fill(p1, p2, transp=90)


// DMI INDICATOR //
adxlen = 10  // input(10, title="ADX Smoothing")
dilen = input(19, title='DI Length')
keyLevel = 23  // input(23, title="key level for ADX")
dirmov(len) =>
    up = ta.change(high)
    down = -ta.change(low)
    truerange = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange)
    minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange)
    [plus, minus]

adx(dilen, adxlen) =>
    [plus, minus] = dirmov(dilen)
    sum = plus + minus
    adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
    [adx, plus, minus]

[sig, up, down] = adx(dilen, adxlen)

benchmark = input.int(title='DMI Benchmark', defval=27, minval=1, step=1)

// plot(sig, color=color.red, title="ADX")
// plot(up, style=plot.style_histogram, color=color.green, title="+DI")
// plot(down, style=plot.style_histogram, color=color.red, title="-DI")
// plot(keyLevel, color=color.white, title="Key Level")

///////////////////////////////////////////////////////////


////////////////////////////////////////////////////Component Code Start

testStartYear = input(2019, 'Backtest Start Year')
testStartMonth = input(1, 'Backtest Start Month')
testStartDay = input(1, 'Backtest Start Day')
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(9999, 'Backtest Stop Year')
testStopMonth = input(12, 'Backtest Stop Month')
testStopDay = input(31, 'Backtest Stop Day')
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() => true
///// Component Code Stop //////////////////////////////////////////

//////////////// STRATEGY EXECUTION //////////////////////////

//LONG SET UP
// Take Profit / Stop Loss
long_tp1_inp = input.float(4.5, title='Long Take Profit 1 %', step=0.1) / 100
long_tp1_qty = input.int(15, title='Long Take Profit 1 Qty', step=1)

long_tp2_inp = input.float(20, title='Long Take Profit 2%', step=0.1) / 100
long_tp2_qty = input.int(100, title='Long Take Profit 2 Qty', step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)

long_sl_inp = input.float(4, title='Long Stop Loss %', step=0.1) / 100
long_stop_level = strategy.position_avg_price * (1 - long_sl_inp)


// STRATEGY CONDITION
// LONG
entry_long = open > lower and open < upper and close > upper and up > down and up > benchmark  //  and volume[0] > volume[1]
entry_price_long = ta.valuewhen(entry_long, close, 0)
SL_long = entry_price_long * (1 - long_sl_inp)
exit_long = close < lower or low < SL_long


// STRATEGY EXECUTION
if testPeriod()

    // LONG
    if UT
        strategy.entry(id='Long', direction=strategy.long, when=entry_long, comment='INSERT ENTER LONG COMMAND')
    strategy.exit('TP1', 'Long', qty_percent=long_tp1_qty, limit=long_take_level_1)  // PLACE TAKE PROFIT IN WBT BOT SETTINGS 
    strategy.exit('TP2', 'Long', qty_percent=long_tp2_qty, limit=long_take_level_2)  // PLACE TAKE PROFIT IN WBT BOT SETTINGS
    strategy.close(id='Long', when=exit_long, comment='INSERT EXIT LONG COMMAND')


//PLOT FIXED SLTP LINE
// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='1st Long Take Profit')
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='2nd Long Take Profit')
plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='Long Stop Loss')



Plus de