Stratégie de négociation de l'oscillateur dynamique

Auteur:ChaoZhang est là., Date: 2023-12-15 à 11h25
Les étiquettes:

img

Résumé

La stratégie de trading Dynamic Momentum Oscillator (DMO) est une stratégie de trading à court terme de 15 minutes basée sur des indicateurs d'oscillateur de momentum. Cette stratégie combine plusieurs indicateurs techniques pour générer des signaux de trading très précis, qui peuvent aider efficacement les traders débutants à prendre des décisions d'achat et de vente dans un court laps de temps, à contrôler les risques et à augmenter la rentabilité.

La logique de la stratégie

Cette stratégie utilise d'abord le canal de Doinchian pour déterminer la direction principale de la tendance du marché. Une rupture au-dessus de la bande supérieure du canal est un signal haussier, tandis qu'une rupture au-dessous de la bande inférieure est un signal baissier. Deuxièmement, la stratégie adopte l'une des trois variantes de la moyenne mobile Hull en combinaison avec un canal ATR adaptatif pour un jugement de tendance plus précis. Lorsque la ligne rapide traverse au-dessus de la ligne moyenne, c'est un signal d'achat, et lorsqu'elle traverse en dessous, c'est un signal de vente. Enfin, à l'aide de l'indicateur Halftrend pour une filtration supplémentaire des faux signaux, la fiabilité des signaux de trading peut être encore améliorée.

Analyse des avantages

Le plus grand avantage de la stratégie DMO réside dans la combinaison organique de plusieurs indicateurs. Différents indicateurs peuvent se vérifier pour filtrer les faux signaux, rendant chaque signal de trading plus précis et fiable. En outre, la façon dont le canal Doinchian juge la tendance principale est simple et directe, et les moyens de filtrer les signaux avec la ligne Halftrend sont également relativement conventionnels. Dans l'ensemble, il est facile à comprendre avec une courbe d'apprentissage faible pour les débutants. Par rapport aux indicateurs uniques, DMO peut atteindre des taux de victoire et une rentabilité plus élevés étant donné le même nombre de transactions.

Analyse des risques

Bien que la stratégie de DMO soit relativement stable et fiable, toute stratégie de trading quantitative comporte certains risques. En particulier, lorsque la ligne rapide traverse en dessous de la ligne médiane, elle peut toujours être un faux signal sans vérification par d'autres indicateurs. En outre, comme toutes les stratégies à court terme, la DMO est également confrontée à des risques associés à un suréchange. Si des événements soudains du marché se produisent qui rendent les indicateurs inefficaces, des paramètres de stop loss inappropriés peuvent également entraîner de plus grandes pertes. Pour atténuer les risques, il est conseillé d'ajuster de manière appropriée les paramètres des indicateurs à moyen et à long terme, de les combiner avec des indicateurs à plus long terme pour la vérification et d'augmenter la distance de stop loss pour contrôler strictement les pertes d'une seule transaction.

Directions d'optimisation

La stratégie DMO peut être optimisée dans les aspects suivants: premièrement, ajuster les paramètres du Hull MA pour équilibrer l'effet de lissage et la sensibilité des moyennes mobiles; deuxièmement, améliorer la logique du canal Doinchian, comme ajuster les paramètres du canal ou ajouter des restrictions supplémentaires; troisièmement, essayer d'autres indicateurs pour remplacer la Halftrend pour une meilleure filtration, tels que les bandes de Bollinger, KDJ, etc.; quatrièmement, spécifier des intervalles de négociation appropriés en fonction des caractéristiques des différents instruments de négociation, par exemple en le changeant en une stratégie de 5 minutes ou 30 minutes. Ces mesures d'optimisation peuvent aider à personnaliser la stratégie DMO en fonction des conditions du marché et des caractéristiques de l'instrument afin d'améliorer la stabilité.

Conclusion

DMO est une stratégie à court terme qui optimise la combinaison de plusieurs indicateurs. Il intègre Doinchian Channel, Hull MA et Halftrend pour déterminer efficacement les tendances du marché et générer des signaux de trading précis. Avec des techniques relativement simples et intuitives et un fonctionnement facile, il peut servir de stratégie d'introduction pour les débutants. Par rapport aux indicateurs simples, DMO peut atteindre des taux de gain et une rentabilité plus élevés.


