EMA Mean Reversion Handelsstrategie


Erstellungsdatum: 2023-10-26 15:33:50 zuletzt geändert: 2023-10-26 15:33:50
Kopie: 2 Klicks: 1006
1
konzentrieren Sie sich auf
1617
Anhänger

EMA Mean Reversion Handelsstrategie

Überblick

Eine Handelsstrategie, bei der der Prozentsatz der Differenz zwischen dem EMA-Mittelwert und dem aktuellen Preis als Positionseingangssignal verwendet wird und die Position mit einem Stop-Loss-Tracking verwaltet wird.

Strategieprinzip

Die Strategie verwendet die EMA als Mittelwert und berechnet die prozentuale Differenz zwischen dem aktuellen Preis und der EMA. Wenn der Preis weit genug von der EMA entfernt ist (default 9%), wird eine Position eröffnet. Wenn der Preis nah genug an der EMA ist (default 1%), wird er ausgeglichen.

Insbesondere umfasst die Strategie folgende Komponenten:

  1. Berechnung der EMA-Gewinnlinie. Die Periode kann konfiguriert werden (Standard 200), die Datenquelle (Endpreis), die Berechnungsmethode (EMA, SMA, RMA, WMA).

  2. Berechnen Sie die prozentuale Differenz zwischen dem aktuellen Preis und der EMA. Achten Sie auf die Behandlung von Positiv-Negativ-Werten.

  3. Die Marge für die Über- und Off-Position beträgt 9% (konfigurierbar) und die Marge für die Leer- und Off-Position beträgt 9% (konfigurierbar).

  4. Die Anzahl der Treppen und die Stufenstufen, die für die Treppe konfiguriert werden können, werden unterstützt.

  5. Nach dem Börsengang kann ein Stop-Loss-Throughset (Standardgewinn 1%) und ein Tracking-Throughset (Standardgewinn 1%) konfiguriert werden.

  6. Nach der Differenzquote ist die Plate Position . Die Plateposition mit mehreren Positionen ist mit einer Schwelle von 1% konfigurierbar.

  7. Rücknahme eines nicht abgeschlossenen Auftrages, wenn der Preis wieder nahe der EMA ist.

  8. Konfigurierbare Stop-Loss-Prozentsätze

  9. Unterstützung für Rückmeldungen und Echtzeit-Transaktionen.

Analyse der Stärken

Diese Strategie hat folgende Vorteile:

  1. Die Trend-Trading-Theorie nutzt das Konzept der Durchschnitts-Regression, um Positionen zu eröffnen, wenn der Preis von der Durchschnittslinie abweicht, und die Rückkehr zu platzieren.

  2. Die Parameter für die Eröffnung, Beendigung und Schließung von Positionen können sorgfältig konfiguriert werden, um sie an unterschiedliche Marktbedingungen anzupassen.

  3. Das Treppenhaus ermöglicht die Errichtung von Lagerstätten in Gruppen und senkt die Einzelkosten.

  4. Der Betriebsstillstand kann die Gewinne sichern und die Risiken verwalten.

  5. Optimierungsspielräume sind groß, und es ist möglich, die Durchschnittsparameter oder die Differenz zwischen den offenen und offenen Positionen an unterschiedliche Situationen anzupassen.

  6. Unterstützt die gängige Programmiersprache Pine Script, die direkt in TradingView verwendet werden kann.

  7. Die visuelle Darstellung der Diagramme erleichtert die Beobachtung und Analyse.

Risikoanalyse

Die Strategie birgt auch folgende Risiken:

  1. Die Optimierung der Parameter kann zu stark auf die Rückmeldedaten abgestimmt sein, die Wirksamkeit der Festplatte ist zweifelhaft.

  2. Risiko eines Ausfalls der Durchschnittslinie. Der Preis kann sich langfristig stark von der Durchschnittslinie entfernen und kann nicht zurückkehren.

  3. Die Stop-Loss-Risiken werden überschritten. Die Situation ist dramatisch und die Stop-Loss-Risiken können überschritten werden.

  4. Die Transaktionen sind häufig und die Gebühren hoch.

  5. Es ist eine lange Beobachtungsphase erforderlich, und es gibt eine große Auswirkung von Unfällen.

