Strategi Trend Naik Berkelanjutan dengan Rata-rata Bergerak Berganda

Penulis:ChaoZhang, Tarikh: 2023-11-13 10:47:48
Tag:

img

Ringkasan

Ini adalah strategi dagangan yang menggunakan corak crossover purata bergerak bersama-sama dengan trend menaik berterusan untuk memasuki perdagangan. Apabila MA pantas melintasi di atas MA perlahan, isyarat crossover emas dihasilkan. Jika trend menaik berterusan selepas crossover, kedudukan panjang boleh dibuka. Apabila harga meningkat ke tahap stop loss atau mengambil keuntungan, kedudukan boleh ditutup untuk stop loss atau mengambil keuntungan.

Logika Strategi

Strategi ini terutamanya berdasarkan crossover purata bergerak untuk isyarat masuk. Secara khusus, MA cepat (MA1) dan MA perlahan (MA2) ditakrifkan. Apabila MA1 melintasi di atas MA2, ia adalah isyarat untuk pergi lama.

Untuk mengelakkan isyarat palsu dari persilangan jangka pendek, ambang ambang ditambahkan, supaya isyarat beli hanya dicetuskan apabila sudut MA2 melebihi ambang yang ditetapkan.

Strategi ini juga menetapkan stop loss dan mengambil keuntungan. Stop loss mengelakkan kerugian sekiranya berlaku pembalikan pasaran secara tiba-tiba, sementara mengambil keuntungan mengunci keuntungan. Mereka ditetapkan sebagai julat peratusan dari harga kemasukan.

Apabila harga meningkat untuk mengambil titik keuntungan, strategi akan ditutup lama untuk mengambil keuntungan.

Analisis Kelebihan

Ini adalah trend yang mudah dan intuitif mengikut strategi.

  1. MA combo menapis kebisingan pasaran dan kunci ke arah trend
  2. Sempadan sudut mengelakkan disesatkan oleh goyangan jangka pendek
  3. Perdagangan dua hala membolehkan keuntungan dari pasaran yang terhad
  4. Stop loss dan mengambil keuntungan kawalan risiko

Analisis Risiko

Terdapat beberapa risiko yang perlu diperhatikan:

  1. MAs mempunyai kelewatan dan mungkin terlepas titik perubahan
  2. Hentikan kerugian tidak dijamin, boleh dipotong di pasaran pantas
  3. Dagangan berhadapan ganda menggandakan risiko, masa masuk pendek adalah kunci
  4. Penyesuaian parameter yang buruk seperti tempoh MA boleh menjejaskan keputusan

Kawasan Peningkatan

Beberapa cara untuk mengoptimumkan lagi strategi:

  1. Tambah penapis trend seperti MACD, Bollinger untuk meningkatkan ketepatan
  2. Gunakan pembelajaran mesin untuk mengoptimumkan tempoh MA secara dinamik
  3. Mengoptimumkan tetapan stop loss dan mengambil keuntungan e.g. trailing stop
  4. Tambah saiz kedudukan untuk mengehadkan kerugian
  5. Mengukur kekuatan trend dengan ADX ke kedudukan pembalikan purata saiz

Kesimpulan

Secara keseluruhan, ini adalah trend yang mudah dan praktikal mengikuti strategi. Ia mempunyai kelebihan tetapi juga risiko. Penyempurnaan lanjut seperti penyesuaian parameter, penunjuk optimum, tetapan stop loss dan lain-lain dapat memperbaikinya. Tetapi tidak ada strategi yang menghilangkan risiko sistemik sepenuhnya. Pengurusan risiko adalah kunci untuk perdagangan yang berhati-hati.


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

//written by markjames12210@gmail.com
//@version=5
strategy(title="MJ-Dual Moving Average",initial_capital=10000,overlay=false)

// import TradingView/ZigZag/6 as ZigZagLib 

// // Create Zig Zag instance from user settings.
// var zigZag = ZigZagLib.newInstance(
//   ZigZagLib.Settings.new(
//       input.float(5.0, "Price deviation for reversals (%)", 0.00001, 100.0, 0.5, "0.00001 - 100"),
//       input.int(10, "Pivot legs", 2),
//       input(#2962FF, "Line color"),
//       input(true, "Extend to last bar"),
//       input(true, "Display reversal price"),
//       input(true, "Display cumulative volume"),
//       input(true, "Display reversal price change", inline = "priceRev"),
//       input.string("Absolute", "", ["Absolute", "Percent"], inline = "priceRev"),
//       true)
//  )

