Dual Moving Average Crossover Persistent Uptrend Strategi

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

img

Gambaran umum

Ini adalah strategi trading yang memanfaatkan pola crossover rata-rata bergerak bersama dengan uptrend yang terus menerus untuk memasuki perdagangan. Ketika MA cepat melintasi di atas MA lambat, sinyal crossover emas dihasilkan. Jika uptrend terus berlanjut setelah crossover, posisi panjang dapat dibuka. Ketika harga naik ke level stop loss atau take profit, posisi dapat ditutup untuk stop loss atau take profit.

Logika Strategi

Strategi ini terutama didasarkan pada crossover rata-rata bergerak untuk sinyal masuk. Secara khusus, MA cepat (MA1) dan MA lambat (MA2) didefinisikan. Ketika MA1 melintasi di atas MA2, itu adalah sinyal untuk pergi panjang.

Untuk menghindari sinyal palsu dari crossover jangka pendek, ambang ambang ditambahkan, sehingga sinyal beli hanya dipicu ketika sudut MA2 berada di atas ambang yang ditetapkan.

Strategi ini juga menetapkan stop loss dan take profit. Stop loss menghindari kerugian jika terjadi pembalikan pasar tiba-tiba, sementara take profit mengunci keuntungan. Mereka ditetapkan sebagai kisaran persentase dari harga masuk.

Ketika harga naik untuk mengambil titik keuntungan, strategi akan menutup panjang untuk mengambil keuntungan. Juga, jika rally kuat, strategi akan membuka posisi pendek untuk reversi rata-rata.

Analisis Keuntungan

Ini adalah tren yang sederhana dan intuitif mengikuti strategi.

  1. MA combo menyaring keluar kebisingan pasar dan kunci dalam arah tren
  2. Ambang ambang menghindari disesatkan oleh osilasi jangka pendek
  3. Perdagangan dua arah memungkinkan keuntungan dari pasar yang terikat rentang
  4. Stop loss dan take profit mengendalikan risiko

Analisis Risiko

Ada beberapa risiko yang perlu diperhatikan:

  1. MA memiliki keterlambatan dan mungkin melewatkan titik balik
  2. Stop loss tidak dijamin, dapat diisi dalam pasar cepat
  3. Perdagangan double-edge menggandakan risiko, waktu masuk pendek adalah kunci
  4. Penyesuaian parameter yang buruk seperti periode MA dapat mempengaruhi hasil

Bidang Peningkatan

Beberapa cara untuk lebih mengoptimalkan strategi:

  1. Tambahkan filter tren seperti MACD, Bollinger untuk meningkatkan akurasi
  2. Menggunakan pembelajaran mesin untuk secara dinamis mengoptimalkan periode MA
  3. Mengoptimalkan pengaturan stop loss dan take profit misalnya trailing stop
  4. Tambahkan ukuran posisi untuk membatasi kerugian
  5. Mengukur kekuatan tren dengan ADX ke posisi reversi rata-rata ukuran

Kesimpulan

Secara keseluruhan, ini adalah tren yang sederhana dan praktis mengikuti strategi. Ini memiliki pro tetapi juga risiko. Penyempurnaan lebih lanjut seperti penyesuaian parameter, indikator optimal, pengaturan stop loss dll dapat memperbaikinya. Tapi tidak ada strategi yang menghilangkan risiko sistemik sepenuhnya. Manajemen risiko adalah kunci untuk perdagangan yang bijaksana.


/*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 banyak