
Ini adalah strategi breakout berdasarkan trend tracking. Ini membeli saham dengan nilai lebih tinggi pada saat breakout terjadi dan menjual saham dengan nilai lebih rendah pada saat breakout terjadi, untuk mencapai trend tracking.
Strategi ini didasarkan pada dua indikator untuk menentukan sinyal masuk dan keluar, satu adalah harga tertinggi dalam periode tertentu yang ditentukan oleh fungsi highest () dan satu adalah harga terendah dalam periode tertentu yang ditentukan oleh fungsi lowest ()
Ketika harga penutupan lebih tinggi dari harga tertinggi di periode tertentu di masa lalu, dianggap sebagai pecahnya tren naik, maka sinyal dibuat. Ketika harga penutupan lebih rendah dari harga terendah di periode tertentu di masa lalu, dianggap sebagai pecahnya tren turun, maka sinyal dibuat.
Strategi ini menetapkan stop loss bergerak dan stop loss tetap pada saat yang sama. Stop loss bergerak didasarkan pada indikator ATR, dengan menghitung nilai ATR dalam periode tertentu, dan mengalikannya dengan kelipatan (parameter trailingAtrMultiplier) sebagai stop loss bergerak.
Setelah melakukan lebih banyak shorting pada K-line pertama, stop loss tetap berlaku; setelah itu beralih ke stop loss bergerak. Kombinasi ini dapat mengunci sebagian keuntungan sambil mengikuti tren.
Strategi ini juga menetapkan aturan perhitungan posisi. Posisi dihitung berdasarkan persentase kerugian maksimum yang dapat ditanggung, kepentingan akun, dan sebagainya.
Secara keseluruhan, ini adalah strategi tipe trend-following yang khas, yang masuk ke dalam permainan saat memutuskan bahwa ada penembusan, mengunci keuntungan dengan cara berhenti dan mengikuti tren, dan keluar dari permainan saat tren berbalik.
Ini adalah strategi terobosan yang memiliki keuntungan utama:
Pengertian tren yang akurat. Menggunakan harga tertinggi dan harga terendah untuk menilai apakah tren berbalik, akurasi yang tinggi, tidak mudah untuk mengirimkan sinyal yang salah.
Posisi dan Stop Loss Science adalah wajar. Penetapan rasio kerugian maksimum, hubungan hak dan kepentingan akun, dan lain-lain membuat posisi masuk akal, menghindari perdagangan yang berlebihan atau tidak valid.
Sederhana, praktis, dan mudah dimengerti. Anda hanya perlu menggunakan indikator yang paling mendasar, logika strategi sederhana, jelas, dan mudah dikuasai.
Skalabilitas yang baik. Parameter indikator, aturan posisi, dan lain-lain menyediakan kotak input, yang dapat disesuaikan dengan kebutuhan pengguna.
Secara keseluruhan, ini adalah strategi penembusan yang sangat praktis. Aman dan dapat diandalkan dalam penghakiman, dan strategi ini dirancang dengan mempertimbangkan pengendalian dan pelacakan risiko. Sangat cocok untuk kepemilikan jangka panjang.
Risiko utama dari strategi ini adalah:
Risiko terbaliknya tren. Strategi penembusan sangat bergantung pada penilaian tren, dan jika salah, kemungkinan besar akan mengalami kerugian besar.
Parameter yang tidak tepat adalah risiko. Pilihan yang tidak tepat dari parameter siklus harga tertinggi dan terendah dapat melewatkan tren, dan parameter posisi yang tidak tepat dapat menyebabkan kerugian yang terlalu besar.
Stop loss adalah risiko yang terlalu radikal. Jika stop loss bergerak terlalu jauh, Anda mungkin akan tersingkir oleh kebisingan pasar.
Solusi utama adalah:
Menambahkan filter tren. Misalnya, menambahkan penilaian indikator lain untuk menghindari kesalahan penembusan.
Optimalkan pilihan parameter. Uji parameter untuk memilih nilai yang optimal, memastikan stabilitasnya.
Jarak hambatan dapat dilepaskan secara tepat. Jarak hambatan dapat menerima regresi tertentu.
Strategi ini dapat dioptimalkan dengan cara:
Menambahkan lebih banyak indikator untuk menilai tren. Selain harga tertinggi dan terendah, penilaian seperti moving averages dapat ditambahkan untuk membuat penilaian tren lebih akurat.
Optimalkan pengaturan parameter. Uji parameter siklus harga minimum tertinggi, parameter stop loss, dan lain-lain untuk memilih kombinasi parameter yang optimal.
Berdasarkan algoritma penyesuaian posisi pasar. Dapat membuat posisi terkait dengan volatilitas pasar, seperti penurunan posisi saat VIX naik.
Meningkatkan filter indikator kapasitas. Masuk hanya dalam penembusan yang meningkatkan kapasitas, menghindari penembusan palsu.
Pertimbangkan varietas preferensial yang diperdagangkan dengan baseline dan relevansi. Pilih kombinasi varietas dengan baseline yang rendah dan kurang relevansi untuk mengurangi risiko kombinasi.
Mengoptimalkan dan menyesuaikan mekanisme stop loss. Dapat menguji kombinasi rasio stop loss bergerak dan tetap, mengurangi risiko stop loss terlalu radikal.
Strategi ini berfungsi sebagai strategi penembusan jenis trend tracking, dengan kinerja yang baik dalam hal akurasi penilaian, posisi dan kontrol risiko, dan kemudahan operasi. Strategi ini menangkap tren lebih awal, menyeimbangkan penguncian keuntungan dan pelacakan tren dengan stop loss bergerak.
Tentu saja sebagai strategi terobosan, sangat bergantung pada penilaian tren dan mudah terganggu oleh kebisingan. Selain itu, pengaturan parameter yang tidak tepat juga dapat mempengaruhi kinerja strategi. Ini perlu diselesaikan dengan optimasi lebih lanjut.
Secara keseluruhan, ini adalah strategi yang sangat praktis, dan struktur dasarnya sudah mencakup elemen paling penting yang dibutuhkan oleh strategi kuantitatif. Jika dapat terus dioptimalkan dan ditingkatkan, itu benar-benar dapat menjadi strategi program yang stabil dan menguntungkan.
/*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')