Oma und Apollo Dual Rail Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-11-02 17:09:35
Tags:

img

Übersicht

Diese Strategie kombiniert zwei Hauptströmungstechnische Indikatoren: den Oma-Indikator und den Apollo-Indikator, um den Dual-Rail-Handel von Long- und Short-Positionen umzusetzen. Seine grundlegende Idee ist es, kurzfristige Pullback-Möglichkeiten zu finden, wenn der mittelfristige langfristige Trend als bullisch beurteilt wird, um Long-Positionen zu etablieren.

Strategieprinzip

Diese Strategie verwendet 50-Tage- und 200-Tage- gleitende Durchschnitte, um den mittelfristigen Trend zu bestimmen.

Als nächstes verwendet die Strategie den Oma-Indikator, um kurzfristige Preisumkehrmöglichkeiten zu lokalisieren. Der Oma-Indikator umfasst %K und %D-Linien, die die Ergebnisse des RSI-Indikators sind, die durch einen einfachen gleitenden Durchschnitt glättet werden. Wenn %K unter %D aus dem überkauften Bereich (über 80) bricht, zeigt dies an, dass sich der Preis von einem überkauften Zustand in einen Rückschritt hinunter dreht; wenn %K über %D aus dem überverkauften Bereich (unter 20) bricht, zeigt dies an, dass der Preis aus dem überverkauften Bereich wieder aufsteigt, was eine lange Gelegenheit darstellt.

Zusätzlich enthält diese Strategie auch den Apollo-Indikator, um falsche Signale weiter zu filtern. Der Apollo-Indikator zeigt die Extrempunkte der %D-Werte der K-Linie an. Wenn %K ein neues Tief bildet, bedeutet dies, dass die Rebound-Stärke relativ schwach ist. Wenn es ein neues Hoch bildet, bedeutet dies, dass die Rebound-Stärke relativ stark ist. Kombiniert mit den Signalen des Oma-Indikators kann dies die Eingangsgenauigkeit weiter verbessern.

Insbesondere bei einem Aufwärtstrend wird diese Strategie die neuen High-Point-Informationen zur gleichen Zeit überprüfen, wenn der Oma-Indikator eine Gelegenheit unterhalb des überkauften Bereichs zeigt, um die Stärke des Bounces zu bestätigen.

Durch den vorstehenden Prozess nutzt diese Strategie die Stärken der mittelfristigen und langfristigen Trendbeurteilung und der kurzfristigen Umkehrindikatoren voll aus, um ein stabiles Doppelschienenhandelssystem aufzubauen.

Vorteile der Strategie

  1. Die Strategie kombiniert Trendhandel und Countertrendhandel, indem sowohl Trendbeurteilung als auch Umkehrindikatoren verwendet werden, um einen stabilen hybriden Handelsrahmen zu bilden.

  2. Durch doppelte Indikatorfilterung kann das falsche Signalverhältnis reduziert und die Zuverlässigkeit der Signale verbessert werden.

  3. Die Strategieparameter sind relativ einfach, leicht zu verstehen und zu optimieren, geeignet für den quantitativen Handel.

  4. Die Ergebnisse der Strategie sind robust, mit einer guten Gewinnrate und einem guten Risiko-Rendite-Verhältnis.

  5. Durch die Einführung von Doppelschienen für lange und kurze Bahnen können Handelsmöglichkeiten kontinuierlich generiert werden, ohne sich auf eine einzige Richtung zu beschränken.

Risiken der Strategie

  1. Als Umkehrstrategie kann es zu aufeinanderfolgenden Verlusten kommen, wenn sich der Trend ändert.

  2. Die Strategie erfordert eine relativ hohe emotionale Kontrolle durch den Händler, der einem gewissen Maß an Abzug standhalten muss.

  3. Einige Parameter wie beispielsweise gleitende Durchschnittsperioden beinhalten eine gewisse Subjektivität und müssen durch Backtesting und Optimierung ermittelt werden.

  4. Sowohl die Oma- als auch die Apollo-Indikatoren sind anfällig für abnormale Schwankungen und können unter extremen Marktbedingungen ausfallen.

  5. Diese Strategie eignet sich besser für volatile Märkte mit Bandbreite und kann bei stark trendigen Märkten unterdurchschnittlich abschneiden.

