Kombinierte Momentum-Breakout-Strategie


Erstellungsdatum: 2023-12-13 17:08:53 zuletzt geändert: 2023-12-13 17:08:53
Kopie: 6 Klicks: 599
1
konzentrieren Sie sich auf
1621
Anhänger

Kombinierte Momentum-Breakout-Strategie

Überblick

Die Strategie ermöglicht einen Durchbruch durch die Kombination von Moving Averages, Laguerre RSI und ADX. Wenn der Laguerre RSI über 80 liegt und der ADX über 20 liegt, wird der Durchbruch durch den Slow Moving Average auf dem schnellen Moving Average gemacht. Wenn der Laguerre RSI unter 20 liegt und der ADX über 20 ist, wird der Durchbruch durch den Slow Moving Average gemacht.

Grundsätze

Die Strategie beurteilt Trends und Markteintrittszeitpunkte anhand folgender Indikatoren:

  1. Moving-Average-Kombination: 16-Tage-EMA, 48-Tage-EMA, 200-Tage-SMA. Wenn der kurzfristige Durchschnitt über dem langfristigen Durchschnitt liegt, wird er als Überkopfmarkt beurteilt.

  2. Der Laguerre RSI beurteilt überkaufte und überverkaufte Bereiche. RSI größer als 80 ist ein Überkopfsignal und kleiner als 20 ein Leerkopfsignal.

  3. Der ADX-Indikator beurteilt den Trendzustand. ADX größer als 20 zeigt den Trendzustand an und eignet sich für einen Durchbruch.

Das Eintrittssignal ist die Richtung des Trends durch die Kombination von Moving Averages, der Laguerre RSI entscheidet über den Zeitpunkt des Eintritts und die ADX-Filterung ist ein nicht-trendender Markt. Das Austrittssignal ist die Umkehrung des Moving Averages. Das gesamte strategische Entscheidungsrahmen ist relativ vernünftig, die einzelnen Indikatoren werden miteinander kombiniert, um das Fehlen und das Ein- und Aussteigen zu beurteilen.

Vorteile

Diese Strategie hat folgende Vorteile:

  1. Die Strategie wird nur eingesetzt, wenn sich ein Trend entwickelt, um die Indexgewinnspanne des Nachmarktes zu erfassen.

  2. Verlustbegrenzung: Ein angemessener Stop-Loss kann die Einzelschäden bis zu einem gewissen Grad begrenzen. Es gibt auch Gewinnchancen, auch wenn Sie in eine Falle geraten.

  3. Die Indikator-Porteil-Genauigkeit: Die Moving Average, der Laguerre RSI und der ADX-Indikator ermöglichen eine vergleichsweise genaue Beurteilung der Marktfreiheit und des Einstiegszeitpunkts.

  4. Einfach umzusetzen: Die Strategie wurde mit nur drei Kennzahlen entwickelt, um einfach umzusetzen und zu erlernen.

Die Gefahr

Es gibt einige Risiken bei dieser Strategie:

  1. Trendwechselrisiko: Die Strategie gehört zu den Trendverfolgungsstrategien. Wenn die Trendwechsel nicht rechtzeitig erkannt werden, kann ein großer Verlust entstehen.

  2. Rücktrittsrisiko: In einem Schock kann der Stop-Loss durchbrochen werden, was zu einem Rücktritt führt.

  3. Risiken der Parameteroptimierung: Die Parameter des Indikators müssen an den jeweiligen Markt angepasst werden, da sie sonst nicht wirksam sind.

Gegenmaßnahmen:

  1. Strenge Stop-Losses und Einzelschadenkontrolle

  2. Optimierung der Parameter und Anpassung der Anzahl der Durchbrüche.

  3. Die Rücknahme wird mit Methoden wie Futures-Sets-Vermessung verwaltet.

Optimierungsrichtung

Diese Strategie kann in folgenden Bereichen optimiert werden:

  1. Optimale Parameter-Optimierung: Tests mit Moving Average-Perioden, Laguerre RSI-Parametern und ADX-Parametern zur Suche nach optimalen Kombinationen.

  2. Breakout-Optimierung: Versuche verschiedene Breakouts an den Moving Averages, um ein Gleichgewicht zwischen Anzahl der Trades und Gewinnraten zu finden.

  3. Optimierung der Eintrittsbedingungen: Tests mit anderen Indikatoren in Kombination mit dem Laguerre RSI, um die Bedingungen zu ermitteln, unter denen die Eintrittszeit besser beurteilt werden kann.

  4. Optimierung der Ausgangsbedingungen: Die Untersuchung anderer Indikatoren in Verbindung mit dem Moving Average dient als präziseres Ausgangssignal.

  5. Profitabilitätsziele und Stop-Loss-Optimierung: Versuche verschiedene Stop-Loss-Strategien zur Optimierung des Ertrags.

Zusammenfassen

Die Strategie erlaubt eine effektive Erfassung von Trendbewegungen durch den Einsatz von drei Indikatoren: Moving Average, Laguerre RSI und ADX. Die Strategie ist zeitgerecht eingeschaltet, wenn sich ein Trend entwickelt, und verfolgt den Trend, um Indexgewinne zu erfassen. Die Strategie ist zugleich mit einer Stop-Loss-Strategie ausgestattet, um einzelne Verluste zu kontrollieren.

Strategiequellcode
/*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")