Strategi Trend Tracking Breakout

Penulis:ChaoZhang, Tanggal: 2024-01-22 17:21:10
Tag:

img

Gambaran umum

Ini adalah strategi breakout yang didasarkan pada trend tracking. itu membeli kekuatan ketika breakout terjadi dan menjual kelemahan untuk melacak tren.

Logika Strategi

Strategi ini terutama bergantung pada dua indikator untuk menentukan sinyal masuk dan keluar - fungsi tertinggi yang menentukan harga tertinggi selama periode tertentu, dan fungsi terendah yang menentukan harga terendah selama periode tertentu.

Ketika harga penutupan di atas harga tertinggi selama periode tertentu (parameter highPeriod), itu dianggap sebagai trend breakout naik, sehingga sinyal panjang dikeluarkan. Ketika harga penutupan di bawah harga terendah selama periode tertentu (parameter lowPeriod), itu dianggap sebagai trend breakout turun, sehingga sinyal pendek dikeluarkan.

Strategi ini juga menetapkan stop loss bergerak dan stop loss tetap. Stop loss bergerak didasarkan pada indikator ATR, yang dihitung dengan nilai ATR selama periode tertentu dikalikan dengan faktor (parameter trailingAtrMultiplier) sebagai tingkat stop loss bergerak. Stop loss tetap dihitung dengan cara yang sama berdasarkan indikator ATR.

Setelah pergi panjang atau pendek, stop loss tetap berlaku untuk bar pertama; kemudian beralih ke stop loss yang terutama bergerak. Kombinasi ini mengunci beberapa keuntungan sambil melacak tren.

Strategi ini juga menetapkan aturan untuk perhitungan ukuran posisi. Berdasarkan persentase kerugian maksimum yang dapat diterima, ekuitas akun, dll, strategi ini menghitung ukuran posisi yang sesuai. Strategi ini juga memperhitungkan jumlah instrumen perdagangan, dengan mengurangi ukuran posisi untuk setiap instrumen.

Singkatnya, ini adalah strategi trend-tracking breakout yang khas. Ini masuk ketika menilai bahwa terjadi breakout, mengunci keuntungan dan melacak tren melalui stop loss, dan keluar ketika tren berbalik.

Analisis Keuntungan

Keuntungan utama dari strategi ini adalah:

  1. Menggunakan harga tertinggi dan terendah untuk menentukan apakah tren terbalik, akurasi sangat tinggi dan sinyal palsu tidak mungkin.

  2. Ukuran posisi yang wajar dan stop loss. Pengaturan persentase kerugian maksimum, asosiasi ekuitas akun dll membuat ukuran posisi wajar, menghindari perdagangan yang berlebihan atau perdagangan yang tidak efektif. Stop loss gabungan mengunci keuntungan dan melacak pergerakan tren.

  3. Sederhana dan praktis, mudah dimengerti dan digunakan.

  4. Parameter indikator, aturan ukuran posisi dll semua menyediakan kotak input bagi pengguna untuk menyesuaikan sesuai kebutuhan.

Singkatnya, ini adalah strategi breakout yang sangat praktis. aman dan dapat diandalkan dalam penilaian, sementara desain mempertimbangkan pengendalian risiko dan pelacakan. sangat cocok untuk jangka menengah hingga panjang memegang.

Analisis Risiko

Risiko utama dari strategi ini adalah:

  1. Risiko pembalikan tren. Strategi breakout sangat bergantung pada penilaian tren, jika salah, kerugian besar dapat dihadapi.

  2. Risiko parameter yang tidak tepat. Jika parameter siklus harga tertinggi / terendah dipilih dengan buruk, tren dapat dilewatkan. Parameter ukuran posisi yang tidak benar dapat menyebabkan kerugian yang terlalu besar.

  3. Jika jarak stop loss yang bergerak terlalu kecil, kebisingan pasar dapat mengetuk posisi sebelum waktunya.

Solusi utama adalah:

  1. Tambahkan filter tren, seperti indikator tambahan untuk memeriksa kebocoran palsu.

  2. Mengoptimalkan pemilihan parameter melalui pengujian stabilitas.

  3. Relaksasi jarak stop loss dengan tepat untuk menahan retracements yang wajar.

Arahan Optimasi

