Strategi Pembalikan Hari Super Trend

Penulis:ChaoZhang, Tarikh: 2024-02-22 16:22:28
Tag:

img

Ringkasan

Strategi Pembalikan Harian Super Trend adalah strategi perdagangan kuantitatif yang menggunakan penunjuk Super Trend untuk menentukan trend pasaran, menggabungkan kejayaan harga dan julat sebenar purata untuk mengira stop loss, dan menggunakan penunjuk kadar perubahan harga untuk menapis isyarat Super Trend. Strategi ini sesuai untuk bingkai masa harian dan lebih tinggi dan boleh digunakan di pasaran seperti cryptocurrency dan saham.

Logika Strategi

Indikator utama strategi ini adalah penunjuk Super Trend. Indikator Super Trend berdasarkan Julat Benar Purata (ATR) dan dapat menentukan arah trend pasaran dengan lebih jelas. Kegagalan rel atas Super Trend adalah isyarat pendek, dan kegagalan rel bawah adalah isyarat panjang.

Strategi ini menggunakan penunjuk Kadar Perubahan Harga (ROC) untuk menapis penunjuk Super Trend untuk mengelakkan isyarat yang tidak sah.

Untuk stop loss, strategi menyediakan dua kaedah stop loss: peratusan stop loss tetap dan adaptif stop loss berasaskan ATR. Stop loss tetap adalah mudah dan langsung.

Syarat masuk adalah pembalikan penunjuk Super Trend dan penunjuk kadar perubahan harga melewati penapis. Syarat keluar adalah bahawa Super Trend membalikkan lagi atau memecahkan garis stop loss. Strategi ini mematuhi prinsip penjejakan trend dan hanya membenarkan satu kedudukan dalam setiap arah.

Analisis Kelebihan

Kelebihan terbesar strategi ini adalah bahawa penunjuk Super Trend mempunyai kejelasan dan kestabilan yang lebih tinggi dalam menilai arah trend berbanding dengan purata bergerak biasa, dengan kurang bunyi bising.

Mekanisme stop loss adaptif ATR juga membolehkan strategi untuk menyesuaikan diri dengan persekitaran pasaran yang lebih luas. Stop loss akan secara automatik meluas semasa peningkatan turun naik untuk memaksimumkan keuntungan.

Dari hasil ujian, strategi ini berfungsi dengan baik dalam pasaran lembu. Kadar kemenangan sangat tinggi dalam trend jangka panjang yang besar, dengan kitaran menguntungkan yang panjang berturut-turut.

Analisis Risiko

Risiko utama yang dihadapi oleh strategi ini adalah salah menilai pembalikan trend, yang mungkin terlepas isyarat pembalikan atau menghasilkan isyarat pembalikan yang tidak perlu.

Selain itu, stop loss yang ditetapkan terlalu luas juga boleh membawa kepada kerugian yang lebih besar.

Untuk menangani risiko-risiko ini, tempoh pengiraan ATR boleh diperpendek dengan sewajarnya atau pengganda stop loss ATR boleh diselaraskan.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Sesuaikan parameter penunjuk Super Trend untuk mengoptimumkan tempoh ATR dan kelipatan ATR untuk menjadikan garis Super Trend lebih lancar.

  2. Sesuaikan parameter penunjuk kadar perubahan harga untuk mengoptimumkan tempoh dan ambang kadar perubahan untuk mengurangkan isyarat palsu.

  3. Cuba mekanisme stop loss yang berbeza seperti stop trailing, atau mengoptimumkan amplitud stop loss stop tetap.

  4. Tambah penunjuk penilaian tambahan untuk menentukan sokongan/tahan utama dan mengelakkan penilaian yang salah mengenai pembalikan trend.

  5. Uji tetapan parameter dan kesan pada produk yang berbeza untuk mencari kombinasi parameter yang optimum.

  6. Melakukan pengoptimuman backtest untuk mencari tetapan parameter terbaik.

Kesimpulan

Secara keseluruhan, Strategi Pembalikan Harian Super Trend adalah strategi trend yang agak stabil dan boleh dipercayai. Ia menggabungkan penunjuk Super Trend dan penunjuk kadar perubahan harga untuk penapisan, yang dapat mengenal pasti arah trend jangka sederhana dan panjang dengan berkesan. Mekanisme stop loss adaptif ATR juga membolehkannya menyesuaikan diri dengan kebanyakan persekitaran pasaran. Melalui pengoptimuman lebih lanjut tetapan parameter dan penunjuk penilaian tambahan, kestabilan dan keuntungan strategi ini dapat ditingkatkan.


/*backtest
start: 2024-01-22 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Super Trend Daily BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_1 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Super Trend /////////////
_2 = input(false,  "══════ Super Trend ══════")
length = input(title="ATR Period", type=input.integer, defval=3)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=1.3)

atr = mult * atr(length)

longStop = hl2 - atr
longStopPrev = nz(longStop[1], longStop)
longStop :=  close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = hl2 + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and close > shortStopPrev ? 1 : dir == 1 and close < longStopPrev ? -1 : dir

///////////// Rate Of Change ///////////// 
_3 = input(false,  "══════ Rate of Change ══════")
source = close
roclength = input(30, "ROC Length",  minval=1)
pcntChange = input(6, "ROC % Change", minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

///////////////  Strategy  /////////////// 
long = dir == 1 and dir[1] == -1 and isMoving()
short = dir == -1 and dir[1] == 1 and isMoving()

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
_4 = input(false,  "════════ Stop Loss ═══════")
SL_type = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inp = input(6.0, title='Fixed Stop Loss %') / 100
atrLkb = input(20, minval=1, title='ATR Stop Period')
atrMult = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop1 = 0.0
longStop1 :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop1[1]
shortStop1 = 0.0
shortStop1 := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop1[1]

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L", strategy.long, when=long)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop = SL_type == "Fixed" ? long_sl : longStop1, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop = SL_type == "Fixed" ? short_sl : shortStop1, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(isMoving() ? dir == 1 ? color.lime : color.red : color.white , transp=80)

Lebih lanjut