Ini adalah strategi breakout yang didasarkan pada trend tracking. itu membeli kekuatan ketika breakout terjadi dan menjual kelemahan untuk melacak tren.
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.
Keuntungan utama dari strategi ini adalah:
Menggunakan harga tertinggi dan terendah untuk menentukan apakah tren terbalik, akurasi sangat tinggi dan sinyal palsu tidak mungkin.
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.
Sederhana dan praktis, mudah dimengerti dan digunakan.
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.
Risiko utama dari strategi ini adalah:
Risiko pembalikan tren. Strategi breakout sangat bergantung pada penilaian tren, jika salah, kerugian besar dapat dihadapi.
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.
Jika jarak stop loss yang bergerak terlalu kecil, kebisingan pasar dapat mengetuk posisi sebelum waktunya.
Solusi utama adalah:
Tambahkan filter tren, seperti indikator tambahan untuk memeriksa kebocoran palsu.
Mengoptimalkan pemilihan parameter melalui pengujian stabilitas.
Relaksasi jarak stop loss dengan tepat untuk menahan retracements yang wajar.
Arah utama optimasi untuk strategi ini adalah:
Selain harga tertinggi/terendah, indikator seperti moving average juga dapat ditambahkan untuk membuat penentuan tren lebih akurat.
Uji dan temukan kombinasi optimal untuk parameter seperti siklus harga tertinggi / terendah, faktor perkalian stop loss dll.
Sesuaikan algoritma ukuran posisi berdasarkan kondisi pasar. Misalnya, ukuran posisi yang lebih kecil ketika volatilitas (misalnya VIX) meningkat.
Tambahkan filter volume untuk konfirmasi breakout, untuk menghindari breakout palsu.
Pertimbangkan spread dan korelasi dalam memilih instrumen perdagangan. Memilih instrumen dengan varian spread kecil dan korelasi rendah dapat mengurangi risiko portofolio.
Mengoptimalkan mekanisme stop loss. Uji komposisi yang berbeda dari stop loss bergerak dan tetap untuk membuat stop loss kurang agresif.
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')