Arah utama optimasi untuk strategi ini adalah:

  1. Selain harga tertinggi/terendah, indikator seperti moving average juga dapat ditambahkan untuk membuat penentuan tren lebih akurat.

  2. Uji dan temukan kombinasi optimal untuk parameter seperti siklus harga tertinggi / terendah, faktor perkalian stop loss dll.

  3. Sesuaikan algoritma ukuran posisi berdasarkan kondisi pasar. Misalnya, ukuran posisi yang lebih kecil ketika volatilitas (misalnya VIX) meningkat.

  4. Tambahkan filter volume untuk konfirmasi breakout, untuk menghindari breakout palsu.

  5. Pertimbangkan spread dan korelasi dalam memilih instrumen perdagangan. Memilih instrumen dengan varian spread kecil dan korelasi rendah dapat mengurangi risiko portofolio.

  6. Mengoptimalkan mekanisme stop loss. Uji komposisi yang berbeda dari stop loss bergerak dan tetap untuk membuat stop loss kurang agresif.

Kesimpulan

Sebagai strategi trend-tracking breakout, strategi ini berkinerja baik dalam akurasi penilaian, ukuran posisi & pengendalian risiko, kemudahan operasi dll. Ini menangkap tren lebih awal dan menyeimbangkan pengambilan keuntungan dan pelacakan melalui stop loss bergerak.

Tentu saja, sebagai strategi breakout, itu sangat bergantung pada penilaian tren dan rentan terhadap gangguan kebisingan pasar. Penyesuaian parameter yang buruk juga dapat merusak kinerja. Optimasi lebih lanjut diperlukan untuk mengatasi masalah ini.

Secara keseluruhan ini adalah strategi yang sangat praktis. Struktur dasarnya sudah berisi komponen yang paling penting untuk strategi kuantum. Dengan optimasi dan peningkatan terus menerus, ini pasti bisa menjadi strategi otomatis yang stabil dan menguntungkan. Bernilai bagi kuantum untuk dipelajari dan dirujuk.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(shorttitle="Trend Surfers - Breakout", title="Trend Surfers - Premium Breakout",
     overlay=true)

// Risk for position and pyramid
maxriskval = input(2, "Max % risk", type = input.float,
     tooltip="Risk % over total equity / Position", group = "Risk Management")
pairnumber = input(title = "How many pairs",type = input.integer, defval= 1,
     tooltip="How many pairs are you trading with the strategy?", group = "Risk Management")

// Emtry Exit
highPeriod = input(title="Highest High Period", type=input.integer, defval=168
     , tooltip="Highest High of X bars - This will trigger a Long Entry when close is above. (Thin Green Line)"
     , group = "Entry Condition")
lowPeriod = input(title="Lowest Low Period", type=input.integer, defval=168,
     tooltip="Lowest low of X bars - This will trigger a Short Entry when close is under. (Thin Red Line)"
     , group = "Entry Condition")
// Stoploss
trailingAtrPeriod = input(title="Trailing ATR Pediod", type=input.integer, defval=10,
     tooltip="Average True Range for the Trailing Stop. (Thick Green Line) "
     , group = "Exit Condition")
trailingAtrMultiplier = input(title="Trailing ATR Multiplier", type=input.float, defval=8
     , group = "Exit Condition")
fixAtrPeriod = input(title="Fix ATR Pediod", type=input.integer, defval=10,
     tooltip="Average True Range for the Fix Stoloss. (Thick Yellow Line)"
     , group = "Exit Condition")
fixAtrMultiplier = input(title="Fix ATR Multiplier", type=input.float, defval=2
     , group = "Exit Condition")
// Pair info 
pair = syminfo.basecurrency + syminfo.currency

// High Low Variable
highestHigh = highest(high, highPeriod)[1]
lowestLow = lowest(low, lowPeriod)[1]
trailingAtr = atr(trailingAtrPeriod) * trailingAtrMultiplier

// Trade Condition
longCondition = crossover(close, highestHigh) 
shortCondition = crossunder(close, lowestLow)

// Risk Variable
fixAtr = atr(fixAtrPeriod) * fixAtrMultiplier
stopvaluelong = close[1] - fixAtr[1]
stopvalueshort = close[1] + fixAtr[1]

