Momentum-Breakout-Strategie

Schriftsteller:ChaoZhang, Datum: 2023-12-13 17:08:53
Tags:

img

Übersicht

Diese Strategie kombiniert gleitenden Durchschnitt, Laguerre RSI Indikator und ADX Indikator, um Breakout-Handel umzusetzen. Es geht lang, wenn der schnelle gleitende Durchschnitt über dem langsamen gleitenden Durchschnitt kreuzt, Laguerre RSI ist größer als 80, und ADX ist größer als 20; es geht kurz, wenn der schnelle gleitende Durchschnitt unter dem langsamen gleitenden Durchschnitt kreuzt, Laguerre RSI ist kleiner als 20, und ADX ist größer als 20. Diese Strategie erfasst die Dynamikmerkmale des Marktes und tritt am Anfang der Trendentwicklung in den Markt ein.

Grundsätze

Die Strategie verwendet hauptsächlich folgende Indikatoren, um Trends und Zeitpunkte für den Einstieg zu bestimmen:

  1. Bewegliche Durchschnittskombination: 16-Tage-EMA, 48-Tage-EMA, 200-Tage-SMA. Ein Aufwärtstrend wird bestimmt, wenn der kurzfristige Durchschnitt über den langfristigen Durchschnitt überschreitet, und ein Abwärtstrend, wenn er darunter überschreitet.

  2. Laguer RSI-Indikator zur Bestimmung von überkauften und überverkauften Zonen.

  3. ADX-Indikator zur Bestimmung des Trendstatus ADX größer als 20 zeigt einen Trend an, der für den Breakout-Handel geeignet ist.

Die Eintrittssignale werden durch die Richtung der gleitenden Durchschnittskombination bestimmt, der Eintrittszeitpunkt durch den Laguerre RSI und nicht-trendige Märkte werden durch den ADX ausgefiltert.

Stärken

Zu den Vorteilen dieser Strategie gehören:

  1. Die Strategie tritt erst zu Beginn der Trendentwicklung in den Markt ein und erzielt exponentielle Gewinne aus Trends.

  2. Begrenzte Verluste: Stop-Losses, die angemessen eingestellt sind, begrenzen Verluste von einzelnen Trades.

  3. Genaue kombinierte Indikatoren: Die gleitenden Durchschnitte, Laguerre RSI und ADX können die Marktrichtung und den Eintrittszeitpunkt relativ genau bestimmen.

  4. Einfache Umsetzung: Die Strategie verwendet nur drei Indikatoren und ist leicht zu verstehen und umzusetzen.

Risiken

Es gibt auch einige Risiken für die Strategie:

  1. Trendumkehrrisiken: Bei einer Trendstrategie können große Verluste entstehen, wenn Trendumkehrungen nicht rechtzeitig erkannt werden.

  2. Abzugsrisiken: Auf unterschiedlichen Märkten kann es zu Stopps kommen, die zu Abzugsrisiken führen.

  3. Risiken bei der Optimierung von Parametern: Die Indikatorparameter müssen für verschiedene Märkte angepasst werden, um Ausfälle zu vermeiden.

Gegenmaßnahmen:

  1. Strenge Stopp-Verluste zur Begrenzung von Einzelhandelsverlusten.

  2. Optimierung der Indikatorparameter und Ausbruchsschwellen.

  3. Verwenden Sie Futures-Hedging usw. zur Verwaltung von Rücknahmen.

Optimierungsrichtlinien

Einige Möglichkeiten zur Optimierung der Strategie sind:

  1. Parameteroptimierung: Testkombinationen von gleitenden Durchschnittsperioden, Laguerre-RSI-Parametern und ADX-Parametern, um optimale Einstellungen zu finden.

  2. Breakout-Optimierung: Versuche verschiedene gleitende Durchschnittsbreakout-Schwellenwerte, um Handelsfrequenz und Rentabilität auszugleichen.

  3. Einstiegsoptimierung: Testen Sie andere Indikatoren in Kombination mit dem Laguerre RSI für einen genaueren Einstiegszeitplan.

  4. Exit-Optimierung: Untersuchen Sie andere Exit-Signale in Kombination mit gleitenden Durchschnitten.

  5. Profit-taking vs. Stop-Loss-Optimierung: Verschiedene Strategien zur Optimierung der Rendite testen.

Zusammenfassung

