Strategi Pengesanan Purata Bergerak Dinamik

Penulis:ChaoZhang, Tarikh: 2023-11-24 16:59:25
Tag:

img

Ringkasan

Idea teras strategi ini adalah menggunakan purata bergerak dinamik untuk mengesan trend, menetapkan stop loss dan mengambil keuntungan, dan menggabungkan teknik lilin Heikin Ashi untuk penghakiman isyarat panjang / pendek.

Prinsip-prinsip

Strategi ini mula-mula mengira penunjuk ATR, kemudian menggabungkan sumber harga input dan parameter untuk mengira purata bergerak dinamik. Isyarat panjang / pendek dihasilkan apabila harga melintasi di atas / di bawah purata bergerak dinamik. Sementara itu, kedudukan stop loss dan mengambil keuntungan ditetapkan untuk mengesan perubahan harga dalam masa nyata.

Secara khusus, penunjuk ATR dan parameter nLoss dikira terlebih dahulu. Kemudian harga tempoh semasa dan kedudukan stop loss tempoh sebelumnya dibandingkan untuk mengemas kini garisan stop loss. Apabila harga memecahkan garis stop loss tempoh sebelumnya, isyarat panjang / pendek pos dan warna yang sesuai dihasilkan. Apabila isyarat perdagangan dicetuskan, tanda anak panah dicatatkan. Akhirnya kedudukan ditutup berdasarkan logik stop loss / mengambil keuntungan.

Analisis Kelebihan

Kelebihan terbesar strategi ini adalah penggunaan purata bergerak dinamik untuk mengesan perubahan harga dalam masa nyata. Ini menangkap trend yang lebih baik daripada purata bergerak tetap tradisional dan mengurangkan kemungkinan stop loss. Di samping itu, menggabungkan stop loss berasaskan ATR membolehkan penyesuaian fleksibel kedudukan stop loss berdasarkan turun naik pasaran untuk mengawal risiko dengan berkesan.

Risiko dan Penyelesaian

Risiko utama strategi ini adalah bahawa harga mungkin jurang ke atas / ke bawah dengan ketara, menyebabkan isyarat palsu apabila stop loss dipukul. Juga, tetapan keadaan yang tidak betul boleh menyebabkan perdagangan yang terlalu kerap.

Penyelesaian termasuk mengoptimumkan tempoh purata bergerak, menyesuaikan ATR dan pekali stop loss untuk mengurangkan kebarangkalian isyarat palsu. Penapis tambahan boleh ditambah untuk mengelakkan perdagangan yang terlalu padat.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Uji pelbagai jenis dan tempoh purata bergerak untuk mencari kombinasi parameter yang optimum

  2. Mengoptimumkan parameter tempoh ATR untuk mengimbangi kepekaan stop loss

  3. Tambah penapis dan penunjuk tambahan untuk meningkatkan kualiti isyarat

  4. Sesuaikan nilai stop loss/take profit untuk mengoptimumkan nisbah ganjaran risiko

Kesimpulan

Idea utama strategi ini adalah menggunakan purata bergerak dinamik untuk mengesan perubahan harga dalam masa nyata, menggunakan penunjuk ATR untuk menetapkan kedudukan stop loss secara dinamik, mengawal risiko dengan ketat sambil mengesan trend. Melalui pengoptimuman parameter dan penyempurnaan peraturan, strategi ini boleh disesuaikan ke dalam sistem kuantitatif yang sangat praktikal.


/*backtest
start: 2022-11-23 00:00:00
end: 2023-11-05 05:20:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT","stocks":0}]
*/

//@version=5
strategy(title='UT Bot v5', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
//CREDITS to HPotter for the orginal code. The guy trying to sell this as his own is a scammer lol. 
//Edited and converted to @version=5 by SeaSide420 for Paperina
// Inputs
AllowBuy = input(defval=true, title='Allow Buy?')
AllowSell = input(defval=false, title='Allow Sell?')
h = input(false, title='Signals from Heikin Ashi Candles')
//revclose = input(defval=true, title='Close when reverse signal?')
Price = input(defval=open, title='Price Source (recommended OPEN to avoid repainting)')
smoothing = input.string(title="Moving Average Type", defval="HMA", options=["SMA", "EMA", "WMA", "HMA"])
MA_Period = input(2, title='This changes the MAPeriod')
a = input.float(1, title='This changes the sensitivity',step=0.1)
c = input(11, title='ATR Period')
TakeProfit = input.int(defval=50000, title='Take Profit ($)', minval=1)
StopLoss = input.int(defval=50000, title='Stop Loss ($)', minval=1)
xATR = ta.atr(c)
nLoss = a * xATR
src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, Price, lookahead=barmerge.lookahead_off) : Price
xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), src - nLoss) : iff_2
pos = 0
iff_3 = src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0) ? 1 : iff_3
xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue
ma_function(src, MA_Period) =>
    switch smoothing
        "SMA" => ta.sma(src, MA_Period)
        "EMA" => ta.ema(src, MA_Period)
        "WMA" => ta.wma(src, MA_Period)
        => ta.hma(src, MA_Period)
thema = ma_function(src, MA_Period)
above = ta.crossover(thema, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, thema)
buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below
barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop
plot(thema,title="The M.A.",color=color.green,linewidth=2)
plot(xATRTrailingStop,title="The M.A.",color=color.red,linewidth=2)
plotshape(buy,  title = "Buy",  text = "Buy",  style = shape.labelup,   location = location.belowbar, color= color.green, textcolor = color.white, size = size.tiny)
plotshape(sell, title = "Sell", text = "Sell", style = shape.labeldown, location = location.abovebar, color= color.red,   textcolor = color.white, size = size.tiny)
barcolor(barbuy ? color.green : na)
barcolor(barsell ? color.red : na)
strategy.close_all(when=strategy.openprofit>TakeProfit,alert_message="Close- TakeProfit", comment = "TP")
strategy.close_all(when=strategy.openprofit<StopLoss-(StopLoss*2),alert_message="Close- StopLoss", comment = "SL")
strategy.close("buy", when =  sell and AllowSell==false , comment = "close buy")
strategy.close("sell", when =  buy and AllowBuy==false, comment = "close sell")
strategy.entry("buy", strategy.long, when = buy and AllowBuy)
strategy.entry("sell", strategy.short, when = sell and AllowSell)

Lebih lanjut