// Position size Long
maxpossize = strategy.equity / close 
positionsizelong = ( ( ( (maxriskval/100) * strategy.equity) / (close - stopvaluelong))) 
stopperclong = ((close - stopvaluelong) / close) * 100
leveragelong = max(1, ceil(positionsizelong / maxpossize)) * 2
posperclong =  (((positionsizelong * close) / strategy.equity) *100 / leveragelong) / pairnumber
realposlong = (((posperclong / 100) * strategy.equity) * leveragelong) / close

// Position size Short
positionsizeshort = ( ( ( (maxriskval/100) * strategy.equity) / (stopvalueshort - close))) 
stoppercshort = ((close - stopvalueshort) / close) * 100
leverageshort = max(1, ceil(positionsizeshort / maxpossize)) * 2
pospercshort =  (((positionsizeshort * close) / strategy.equity) *100 / leverageshort) / pairnumber
realposshort = (((pospercshort / 100) * strategy.equity) * leverageshort) / close

// Alert Message
entry_long_message = '\nGo Long for ' + pair + 'NOW!' +
                     '\nPosition Size % =' + tostring(posperclong) +
                     '\nLeverage' + tostring(leveragelong) +
                     '\nStoploss Price =' + tostring(stopvaluelong) +
                     '\nClose any Short position that are open for ' + pair + '!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

entry_short_message ='\nGo Short for ' + pair + 'NOW!' +
                     '\nPosition Size % =' + tostring(pospercshort) +
                     '\nLeverage' + tostring(leverageshort) +
                     '\nStoploss Price =' + tostring(stopvalueshort) +
                     '\nClose any Long position that are open for ' + pair + '!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

exit_short_message = '\nExit Short for ' + pair + 'NOW!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

exit_long_message = '\nExit Long for ' + pair + 'NOW!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'
// Order
if longCondition 
    strategy.entry("Long", strategy.long, stop=highestHigh, comment="Long", qty=realposlong
     , alert_message = entry_long_message)
if shortCondition
    strategy.entry("Short", strategy.short, stop=lowestLow, comment="Short", qty=realposshort
     , alert_message = entry_short_message)

// Stoploss Trailing
longTrailing = close - trailingAtr
shortTrailing = close + trailingAtr

var longTrailingStop = 0.0
var shortTrailingStop = 999999.9

trailingStopLine = 0.0
trailingStopLine := na
fixedStopLine = 0.0
fixedStopLine := na
var inTrade = 0
if longCondition or shortCondition
    if 0 == inTrade
        if longCondition
            inTrade := 1
        else
            inTrade := -1
if 1 == inTrade and (shortCondition or low <= max(fixedStopLine[1], longTrailingStop))
    inTrade := 0
if -1 == inTrade and (longCondition or high >= min(fixedStopLine[1], shortTrailingStop))
    inTrade := 0

longTrailingStop := if (1 == inTrade)
    stopValue = longTrailing
    max(stopValue, longTrailingStop[1])
else
    0

shortTrailingStop := if (-1 == inTrade)
    stopValue = shortTrailing
    min(stopValue, shortTrailingStop[1])
else
    999999

// Fix Stoploss
firstPrice = 0.0
firstFixAtr = 0.0
firstPrice := na
firstFixAtr := na
if 0 != inTrade
    firstPrice := valuewhen(inTrade != inTrade[1] and 0 != inTrade, close, 0)
    firstFixAtr := valuewhen(inTrade != inTrade[1] and 0 != inTrade, fixAtr, 0)
    if 1 == inTrade
        fixedStopLine := firstPrice - firstFixAtr
        trailingStopLine := longTrailingStop
    else
        fixedStopLine := firstPrice + firstFixAtr
        trailingStopLine := shortTrailingStop

if (strategy.position_size > 0)
    strategy.exit(id="L Stop", stop=max(fixedStopLine, longTrailingStop)
     , alert_message = exit_long_message)

if (strategy.position_size < 0)
    strategy.exit(id="S Stop", stop=min(fixedStopLine, shortTrailingStop)
     , alert_message = exit_long_message)
    

// Plot
plot(highestHigh, color=color.green, linewidth=1, transp=0, title='Highest High')
plot(lowestLow, color=color.red, linewidth=1, transp=0, title='Lowest Low')
plot(trailingStopLine, color=color.lime, linewidth=2, transp=0, offset=1, title='Trailing Stop')
plot(fixedStopLine, color=color.orange, linewidth=2, transp=0, offset=1, title='Fixed Stop')

Lebih banyak