Stratégie de rupture de moyenne mobile de haut niveau


Date de création: 2023-10-30 12:22:28 Dernière modification: 2023-10-30 12:22:28
Copier: 0 Nombre de clics: 659
1
Suivre
1617
Abonnés

Stratégie de rupture de moyenne mobile de haut niveau

Aperçu

L’idée principale de cette stratégie est d’utiliser les ruptures de la ligne moyenne supérieure pour réaliser des transactions de tendance. Dans la période de temps du niveau supérieur, le début d’une tendance peut être détecté lorsque le prix franchit la ligne moyenne supérieure ou inférieure, ce qui permet de choisir la direction appropriée pour le suivi.

Principe de stratégie

La stratégie a été développée dans le langage Pine Script et se compose principalement de plusieurs parties:

  1. Paramètres de saisie

Le paramètre de périodicité moyenne est définie, la valeur par défaut est 200; le paramètre de périodicité de la ligne de temps K est définie, la valeur par défaut est la ligne de jour “D”.

  1. Calcul de la moyenne

Calculer la moyenne mobile exponentielle avec la fonction ta.ema.

  1. Une avancée décisive

Utilisez les fonctions ta.crossover et ta.crossunder pour déterminer si le prix a franchi ou franchi la ligne moyenne.

  1. Cartographie du signal

En cas de rupture, dessinez une flèche vers le haut ou vers le bas sur la ligne K.

  1. Les opérations de clôture

La direction choisie pour ouvrir la position lors d’une rupture, et la distance de doublement du stop-loss pour la liquidation de la position.

Cette stratégie repose principalement sur la capacité de discernement de la tendance de la ligne moyenne de niveau supérieur, qui permet le suivi de la tendance par des opérations de rupture simples, qui appartiennent aux stratégies de rupture plus traditionnelles.

Analyse des avantages

Cette stratégie présente les avantages suivants:

  1. Les concepts sont simples, faciles à comprendre et à maîtriser.

  2. Il est facile de régler les paramètres en s’appuyant uniquement sur un indicateur de moyenne.

  3. Les opérations de piratage sont faciles à générer des tendances et ne sont pas fréquentes.

  4. Les cycles de haut niveau montrent clairement les grandes tendances et ne sont pas affectés par les fluctuations à court terme.

  5. Différentes combinaisons de périodes peuvent être configurées pour s’adapter à différentes variétés.

  6. Il est facile de suivre plusieurs espèces, mais difficile de les mettre en cage en même temps.

Analyse des risques

Cette stratégie comporte aussi des risques:

  1. Les signaux de rupture peuvent provoquer de fausses ruptures et ne pas filtrer efficacement les fluctuations du marché.

  2. Les réseaux de téléphonie mobile sont devenus de plus en plus populaires.

  3. Les dommages peuvent être plus importants si la direction fait une erreur de jugement.

  4. Les cycles de la moyenne et les cycles de négociation ne correspondant pas, il peut y avoir des transactions excessives ou des pertes.

  5. Il n’est pas possible de mettre fin à la perte en temps réel, et les pertes sont plus susceptibles de s’étendre.

Les solutions pour faire face au risque comprennent: la combinaison d’indicateurs de tendance, l’augmentation des conditions de filtrage, une réduction appropriée de la période de détention des positions, l’ajustement dynamique des positions de stop-loss, etc.

Direction d’optimisation

Cette stratégie peut être optimisée dans les domaines suivants:

  1. Augmentation de la combinaison d’indicateurs de tendance, tels que MACD, KD, etc., pour améliorer la fiabilité des percées.

  2. Augmentation des conditions de filtrage telles que le volume de transactions ou les canaux de liaison afin d’éviter les fausses percées.

  3. Optimisation de la correspondance des paramètres avec les cycles, afin que les cycles de détention correspondent mieux aux cycles de tendance.

  4. L’ajout d’une stratégie de stop-loss en temps réel pour contrôler les pertes individuelles en suivant le stop-loss.

  5. L’optimisation dynamique des paramètres est envisagée en combinaison avec l’apprentissage automatique.

  6. L’objectif est d’améliorer la stabilité de l’ensemble du portefeuille en essayant plusieurs configurations d’actifs.

Résumer

