Strategi perdagangan lintas rata-rata bergerak dinamis

Penulis:ChaoZhang, Tanggal: 2023-11-13 10:27:54
Tag:

img

Gambaran umum

Ide utama dari strategi ini adalah untuk membangun beberapa moving average berdasarkan indikator Ratio OCHL Averager dari jangka waktu yang berbeda dan menghasilkan sinyal perdagangan berdasarkan crossover.

Logika Strategi

Strategi ini menggunakan dua indikator Ratio OCHL Averager dengan kerangka waktu yang berbeda sebagai garis cepat dan lambat.

b = abs(close-open)/(high - low)
c = min(max(b, 0), 1)  
Ratio OCHL Averager = c*close + (1-c)*previous Ratio OCHL Averager

Di sini b mewakili rasio pergerakan harga intraday dan c adalah rata-rata b. Ratio OCHL Averager menggabungkan harga terbuka, tutup, tinggi dan rendah untuk membangun rata-rata bergerak.

Strategi ini menetapkan periode yang lebih pendek untuk garis cepat dan periode yang lebih lama untuk garis lambat. Sinyal beli dihasilkan ketika garis cepat melintasi di atas garis lambat, dan sinyal jual ketika garis cepat melintasi di bawah.

Keuntungan

  1. Ratio OCHL Averager meratakan data harga dan menyaring kebisingan pasar, membuat sinyal perdagangan lebih dapat diandalkan.

  2. Crossover rata-rata bergerak ganda dikombinasikan dengan kerangka waktu yang berbeda dapat mendeteksi awal tren baru dengan lebih baik.

  3. Periode jalur cepat dan lambat dapat disesuaikan dengan kondisi pasar yang berbeda.

  4. Logika strategi sederhana dan intuitif, mudah dimengerti dan diterapkan.

  5. Stop loss dan take profit dapat diatur secara fleksibel untuk mengendalikan risiko.

Risiko

  1. Crossover rata-rata bergerak dapat menghasilkan sinyal palsu yang berlebihan. indikator teknis lainnya mungkin diperlukan untuk penyaringan.

  2. Periode jalur cepat dan lambat harus dipilih dengan wajar, jika tidak, hal itu dapat mempengaruhi kinerja strategi.

  3. Ini adalah tren mengikuti strategi tidak cocok untuk pasar rentang terikat.

  4. Stop loss dan take profit harus disesuaikan dengan baik untuk mengurangi kerugian dan mengoptimalkan tingkat keuntungan.

Arahan Optimasi

  1. Pertimbangkan untuk menggabungkan indikator momentum seperti MACD, KDJ untuk penyaringan sinyal dan peningkatan kualitas.

  2. Uji kombinasi periode garis cepat dan lambat yang berbeda untuk menemukan parameter yang optimal.

  3. Mengoptimalkan stop loss dan mengambil keuntungan berdasarkan hasil backtest.

  4. Pertimbangkan untuk menyesuaikan parameter secara dinamis dalam kondisi pasar tertentu, misalnya, meningkatkan periode di pasar yang terikat kisaran.

Kesimpulan

Strategi ini memiliki logika yang jelas menggunakan crossover rata-rata bergerak cepat dan lambat untuk menentukan arah tren. Ini adalah strategi tren berikut yang dinamis yang cocok untuk perdagangan jangka menengah. Masih ada banyak ruang untuk optimasi dengan penyesuaian parameter, penyaringan sinyal dll. Secara keseluruhan ini adalah strategi perdagangan tren yang fleksibel dan praktis.


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="[XC] Adaptive Strategy V3 - Ratio OCHL Averager no repaint",shorttitle="R_OHCL", overlay=true, currency=currency.EUR,initial_capital=10000,
     default_qty_value=100, default_qty_type=strategy.percent_of_equity , calc_on_every_tick=false, calc_on_order_fills=true)


//                  ╔═ SETTINGS                  ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

strategy_1     = input ( defval=true   , type=input.bool    , title="STRATEGY 1? —>"      )
Recursive      = input(false)
RES201         = "Min",RES202= "D",RES203 = "W",RES204 = "M"