/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © kgynofomo

//@version=5
strategy(title="[Salavi] | Andy Super Pro Strategy [BTC|M15]",overlay = true, pyramiding = 1,initial_capital = 10000, default_qty_type = strategy.cash,default_qty_value = 10000)

//Doinchian Trend Ribbon
dlen = input.int(defval=30, minval=10)

dchannel(len) =>
    float hh = ta.highest(len)
    float ll = ta.lowest(len)

    int trend = 0
    trend := close > hh[1] ? 1 : close < ll[1] ? -1 : nz(trend[1])
    trend

dchannelalt(len, maintrend) =>
    float hh = ta.highest(len)
    float ll = ta.lowest(len)

    int trend = 0
    trend := close > hh[1] ? 1 : close < ll[1] ? -1 : nz(trend[1])
    maintrend == 1 ? trend == 1 ? #00FF00ff : #00FF009f : maintrend == -1 ? trend == -1 ? #FF0000ff : #FF00009f : na

maintrend = dchannel(dlen)
donchian_bull = maintrend==1
donchian_bear = maintrend==-1


//Hulls
src = input(hlc3, title='Source')
modeSwitch = input.string('Hma', title='Hull Variation', options=['Hma', 'Thma', 'Ehma'])
length = input(55, title='Length')
lengthMult = input(1.0, title='Length multiplier ')

useHtf = false
htf = '240'

switchColor = true
candleCol = false
visualSwitch = true
thicknesSwitch = 1
transpSwitch = 40

//FUNCTIONS
//HMA
HMA(_src, _length) =>
    ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>
    ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length)))
//THMA    
THMA(_src, _length) =>
    ta.wma(ta.wma(_src, _length / 3) * 3 - ta.wma(_src, _length / 2) - ta.wma(_src, _length), _length)

//SWITCH
Mode(modeSwitch, src, len) =>
    modeSwitch == 'Hma' ? HMA(src, len) : modeSwitch == 'Ehma' ? EHMA(src, len) : modeSwitch == 'Thma' ? THMA(src, len / 2) : na

//OUT
_hull = Mode(modeSwitch, src, int(length * lengthMult))
HULL = useHtf ? request.security(syminfo.ticker, htf, _hull) : _hull
MHULL = HULL[0]
SHULL = HULL[2]

//COLOR
hullColor = switchColor ? HULL > HULL[2] ? #00ff00 : #ff0000 : #ff9800
hull_bull = HULL > HULL[2]
bull_start = hull_bull and hull_bull[1]==false
hull_bear = HULL < HULL[2]
bear_start = hull_bear and hull_bear[1]==false

barcolor(color=candleCol ? switchColor ? hullColor : na : na)

//halftrend
amplitude = input(title='Amplitude', defval=2)
channelDeviation = input(title='Channel Deviation', defval=2)
// showArrows = input(title='Show Arrows', defval=true)
// showChannels = input(title='Show Channels', defval=true)

var int trend = 0
var int nextTrend = 0
var float maxLowPrice = nz(low[1], low)
var float minHighPrice = nz(high[1], high)

var float up = 0.0
var float down = 0.0
float atrHigh = 0.0
float atrLow = 0.0
float arrowUp = na
float arrowDown = na

atr2 = ta.atr(100) / 2
dev = channelDeviation * atr2

highPrice = high[math.abs(ta.highestbars(amplitude))]
lowPrice = low[math.abs(ta.lowestbars(amplitude))]
highma = ta.sma(high, amplitude)
lowma = ta.sma(low, amplitude)

if nextTrend == 1
    maxLowPrice := math.max(lowPrice, maxLowPrice)

    if highma < maxLowPrice and close < nz(low[1], low)
        trend := 1
        nextTrend := 0
        minHighPrice := highPrice
        minHighPrice
else
    minHighPrice := math.min(highPrice, minHighPrice)

    if lowma > minHighPrice and close > nz(high[1], high)
        trend := 0
        nextTrend := 1
        maxLowPrice := lowPrice
        maxLowPrice