Entsprechendes Risikomanagement:

  1. Mehrfach Parameter optimiert, um eine stabile Parameter. Mehrfach Markt-Bewertung Wirksamkeit.

  2. Die Einheitliche Linie sollte nicht zu kurz oder zu lang sein.

  3. Die Stop-Loss-Spanne soll entsprechend gelockert werden, um eine Verstoppung zu verhindern.

  4. Die Bedingungen für die Eröffnung von Positionen sollten entsprechend gelockert und die Häufigkeit des Handels reduziert werden.

  5. Das Projekt wurde in Zusammenarbeit mit der Organisation der Internationalen Katastrophenschutzorganisation (IKO) durchgeführt.

Optimierungsrichtung

Die Strategie kann in folgenden Bereichen optimiert werden:

  1. Filterbedingungen wie Handelsvolumen, Brin-Band, RSI und andere werden hinzugefügt, um falsche Signale zu reduzieren.

  2. Erhöhung der Wahrscheinlichkeit für einen positiven Handel durch die Einführung von Composite Average Lines, wie z. B. eines Dual EMA-Systems

  3. Optimierung von Stop-Loss-Strategien wie Adaptive Stop-Loss und Chandelier Exit, um das Risiko weiter zu begrenzen.

  4. Hinzugefügt wurde eine Funktion zur automatischen Parameteroptimierung, die automatisch nach besseren Parameterkombinationen sucht.

  5. Erhöhung der Wahrscheinlichkeit einer Abweichung von der Durchschnittsgrenze durch die Vorhersage durch maschinelles Lernen.

  6. Erwägen Sie, über die Zeiträume hinweg zu handeln, und nutzen Sie die Informationen über die Nacht- oder Vorplatte.

  7. Integration von Aktienpools, automatische Aktienwahl und -handel, Erweiterung der Strategie-Kapazität.

Zusammenfassen

Die EMA-Rückgangstrategie ist eine Trendverfolgungsstrategie, die auf den Merkmalen der Preis-Rückgangsgleichgewicht basiert. Sie nutzt die statistischen Eigenschaften der Gleichgewichtung, um Trendwende zu beurteilen und Risiken mit Stop-Loss zu kontrollieren. Im Vergleich zu herkömmlichen EMA-Handelsstrategien konzentriert sie sich auf die dynamische Verfolgung von Stop-Losses und nicht auf die Festplatte.

