Strategi Penembusan Pengesanan Trend

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

img

Ringkasan

Ini adalah strategi breakout berdasarkan trend tracking. ia membeli kekuatan apabila breakout berlaku dan menjual kelemahan untuk mengesan trend.

Logika Strategi

Strategi ini terutamanya bergantung kepada dua penunjuk untuk menentukan isyarat masuk dan keluar - fungsi tertinggi yang menentukan harga tertinggi dalam tempoh tertentu, dan fungsi terendah yang menentukan harga terendah dalam tempoh tertentu.

Apabila harga penutupan di atas harga tertinggi dalam tempoh tertentu (parameter highPeriod), ia dianggap sebagai penutupan trend menaik, jadi isyarat panjang dikeluarkan. Apabila harga penutupan di bawah harga terendah dalam tempoh tertentu (parameter lowPeriod), ia dianggap sebagai penutupan trend menurun, jadi isyarat pendek dikeluarkan.

Strategi ini juga menetapkan stop loss bergerak dan stop loss tetap. Stop loss bergerak adalah berdasarkan penunjuk ATR, dikira oleh nilai ATR dalam tempoh tertentu didarabkan dengan faktor (parameter trailingAtrMultiplier) sebagai tahap stop loss bergerak. Stop loss tetap dikira dengan cara yang sama berdasarkan penunjuk ATR.

Selepas pergi panjang atau pendek, stop loss tetap berkuat kuasa untuk bar pertama; kemudian ia beralih ke stop loss bergerak terutamanya.

Strategi ini juga menetapkan peraturan untuk pengiraan saiz kedudukan. Berdasarkan peratusan kerugian maksimum yang boleh diterima, ekuiti akaun dan lain-lain, ia mengira saiz kedudukan yang sesuai. Ia juga mengambil kira bilangan instrumen dagangan, mengurangkan saiz kedudukan untuk setiap instrumen.

Ringkasnya, ini adalah strategi breakout trend-tracking yang tipikal. Ia memasuki apabila ia menilai penembusan telah berlaku, mengunci keuntungan dan mengesan trend melalui stop loss, dan keluar apabila trend berbalik.

Analisis Kelebihan

Kelebihan utama strategi ini ialah:

  1. Penghakiman trend yang tepat. Menggunakan harga tertinggi dan terendah untuk menentukan sama ada trend terbalik, ketepatan sangat tinggi dan isyarat palsu tidak mungkin.

  2. Saiz kedudukan yang munasabah dan stop loss. Tetapan peratusan kerugian maksimum, persatuan ekuiti akaun dan lain-lain menjadikan saiz kedudukan munasabah, mengelakkan perdagangan yang berlebihan atau perdagangan yang tidak berkesan. Stop loss gabungan mengunci keuntungan dan mengesan pergerakan trend.

  3. Sederhana dan praktikal, mudah difahami dan digunakan.

  4. Parameter penunjuk, peraturan ukuran kedudukan dan lain-lain semua menyediakan kotak input untuk pengguna menyesuaikan mengikut keperluan.

Ringkasnya, ini adalah strategi breakout yang sangat praktikal. selamat dan boleh dipercayai dalam pertimbangan, manakala reka bentuk mengambil kira kawalan risiko dan penjejakan. sangat sesuai untuk memegang jangka menengah hingga panjang.

Analisis Risiko

Risiko utama strategi ini ialah:

  1. Risiko pembalikan trend. Strategi breakout sangat bergantung pada penilaian trend, jika ia salah, kerugian besar mungkin dihadapi.

  2. Risiko parameter yang tidak betul. Jika parameter kitaran harga tertinggi / terendah dipilih dengan buruk, trend boleh terlepas. Parameter saiz kedudukan yang tidak betul boleh menyebabkan kerugian yang berlebihan.

  3. Risiko stop loss yang terlalu agresif. Jika jarak stop loss bergerak terlalu kecil, bunyi pasaran boleh mengetuk kedudukan sebelum waktunya.

Penyelesaian utama ialah:

  1. Tambah penapis trend, seperti penunjuk tambahan untuk memeriksa penembusan palsu.

  2. Mengoptimumkan pemilihan parameter melalui ujian untuk kestabilan.

  3. Relaks jarak stop loss dengan sewajarnya untuk menahan retracements yang munasabah.

Arahan pengoptimuman

Arah pengoptimuman utama untuk strategi ini adalah:

  1. Tambah lebih banyak penunjuk untuk menentukan trend. Selain harga tertinggi / terendah, penunjuk seperti purata bergerak juga boleh ditambah untuk membuat penentuan trend lebih tepat.

  2. Mengoptimumkan tetapan parameter. Uji dan cari kombinasi optimum untuk parameter seperti kitaran harga tertinggi / terendah, faktor pengganda stop loss dan lain-lain

  3. Sesuaikan algoritma saiz kedudukan berdasarkan keadaan pasaran. Sebagai contoh, saiz kedudukan yang lebih rendah apabila turun naik (contohnya VIX).

  4. Tambah penapis kelantangan untuk pengesahan, untuk mengelakkan kebocoran palsu.

  5. Pertimbangkan spread dan korelasi dalam memilih instrumen dagangan. Memilih instrumen dengan variasi spread kecil dan korelasi yang rendah dapat mengurangkan risiko portfolio.

  6. Mengoptimumkan mekanisme stop loss. Uji komposisi yang berbeza dari kehilangan berhenti bergerak dan tetap untuk membuat kerugian berhenti kurang agresif.

Kesimpulan

Sebagai strategi trend-tracking breakout, strategi ini berfungsi dengan baik dalam ketepatan penghakiman, saiz kedudukan & kawalan risiko, kemudahan operasi dan lain-lain. Ia menangkap trend awal dan menyeimbangkan pengambilan keuntungan dan penjejakan melalui pergerakan stop loss.

Sudah tentu, sebagai strategi pecah, ia sangat bergantung pada penilaian trend dan terdedah kepada gangguan bunyi pasaran. Penyesuaian parameter yang tidak baik juga boleh melemahkan prestasi. Pengoptimuman lanjut diperlukan untuk menangani masalah ini.

Secara keseluruhan ini adalah strategi yang sangat praktikal. Struktur asasnya sudah mengandungi komponen yang paling penting untuk strategi kuant. Dengan pengoptimuman dan peningkatan yang berterusan, ia pasti boleh menjadi strategi automatik yang stabil dan menguntungkan. Bernilai untuk kajian dan rujukan kuant.


/*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 lanjut