Ini adalah strategi breakout berdasarkan trend tracking. ia membeli kekuatan apabila breakout berlaku dan menjual kelemahan untuk mengesan trend.
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.
Kelebihan utama strategi ini ialah:
Penghakiman trend yang tepat. Menggunakan harga tertinggi dan terendah untuk menentukan sama ada trend terbalik, ketepatan sangat tinggi dan isyarat palsu tidak mungkin.
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.
Sederhana dan praktikal, mudah difahami dan digunakan.
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.
Risiko utama strategi ini ialah:
Risiko pembalikan trend. Strategi breakout sangat bergantung pada penilaian trend, jika ia salah, kerugian besar mungkin dihadapi.
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.
Risiko stop loss yang terlalu agresif. Jika jarak stop loss bergerak terlalu kecil, bunyi pasaran boleh mengetuk kedudukan sebelum waktunya.
Penyelesaian utama ialah:
Tambah penapis trend, seperti penunjuk tambahan untuk memeriksa penembusan palsu.
Mengoptimumkan pemilihan parameter melalui ujian untuk kestabilan.
Relaks jarak stop loss dengan sewajarnya untuk menahan retracements yang munasabah.
Arah pengoptimuman utama untuk strategi ini adalah:
Tambah lebih banyak penunjuk untuk menentukan trend. Selain harga tertinggi / terendah, penunjuk seperti purata bergerak juga boleh ditambah untuk membuat penentuan trend lebih tepat.
Mengoptimumkan tetapan parameter. Uji dan cari kombinasi optimum untuk parameter seperti kitaran harga tertinggi / terendah, faktor pengganda stop loss dan lain-lain
Sesuaikan algoritma saiz kedudukan berdasarkan keadaan pasaran. Sebagai contoh, saiz kedudukan yang lebih rendah apabila turun naik (contohnya VIX).
Tambah penapis kelantangan untuk pengesahan, untuk mengelakkan kebocoran palsu.
Pertimbangkan spread dan korelasi dalam memilih instrumen dagangan. Memilih instrumen dengan variasi spread kecil dan korelasi yang rendah dapat mengurangkan risiko portfolio.
Mengoptimumkan mekanisme stop loss. Uji komposisi yang berbeza dari kehilangan berhenti bergerak dan tetap untuk membuat kerugian berhenti kurang agresif.
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')