Oma dan Apollo Dual Rail Trading Strategy

Penulis:ChaoZhang, Tarikh: 2023-11-02 17:09:35
Tag:

img

Ringkasan

Strategi ini menggabungkan dua penunjuk teknikal utama: penunjuk Oma dan penunjuk Apollo untuk melaksanakan perdagangan dua rel kedudukan panjang dan pendek. Idea asasnya adalah untuk mencari peluang mundur jangka pendek apabila trend jangka menengah dan panjang dinilai bullish untuk menubuhkan kedudukan panjang. Apabila trend jangka menengah dan panjang dinilai menurun, ia mencari peluang dalam pemulihan jangka pendek untuk menubuhkan kedudukan pendek.

Prinsip Strategi

Strategi ini menggunakan purata bergerak 50 hari dan 200 hari untuk menentukan trend jangka menengah dan panjang.

Seterusnya, strategi ini menggunakan penunjuk Oma untuk mencari peluang pembalikan harga jangka pendek. Penunjuk Oma merangkumi garis %K dan %D, yang merupakan hasil penunjuk RSI yang disederhanakan oleh purata bergerak mudah. Apabila %K memecahkan di bawah %D dari kawasan overbought (di atas 80), ia menunjukkan harga beralih dari keadaan overbought ke pullback ke bawah; apabila %K memecahkan di atas %D dari kawasan oversold (di bawah 20), ia menunjukkan harga melonjak kembali dari kawasan oversold, yang memberikan peluang panjang.

Selain itu, untuk menapis isyarat palsu, strategi ini juga menggabungkan penunjuk Apollo. Penunjuk Apollo memaparkan titik-titik melampau nilai %D garis K. Apabila %K membentuk tahap rendah baru, ini bermakna kekuatan rebound agak lemah. Apabila ia membentuk tahap tinggi baru, ini bermakna kekuatan rebound agak kuat. Digabungkan dengan isyarat dari penunjuk Oma, ini dapat meningkatkan lebih lanjut ketepatan kemasukan.

Secara khusus, dalam trend menaik, strategi ini akan memeriksa maklumat titik tinggi baru pada masa yang sama apabila penunjuk Oma menunjukkan peluang di bawah kawasan overbought, untuk mengesahkan kekuatan lompatan. Dalam trend penurunan, apabila penunjuk Oma menunjukkan peluang pendek melintasi dari kawasan oversold, strategi ini akan memeriksa maklumat titik rendah baru pada masa yang sama untuk mengesahkan kelemahan kekuatan lompatan.

Melalui proses di atas, strategi ini memanfaatkan sepenuhnya kekuatan penilaian trend jangka sederhana dan jangka pendek dan penunjuk pembalikan jangka pendek untuk membina sistem perdagangan dua rel yang stabil.

Kelebihan Strategi

  1. Strategi ini menggabungkan perdagangan trend dan perdagangan countertrend dengan menggunakan kedua-dua penilaian trend dan penunjuk pembalikan, membentuk kerangka perdagangan hibrid yang stabil.

  2. Dengan penapisan penunjuk berganda, nisbah isyarat palsu dapat dikurangkan dan kebolehpercayaan isyarat dapat ditingkatkan.

  3. Parameter strategi agak mudah, mudah difahami dan dioptimumkan, sesuai untuk perdagangan kuantitatif.

  4. Prestasi strategi adalah kukuh, dengan kadar kemenangan yang baik dan ciri nisbah risiko-balasan.

  5. Dengan menggunakan rel dua untuk panjang dan pendek, peluang perdagangan boleh diperoleh secara berterusan tanpa terhad kepada satu arah.

Risiko Strategi

  1. Sebagai strategi pembalikan, kerugian berturut-turut mungkin berlaku apabila trend berubah.

  2. Strategi ini memerlukan kawalan emosi yang agak tinggi dari peniaga, yang perlu menahan tahap penarikan tertentu.

  3. Sesetengah parameter seperti tempoh purata bergerak melibatkan subjektiviti tertentu dan perlu ditentukan melalui backtesting dan pengoptimuman.

  4. Kedua-dua penunjuk Oma dan Apollo mempunyai beberapa kepekaan terhadap turun naik yang tidak normal, dan mungkin gagal dalam keadaan pasaran yang melampau.

  5. Strategi ini lebih sesuai untuk pasaran turun naik yang terhad kepada julat, dan mungkin kurang berprestasi di pasaran dengan trend yang kuat.

Risiko boleh dikurangkan dengan menyesuaikan tempoh purata bergerak dengan sewajarnya untuk memperkenalkan penapisan trend, dan menambah stop loss / mengambil keuntungan.

Arahan pengoptimuman

  1. Uji kombinasi parameter yang berbeza untuk mendapatkan tetapan parameter yang lebih baik, contohnya menggunakan purata bergerak penghalusan EWMA.

  2. Tambah indikator Volume atau BV untuk menilai perbezaan yang boleh membantu mengesahkan kebolehpercayaan isyarat.

  3. Tambah indeks turun naik seperti VIX sebagai penunjuk pemantauan, untuk mengurangkan saiz kedudukan apabila pasaran panik.

  4. Mengoptimumkan strategi stop loss/take profit, seperti menggunakan stop loss ATR dinamik.

  5. Memperkenalkan algoritma pembelajaran mesin untuk mengoptimumkan tetapan parameter secara dinamik.

  6. Tambah model pelbagai faktor untuk meningkatkan kualiti isyarat.

Ringkasan

Secara keseluruhannya, ini adalah strategi perdagangan kuantitatif yang stabil dan cekap. Ia menggabungkan penilaian trend dan penunjuk pembalikan, dan menggunakan pengesahan berganda menggunakan penunjuk Oma dan Apollo, yang dapat secara berkesan mendedahkan peluang pembalikan harga jangka pendek. Berbanding dengan menggunakan sistem trend atau pembalikan semata-mata, bentuk strategi ini lebih kukuh dengan kawalan penarikan yang unggul, dan merupakan strategi perdagangan kuantitatif yang disyorkan. Sudah tentu, pengguna juga perlu menyedari risiko yang terlibat, dan menggunakan pengoptimuman parameter, berhenti kerugian / mengambil keuntungan, pengenalan rejim pasaran dll untuk mengawal risiko dan mencapai prestasi yang terbaik.


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

Lebih lanjut