// // Update 'zigZag' object on each bar with new ​pivots, ​volume, lines, labels.
// zigZag.update()
// // plot(zigZag.pivots, "zigZag")

ma1= ta.sma(close,8)
ma2= ta.sma(close,21)

angleCriteria = input.int(title="Angle", defval=7, minval=1, maxval=13)

i_lookback   = input.int(2,     "Angle Period", minval = 1)
i_atrPeriod  = input.int(10,    "ATR Period",   minval = 1)
i_angleLevel = input.int(6,     "Angle Level",  minval = 1)
i_maSource   = input.source(close, "MA Source")
TP = input.float(1, "TP", minval = 0.1)
SL = input.float(1, "SL", minval = 0.1)

f_angle(_src, _lookback, _atrPeriod) =>
    rad2degree = 180 / 3.141592653589793238462643  //pi 
    ang = rad2degree * math.atan((_src[0] - _src[_lookback]) / ta.atr(_atrPeriod)/_lookback)
    ang
_angle = f_angle(ma2, i_lookback, i_atrPeriod)
plot(ta.atr(i_atrPeriod), "atr")
// plot(ma1,color=#FF0000)
// plot(ma2,color=#00FF00)

crosso=ta.crossover(ma1,ma2) 
crossu=ta.crossunder(ma1,ma2)

_lookback = 15

f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed
    
longcrossed = f_somethingHappened(crosso,_lookback)
shortcrossed = f_somethingHappened(crossu,_lookback)

atr_factor = 1
atr = ta.atr(i_atrPeriod)
e = atr * atr_factor 

afr = close 
afr := nz(afr[1], afr)

atr_factoryHigh = close + e
atr_factoryLow = close - e 

if atr_factoryLow > afr 
    afr := atr_factoryLow
if atr_factoryHigh < afr 
    afr := atr_factoryHigh

// plot(afr, "afr", display = display.data_window)
// plot(atr_factoryHigh, "afr", color = color.yellow, display = display.all)
// plot(atr_factoryLow, "afr", color = color.green, display = display.all)


inLong() => strategy.position_size > 0
inShort() => strategy.position_size < 0
inZero() => not inLong() and not inShort()

long = longcrossed and _angle > angleCriteria
short= shortcrossed and _angle < -(angleCriteria)

plotshape(long, "Buy", shape.arrowup, location.belowbar, color = #FF0000)
plotshape(short, "Sell", shape.arrowdown, location.abovebar, color = #00FF00)

var longTp = 0.0
var longSl = 0.0
var shortTp = 0.0
var shortSl = 0.0
[b_middle, b_high, b_low] = ta.bb(close, 20, 2)
entry_price = strategy.opentrades.entry_price(0)

if inZero()
    if short
        longTp := close * (1 + TP/100)
        longSl := close * (1 - SL/100)
        strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))
    if long
        shortTp := close * (1 - TP/100)
        shortSl := close * (1 + SL/100)
        strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

if inLong()
    // if close - entry_price > close * 0.005
    //     longSl := entry_price + close * 0.001
    if high > longTp
        strategy.close("LONG")
        if (close - open) > close * 0.014
            shortTp := close * (1 - TP/100)
            shortSl := close * (1 + SL/100)
            strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

    if close < longSl
        strategy.close("LONG")
    if open >= b_high and close >= b_high
        strategy.close("LONG")
    // if high > b_high and entry_price < high
    //     strategy.close("LONG")


if inShort()
    // if entry_price - close > close * 0.005
    //     shortSl := entry_price - close * 0.001
    if low < shortTp
        strategy.close("SHORT")
        if (open - close) > close * 0.014
            longTp := close * (1 + TP/100)
            longSl := close * (1 - SL/100)
            strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))


    if close > shortSl
        strategy.close("SHORT")
    if open < b_low and close < b_low
        strategy.close("SHORT")
    // if low < b_low and entry_price > low
    //     strategy.close("SHORT")

Lebih lanjut