Strategi pelacakan tren berdasarkan candlestick moving average dan super trend stop loss


Tanggal Pembuatan: 2023-09-13 18:07:54 Akhirnya memodifikasi: 2023-09-13 18:07:54
menyalin: 1 Jumlah klik: 694
1
fokus pada
1617
Pengikut

Strategi ini disebut strategi pelacakan tren berdasarkan garis K rata-rata bergerak dan overtrend stop. Strategi ini menggunakan garis rata-rata bergerak untuk memetakan garis K tren dan menghasilkan sinyal perdagangan yang dikombinasikan dengan mekanisme overtrend stop untuk melacak tren.

Secara khusus, logika transaksi strategi adalah sebagai berikut:

  1. Menggunakan garis rata-rata bergerak untuk menghitung harga awal dan akhir, dan memetakan garis K tren.

  2. Pada garis tren K, digunakan teknik stop loss overtrend untuk mendapatkan stop loss over and under.

  3. Ketika harga menembus posisi stop loss, maka akan muncul sinyal beli. Ketika harga menembus posisi stop loss, maka akan muncul sinyal jual.

  4. Pengertian harga tertinggi dan terendah dalam satu tahun yang digabungkan dengan periode waktu yang lebih tinggi untuk menghindari terlalu banyak sinyal tidak efektif di pasar yang bergoyang.

  5. Ketika overtrading stop loss berbalik, posisi terendah stop loss.

Keuntungan dari strategi ini adalah penggabungan berbagai indikator teknis sekaligus, meningkatkan akurasi penilaian. Namun, parameter moving average dan overtrend stop loss perlu dioptimalkan. Strategi stop loss juga sangat penting.

Secara keseluruhan, penggunaan indikator dan model yang terintegrasi sebagian menutupi kekurangan indikator tunggal, tetapi tidak ada strategi yang sempurna. Pedagang masih perlu mempertahankan fleksibilitas yang cukup untuk menanggapi perubahan pasar.

Kode Sumber Strategi
/*backtest
start: 2023-01-01 00:00:00
end: 2023-04-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("MA Candles Supertrend Strategy", shorttitle="MACSTS", overlay=true, initial_capital = 20000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01)

MAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
LoopbackBars = input(20, step=10)

AtrMAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
AtrLength = input(30, step=10)
AtrMult = input(1)
adoptiveWicks = false // does not work
wicks = input(true)

dThreshold = input(0.2, step=0.1, maxval=1)
rThreshold = input(0.7, step=0.1, maxval=1)
tradeDirection = input(title="Trade Direction", defval=strategy.direction.long, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "End Time", type = input.time)
inDateRange = true
strategy.risk.allow_entry_in(tradeDirection)

f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_secureSecurity(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on)

f_getYearlyHighLowCondition()=>
    yhighrange = f_secureSecurity(syminfo.tickerid, '12M', high, 1) 
    ylowrange = f_secureSecurity(syminfo.tickerid, '12M', low, 1)
    yearlyHighCondition = close > yhighrange*(1-dThreshold) or close > ylowrange*(1+rThreshold)
    yearlyLowCondition = close < ylowrange*(1+dThreshold) or close < yhighrange*(1-rThreshold)
    [yearlyHighCondition, yearlyLowCondition]


f_getSupertrend(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, AtrMult, wicks)=>
    truerange = max(oHigh, oClose[1]) - min(oLow, oClose[1])
    
    averagetruerange = f_getMovingAverage(truerange, AtrMAType, AtrLength)
    atr = averagetruerange * AtrMult

    longWicks = (adoptiveWicks and (close < oClose)) or wicks
    shortWicks = (adoptiveWicks and (close > oClose)) or wicks
    longStop = oClose - atr
    longStopPrev = nz(longStop[1], longStop)
    longStop := (longWicks ? oLow[1] : oClose[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop
    
    shortStop = oClose + atr
    shortStopPrev = nz(shortStop[1], shortStop)
    shortStop := (shortWicks ? oHigh[1] : oClose[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
    
    dir = 1
    dir := nz(dir[1], dir)
    dir := dir == -1 and (longWicks ? oHigh : oClose) > shortStopPrev ? 1 : dir == 1 and (shortWicks[1]? oLow : oClose) < longStopPrev ? -1 : dir
    

    [dir, longStop, shortStop]

oOpen = f_getMovingAverage(open, MAType, LoopbackBars)
oClose = f_getMovingAverage(close, MAType, LoopbackBars)
oHigh = f_getMovingAverage(high, MAType, LoopbackBars)
oLow = f_getMovingAverage(low, MAType, LoopbackBars)

colorByPreviousClose = false
candleColor = colorByPreviousClose ?
                 (oClose[1] < oClose ? color.green : oClose[1] > oClose ? color.red : color.silver) : 
                 (oOpen < oClose ? color.green : oOpen > oClose ? color.red : color.silver)
plotcandle(oOpen, oHigh, oLow, oClose, 'Oscilator Candles', color = candleColor)

[yearlyHighCondition, yearlyLowCondition] =  f_getYearlyHighLowCondition()
[dir, longStop, shortStop] = f_getSupertrend(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, AtrMult, wicks)
trailingStop = dir == 1? longStop : shortStop
trendColor = dir == 1? color.green: color.red
plot(trailingStop, title="TrailingStop", color=trendColor, linewidth=2, style=plot.style_linebr)

longCondition = close > shortStop and dir == 1 and yearlyHighCondition
shortCondition = close < longStop and dir == -1 and yearlyLowCondition

exitLongCondition = dir == -1
exitShortCondition = dir == 1

strategy.risk.allow_entry_in(tradeDirection)
strategy.entry("Long", strategy.long, when=longCondition, oca_name="oca_buy")
strategy.close("Long", when=exitLongCondition)
strategy.entry("Short", strategy.short, when=shortCondition, oca_name="oca_sell")
strategy.close("Short", when=exitShortCondition)