5-Minuten-Trendfolgestrategie basierend auf schnellem und langsamem EMA-Crossover


Erstellungsdatum: 2023-11-16 15:36:36 zuletzt geändert: 2023-11-16 15:36:36
Kopie: 0 Klicks: 828
1
konzentrieren Sie sich auf
1617
Anhänger

5-Minuten-Trendfolgestrategie basierend auf schnellem und langsamem EMA-Crossover

Überblick

Die Strategie basiert auf einem schnellen EMA-Kreuzungssystem, das auf einem 5-Minuten-Zeitrahmen basiert, kombiniert mit einem Limit-Beschreibung und der automatischen Erfassung eines Stop-Loss-Trends. Die Strategie eignet sich für den Handel mit kurzfristigen Trends, um die Richtung des Gesamttrends durch EMA-Filterung zu bestimmen, und kombiniert mit einem schnellen EMA-Kreuzung, um den spezifischen Einstieg zu bestimmen.

Strategieprinzip

  1. Mit schnellen und langsamen EMAs, mit schnellen EMAs mehr als mit langsamen EMAs, mit schnellen EMAs weniger als mit schnellen EMAs
  2. Verwenden Sie EMA-Makrofilter, um nur dann mehr zu tun, wenn der Preis über der EMA liegt, und nur dann, wenn er unter der EMA liegt, um falsche Durchbrüche zu vermeiden
  3. Der Einstieg erfolgt über eine Preisliste, um sicherzustellen, dass der Preis den gewünschten Stand erreicht.
  4. Eintritt mit dynamischem Tracking Stop Loss, Lock Profit, Stop Loss und Exit

Es gibt nur zwei Möglichkeiten:

  1. Berechnen Sie den schnellen EMA entsprechend der Länge des schnellen EMA und des langsamen EMA
  2. Wenn der EMA-Filter aktiviert ist, können Sie nur mehr tun, wenn der Preis über der EMA liegt, und nur unter der EMA
  3. Wenn die schnelle EMA über die langsame EMA geht, machen Sie mehr; wenn die schnelle EMA unter die langsame EMA geht, machen Sie Platz
  4. Bei mehreren Eintrittskarten Mindestkarten, bei leeren Eintrittskarten Höchstkarten
  5. Nach der Eintrittsphase starten Sie die Tracking-Stopps, die nach dem laufenden Höchstpreis verfolgen, die Verluste stoppen und stoppen

Das ist die grundlegende Transaktionslogik der Strategie.

Strategische Vorteile

  1. Verwenden Sie EMAs, um die Richtung des Gesamttrends zu bestimmen und einen Abweichhandel zu vermeiden
  2. Die EMA und die Limit-Liste sind ein guter Weg, um die Preissteigerungen zu vermeiden.
  3. Dynamische Stop-Loss-Verfolgung, eine gute Methode, um Gewinne zu sichern
  4. Risikokontrolle ist vorhanden, jeder Stop-Loss ist bei etwa 2% festgelegt
  5. Weniger Rückzug, bessere Erfassung von Trends
  6. Strategie ist einfach, klar, leicht zu verstehen und zu optimieren

Strategisches Risiko

  1. Es besteht ein gewisses Risiko, dass ein falscher Trendbruch verhindert wird.
  2. Fehlgeordnete EMA-Zyklen können zu verpassten Trends führen
  3. Die Stop-Loss-Spanne ist zu hoch eingestellt und kann außerhalb der normalen Schwankungsbreite gestoppt werden
  4. “Wir sind zu radikal, um zu verfolgen, dass der Verlust zu früh aufhört”.
  5. Die Stop-Loss- und Stop-Stop-Ratio-Einstellungen sind unvernünftig und können die größeren Ereignisse verpassen

Gegenmaßnahmen:

  1. Optimierung der EMA-Parameter zur Ermittlung der optimalen Zykluslänge
  2. Eine angemessene Lockerung der Stop-Loss-Marge, um zu verhindern, dass zu häufige Stop-Losses auftreten
  3. Beginn der Verlustverfolgung und die Verfolgungsbreite werden sorgfältig eingestellt
  4. Verschiedene Stop-Loss-Stopp-Ratios testen, um die optimalen Parameter zu finden