Die Risiken können gemildert werden, indem der gleitende Durchschnittszeitraum angemessen angepasst wird, um eine Trendfilterung einzuführen, und Stop-Loss/Take-Profit hinzugefügt wird.

Optimierungsrichtlinien

  1. Versuche verschiedene Parameterkombinationen, um bessere Parametereinstellungen zu erhalten, z. B. mit Hilfe von EWMA-Gleichungs- gleitenden Durchschnitten.

  2. Zusätzliche Volumen- oder BV-Indikatoren zur Beurteilung der Abweichung, die zur Überprüfung der Signalzuverlässigkeit beitragen können.

  3. Fügen Sie Volatilitätsindizes wie VIX als Überwachungsindikatoren hinzu, um die Positionsgröße zu reduzieren, wenn der Markt in Panik gerät.

  4. Optimierung von Stop-Loss-/Take-Profit-Strategien, z. B. Einführung dynamischer ATR-Stop-Loss-Systeme.

  5. Einführung von Algorithmen für maschinelles Lernen zur dynamischen Optimierung der Parameter-Einstellungen.

  6. Hinzufügen von Multifaktormodellen zur Verbesserung der Signalqualität.

Zusammenfassung

Insgesamt handelt es sich um eine stabile und effiziente quantitative Handelsstrategie. Sie kombiniert Trendbeurteilung und Umkehrindikatoren und übernimmt eine doppelte Verifizierung mit den Oma- und Apollo-Indikatoren, die kurzfristige Preisumkehrmöglichkeiten effektiv aufdecken können. Im Vergleich zu reinen Trend- oder Umkehrsystemen ist diese Strategieform robuster mit einer überlegenen Zugriffskontrolle und ist eine empfohlene quantitative Handelsstrategie. Natürlich müssen sich die Benutzer auch der damit verbundenen Risiken bewusst sein und Parameteroptimierung, Stop-Loss/Take-Profit, Marktregiedidentifikation usw. verwenden, um Risiken zu kontrollieren und die beste Performance zu erzielen.