if trend == 0
    if not na(trend[1]) and trend[1] != 0
        up := na(down[1]) ? down : down[1]
        arrowUp := up - atr2
        arrowUp
    else
        up := na(up[1]) ? maxLowPrice : math.max(maxLowPrice, up[1])
        up
    atrHigh := up + dev
    atrLow := up - dev
    atrLow
else
    if not na(trend[1]) and trend[1] != 1
        down := na(up[1]) ? up : up[1]
        arrowDown := down + atr2
        arrowDown
    else
        down := na(down[1]) ? minHighPrice : math.min(minHighPrice, down[1])
        down
    atrHigh := down + dev
    atrLow := down - dev
    atrLow

ht = trend == 0 ? up : down

var color buyColor = color.blue
var color sellColor = color.red

htColor = trend == 0 ? buyColor : sellColor
// htPlot = plot(ht, title='HalfTrend', linewidth=2, color=htColor)

// atrHighPlot = plot(showChannels ? atrHigh : na, title='ATR High', style=plot.style_circles, color=color.new(sellColor, 0))
// atrLowPlot = plot(showChannels ? atrLow : na, title='ATR Low', style=plot.style_circles, color=color.new(buyColor, 0))

// fill(htPlot, atrHighPlot, title='ATR High Ribbon', color=color.new(sellColor, 90))
// fill(htPlot, atrLowPlot, title='ATR Low Ribbon', color=color.new(buyColor, 90))

HalfTrend_buySignal = not na(arrowUp) and trend == 0 and trend[1] == 1
HalfTrend_sellSignal = not na(arrowDown) and trend == 1 and trend[1] == 0

// plotshape(showArrows and buySignal ? atrLow : na, title='Arrow Up', style=shape.triangleup, location=location.absolute, size=size.tiny, color=color.new(buyColor, 0))
// plotshape(showArrows and sellSignal ? atrHigh : na, title='Arrow Down', style=shape.triangledown, location=location.absolute, size=size.tiny, color=color.new(sellColor, 0))




//ema
filter_ema = ta.ema(close,200)
ema_bull = close>filter_ema
ema_bear = close<filter_ema

atr_length = input.int(7)
atr = ta.atr(atr_length)
atr_rsi_length = input.int(50)
atr_rsi = ta.rsi(atr,atr_rsi_length)
atr_valid = atr_rsi>50

longCondition = bull_start and atr_valid
shortCondition = bear_start and atr_valid

Exit_long_condition = shortCondition
Exit_short_condition = longCondition

if longCondition
    strategy.entry("Andy Buy",strategy.long, limit=close,comment="Andy Buy Here")

if Exit_long_condition
    strategy.close("Andy Buy",comment="Andy Buy Out")
    // strategy.entry("Andy fandan Short",strategy.short, limit=close,comment="Andy 翻單 short Here")
    // strategy.close("Andy fandan Buy",comment="Andy short Out")


if shortCondition
    strategy.entry("Andy Short",strategy.short, limit=close,comment="Andy short Here")


// strategy.exit("STR","Long",stop=longstoploss)
if Exit_short_condition
    strategy.close("Andy Short",comment="Andy short Out")
    // strategy.entry("Andy fandan Buy",strategy.long, limit=close,comment="Andy 翻單 Buy Here")
    // strategy.close("Andy fandan Short",comment="Andy Buy Out")




inLongTrade = strategy.position_size > 0
inLongTradecolor = #58D68D
notInTrade = strategy.position_size == 0
inShortTrade = strategy.position_size < 0

// bgcolor(color = inLongTrade?color.rgb(76, 175, 79, 70):inShortTrade?color.rgb(255, 82, 82, 70):na)
plotshape(close!=0,location = location.bottom,color = inLongTrade?color.green:inShortTrade?color.red:na)


plotshape(longCondition, title='Buy', text='Andy Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(shortCondition, title='Sell', text='Andy Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

Fi1 = plot(MHULL, title='MHULL', color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(SHULL, title='SHULL', color=hullColor, linewidth=thicknesSwitch, transp=50)

fill(Fi1, Fi2, title='Band Filler', color=hullColor, transp=transpSwitch)




Plus de