Richtung der Strategieoptimierung

  1. Optimierung der EMA-Zyklusparameter, um die optimale Kombination zu finden
  2. Versuchen Sie es mit verschiedenen EMA-Typen, wie beispielsweise einem gewogenen Moving Average.
  3. Tests mit anderen Indikatoren, wie MACD, um zu sehen, ob sie die Wirksamkeit verbessern
  4. Versuchen Sie, EMA-Filter in einem höheren Zeitrahmen durchzuführen
  5. Optimierung der Einstiegsgrenze
  6. Optimierung von Stop-Loss-Stop-Punkten und -Raten
  7. Versuchen Sie, eine komplexere Methode zur Verlustverfolgung zu verwenden.
  8. Trendschwäche wird durch Trendindikatoren ermittelt
  9. Erwägen Sie, weitere Filter hinzuzufügen, um weitere False-Breaks zu vermeiden.

Zusammenfassen

Die Strategie als Ganzes ist eine sehr geeignete Strategie für den Handel mit kurzen mittleren und mittleren Trends, die schnelle EMA-Kreuzung des Einstiegszeitpunkts, die Vermeidung von Höhen und Tiefen, die dynamische Verfolgung von Stop-Loss- und Gewinnschließung ist sehr klar, vernünftig und einfach zu bedienen. Durch die Optimierung bestimmter Parameter kann die Erfolgsrate und Profitabilität der Strategie weiter verbessert werden.