//++ Resolution 1 ++
inp_resolution1 = input(600, minval=1, title="Resolution Line 1")
restype1        = input ( defval="Min"  , type=input.string , title= "Resolution Line 1" , options=[ "Min","D","W","M"])
multiplier1     = restype1 == "Min" ? "" : restype1 == "D" ? "D" : restype1 == "W" ? "W" : "M"
resolution1     = tostring(inp_resolution1)+ multiplier1

//++ Resolution 2 ++
inp_resolution2 = input(1440, minval=1, title="Resolution Line 2")
restype2        = input ( defval="Min"  , type=input.string , title= "Resolution Line 2" , options=["Min","D","W","M"])
multiplier2     = restype2 == "Min" ? "" : restype2 == "D" ? "D" : restype2 == "W" ? "W" : "M"
resolution2     = tostring(inp_resolution2)+ multiplier2

StopLoss        = input(defval = 500 , title = "Stop Loss", minval = 0)
TakeProfit      = input(defval = 2500 , title = "Take Profit", minval = 0)
// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = TakeProfit  >= 1 ? TakeProfit  : na
useStopLoss     = StopLoss    >= 1 ? StopLoss    : na


//                  ╔═ BACKTEST RANGE            ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
line_breakBTR  = input ( defval = true   , type=input.bool   , title="BACKTEST RANGE —"      ) 
FromYear       = input ( defval = 2019, title = "From Year", minval = 2017)
FromMonth      = input ( defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay        = input ( defval = 2, title = "From Day", minval = 1, maxval = 31)
//FromHour     = input ( defval = 1, title = "From Hour", minval = 1, maxval = 24)
ToYear         = input ( defval = 9999, title = "To Year", minval = 2017)
//ToHour       = input ( defval = 0, title = "From Hour", minval = 0, maxval = 24)
ToMonth        = input ( defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay          = input ( defval = 1, title = "To Day", minval = 1, maxval = 31)

// === FUNCTION EXAMPLE ===
start     = timestamp(syminfo.timezone, FromYear, FromMonth, FromDay, 0, 00)  // backtest start window
finish    = timestamp(syminfo.timezone, ToYear  , ToMonth  , ToDay  , 0, 59)  // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

//                  ╔═ INDICATOR                 ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

// "Ratio OCHL Averager" -> alexgrover / tradingview.com/script/RGAtOI6h-Ratio-OCHL-Averager-An-Alternative-to-VWAP/

rochla( res,Recursive)=>
    //Recursive = false
    H =  security(syminfo.tickerid,res,high[1],gaps = barmerge.gaps_off,  lookahead = barmerge.lookahead_on)
    L =  security(syminfo.tickerid,res,low[1] ,gaps = barmerge.gaps_off,  lookahead = barmerge.lookahead_on)
    d = 0.
    //----
    a = Recursive ? nz(d[1],open) : open
    b = abs(close-a)/(H - L)
    c = b > 1 ? 1 : b
    d := c*close+(1-c)*nz(d[1],close)



strat1_line1=rochla(resolution1,Recursive)
strat1_line2=rochla(resolution2,Recursive)

plot(strat1_line1, title="Ratio OCHL Averager 1", color=#DAA520,linewidth=2,transp=0)
plot(strat1_line2, title="Ratio OCHL Averager 2", color=#B22222,linewidth=2,transp=0)



//                  ╔═ STRATEGY 1                ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

trading_strat1_line1 = strategy_1 == 1    ? strat1_line1   : na
trading_strat1_line2 = strategy_1 == 1    ? strat1_line2   : na

longCross  = crossunder (trading_strat1_line2, trading_strat1_line1) ? true : false
shortCross = crossover  (trading_strat1_line2, trading_strat1_line1) ? true : false

plot( longCross  ? trading_strat1_line1 : na , title = "Long"  , color=color.aqua, style=plot.style_circles, linewidth=5, offset= 0)
plot( shortCross ? trading_strat1_line2 : na , title = "Short" , color=color.red , style=plot.style_circles, linewidth=5, offset= 0)



//                  ╔═ Backtest 1                ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░


strategy.exit("close",loss = useStopLoss, profit = useTakeProfit)

if longCross  and window() and strategy_1 == 1 
    strategy.entry("Go Long", strategy.long)
if shortCross and window() and strategy_1 == 1 
    strategy.entry("Go Short", strategy.short)

//end

Lebih banyak