Doppelgleisige Handelsstrategie von Ouma und Apollo


Erstellungsdatum: 2023-11-02 17:09:35 zuletzt geändert: 2023-11-02 17:09:35
Kopie: 3 Klicks: 678
1
konzentrieren Sie sich auf
1617
Anhänger

Doppelgleisige Handelsstrategie von Ouma und Apollo

Überblick

Die Strategie kombiniert die beiden Mainstream-Technologie-Indikatoren, den Omaha- und den Apollo-Index, um einen Multi-Hochspiel-Trading zu realisieren. Die Grundidee besteht darin, nach Kurzstrecken-Preisrückschlag-Eintrittschancen zu suchen, wenn der mittlere Langstrecken-Trend als hoch beurteilt wird, und nach Kurzstrecken-Preisrückschlag-Eintrittschancen, wenn der mittlere Langstrecken-Trend als niedrig beurteilt wird.

Strategieprinzip

Die Strategie nutzt zwei bewegliche Durchschnitte, 50 und 200 Tage, um den mittleren langen Trend zu beurteilen. Die 50-Tage-Linie über der 200-Tage-Linie zeigt einen Mehrkopf-Trend an, umgekehrt einen Hohlkopf-Trend.

Die Strategie nutzt dann den OMA-Indikator, um die Gelegenheit für einen kurzen Kurswechsel zu finden. Der OMA-Indikator besteht aus der %K-Linie und der %D-Linie, die jeweils das Ergebnis eines RSI-Indikators sind, das durch eine einfache Moving-Average-Gleichbehandlung behandelt wurde. Wenn die %K-Linie von der Überverkaufszone (<80) abwärts die %D-Linie durchbricht, ist dies eine leere Auswahl; wenn die %K-Linie von der Überverkaufszone (<20) aufwärts die %D-Linie durchbricht, ist dies eine mehrere Auswahl.

Zusätzlich wurde der Apollo-Index eingeführt, um die Möglichkeit von Fehlmeldungen weiter zu filtern. Der Apollo-Index zeigt die Information über die K-Linie%D-Werte an den äußersten Punkten. Wenn eine neue %K-Linie entsteht, bedeutet dies eine schwache Rebound-Fähigkeit; wenn eine neue Höhe entsteht, bedeutet dies eine starke Rebound-Fähigkeit.

In einem mehrköpfigen Trend wird die Strategie die neue Höchstinformation überprüfen, um die Stärke der Reaktion zu bestätigen, wenn der Oma-Indikator unter der Überverkaufszone eine mehrköpfige Chance auftritt. In einem Luftkopftrend wird die Strategie die neue Tiefpunktinformation überprüfen, um die Schwächung der Reaktion zu bestätigen, wenn der Oma-Indikator über der Überkaufszone eine Luftkopfmöglichkeit auftritt.

Durch den oben beschriebenen Prozess nutzt die Strategie die Vorteile der mittleren und langen Trendentscheidung und der kurzen Umkehrung, um ein stabiles, mehrspuriges, zweigleisiges Handelssystem aufzubauen.

Strategische Vorteile

  1. Diese Strategie kombiniert Trendbeurteilung und Umkehrungskennzahlen, um die Vorteile von Trend- und Gegenhandel zu kombinieren und einen stabilen Mixed-Trading-Rahmen zu bilden.

  2. Durch die Doppel-Indikator-Filterung kann die Falschmeldungsrate reduziert und die Signalzuverlässigkeit erhöht werden.

  3. Die Strategieparameter sind relativ einfach, leicht zu verstehen und zu optimieren und eignen sich für die Quantifizierung von Geschäften.

  4. Die Strategie funktioniert stabil und hat eine gute Gewinn- und Verlustquote.

  5. Mit dem Mehrfach-Doppelbahn-Methode können kontinuierliche Handelsmöglichkeiten erzielt werden, die nicht auf eine einzelne Richtung beschränkt sind.

Strategisches Risiko

  1. Als Strategie der Umkehrung kann es zu einer Reihe von Verlusten kommen, wenn sich der Trend ändert.

  2. Die Strategie erfordert eine hohe Emotionskontrolle der Händler und erfordert eine gewisse Rücknahmequote.

  3. Einige Parameter wie die Periodizität des Moving Averages sind etwas subjektiv und müssen durch Rückmeldung optimiert werden, um die richtigen Parameter zu bestimmen.

  4. Der Omega- und der Apollo-Index sind anfällig für außergewöhnliche Schwankungen und können unter extremen Umständen ausfallen.

  5. Diese Strategie ist besser geeignet für ein unbeständiges Marktumfeld und kann bei einem offensichtlichen Trend abgeschrieben werden.

Die Einführung von Trendfiltern und die Aufnahme von Stop-Loss-Stopp-Strategien kann Risiken vermeiden, indem die Bewegung der Durchschnittszyklen entsprechend angepasst wird. Wenn der Markt in eine offensichtliche Tendenz eintritt, kann eine Pause der Strategie in Betracht gezogen werden, um den Handel in dieser Umgebung zu vermeiden.

Richtung der Strategieoptimierung

  1. Versuchen Sie, verschiedene Kombinationen von Parametern zu testen, um eine bessere Parameter-Einstellung zu erhalten. Zum Beispiel können Sie mit EWMA-Glatten Moving Averages und anderen Indikatoren versuchen.

  2. Das Hinzufügen von Indikatoren wie Volumen oder BV zur Beurteilung von Abweichungen kann die Signalsicherheit weiter überprüfen.

  3. Die Einführung von Panik-Indizes wie VIX als Überwachungsindikatoren, um die Positionen in Zeiten von Panik zu senken.

  4. Optimierung der Stop-Loss-Strategie, z. B. durch dynamische Stop-Loss-Methoden wie ATR-Stopp.

  5. Einführung von Machine Learning-Algorithmen zur dynamischen Optimierung der Parameter-Einstellungen.

  6. Mehrfaktormodelle zur Verbesserung der Signalqualität.

Zusammenfassen

Die Strategie ist insgesamt eine stabile und effiziente quantitative Handelsstrategie. Sie kombiniert Trendbeurteilung und Umkehrindikatoren mit doppelter Verifizierung des Oma- und Apollo-Indikators, um die kurzfristigen Preisumkehrmöglichkeiten effektiv zu entdecken. Die Strategie ist robuster und mit besserer Rücknahmekontrolle als die Verwendung eines Trendsystems oder Umkehrsystems.

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