La stratégie est généralement simple et pratique, elle permet de suivre la tendance par une simple rupture de la ligne de parité, elle est facile à maîtriser et peut être utilisée comme une stratégie d’entrée pour le trading quantifié. Cependant, il existe des problèmes qui nécessitent des améliorations via des indicateurs combinés, des paramètres d’optimisation, des arrêts de perte dynamiques, etc., pour rendre la stratégie plus stable et efficace.

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

// @version=5
// Open-Range-Breakout strategy
// No license. Free and Open Source.    

strategy('Strategy: ORB', shorttitle="ORB", overlay=true , currency=currency.NONE, initial_capital=100000)

// Inputs
period = input.int(defval=15, title="TimeRange", tooltip="The range in minutes (default: 15m)")
sessionInput = input(defval="0915-0930", title="Time Range", group="ORB settings", tooltip='What is the timeperiod (default 9:15AM to 9:30AM, exchange timezone')
hide = input.bool(defval = false, title="Hide ORB Range", group="ORB setting", tooltip = 'Hide the ORB range drawing')

// SL Related
slAtrLen = input.int(defval=14, title="ATR Period for placing SL", group="StopLoss settings")
showSLLines = input.bool(defval=false, title="Show SL lines in chart", tooltip="Show SL lines also as dotted lines in chart. Note: chart may look untidy.", group="StopLoss settings")

// Further Filtering
ignoreMementumVolume = input.bool(defval=false, title="Ignore Momentum & Volume", tooltip="Ignore Momentum & Volume to find out trades", group="Strengh Settings")
rsiLen = input.int(defval=14, title="Momentum Period", group="Strengh Settings", tooltip = 'To determine the momentum, RSI period is set default to 100')
rsiBullish = input.int(defval=50, step=1, title="Bullish Momentum", group="Strengh Settings", tooltip = 'Bullish Momentum, default set to RSI as 50')
rsiBearish = input.int(defval=50, step=1, title="Bearish Momentum", group="Strengh Settings", tooltip = 'Bearish Momentum, default set to RSI as 50')
volAvg = input.int(defval=20, step=1, title="Volume Average Period", group="Strengh Settings", tooltip = 'To calculate average volume, how many historical bars are considered. Default: 20.')
volThreshold = input.float(defval=1, step=0.1, title="Volume Strengh", group="Strengh Settings", tooltip = 'Multiplier: How big the current bar volume compared to average of last 20')

trendPeriod = input.int(defval=200, step=1, title="Trend Period", group="Trend Settings", tooltip = 'To calculate trend, what period is considered. Default: 200.')
hideTrend = input.bool(defval = false, title="Hide the trend line", group="Trend Settings", tooltip = 'Hide the trend')

hidePDHCL = input.bool(defval = false, title="Hide the PDHCL (prev day High Close Low range)", tooltip = 'Hide the Previous Day High, Close, Low lines')

hideTable = input.bool(defval = false, title="Hide the Summary Table", tooltip = 'Hide the summary table.')

// Trade related
rrRatio = input.float(title='Risk:Reward', step=0.1, defval=2.0, group="Trade settings")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=true, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked.", group="Trade settings")
lotSize = input.int(title='Lot Size', step=1, defval=1, group="Trade settings")

// Util method

is_newbar(res) => 
	timeframe.change(time(res)) != 0

// print table
printTable(txt) =>
    var table t = table.new(position.bottom_right, 1, 1)
    table.cell(t, 0, 0, txt, text_halign = text.align_left, bgcolor = color.lime)
	
// globals
t = time(timeframe.period, sessionInput + ":1234567") // everyday
in_session = not na(t)
is_first = in_session and not in_session[1]
is_end_session = in_session[1] and not in_session
green(open, close) => close > open ? true : false
red(open, close) => close < open ? true : false

var float orb_high = na
var float orb_low = na
if is_first
    orb_high := high
    orb_low := low
else
    orb_high := orb_high[1]
    orb_low := orb_low[1]
if high > orb_high and in_session
    orb_high := high
if low < orb_low and in_session
    orb_low := low

plot(hide ? na : orb_high, style=plot.style_line, color=orb_high[1] != orb_high ? na : color.green, title="ORB High", linewidth=2)
plot(hide ? na : orb_low, style=plot.style_line, color=orb_low[1] != orb_low ? na : color.red, title="ORB Low", linewidth=2)