Zusammenfassend lässt sich sagen, dass diese Strategie die Trendbewegungen effektiv erfasst, indem sie die Kombination von gleitenden Durchschnitten, Laguerre RSI und ADX verwendet, um Ein- und Ausgänge zu bestimmen. Durch den frühen Eintritt in die Trendentwicklungen und die genaue Beobachtung der Trendläufe können exponentielle Gewinne erzielt werden, während Stop-Losses helfen, Verluste zu begrenzen.


/*backtest
start: 2023-12-05 00:00:00
end: 2023-12-12 00:00:00
period: 1m
basePeriod: 1m
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/
// © PtGambler

//@version=5
strategy("3MA + Laguerre RSI + ADX [Pt]", shorttitle = "3MA+LaRSI+ADX[Pt]", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills = false, max_bars_back = 500)


// ********************************** Trade Period / Strategy Setting **************************************
startY = input(title='Start Year', defval=2011, group = "Backtesting window")
startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Backtesting window")
startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Backtesting window")
finishY = input(title='Finish Year', defval=2050, group = "Backtesting window")
finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Backtesting window")
finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Backtesting window")
timestart = timestamp(startY, startM, startD, 00, 00)
timefinish = timestamp(finishY, finishM, finishD, 23, 59)
use_entry_sess = input.bool(false, 'Use Entry Session Window', group = "Trading Session")
t1_session = input("0930-1555:23456", "Entry Session", group="Trading Session", tooltip = "Entry Signal only generated within this period.") 
t1 = time(timeframe.period, t1_session)
window = true

margin_req = input.float(1, title="Margin Requirement / Leverage", step=0.1, group = "Trading Options")
qty_per_trade = input.float(100, title = "% of initial capital per trade", group = "Trading Options")
reinvest = input.bool(defval=false,title="Reinvest profit", group = "Trading Options")
reinvest_percent = input.float(defval=100, title = "Reinvest percentage", group="Trading Options")

close_eod = input.bool(false, "All trades will close at the close of trading window", group = "Trading Options")
close_b4_open = input.bool(false, "Position must hit either SL/PT before entering new trade", group = "Trading Options")

profit = strategy.netprofit 
strategy.initial_capital = 50000
float trade_amount = math.floor(strategy.initial_capital*margin_req / close) 

if strategy.netprofit > 0 and reinvest
    trade_amount := math.floor((strategy.initial_capital* (qty_per_trade/100)+(profit*reinvest_percent*0.01))*margin_req/ close) 
else
    trade_amount := math.floor(strategy.initial_capital* (qty_per_trade/100)*margin_req / close)  

// ******************************************************************************************

group_ma = "Moving Average Ribbon"
group_larsi = "Laguerre RSI"
group_adx = "ADX"
group_SL = "Stop Loss / Profit Target"

// ----------------------------------------- MA Ribbon -------------------------------------

ema1_len = input.int(16, "Fast EMA Length", group = group_ma)
ema2_len = input.int(48, "Slow EMA Length ", group = group_ma)
sma1_len = input.int(200, "Slow SMA Length", group = group_ma)

ema1 = ta.ema(close, ema1_len)
ema2 = ta.ema(close, ema2_len)
sma1 = ta.sma(close, sma1_len)

plot(ema1, "EMA 1", color.white, linewidth = 2)
plot(ema2, "EMA 2", color.yellow, linewidth = 2)
plot(sma1, "SMA 1", color.purple, linewidth = 2)

ma_bull = ema1 > ema2 and ema2 > sma1   
ma_bear = ema1 < ema2 and ema2 < sma1

// ------------------------------------------ Laguerre RSI ---------------------------------------

alpha = input.float(0.2, title='Alpha', minval=0, maxval=1, step=0.1, group = group_larsi)

gamma = 1 - alpha
L0 = 0.0
L0 := (1 - gamma) * close + gamma * nz(L0[1])
L1 = 0.0
L1 := -gamma * L0 + nz(L0[1]) + gamma * nz(L1[1])

L2 = 0.0
L2 := -gamma * L1 + nz(L1[1]) + gamma * nz(L2[1])

L3 = 0.0
L3 := -gamma * L2 + nz(L2[1]) + gamma * nz(L3[1])

cu = (L0 > L1 ? L0 - L1 : 0) + (L1 > L2 ? L1 - L2 : 0) + (L2 > L3 ? L2 - L3 : 0)

cd = (L0 < L1 ? L1 - L0 : 0) + (L1 < L2 ? L2 - L1 : 0) + (L2 < L3 ? L3 - L2 : 0)

temp = cu + cd == 0 ? -1 : cu + cd
LaRSI = temp == -1 ? 0 : cu / temp
LaRSI := LaRSI * 100

bull_LaRSI = LaRSI > 80
bear_LaRSI = LaRSI < 20

// --------------------------------------- ADX  ------------------------

adxlen = input(14, title="ADX Smoothing", group = group_adx)
dilen = input(14, title="DI Length", group = group_adx)
dirmov(len) =>
	up = ta.change(high)
	down = -ta.change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = ta.rma(ta.tr, len)
	plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
	minus = fixnan(100 * ta.rma(minusDM, 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)
sig = adx(dilen, adxlen)

active_adx = sig > 20 //and sig > sig[1]

// ******************************* Profit Target / Stop Loss *********************************************

use_SLPT = input.bool(false, 'Use Fixed SL / PT', group = group_SL)
SL = input.float(50, 'Stop loss in ticks', step = 1, group = group_SL) * syminfo.mintick
PT = input.float(100, "Profit target in ticks", step = 1, group = group_SL) * syminfo.mintick

var L_PT = 0.0
var S_PT = 0.0
var L_SL = 0.0
var S_SL = 0.0

if strategy.position_size > 0
    L_SL := L_SL[1]
    L_PT := L_PT[1]
else if strategy.position_size < 0
    S_SL := S_SL[1]
    S_PT := S_PT[1]
else
    L_SL := close - SL
    L_PT := close + PT
    S_SL := close + SL
    S_PT := close - PT

entry_line = plot(use_SLPT and strategy.position_size != 0 ? strategy.opentrades.entry_price(0) : na, "Entry Price", color.white, linewidth = 1, style = plot.style_linebr)

L_PT_line = plot(use_SLPT and strategy.position_size > 0 ? L_PT : na, "L PT", color.green, linewidth = 2, style = plot.style_linebr)
S_PT_line = plot(use_SLPT and strategy.position_size < 0 ? S_PT : na, "S PT", color.green, linewidth = 2, style = plot.style_linebr)

L_SL_line = plot(use_SLPT and strategy.position_size > 0 ? L_SL : na, "L SL", color.red, linewidth = 2, style = plot.style_linebr)
S_SL_line = plot(use_SLPT and strategy.position_size < 0 ? S_SL : na, "S SL", color.red, linewidth = 2, style = plot.style_linebr)

fill(L_PT_line, entry_line, color = color.new(color.green,90))
fill(S_PT_line, entry_line, color = color.new(color.green,90))
fill(L_SL_line, entry_line, color = color.new(color.red,90))
fill(S_SL_line, entry_line, color = color.new(color.red,90))


// ---------------------------------- Strategy setup ------------------------------------------------------

L_entry1 = ma_bull and bull_LaRSI and active_adx
S_entry1 = ma_bear and bear_LaRSI and active_adx

L_exit1 = ta.crossunder(ema1, ema2)
S_exit1 = ta.crossover(ema1, ema2)

// Trigger zones
bgcolor(ma_bull ? color.new(color.green ,90) : na)
bgcolor(ma_bear ? color.new(color.red,90) : na)

if L_entry1 and (use_entry_sess ? window : true) and (close_b4_open ? strategy.position_size == 0 : true)
    strategy.entry("Long", strategy.long, trade_amount)

if S_entry1 and (use_entry_sess ? window : true) and (close_b4_open ? strategy.position_size == 0 : true)
    strategy.entry("Short", strategy.short, trade_amount)

if use_SLPT
    strategy.exit("Exit Long", "Long", limit = L_PT, stop = L_SL, comment_profit = "Exit Long, PT hit", comment_loss = "Exit Long, SL hit")
    strategy.exit("Exit Short", "Short", limit = S_PT, stop = S_SL, comment_profit = "Exit Short, PT hit", comment_loss = "Exit Short, SL hit")
else
    if L_exit1
        strategy.close("Long", comment = "Exit Long")

    if S_exit1
        strategy.close("Short", comment = "Exit Short")

if use_entry_sess and not window and close_eod
    strategy.close_all(comment = "EOD close")


Mehr