Strategi mengikuti tren berdasarkan osilator yang dihaluskan


Tanggal Pembuatan: 2023-12-27 15:41:37 Akhirnya memodifikasi: 2023-12-27 15:41:37
menyalin: 0 Jumlah klik: 740
1
fokus pada
1621
Pengikut

Strategi mengikuti tren berdasarkan osilator yang dihaluskan

Ringkasan

Strategi ini didasarkan pada indikator geser untuk mengidentifikasi tren harga dan melakukan perdagangan dengan metode pelacakan tren. Lakukan overhead ketika harga menerobos garis indikator dan melakukan short head ketika harga turun dari garis indikator.

Prinsip Strategi

Strategi ini menggunakan indikator smoothed oscillation yang dapat disesuaikan untuk mengidentifikasi tren harga. Indikator ini menghitung harga putar balik pada garis K saat ini, yaitu harga teoritis yang dapat membalikkan kerugian dan trajectory.

Strategi ini menggunakan garis indikator yang pecah sebagai sinyal untuk membangun posisi. Lakukan lebih banyak ketika harga melewati garis indikator dan kosong ketika harga turun di bawah garis indikator. Batas stop loss ditetapkan sebagai persentase tertentu dari harga masuk untuk mengunci keuntungan dan mengendalikan risiko.

Keunggulan Strategis

  1. Menggunakan indikator khusus untuk mengidentifikasi tren dan melakukan pengukuran kembali yang lebih baik
  2. Menggunakan pelacakan tren, yang secara garis besar sesuai dengan teori perdagangan tren kuantitatif
  3. Pengaturan Stop Loss yang menguntungkan untuk pengendalian risiko

Analisis risiko

  1. Indikator memiliki tingkat kemunduran yang dapat menyebabkan kinerja strategi yang buruk
  2. Ini adalah salah satu indikator yang dapat memberikan sinyal yang salah.
  3. Pengaturan Stop Loss memiliki ruang untuk dioptimalkan, kemungkinan terjadi overstop

Arah optimasi

  1. Pertimbangkan untuk memfilter sinyal perdagangan Anda dengan indikator lain, seperti Bollinger Bands, RSI, dll.
  2. Uji pengaturan parameter indikator berbeda
  3. Pengujian dan pengoptimalan modus stop loss
  4. Lebih banyak data dari berbagai varietas dan siklus tes

Meringkaskan

Strategi ini secara keseluruhan memiliki ide yang jelas, menggunakan indikator khusus untuk mengidentifikasi tren dan melakukan perdagangan dengan cara mengikuti tren. Dari hasil pengukuran, strategi ini berkinerja baik dan memiliki potensi untuk digunakan di pasar nyata. Namun, hanya bergantung pada satu indikator dan ada beberapa kemunduran, kualitas sinyal masih harus diverifikasi. Selain itu, mekanisme stop loss juga perlu diuji dan dioptimalkan lebih lanjut.