Strategiequellcode
/*backtest
start: 2022-11-09 00:00:00
end: 2023-11-15 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/
// © jordanfray

//@version=5
strategy(title="5 Minute EMA Strategy", overlay=true, max_bars_back=500, default_qty_type=strategy.percent_of_equity, default_qty_value=100,initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.05, backtest_fill_limits_assumption=2)

// Indenting Classs
indent_1 = " "
indent_2 = "  "
indent_3 = "   "
indent_4 = "    "

// Group Titles
group_one_title = "EMA Settings"
group_two_title = "Entry Settings"
group_three_title = "Trade Filters"

// Input Tips

ocean_blue = color.new(#0C6090,0)
sky_blue = color.new(#00A5FF,0)
green = color.new(#2DBD85,0)
red = color.new(#E02A4A,0)
light_blue = color.new(#00A5FF,85)
light_green = color.new(#2DBD85,85)
light_red = color.new(#E02A4A,85)
light_yellow = color.new(#FFF900,85)
white = color.new(#ffffff,0)
light_gray = color.new(#000000,70)
transparent = color.new(#000000,100)

// Strategy Settings - EMA
fast_EMA_length = input.int(defval=20, minval=1, title="Fast Length", group=group_one_title)
fast_EMA_type = input.string(defval="EMA", options = ["EMA", "SMA", "RMA", "WMA"], title=indent_4+"Type", group=group_one_title)
fast_EMA_source = input.source(defval=close, title=indent_4+"Source", group=group_one_title)
fast_EMA = switch fast_EMA_type
    "EMA" => ta.ema(fast_EMA_source, fast_EMA_length)
    "SMA" => ta.sma(fast_EMA_source, fast_EMA_length)
    "RMA" => ta.rma(fast_EMA_source, fast_EMA_length)
    "WMA" => ta.wma(fast_EMA_source, fast_EMA_length)
    => na
plot(fast_EMA, title="Fast EMA", linewidth=1, color=green, editable=true)

slow_EMA_length = input.int(defval=100, minval=1, title="Slow Length", group=group_one_title)
slow_EMA_type = input.string(defval="EMA", options = ["EMA", "SMA", "RMA", "WMA"], title=indent_4+"Type", group=group_one_title)
slow_EMA_source = input.source(defval=close, title=indent_4+"Source", group=group_one_title)
slow_EMA = switch slow_EMA_type
    "EMA" => ta.ema(slow_EMA_source, slow_EMA_length)
    "SMA" => ta.sma(slow_EMA_source, slow_EMA_length)
    "RMA" => ta.rma(slow_EMA_source, slow_EMA_length)
    "WMA" => ta.wma(slow_EMA_source, slow_EMA_length)
    => na
plot(slow_EMA, title="Slow EMA", linewidth=1, color=sky_blue, editable=true)


// EMA Macro Filter
enable_EMA_filter = input.bool(defval=false, title="Use EMA Filter", group=group_three_title)
EMA_filter_timeframe = input.timeframe(defval="", title=indent_4+"Timeframe", group=group_three_title)
EMA_filter_length = input.int(defval=300, minval=1, step=10, title=indent_4+"Length", group=group_three_title)
EMA_filter_source = input.source(defval=hl2, title=indent_4+"Source", group=group_three_title)
ema_filter = ta.ema(EMA_filter_source, EMA_filter_length)
ema_filter_smoothed = request.security(syminfo.tickerid, EMA_filter_timeframe, ema_filter[barstate.isrealtime ? 1 : 0], gaps=barmerge.gaps_on)
plot(enable_EMA_filter ? ema_filter_smoothed: na, title="EMA Macro Filter", linewidth=2, color=white, editable=true)


// Entry Settings
stop_loss_val = input.float(defval=2.0, title="Stop Loss (%)", step=0.1, group=group_two_title)/100
take_profit_val = input.float(defval=2.0, title="Take Profit (%)", step=0.1, group=group_two_title)/100
long_entry_limit_lookback = input.int(defval=3, title="Long Entry Limit Lookback", minval=1, step=1, group=group_two_title)
short_entry_limit_lookback = input.int(defval=3, title="Short Entry Limit Lookback", minval=1, step=1, group=group_two_title)
limit_order_long_price = ta.lowest(low, long_entry_limit_lookback)
limit_order_short_price = ta.highest(high, short_entry_limit_lookback)
start_trailing_after = input.float(defval=1, title="Start Trailing After (%)", step=0.1, group=group_two_title)/100
trail_behind = input.float(defval=1, title="Trail Behind (%)", step=0.1, group=group_two_title)/100
long_start_trailing_val = strategy.position_avg_price + (strategy.position_avg_price * start_trailing_after)
short_start_trailing_val = strategy.position_avg_price - (strategy.position_avg_price * start_trailing_after)
long_trail_behind_val = close - (strategy.position_avg_price * (trail_behind/100))
short_trail_behind_val = close + (strategy.position_avg_price * (trail_behind/100))
currently_in_a_long_postion = strategy.position_size > 0
currently_in_a_short_postion = strategy.position_size < 0
long_profit_target = strategy.position_avg_price * (1 + take_profit_val)
long_stop_loss = strategy.position_avg_price * (1.0 - stop_loss_val)
short_profit_target = strategy.position_avg_price * (1 - take_profit_val)
short_stop_loss = strategy.position_avg_price * (1 + stop_loss_val)

bars_since_entry = bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1)
plot(bars_since_entry, editable=false, title="Bars Since Entry", color=green)

long_run_up = currently_in_a_long_postion and bars_since_entry > 0 ? ta.highest(high, bars_since_entry) : high
long_trailing_stop = currently_in_a_long_postion and bars_since_entry > 0 and long_run_up > long_start_trailing_val ? long_run_up - (long_run_up * trail_behind) : long_stop_loss
long_run_up_line = plot(long_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? green : transparent)
long_trailing_stop_line = plot(long_trailing_stop, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? long_trailing_stop > strategy.position_avg_price ? green : red : transparent)

short_run_up = currently_in_a_short_postion and bars_since_entry > 0 ? ta.lowest(low, bars_since_entry) : low
short_trailing_stop = currently_in_a_short_postion and bars_since_entry > 0 and short_run_up < short_start_trailing_val ? short_run_up + (short_run_up * trail_behind) : short_stop_loss
// short_run_up_line = plot(short_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? green : transparent)
short_trailing_stop_line = plot(short_trailing_stop, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? short_trailing_stop < strategy.position_avg_price ? green : red : transparent)


// Trade Conditions
fast_EMA_cross_down_slow_EMA = ta.crossunder(fast_EMA,slow_EMA)
fast_EMA_cross_up_slow_EMA = ta.crossover(fast_EMA,slow_EMA)
plotshape(fast_EMA_cross_down_slow_EMA ? close : na, title="Short Entry Symbol", color=red, style=shape.triangledown, location=location.belowbar)
plotshape(fast_EMA_cross_up_slow_EMA ? close : na, title="Long Entry Symbol", color=green, style=shape.triangleup, location=location.abovebar)
fast_EMA_is_above_slow_EMA = fast_EMA > slow_EMA
fast_EMA_is_below_slow_EMA = fast_EMA < slow_EMA
ema_macro_filter_longs_only = fast_EMA > ema_filter_smoothed and slow_EMA > ema_filter_smoothed
ema_macro_filter_shorts_only = fast_EMA < ema_filter_smoothed and slow_EMA < ema_filter_smoothed

long_position_take_profit = ta.cross(close, long_trailing_stop) or close > long_profit_target
short_position_take_profit = ta.cross(close, short_trailing_stop) or close > short_profit_target

long_conditions_met = enable_EMA_filter ? ema_macro_filter_longs_only and fast_EMA_cross_up_slow_EMA and fast_EMA_is_above_slow_EMA and not currently_in_a_short_postion : fast_EMA_cross_up_slow_EMA and not currently_in_a_short_postion
short_conditions_met = enable_EMA_filter ? ema_macro_filter_shorts_only and fast_EMA_cross_down_slow_EMA and fast_EMA_is_below_slow_EMA and not currently_in_a_long_postion : fast_EMA_cross_down_slow_EMA and fast_EMA_is_below_slow_EMA and not currently_in_a_long_postion

// Long Entry
strategy.entry(id="Long", direction=strategy.long, limit=limit_order_long_price, when=long_conditions_met)
strategy.cancel(id="Cancel Long", when=ta.crossover(fast_EMA,slow_EMA))
strategy.exit(id="Close Long", from_entry="Long", stop=long_trailing_stop, limit=long_profit_target, when=long_position_take_profit)

// Short Entry 
strategy.entry(id="Short", direction=strategy.short, limit=limit_order_short_price, when=short_conditions_met)
strategy.cancel(id="Cancel Short", when=ta.crossunder(fast_EMA,slow_EMA))
strategy.exit(id="Close Short", from_entry="Short", stop=short_trailing_stop, limit=short_profit_target, when=short_position_take_profit)

entry = plot(strategy.position_avg_price, editable=false, title="Entry", style=plot.style_stepline, color=currently_in_a_long_postion or currently_in_a_short_postion ? color.blue : transparent, linewidth=1)
fill(entry,long_trailing_stop_line, editable=false, color=currently_in_a_long_postion ? long_trailing_stop > strategy.position_avg_price ? light_green : light_red : transparent)
fill(entry,short_trailing_stop_line, editable=false, color=currently_in_a_short_postion ? short_trailing_stop < strategy.position_avg_price ? light_green : light_red : transparent)
//ltp = plot(currently_in_a_long_postion ? long_profit_target : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_long_postion ? green : transparent, linewidth=1)
//lsl = plot(currently_in_a_long_postion ? long_stop_loss : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_long_postion ? red : transparent, linewidth=1)
//fill(entry,ltp, color= currently_in_a_long_postion ? light_green : light_red)
//fill(entry,lsl, color= currently_in_a_long_postion ? light_red : light_green)

//stp = plot(currently_in_a_short_postion ? short_profit_target : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_short_postion ? green : transparent, linewidth=1)
//ssl = plot(currently_in_a_short_postion ? short_stop_loss : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_short_postion ? red : transparent, linewidth=1)
//fill(entry,stp, color= currently_in_a_short_postion ? light_green : light_red)
//fill(entry,ssl, color= currently_in_a_short_postion ? light_red : light_green)