Strategiequellcode
/*backtest
start: 2022-10-19 00:00:00
end: 2023-10-25 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="EMA Mean Reversion Strategy", overlay=true, max_bars_back=5000, 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 = "    "


// Tooltips
longEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, a long postion will open."
shortEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, a short postion will open."
closeEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, open postion will close."
ladderInToolTip = "Enable this to use the laddering settings below."
cancelEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, any unfilled entries will be canceled."

// Group Titles
group_one_title = "EMA Settings"
group_two_title = "Entry Settings"


// Colors
blue = color.new(#00A5FF,0)
lightBlue = color.new(#00A5FF,90)
green = color.new(#2DBD85,0)
gray_80 =  color.new(#7F7F7F,80)
gray_60 =  color.new(#7F7F7F,60)
gray_40 =  color.new(#7F7F7F,40)
white = color.new(#ffffff,0)
red = color.new(#E02A4A,0)
transparent = color.new(#000000,100)


// Strategy Settings
EMAtimeframe = input.timeframe(defval="", title="Timeframe", group=group_one_title)
EMAlength = input.int(defval=200, minval=1, title="Length", group=group_one_title)
EMAtype = input.string(defval="EMA", options = ["EMA", "SMA", "RMA", "WMA"], title="Type", group=group_one_title)
EMAsource = input.source(defval=close, title="Source", group=group_one_title)

openLongEntryAbove = input.float(defval=9, title="Long Position Entry Trigger", tooltip=longEntryToolTip, group=group_two_title)
openEntryEntryAbove = input.float(defval=9, title="Short Position Entry Trigger", tooltip=shortEntryToolTip, group=group_two_title)
closeEntryBelow = input.float(defval=1.0, title="Close Position Trigger", tooltip=closeEntryToolTip, group=group_two_title)
cancelEntryBelow = input.float(defval=4, title="Cancel Unfilled Entries Trigger", tooltip=cancelEntryToolTip, group=group_two_title)

enableLaddering = input.bool(defval=true, title="Ladder Into Positions", tooltip=ladderInToolTip, group=group_two_title)
ladderRungs = input.int(defval=4, minval=2, maxval=4, step=1, title=indent_4+"Ladder Rungs", group=group_two_title)
ladderStep = input.float(defval=.5, title=indent_4+"Ladder Step (%)", step=.1, group=group_two_title)/100
stop_loss_val = input.float(defval=4.0, title="Stop Loss (%)", step=0.1, group=group_two_title)/100
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

// Calculate trailing stop values
long_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)
long_stop_loss = strategy.position_avg_price * (1.0 - stop_loss_val)
short_start_trailing_val = strategy.position_avg_price - (strategy.position_avg_price * start_trailing_after)
short_trail_behind_val = close + (strategy.position_avg_price * trail_behind)
short_stop_loss = strategy.position_avg_price * (1 + stop_loss_val)


// Calulate EMA
EMA = switch EMAtype
    "EMA" => ta.ema(EMAsource, EMAlength)
    "SMA" => ta.sma(EMAsource, EMAlength)
    "RMA" => ta.rma(EMAsource, EMAlength)
    "WMA" => ta.wma(EMAsource, EMAlength)
    => na
EMA_ = EMAtimeframe == timeframe.period ? EMA : request.security(syminfo.ticker, EMAtimeframe, EMA[1], lookahead = barmerge.lookahead_on)
plot(EMA_, title="EMA", linewidth=2, color=blue, editable=true)

EMA_cloud_upper_band_val = EMA_ + (EMA_ * openLongEntryAbove/100)
EMA_cloud_lower_band_val = EMA_ - (EMA_ * openLongEntryAbove/100)
EMA_cloud_upper_band = plot(EMA_cloud_upper_band_val, title="EMA Cloud Upper Band", color=blue)
EMA_cloud_lower_band = plot(EMA_cloud_lower_band_val, title="EMA Cloud Upper Band", color=blue)
fill(EMA_cloud_upper_band, EMA_cloud_lower_band, editable=false, color=lightBlue)

distance_from_EMA = ((close - EMA_)/close)*100
if distance_from_EMA < 0
    distance_from_EMA := distance_from_EMA * -1

// Calulate Ladder Entries
long_ladder_1_limit_price = close - (close * 1 * ladderStep)
long_ladder_2_limit_price = close - (close * 2 * ladderStep)
long_ladder_3_limit_price = close - (close * 3 * ladderStep)
long_ladder_4_limit_price = close - (close * 4 * ladderStep)

short_ladder_1_limit_price = close + (close * 1 * ladderStep)
short_ladder_2_limit_price = close + (close * 2 * ladderStep)
short_ladder_3_limit_price = close + (close * 3 * ladderStep)
short_ladder_4_limit_price = close + (close * 4 * ladderStep)

var position_qty = strategy.equity/close
if enableLaddering
    position_qty := (strategy.equity/close) / ladderRungs
else
    position_qty := strategy.equity/close
    
plot(position_qty, color=white)
//plot(strategy.equity, color=green)

// Entry Conditions
currently_in_a_postion = strategy.position_size != 0
currently_in_a_long_postion = strategy.position_size > 0
currently_in_a_short_postion = strategy.position_size < 0
average_price = strategy.position_avg_price

bars_since_entry = currently_in_a_postion ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) + 1 : 5
long_run_up = ta.highest(high, bar_index == 0 ? 5000: bars_since_entry)
long_run_up_line = plot(long_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? green : transparent)
start_trailing_long_entry = currently_in_a_long_postion and long_run_up > long_start_trailing_val
long_trailing_stop = start_trailing_long_entry ? long_run_up - (long_run_up * trail_behind) : long_stop_loss
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 = ta.lowest(low, bar_index == 0 ? 5000: bars_since_entry)
short_run_up_line = plot(short_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? green : transparent)
start_trailing_short_entry = currently_in_a_short_postion and short_run_up < short_start_trailing_val
short_trailing_stop = start_trailing_short_entry ? short_run_up + (short_run_up * trail_behind) : short_stop_loss
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)

long_conditions_met = distance_from_EMA > openLongEntryAbove and close < EMA_ and not currently_in_a_postion
short_conditions_met = distance_from_EMA > openEntryEntryAbove and close > EMA_ and not currently_in_a_postion
close_long_entries = distance_from_EMA <= closeEntryBelow or close <= long_trailing_stop
close_short_entries = distance_from_EMA <= closeEntryBelow or close >= short_trailing_stop
cancel_entries = distance_from_EMA <= cancelEntryBelow

plotshape(long_conditions_met ? close : na, style=shape.diamond, title="Long Conditions Met" )
plotshape(short_conditions_met ? close : na, style=shape.diamond, title="Short Conditions Met" )
plot(average_price,style=plot.style_stepline, editable=false, color=currently_in_a_postion ? blue : transparent)

// Long Entry
if enableLaddering
    if ladderRungs == 2
        strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met)
        strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met)
    else if ladderRungs == 3
        strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met)
        strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met)
        strategy.entry(id="Long Ladder 3", direction=strategy.long, qty=position_qty, limit=long_ladder_3_limit_price, when=long_conditions_met)
    else if ladderRungs == 4
        strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met)
        strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met)
        strategy.entry(id="Long Ladder 3", direction=strategy.long, qty=position_qty, limit=long_ladder_3_limit_price, when=long_conditions_met)
        strategy.entry(id="Long Ladder 4", direction=strategy.long, qty=position_qty, limit=long_ladder_4_limit_price, when=long_conditions_met)
    
    strategy.exit(id="Close Long Ladder 1", from_entry="Long Ladder 1", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries)
    strategy.exit(id="Close Long Ladder 2", from_entry="Long Ladder 2", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries)
    strategy.exit(id="Close Long Ladder 3", from_entry="Long Ladder 3", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries)
    strategy.exit(id="Close Long Ladder 4", from_entry="Long Ladder 4", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries)
    
    strategy.cancel(id="Long Ladder 1", when=cancel_entries)
    strategy.cancel(id="Long Ladder 2", when=cancel_entries)
    strategy.cancel(id="Long Ladder 3", when=cancel_entries)
    strategy.cancel(id="Long Ladder 4", when=cancel_entries)
else
    strategy.entry(id="Long", direction=strategy.long, qty=100, when=long_conditions_met)
    strategy.exit(id="Close Long", from_entry="Long", stop=long_stop_loss, limit=EMA_, when=close_long_entries)
    strategy.cancel(id="Long", when=cancel_entries)

// Short Entry
if enableLaddering
    if ladderRungs == 2
        strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met)
        strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met)
    else if ladderRungs == 3
        strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met)
        strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met)
        strategy.entry(id="Short Ladder 3", direction=strategy.short, qty=position_qty, limit=short_ladder_3_limit_price, when=short_conditions_met)
    else if ladderRungs == 4
        strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met)
        strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met)
        strategy.entry(id="Short Ladder 3", direction=strategy.short, qty=position_qty, limit=short_ladder_3_limit_price, when=short_conditions_met)
        strategy.entry(id="Short Ladder 4", direction=strategy.short, qty=position_qty, limit=short_ladder_4_limit_price, when=short_conditions_met)
    
    strategy.exit(id="Close Short Ladder 1", from_entry="Short Ladder 1", stop=short_trailing_stop, limit=EMA_, when=close_short_entries)
    strategy.exit(id="Close Short Ladder 2", from_entry="Short Ladder 2", stop=short_trailing_stop, limit=EMA_, when=close_short_entries)
    strategy.exit(id="Close Short Ladder 3", from_entry="Short Ladder 3", stop=short_trailing_stop, limit=EMA_, when=close_short_entries)
    strategy.exit(id="Close Short Ladder 4", from_entry="Short Ladder 4", stop=short_trailing_stop, limit=EMA_, when=close_short_entries)
    
    strategy.cancel(id="Short Ladder 1", when=cancel_entries)
    strategy.cancel(id="Short Ladder 2", when=cancel_entries)
    strategy.cancel(id="Short Ladder 3", when=cancel_entries)
    strategy.cancel(id="Short Ladder 4", when=cancel_entries)
else
    strategy.entry(id="Short", direction=strategy.short, when=short_conditions_met)
    strategy.exit(id="Close Short", from_entry="Short", limit=EMA_, when=close_short_entries)
    strategy.cancel(id="Short", when=cancel_entries)