Oma dan Apollo Dual Rail Trading Strategy

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

img

Gambaran umum

Strategi ini menggabungkan dua indikator teknis utama: indikator Oma dan indikator Apollo untuk menerapkan perdagangan dual-rail posisi panjang dan pendek. Ide dasarnya adalah untuk menemukan peluang pullback jangka pendek ketika tren jangka menengah-panjang dinilai bullish untuk menetapkan posisi panjang. Ketika tren jangka menengah-panjang dinilai menurun, ia mencari peluang dalam rebound jangka pendek untuk menetapkan posisi pendek.

Prinsip Strategi

Strategi ini menggunakan rata-rata bergerak 50 hari dan 200 hari untuk menentukan tren jangka menengah dan panjang.

Selanjutnya, strategi menggunakan indikator Oma untuk menemukan peluang pembalikan harga jangka pendek. Indikator Oma mencakup garis %K dan %D, yang merupakan hasil dari indikator RSI yang dihaluskan oleh rata-rata bergerak sederhana. Ketika %K menembus di bawah %D dari area overbought (di atas 80), ini menunjukkan harga berubah dari keadaan overbought ke pullback down; ketika %K menembus di atas %D dari area oversold (di bawah 20), ini menunjukkan harga bangkit kembali dari area oversold, yang menyajikan peluang panjang.

Selain itu, untuk lebih menyaring sinyal palsu, strategi ini juga menggabungkan indikator Apollo. Indikator Apollo menampilkan titik ekstrem dari nilai %D dari garis K. Ketika %K membentuk titik rendah baru, itu berarti kekuatan rebound relatif lemah. Ketika membentuk titik tinggi baru, itu berarti kekuatan rebound relatif kuat. Dikombinasikan dengan sinyal dari indikator Oma, ini dapat lebih meningkatkan akurasi masuk.

Secara khusus, dalam tren naik, strategi ini akan memeriksa informasi titik tinggi baru pada saat yang sama ketika indikator Oma menunjukkan peluang di bawah area overbought, untuk mengkonfirmasi kekuatan bounce.

Melalui proses di atas, strategi ini memanfaatkan sepenuhnya kekuatan penilaian tren jangka menengah dan jangka panjang dan indikator pembalikan jangka pendek untuk membangun sistem perdagangan dual-rail yang stabil.

Keuntungan dari Strategi

  1. Strategi ini menggabungkan perdagangan tren dan perdagangan kontra-tren dengan menggunakan penilaian tren dan indikator pembalikan, membentuk kerangka perdagangan hibrida yang stabil.

  2. Dengan penyaringan indikator ganda, rasio sinyal palsu dapat dikurangi dan keandalan sinyal ditingkatkan.

  3. Parameter strategi relatif sederhana, mudah dimengerti dan dioptimalkan, cocok untuk perdagangan kuantitatif.

  4. Kinerja strategi ini kuat, dengan tingkat kemenangan yang baik dan karakteristik rasio risiko-manfaat.

  5. Dengan mengadopsi rel ganda untuk panjang dan pendek, peluang perdagangan dapat diperoleh terus-menerus tanpa terbatas pada satu arah.

Risiko dari Strategi

  1. Sebagai strategi pembalikan, kerugian berturut-turut dapat terjadi ketika tren berubah.

  2. Strategi ini membutuhkan kontrol emosional yang relatif tinggi dari pedagang, yang perlu menahan tingkat penarikan tertentu.

  3. Beberapa parameter seperti periode rata-rata bergerak melibatkan subjektivitas tertentu dan perlu ditentukan melalui backtesting dan optimalisasi.

  4. Kedua indikator Oma dan Apollo memiliki beberapa sensitivitas terhadap fluktuasi abnormal, dan mungkin gagal dalam kondisi pasar yang ekstrim.

  5. Strategi ini lebih cocok untuk pasar volatile range-bound, dan mungkin berkinerja buruk di pasar dengan tren yang kuat.

Risiko dapat dikurangi dengan menyesuaikan periode rata-rata bergerak dengan tepat untuk memperkenalkan penyaringan tren, dan menambahkan stop loss/take profit.

Arahan Optimasi

  1. Uji kombinasi parameter yang berbeda untuk mendapatkan pengaturan parameter yang lebih baik, misalnya dengan menggunakan rata-rata bergerak perataan EWMA.

  2. Tambahkan indikator Volume atau BV untuk menilai perbedaan yang dapat membantu memverifikasi keandalan sinyal.

  3. Tambahkan indeks volatilitas seperti VIX sebagai indikator pemantauan, untuk mengurangi ukuran posisi ketika pasar panik.

  4. Mengoptimalkan strategi stop loss/take profit, seperti mengadopsi stop loss ATR dinamis.

  5. Memperkenalkan algoritma pembelajaran mesin untuk mengoptimalkan pengaturan parameter secara dinamis.

  6. Tambahkan model multifaktor untuk meningkatkan kualitas sinyal.

Ringkasan

Secara keseluruhan, ini adalah strategi perdagangan kuantitatif yang stabil dan efisien. Ini menggabungkan penilaian tren dan indikator pembalikan, dan mengadopsi verifikasi ganda menggunakan indikator Oma dan Apollo, yang dapat secara efektif mengungkap peluang pembalikan harga jangka pendek. Dibandingkan dengan menggunakan sistem tren atau pembalikan murni, bentuk strategi ini lebih kuat dengan kontrol penarikan yang unggul, dan merupakan strategi perdagangan kuantitatif yang direkomendasikan. Tentu saja, pengguna juga perlu menyadari risiko yang terlibat, dan menggunakan optimasi parameter, stop loss / take profit, identifikasi rezim pasar, dll untuk mengendalikan risiko dan mencapai kinerja 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 banyak