Kode Sumber Strategi
/*backtest
start: 2023-12-19 00:00:00
end: 2023-12-26 00:00:00
period: 10m
basePeriod: 1m
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/

// © TraderHalai
// This is a backtest of the Smoothed Heikin Ashi Trend indicator, which computes the reverse candle close price required to flip a heikin ashi trend from red to green and vice versa. Original indicator can be found on the scripts section of my profile.

// Default testing parameters are 10% of equity position size, with a 1% stop loss on short and long strategy.opentrades.commission

// This particular back test uses this indicator as a Trend trading tool with a tight stop loss. The equity curve as tested seems promising but requires further work to refine. Note in an actual trading setup, you may wish to use this with volatilty filters as most of the losses are in sideways, low volatility markets.


//@version=5
strategy("Smoothed Heikin Ashi Trend on Chart - TraderHalai BACKTEST", " SHA Trend - BACKTEST", overlay=true)
//Inputs

i_useSmooth =       input ( true, "Use smoothing Heikin Ashi")
i_smoothingMethod = input.string("SMA", "Method", options=["SMA", "EMA", "HMA", "VWMA", "RMA"])
i_smoothingPeriod = input ( 10, "Smoothing period")

i_infoBox   =       input ( true, "Show Info Box"        )
i_decimalP  =       input ( 2,    "Prices Decimal Places") 
i_boxOffSet =       input ( 5,    "Info Box Offset"      )
i_repaint   =       input (false,  "Repaint -  Keep on for live / Off for backtest")

i_longLossPerc = input.float(title="Long Stop Loss (%)",minval=0.0, step=0.1, defval=1) * 0.01

i_shortLossPerc = input.float(title="Short Stop Loss (%)", minval=0.0, step=0.1, defval=1) * 0.01


timeperiod = timeframe.period

//Security functions to avoid repaint, as per PineCoders
f_secureSecurity(_symbol, _res, _src) => request.security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on)
f_security(_symbol, _res, _src, _repaint) => request.security(_symbol, _res, _src[_repaint ? 0 : barstate.isrealtime ? 1 : 0])[_repaint ? 0 : barstate.isrealtime ? 0 : 1]
f_secSecurity2(_symbol, _res, _src) => request.security(_symbol, _res, _src[1])


candleClose = f_security(syminfo.tickerid, timeperiod, close, i_repaint)
candleOpen = f_security(syminfo.tickerid, timeperiod, open, i_repaint)
candleLow = f_security(syminfo.tickerid, timeperiod, low, i_repaint)
candleHigh = f_security(syminfo.tickerid, timeperiod, high, i_repaint)

haTicker = ticker.heikinashi(syminfo.tickerid)
haClose = f_security(haTicker, timeperiod, close, i_repaint)
haOpen = f_security(haTicker, timeperiod, open, i_repaint)
haLow = f_security(haTicker, timeperiod, low, i_repaint)
haHigh= f_security(haTicker, timeperiod, high, i_repaint)


reverseClose = (2 * (haOpen[1] + haClose[1])) - candleHigh - candleLow - candleOpen

if(reverseClose < candleLow)
    reverseClose := (candleLow + reverseClose) / 2

if(reverseClose > candleHigh)
    reverseClose := (candleHigh + reverseClose) / 2
    
//Smoothing
    
smaSmoothed = ta.sma(reverseClose, i_smoothingPeriod)
emaSmoothed = ta.ema(reverseClose, i_smoothingPeriod)
hmaSmoothed = ta.hma(reverseClose, i_smoothingPeriod)
vwmaSmoothed = ta.vwma(reverseClose, i_smoothingPeriod)
rmaSmoothed = ta.rma(reverseClose, i_smoothingPeriod)

shouldApplySmoothing = i_useSmooth and i_smoothingPeriod > 1 

smoothedReverseClose = reverseClose

if(shouldApplySmoothing)
    if(i_smoothingMethod == "SMA")
        smoothedReverseClose := smaSmoothed
    else if(i_smoothingMethod == "EMA")
        smoothedReverseClose := emaSmoothed
    else if(i_smoothingMethod == "HMA")
        smoothedReverseClose := hmaSmoothed
    else if(i_smoothingMethod == "VWMA")
        smoothedReverseClose := vwmaSmoothed
    else if(i_smoothingMethod == "RMA")
        smoothedReverseClose := rmaSmoothed
    else 
        smoothedReverseClose := reverseClose // Default to non-smoothed for invalid smoothing type
    
haBull = candleClose >= smoothedReverseClose
haCol = haBull ? color.green : color.red


//Overall trading strategy
if(ta.crossover(candleClose, smoothedReverseClose))
    strategy.entry("LONG", strategy.long, stop=smoothedReverseClose)
else
    strategy.cancel("LONG")

if(ta.crossunder(candleClose, smoothedReverseClose))
    strategy.entry("SHORT", strategy.short, stop=smoothedReverseClose)
else
    strategy.cancel("SHORT")
    

longStopPrice  = strategy.position_avg_price * (1 - i_longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + i_shortLossPerc)



plot(series=(strategy.position_size > 0) ? longStopPrice : na,
     color=color.red, style=plot.style_cross,
     linewidth=2, title="Long Stop Loss")
plot(series=(strategy.position_size < 0) ? shortStopPrice : na,
     color=color.red, style=plot.style_cross,
     linewidth=2, title="Short Stop Loss")
     
plot(smoothedReverseClose, color=haCol)

if (strategy.position_size > 0)
    strategy.exit(id="XL STP", stop=longStopPrice)

if (strategy.position_size < 0)
    strategy.exit(id="XS STP", stop=shortStopPrice)