Strategi dagangan dwi-landasan Ouma dan Apollo


Tarikh penciptaan: 2023-11-02 17:09:35 Akhirnya diubah suai: 2023-11-02 17:09:35
Salin: 3 Bilangan klik: 398
1
fokus pada
1166
Pengikut

Strategi dagangan dwi-landasan Ouma dan Apollo

Gambaran keseluruhan

Strategi ini menggabungkan Indeks Omaha dan Indeks Apollo, dua petunjuk teknologi utama, untuk mencapai perdagangan dua hala. Idealnya adalah untuk mencari peluang masuk harga garis pendek apabila trend garis panjang tengah dinilai sebagai bermulut dan membina bermulut.

Prinsip Strategi

Strategi ini menggunakan dua purata bergerak pada 50 dan 200 hari untuk menilai trend garis panjang tengah, dengan garis 50 di atas garis 200 hari menunjukkan trend multihead, sebaliknya, trend kepala kosong.

Kemudian, strategi ini menggunakan Indeks Omma untuk mencari peluang untuk membalikkan harga garis pendek. Indeks Omma terdiri daripada garis% K dan garis% D, yang masing-masing adalah hasil daripada RSI yang diproses dengan rata-rata purata bergerak sederhana. Apabila garis% K turun dari kawasan overbought (di atas 80) dan menembusi garis% D, menunjukkan bahawa harga beralih dari keadaan overbought ke penurunan rebound, adalah peluang pilihan kosong; apabila% K naik dari kawasan overbought (di bawah 20) dan menembusi garis% D, menunjukkan bahawa harga bangkit dari kawasan oversold, adalah peluang pilihan pelbagai.

Di samping itu, untuk menyaring lebih jauh peluang untuk melaporkan kesilapan, strategi ini juga memperkenalkan penunjuk Apollo. Penunjuk Apollo memaparkan maklumat mengenai titik-titik yang paling tinggi bagi nilai K-garis% D. Apabila K-garis% membentuk titik rendah baru, ini bermakna daya balas yang lebih lemah; apabila titik tinggi baru terbentuk, ini bermakna daya balas yang lebih kuat.

Khususnya, dalam tren multihead, strategi ini akan memeriksa maklumat titik tinggi baru untuk mengesahkan kekuatan bouncing apabila penunjuk Omma menunjukkan peluang teratas di bawah kawasan jual beli, dan memeriksa maklumat titik rendah baru untuk mengesahkan kekuatan bouncing apabila penunjuk Omma menunjukkan peluang teratas di atas kawasan beli.

Melalui proses yang dinyatakan di atas, strategi ini memanfaatkan keunggulan penilaian trend garis panjang dan garis pendek dan membina sistem perdagangan dua hala yang stabil.

Kelebihan Strategik

  1. Strategi ini menggabungkan penghakiman trend dan penunjuk pembalikan, menggabungkan kelebihan perdagangan trend dan perdagangan berlawanan arah, membentuk kerangka perdagangan campuran yang stabil.

  2. Dengan penapisan dua kali ganda, anda boleh mengurangkan kadar laporan palsu dan meningkatkan kebolehpercayaan isyarat.

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

  4. Strategi ini berjalan dengan baik dan mempunyai ciri-ciri kemenangan dan keuntungan yang lebih baik.

  5. Menggunakan kaedah dua hala, peluang untuk berdagang berterusan dan tidak terhad kepada satu arah.

Risiko Strategik

  1. Sebagai strategi yang bertukar arah, apabila trend berubah, ia boleh menyebabkan kerugian berturut-turut.

  2. Strategi ini memerlukan kawalan emosi yang tinggi dari peniaga dan memerlukan peratusan penarikan balik.

  3. Sesetengah parameter seperti kitaran purata bergerak mempunyai subjektiviti tertentu, dan parameter yang sesuai perlu ditentukan melalui pengoptimuman pengulangan.

  4. Indeks Oma dan Apollo mempunyai sensitiviti terhadap turun naik yang tidak normal, dan dalam keadaan yang melampau, ia mungkin tidak berfungsi.

  5. Strategi ini lebih sesuai untuk keadaan pasaran yang tidak menentu, dan kesannya mungkin dikurangkan dalam keadaan yang jelas.

Untuk mengelakkan risiko, penapis trend boleh diperkenalkan dengan menyesuaikan kitaran purata bergerak dengan betul, dan strategi berhenti berhenti boleh dimasukkan. Apabila pasaran memasuki trend yang jelas, anda boleh mempertimbangkan untuk menangguhkan strategi dan mengelakkan perdagangan dalam keadaan tersebut.

Arah pengoptimuman strategi

  1. Uji kombinasi parameter yang berbeza untuk mendapatkan tetapan parameter yang lebih baik. Sebagai contoh, anda boleh mencuba menggunakan petunjuk seperti purata bergerak EWMA yang lancar.

  2. Menambah petunjuk seperti Volume atau BV untuk menilai penyimpangan, dapat mengesahkan kebolehpercayaan isyarat lebih lanjut.

  3. Menambah indeks panik seperti VIX sebagai penunjuk pemantauan untuk menurunkan kedudukan ketika pasaran panik.

  4. Mengoptimumkan strategi hentian hentian, seperti hentian dinamik seperti hentian ATR.

  5. Masukkan algoritma pembelajaran mesin untuk mengoptimumkan parameter secara dinamik.

  6. Menambahkan model pelbagai faktor untuk meningkatkan kualiti isyarat.

ringkaskan

Strategi ini secara keseluruhannya adalah strategi perdagangan kuantitatif yang stabil dan cekap. Ia menggabungkan penilaian trend dan indikator pembalikan, menggunakan kaedah double-verifikasi Indeks Omaha dan Indeks Apollo, yang dapat mengesan peluang pembalikan harga garis pendek dengan berkesan. Berbanding dengan penggunaan sistem trend atau sistem pembalikan sahaja, bentuk strategi ini lebih mantap, kawalan penarikan balik juga lebih baik, merupakan strategi perdagangan kuantitatif yang disyorkan.

Kod sumber strategi
/*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)