/*backtest
start: 2023-10-25 00:00:00
end: 2023-10-28 00:00:00
period: 5m
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("2 EMA + Stoch RSI + ATR [Pt]", shorttitle = "2EMA+Stoch+ATR", 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)

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

group_ema = "EMA"
group_stoch = "Stochastic RSI"
group_atr = "ATR Stoploss Finder"

// ----------------------------------------- 2 EMA -------------------------------------

ema1_len = input.int(50, "EMA Length 1", group = group_ema)
ema2_len = input.int(200, "EMA Length 2", group = group_ema)

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

plot(ema1, "ema1", color.white, linewidth = 2)
plot(ema2, "ema2", color.orange, linewidth = 2)

ema_bull = ema1 > ema2
ema_bear = ema1 < ema2


// -------------------------------------- Stochastic RSI -----------------------------

smoothK = input.int(3, "K", minval=1, group = group_stoch)
smoothD = input.int(3, "D", minval=1, group = group_stoch)
lengthRSI = input.int(14, "RSI Length", minval=1, group = group_stoch)
lengthStoch = input.int(14, "Stochastic Length", minval=1, group = group_stoch)
src = close
rsi1 = ta.rsi(src, lengthRSI)
k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ta.sma(k, smoothD)

var trigger_stoch_OB = k > 80
var trigger_stoch_OS = k < 20

stoch_crossdown = ta.crossunder(k, d)
stoch_crossup = ta.crossover(k, d)

P_hi = ta.pivothigh(k,1,1)
P_lo = ta.pivotlow(k,1,1)

previous_high = ta.valuewhen(P_hi, k, 1)
previous_low = ta.valuewhen(P_lo, k, 1)
recent_high = ta.valuewhen(P_hi, k, 0)
recent_low = ta.valuewhen(P_lo, k, 0)

// --------------------------------------- ATR stop loss finder ------------------------

length = input.int(title='Length', defval=14, minval=1, group = group_atr)
smoothing = input.string(title='Smoothing', defval='EMA', options=['RMA', 'SMA', 'EMA', 'WMA'], group = group_atr)
m = input.float(0.7, 'Multiplier', step = 0.1, group = group_atr)
src1 = input(high, "Source for upper band", group = group_atr)
src2 = input(low, "Source for lower band", group = group_atr)

showatr = input.bool(true, 'Show ATR Bands', group = group_atr)
collong = input.color(color.purple, 'Long ATR SL', inline='1', group = group_atr)
colshort = input.color(color.purple, 'Short ATR SL', inline='2', group = group_atr)

ma_function(source, length) =>
    if smoothing == 'RMA'
        ta.rma(source, length)
    else
        if smoothing == 'SMA'
            ta.sma(source, length)
        else
            if smoothing == 'EMA'
                ta.ema(source, length)
            else
                ta.wma(source, length)

a = ma_function(ta.tr(true), length) * m
up = ma_function(ta.tr(true), length) * m + src1
down = src2 - ma_function(ta.tr(true), length) * m

p1 = plot(showatr ? up : na, title='ATR Short Stop Loss', color=colshort)
p2 = plot(showatr ? down : na, title='ATR Long Stop Loss', color=collong)

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

RR = input.float(2.0, "Reward to Risk ratio (X times SL)", step = 0.1, group = "Profit Target")

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

BSLE = ta.barssince(strategy.opentrades.entry_bar_index(0) == bar_index)

if strategy.position_size > 0 and BSLE == 1
    L_PT := close + (close-down)*RR
    L_SL := L_SL[1]
    S_PT := close - (up - close)*RR
    S_SL := up
else if strategy.position_size < 0 and BSLE == 1
    S_PT := close - (up - close)*RR
    S_SL := S_SL[1]
    L_PT := close + (close-down)*RR
    L_SL := down
else if strategy.position_size != 0
    L_PT := L_PT[1] 
    S_PT := S_PT[1]
else
    L_PT := close + (close-down)*RR
    L_SL := down
    S_PT := close - (up - close)*RR
    S_SL := up

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

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

L_SL_line = plot(strategy.position_size > 0 and BSLE > 0 ? L_SL : na, "L SL", color.red, linewidth = 2, style = plot.style_linebr)
S_SL_line = plot(strategy.position_size < 0 and BSLE > 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 ------------------------------------------------------

var L_entry_trigger1 = false
var S_entry_trigger1 = false

L_entry_trigger1 := ema_bull and close < ema1 and k < 20 and strategy.position_size == 0
S_entry_trigger1 := ema_bear and close > ema1 and k > 80 and strategy.position_size == 0

L_entry1 = L_entry_trigger1[1] and stoch_crossup and recent_low > previous_low
S_entry1 = S_entry_trigger1[1] and stoch_crossdown and recent_high < previous_high

//debugging
plot(L_entry_trigger1[1]?1:0, "L Entry Trigger")
plot(stoch_crossup?1:0, "Stoch Cross Up")
plot(recent_low > previous_low?1:0, "Higher low")

plot(S_entry_trigger1[1]?1:0, "S Entry Trigger")
plot(stoch_crossdown?1:0, "Stoch Cross down")
plot(recent_high < previous_high?1:0, "Lower high")

if L_entry1
    strategy.entry("Long", strategy.long)

if S_entry1
    strategy.entry("Short", strategy.short)

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")

//resetting triggers
L_entry_trigger1 := L_entry_trigger1[1] ? L_entry1 or ema_bear or S_entry1 ? false : true : L_entry_trigger1
S_entry_trigger1 := S_entry_trigger1[1] ? S_entry1 or ema_bull or L_entry1 ? false : true : S_entry_trigger1

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

Mehr