// PDHCL (Previous Day High Close Low)
[dh,dl,dc] = request.security(syminfo.ticker, "D", [high[1],low[1], close[1]], lookahead=barmerge.lookahead_on)
plot(hidePDHCL ? na : dh, title="Prev High",  color=color.red,  linewidth=2, trackprice=true, show_last = 1)
plot(hidePDHCL ? na : dl, title="Prev Low",  color=color.green,  linewidth=2, trackprice=true, show_last = 1)
plot(hidePDHCL ? na : dc, title="Prev Close",  color=color.black,  linewidth=2, trackprice=true, show_last = 1)
plot(hidePDHCL ? na : ta.vwap(close), title="Prev VWAP",  color=color.fuchsia,  linewidth=2, trackprice=true, show_last = 1)

var l1 = label.new(bar_index, hidePDHCL ? na : dh, 'PDH', style=label.style_label_right)

// Previous Day WWAP


// For SL calculation
atr = ta.atr(slAtrLen)	
highestHigh = ta.highest(high, 7)
lowestLow = ta.lowest(low, 7)
longStop = showSLLines ? lowestLow - (atr * 1) : na
shortStop = showSLLines ? highestHigh + (atr * 1) : na
plot(longStop, title="Buy SL", color=color.green, style=plot.style_cross)
plot(shortStop, title="Sell SL", color=color.red, style=plot.style_cross)

// Momentum: rsi
rsi = ta.rsi(close, rsiLen)

// trend: EMA200
ema = ta.ema(close, trendPeriod)
plot(hideTrend ? na : ema, "EMA Trend", color=close > ema ? color.green : color.red, linewidth = 1)

// Volume-Weighed Moving Average calculation
vwmaAvg = ta.vwma(close, volAvg)
vwma_latest = volume
// plotshape((barstate.isconfirmed and (vwma_latest > (vwmaAvg * volThreshold))), title='VolumeData', text='', location=location.abovebar, style=shape.diamond, color=color.gray, textcolor=color.gray, size=size.tiny)

// Trade signals

longCond = barstate.isconfirmed and (ta.crossover(close, orb_high) or ta.crossover(close, dh)) and green(open, close) and (ignoreMementumVolume ? true : rsi > rsiBullish and (vwma_latest > (vwmaAvg * volThreshold)))
shortCond = barstate.isconfirmed and (ta.crossunder(close, orb_low) or ta.crossunder(close, dl)) and red(open, close) and (ignoreMementumVolume ? true : rsi < rsiBearish and (vwma_latest > (vwmaAvg * volThreshold)))

plotshape(longCond, title='Breakout', text='BO', location=location.belowbar, style=shape.triangleup, color=color.green, textcolor=color.green)
plotshape(shortCond, title='Breakout', text='BD', location=location.abovebar, style=shape.triangledown, color=color.red, textcolor=color.red)


// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
    // Entry
    var float sl = na
    var float target = na
    if (longCond)
        strategy.entry("enter long", strategy.long, lotSize, limit=na, stop=na, comment="Enter Long")
        sl := longStop
        target := close + ((close - longStop) * rrRatio)
        alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
    if (shortCond)
        strategy.entry("enter short", strategy.short, lotSize, limit=na, stop=na, comment="Enter Short")
        sl := shortStop
        target := close - ((shortStop - close) * rrRatio)
        alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)

    // Exit: target or SL
    if ((close >= target) or (close <= sl))
        strategy.close("enter long", comment=close < sl ? "Long SL hit" : "Long target hit")
    if ((close <= target) or (close >= sl))
        strategy.close("enter short", comment=close > sl ? "Short SL hit" : "Short target hit")
else if (not mktAlwaysOn)
    // Close all open position at the end if Day
    strategy.close_all(comment = "Close all entries at end of day.")


// Plotting table
if (not hideTable and is_end_session)
    message =  syminfo.ticker + " :\n\nORB Upper: " + str.tostring(math.round(orb_high)) + "\nORB Lower: " + str.tostring(math.round(orb_low)) + "\nPDH: " + str.tostring(math.round(dh)) + "\nPDC: " + str.tostring(math.round(dc)) + "\nPDL: " + str.tostring(math.round(dl)) + "\nVWAP: " + str.tostring(math.round(ta.vwap(close)))   
    printTable(message)
    alert(message, alert.freq_once_per_bar_close)