Strategi perdagangan pelacakan purata bergerak berganda adalah strategi mengikuti trend berdasarkan purata bergerak dan penunjuk tertentu. Strategi ini menggunakan dua purata bergerak dengan tetapan parameter yang berbeza untuk membina saluran dan menggabungkan penunjuk OTT untuk menetapkan had atas dan bawah saluran untuk menjejaki trend harga dengan bijak. Apabila harga menembusi saluran, operasi beli atau jual dilaksanakan.
Metodologi teras strategi ini adalah untuk membina saluran penyesuaian menggunakan dua purata bergerak dan penunjuk OTT, khususnya:
Mengira garis pantas MAvg menggunakan CLOSE dan purata bergerak tersuai sebagai input, dengan panjang 5 tempoh;
Mengira kedudukan baris panjang LongStop dan kedudukan baris pendek ShortStop untuk saluran berdasarkan MAvg dan peratusan yang telah ditetapkan;
Mengira MT stop loss saluran dalam penunjuk OTT, dan harga saluran OTT berdasarkan arah panjang/pendek;
Menghasilkan isyarat perdagangan apabila harga memecahkan melalui OTT.
Proses di atas membolehkan pengesanan perubahan trend harga secara real-time, menghasilkan isyarat perdagangan.
Kelebihan strategi ini termasuk:
Terdapat juga beberapa risiko:
Risiko boleh ditangani melalui pengoptimuman parameter, mengintegrasikan penapis penunjuk dan asas lain.
Strategi ini boleh dioptimumkan dalam beberapa aspek:
Ringkasnya, ini adalah strategi trend berikut berdasarkan saluran purata bergerak berganda dan penunjuk OTT. Idea utama adalah membina saluran adaptif dan menghasilkan isyarat apabila harga pecah. Strategi ini mempunyai kelebihan tetapi juga ruang untuk penambahbaikan. Dengan penyesuaian parameter dan pengoptimuman logik, ia berpotensi menjadi strategi perdagangan kuant yang cekap yang patut digunakan.
/*backtest start: 2023-02-11 00:00:00 end: 2024-02-17 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="BugRA_Trade_Strategy", shorttitle="BugRA_Trade_Strategy", overlay=true) // Kullanıcı Girdileri length = input(5, title="Period", minval=1) percent = input(1, title="Sihirli Yüzde", type=input.float, step=0.1, minval=0) mav = input(title="Hareketli Ortalama Türü", defval="VAR", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"]) wt_n1 = input(10, title="Kanal Periyodu") wt_n2 = input(21, title="Averaj Uzunluğu") src = close // Tarih Aralığı Girdileri startDate = input(20200101, title="Başlangıç Tarihi (YYYYMMDD)") endDate = input(20201231, title="Bitiş Tarihi (YYYYMMDD)") // Tarih Filtresi Fonksiyonu isDateInRange() => true // Özel Fonksiyonlar Var_Func(src, length) => valpha = 2 / (length + 1) vud1 = src > src[1] ? src - src[1] : 0 vdd1 = src < src[1] ? src[1] - src : 0 vUD = sum(vud1, length) vDD = sum(vdd1, length) vCMO = (vUD - vDD) / (vUD + vDD) varResult = 0.0 varResult := nz(valpha * abs(vCMO) * src + (1 - valpha * abs(vCMO)) * nz(varResult[1])) varResult Wwma_Func(src, length) => wwalpha = 1 / length wwma = 0.0 wwma := wwalpha * src + (1 - wwalpha) * nz(wwma[1]) wwma Zlema_Func(src, length) => zxLag = floor(length / 2) zxEMAData = src + (src - src[zxLag]) zlema = ema(zxEMAData, length) zlema Tsf_Func(src, length) => lrc = linreg(src, length, 0) lrs = lrc - linreg(src, length, 1) tsf = lrc + lrs tsf getMA(src, length) => ma = mav == "SMA" ? sma(src, length) : mav == "EMA" ? ema(src, length) : mav == "WMA" ? wma(src, length) : mav == "TMA" ? sma(sma(src, ceil(length / 2)), floor(length / 2) + 1) : mav == "VAR" ? Var_Func(src, length) : mav == "WWMA" ? Wwma_Func(src, length) : mav == "ZLEMA" ? Zlema_Func(src, length) : mav == "TSF" ? Tsf_Func(src, length) : na // Strateji Hesaplamaları MAvg = getMA(src, length) fark = MAvg * percent * 0.01 longStop = MAvg - fark longStopPrev = nz(longStop[1], longStop) longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop shortStop = MAvg + fark shortStopPrev = nz(shortStop[1], shortStop) shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop dir = 1 dir := nz(dir[1], dir) dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir MT = dir==1 ? longStop: shortStop OTT = MAvg > MT ? MT*(200+percent)/200 : MT*(200-percent)/200 plot(OTT, title="BugRA", color=color.rgb(251, 126, 9)) // Alım ve Satım Koşulları longCondition = crossover(src, OTT) and isDateInRange() shortCondition = crossunder(src, OTT) and isDateInRange() // Strateji Giriş ve Çıkış Emirleri if (longCondition) strategy.entry("Long", strategy.long) if (shortCondition) strategy.close("Long")