Strategi Pembalikan Tren Super Harian

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

img

Gambaran umum

Super Trend Daily Reversal Strategy adalah strategi perdagangan kuantitatif yang menggunakan indikator Super Trend untuk menentukan tren pasar, menggabungkan price breakthrough dan average true range untuk menghitung stop loss, dan menggunakan indikator tingkat perubahan harga untuk menyaring sinyal Super Trend. Strategi ini cocok untuk jangka waktu harian dan lebih tinggi dan dapat digunakan di pasar seperti cryptocurrency dan saham.

Logika Strategi

Indikator inti dari strategi ini adalah indikator Super Trend. Indikator Super Trend didasarkan pada Average True Range (ATR) dan dapat lebih jelas menentukan arah tren pasar. Pemecahan rel atas Super Trend adalah sinyal pendek, dan pemecahan rel bawah adalah sinyal panjang.

Strategi ini menggunakan indikator Rate Price Change (ROC) untuk menyaring indikator Super Trend untuk menghindari sinyal yang tidak valid.

Untuk stop loss, strategi menyediakan dua metode stop loss: persentase stop loss tetap dan stop loss adaptif berbasis ATR. Stop loss tetap sederhana dan langsung.

Kondisi masuk adalah pembalikan indikator Super Trend dan indikator tingkat perubahan harga melewati filter. Kondisi keluar adalah bahwa Super Trend membalik lagi atau menembus garis stop loss. Strategi ini mematuhi prinsip pelacakan tren dan hanya memungkinkan satu posisi di setiap arah.

Analisis Keuntungan

Keuntungan terbesar dari strategi ini adalah bahwa indikator Super Trend memiliki kejelasan dan stabilitas yang lebih tinggi dalam menilai arah tren dibandingkan dengan rata-rata bergerak biasa, dengan lebih sedikit kebisingan.

Mekanisme stop loss adaptif ATR juga memungkinkan strategi untuk beradaptasi dengan lingkungan pasar yang lebih luas. Stop loss akan secara otomatis meluas selama peningkatan volatilitas untuk memaksimalkan keuntungan.

Dari hasil pengujian, strategi ini berkinerja sangat baik di pasar bull. tingkat kemenangan sangat tinggi dalam tren jangka panjang yang signifikan, dengan siklus menguntungkan berturut-turut yang panjang.

Analisis Risiko

Risiko utama yang dihadapi oleh strategi ini adalah penilaian yang salah tentang pembalikan tren, yang dapat melewatkan sinyal pembalikan atau menghasilkan sinyal pembalikan yang tidak perlu.

Selain itu, stop loss yang diatur terlalu lebar juga dapat menyebabkan kerugian yang lebih besar.

Untuk mengatasi risiko-risiko ini, periode perhitungan ATR dapat diperpendek dengan tepat atau pengganda stop loss ATR disesuaikan. indikator tambahan juga dapat ditambahkan untuk menentukan area pendukung/resistensi utama untuk menghindari sinyal yang menyesatkan dari area tersebut.

Arahan Optimasi

Strategi dapat dioptimalkan dalam aspek berikut:

  1. Sesuaikan parameter indikator Super Trend untuk mengoptimalkan periode ATR dan kelipatan ATR untuk membuat garis Super Trend lebih halus.

  2. Sesuaikan parameter indikator tingkat perubahan harga untuk mengoptimalkan periode dan ambang tingkat perubahan untuk mengurangi sinyal palsu.

  3. Cobalah mekanisme stop loss yang berbeda seperti trailing stop, atau optimalkan amplitudo stop loss dari fixed stop.

  4. Tambahkan indikator penilaian tambahan untuk menentukan support/resistance utama dan menghindari penilaian yang salah tentang pembalikan tren.

  5. Uji pengaturan parameter dan efek pada produk yang berbeda untuk menemukan kombinasi parameter yang optimal.

  6. Melakukan optimasi backtest untuk menemukan pengaturan parameter terbaik.

Kesimpulan

Secara keseluruhan, Super Trend Daily Reversal Strategy adalah strategi trend yang relatif stabil dan dapat diandalkan. Ini menggabungkan indikator Super Trend dan indikator tingkat perubahan harga untuk penyaringan, yang dapat secara efektif mengidentifikasi arah tren jangka menengah dan panjang. Mekanisme stop loss adaptif ATR juga memungkinkan untuk beradaptasi dengan sebagian besar lingkungan pasar. Melalui pengoptimalan lebih lanjut pengaturan parameter dan indikator penilaian tambahan, stabilitas dan profitabilitas 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 banyak