
Strategi perdagangan penembusan trend tepat berdasarkan indikator trend dan bentuk garis K tertentu, untuk menangkap kecenderungan penembusan dengan tepat. Strategi ini menggunakan garis rata untuk menilai arah trend, indikator RSI untuk menilai overbought dan oversold, dan menggabungkan bentuk garis K yang tinggi untuk memilih titik penembusan, untuk menentukan lokasi trend, melakukan perdagangan penembusan pada masa yang sesuai, dan memperoleh keuntungan tambahan.
Menggunakan EMA 8 hari dan EMA 80 hari untuk menentukan arah trend. EMA 8 hari di atas EMA 80 hari ditakrifkan sebagai bullish, sebaliknya sebagai bearish.
Mendefinisikan bentuk gabungan tertentu dari tiga garis K, iaitu titik terendah garis K pertama adalah lebih rendah daripada yang kedua, dan titik terendah garis K ketiga adalah lebih rendah daripada yang kedua. Bentuk ini muncul sebagai isyarat beli ketika berada dalam trend naik.
Garis K ketiga menjadi Garis K dalaman, iaitu apabila harga penutupan berada di dalam Garis K sebelumnya, sebagai titik isyarat terbaik. Pada masa ini bentuk 123 dapat diletakkan secara langsung pada komisen perdagangan.
Harga komisen adalah ketinggian K baris ketiga ((beli) atau ketinggian K baris ketiga ((jual) Stop loss adalah ketinggian K baris kedua ((beli) atau ketinggian K baris kedua ((jual) Stop loss adalah dua kali ganda perbezaan harga risiko
Apabila trend, bentuk, dan syarat penunjuk telah dicapai, letakkan komisen penembusan, lakukan perdagangan dengan kebarangkalian tinggi. Dan letakkan hentian kerugian untuk mengunci keuntungan, untuk operasi penembusan yang stabil.
Strategi ini mempunyai kelebihan yang ketara:
Menggunakan EMA ganda untuk menentukan arah trend besar dan mengelakkan dagangan berlawanan arah.
K linear bentuk penyaringan mempunyai bentuk yang penting, meningkatkan kebarangkalian keuntungan.
Isyarat hanya dikeluarkan apabila trend, bentuk, dan perbezaan harga sesuai, untuk memastikan kualiti isyarat.
Bentuk K-line dalaman meningkatkan kebolehpercayaan isyarat dan mengunci masa perdagangan lebih jauh.
Tetapkan titik penangguhan stop loss untuk mengawal risiko perdagangan individu secara berkesan.
Data yang disahkan, kemenangan melebihi 65%, dengan kelebihan statistik untuk keuntungan jangka panjang.
Secara keseluruhannya, strategi ini memanfaatkan penilaian komprehensif mengenai trend, bentuk dan petunjuk untuk menentukan tepat masa perdagangan terobosan, dengan kelebihan risiko dan keuntungan yang stabil.
Risiko utama dari strategi ini adalah:
Kesilapan dalam menilai trend, menghasilkan isyarat yang salah dalam keadaan gegaran. Anda boleh memperkenalkan lebih banyak penunjuk trend untuk pengesahan pelbagai dimensi.
Satu-satunya kaedah penangguhan kerugian tidak sesuai dengan setiap keadaan. Anda boleh menetapkan titik penangguhan kerugian terapung.
Pengiktirafan K-Line bergantung pada tetapan parameter, yang memerlukan pengoptimuman berulang untuk mencari kombinasi terbaik.
Tidak dapat meramalkan kesan kepada perdagangan apabila berlaku peristiwa Black Swan yang besar.
Data pengesanan semula tidak dapat mewakili prestasi perdagangan sebenar, terdapat risiko overfit. Parameter yang kuat harus disahkan dengan ketat.
Kos dagangan akan memberi kesan yang besar kepada strategi perdagangan frekuensi tinggi. Anda harus memastikan bahawa kadar kemenangan dan kerugian anda cukup untuk menyokong kos.
Secara keseluruhan, strategi ini dapat mengurangkan risiko dan meningkatkan kestabilan prestasi dengan mengoptimumkan konfigurasi parameter, memperkenalkan lebih banyak dimensi penghakiman, dan mengawal saiz kedudukan.
Strategi ini masih mempunyai beberapa dimensi yang boleh dioptimumkan:
Uji lebih banyak parameter kitaran K untuk menentukan kombinasi parameter yang lebih stabil.
Menambah penunjuk jumlah transaksi untuk pengesahan pelbagai dimensi, mengelakkan penembusan palsu.
Meningkatkan parameter penilaian kecergasan seperti kadar Sharp, kadar keuntungan dan kerugian.
Memperkenalkan mekanisme pengesanan yang boleh dikendalikan untuk menjana keuntungan yang dinamik.
Berpadu dengan Indeks Kecemasan VIX, mengelakkan tempoh ketidakpastian pasaran.
Uji parameter kitaran pegangan yang berbeza untuk menentukan jangka masa pegangan yang optimum.
Optimumkan mekanisme hentian kerugian untuk mengelakkan hentian statik yang terlalu padat.
Dengan cara ini, kita dapat meningkatkan lagi kestabilan, kelenturan dan keuntungan strategi.
Strategi perdagangan penembusan trend yang tepat berjaya menggunakan kombinasi organik trend, bentuk dan penghentian kerugian untuk menangkap peluang tinggi untuk penembusan trend. Ia mempunyai ciri-ciri isyarat perdagangan yang jelas, pengesahan pelbagai indikator, risiko yang boleh dikawal, merupakan strategi yang berkesan untuk tingkah laku yang berpihak kepada trend. Dengan terus mengoptimumkan dan menyempurnakan, strategi ini dijangka menjadi alat yang kuat untuk mengikuti trend untuk menguruskan kedudukan penembusan.
/*backtest
start: 2022-11-01 00:00:00
end: 2023-10-14 05:20:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © julianossilva
//@version=5
strategy(title="J2S Backtest: 123-Stormer Strategy",
shorttitle="J2S Backtest: 123-Stormer Strategy",
overlay=true, initial_capital=1000, default_qty_value=10,
default_qty_type = strategy.percent_of_equity, pyramiding=0)
// Initial Backtest Date Range
useStartDate = timestamp("01 Jan 2020 21:00:00")
useEndDate = timestamp("01 Jan 2023 21:00:00")
// User Inputs
SIGNAL_CONFIG = "BACKTEST: STORMER STRATEGY (123)"
longEntryInput = input.bool(defval=true, title="Long Entry", group=SIGNAL_CONFIG)
shortEntryInput = input.bool(defval=true, title="Short entry", group=SIGNAL_CONFIG)
thresholdForEntryInput = input.int(defval=3, title="Threshold on clandes for entry", group=SIGNAL_CONFIG)
insideBarStrategyTitle = "Only third candle inside bar is valid"
insideBarStrategyTip = "According to Stomer, it would be the best signal for the strategy"
insideBarStrategyInput = input.bool(defval=true, title=insideBarStrategyTitle, group=SIGNAL_CONFIG, tooltip=insideBarStrategyTip)
EMA_CONFIG = "BACKTEST: EXPONENTIAL MOVING AVERAGES"
sourceInput = input.source(defval=close, title="Source", inline="01", group=EMA_CONFIG)
emaTimeframeInput = input.timeframe("1W", title="Timeframe", inline="01", group=EMA_CONFIG)
emaOffsetInput = input.int(defval=8, title="Offset", inline="01", group=EMA_CONFIG)
fastEMALengthInput = input.int(defval=8, title="Fast EMA Length", inline="02", group=EMA_CONFIG)
useFastEMAInput = input.bool(defval=true, title="Use Fast EMA", inline="02", group=EMA_CONFIG)
slowEMALengthInput = input.int(defval=80, title="Slow EMA Length", inline="03", group=EMA_CONFIG)
useSlowEMAInput = input.bool(defval=true, title="Use Slow EMA", inline="03", group=EMA_CONFIG)
PERIOD_CONFIG = "BACKTEST: TIME PERIOD"
useDateFilterInput = input.bool(defval=true, title="Filter Date Range of Backtest", group=PERIOD_CONFIG)
backtestStartDateInput = input(defval=useStartDate, title="Start Date", group=PERIOD_CONFIG)
backtestEndDateInput = input(defval=useEndDate, title="End Date", group=PERIOD_CONFIG)
// Colors
bbBackgroundColor = color.rgb(33, 150, 243, 90)
candleColorDown = color.rgb(239, 83, 80, 80)
candleColorUp = color.rgb(38, 166, 154, 70)
insideBarColorDown = color.rgb(239, 83, 80, 40)
insideBarColorUp = color.rgb(38, 166, 154, 20)
downTrendColor = color.rgb(239, 83, 80, 80)
sidewaysTrendColor = color.rgb(252, 232, 131, 80)
upTrendColor = color.rgb(38, 166, 154, 80)
buySignalColor = color.lime
sellSignalColor = color.orange
// Candles
isCandleUp() => close > open
isCandleDown() => close <= open
barcolor(isCandleUp() ? candleColorUp : isCandleDown() ? candleColorDown : na)
// Exponential Moving Averages
fastEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, fastEMALengthInput), barmerge.gaps_on, barmerge.lookahead_on)
currentFastEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, fastEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on)
previousFastEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput[1], fastEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on)
slowEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, slowEMALengthInput), barmerge.gaps_on, barmerge.lookahead_on)
currentSlowEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, slowEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on)
previousSlowEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput[1], slowEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on)
// Trend Rules for Exponential Moving Averages
isSlowEMAUp() => currentSlowEMA > previousSlowEMA
isSlowEMADown() => currentSlowEMA < previousSlowEMA
isFastEMAUp() => currentFastEMA > previousFastEMA
isFastEMADown() => currentFastEMA < previousFastEMA
// Exponential Moving Average Colors
fastEMAColor = isFastEMAUp() ? upTrendColor : isFastEMADown() ? downTrendColor : sidewaysTrendColor
slowEMAColor = isSlowEMAUp() ? upTrendColor : isSlowEMADown() ? downTrendColor : sidewaysTrendColor
// Display Exponential Moving Averages
plot(useFastEMAInput ? fastEMA : na, offset=emaOffsetInput, color=fastEMAColor, title="Fast EMA", style=plot.style_line, linewidth=4)
plot(useSlowEMAInput ? slowEMA : na, offset=emaOffsetInput, color=slowEMAColor, title="Slow EMA", style=plot.style_line, linewidth=7)
// Price Trend
pricesAboveFastEMA() => low[2] > currentFastEMA and low[1] > currentFastEMA and low > currentFastEMA
pricesAboveSlowEMA() => low[2] > currentSlowEMA and low[1] > currentSlowEMA and low > currentSlowEMA
pricesBelowFastEMA() => high[2] < currentFastEMA and high[1] < currentFastEMA and high < currentFastEMA
pricesBelowSlowEMA() => high[2] < currentSlowEMA and high[1] < currentSlowEMA and high < currentSlowEMA
// Market in Bullish Trend
isBullishTrend() =>
if useFastEMAInput and useSlowEMAInput
pricesAboveFastEMA() and pricesAboveSlowEMA()
else if useFastEMAInput
pricesAboveFastEMA()
else if useSlowEMAInput
pricesAboveSlowEMA()
else
na
// Market in Bearish Trend
isBearishTrend() =>
if useFastEMAInput and useSlowEMAInput
pricesBelowFastEMA() and pricesBelowSlowEMA()
else if useFastEMAInput
pricesBelowFastEMA()
else if useSlowEMAInput
pricesBelowSlowEMA()
else
na
// Stormer Strategy (123)
isFirstCandleUp() => high[2] > high[1] and low[2] > low[1]
isFirstCandleDown() => high[2] < high[1] and low[2] < low[1]
isThirdCandleUp() => low > low[1]
isThirdCandleDown() => high < high[1]
isThirdCandleInsideBar() => high < high[1] and low > low[1]
// Buy Signal
isStormer123Buy() =>
if insideBarStrategyInput
longEntryInput and isFirstCandleUp() and isThirdCandleInsideBar() and isBullishTrend()
else
longEntryInput and isFirstCandleUp() and isThirdCandleUp() and isBullishTrend()
// Sell Signal
isStormer123Sell() =>
if insideBarStrategyInput
shortEntryInput and isFirstCandleDown() and isThirdCandleInsideBar() and isBearishTrend()
else
shortEntryInput and isFirstCandleDown() and isThirdCandleDown() and isBearishTrend()
// Backtest Time Period
inTradeWindow = true
isInTradeWindow() => inTradeWindow
isBacktestDateRangeOver() => not inTradeWindow and inTradeWindow[1]
// Backtest Price Parameters
highestPrice = ta.highest(high, 3)
lowestPrice = ta.lowest(low,3)
priceRange = highestPrice - lowestPrice
// Stormer Strategy (123): LONG
var myLongOrders = array.new_int(0)
longtEntryID = "Long Entry:\n" + str.tostring(bar_index)
longExitID = "Long Exit:\n" + str.tostring(bar_index)
stopLossInLong = lowestPrice + 0.01
takeProfitInLong = priceRange + high
longEntryHasBeenMet = isInTradeWindow() and isBullishTrend() and isStormer123Buy()
// Scheduling LONG entry
if longEntryHasBeenMet
array.push(myLongOrders, bar_index)
strategy.order(longtEntryID, strategy.long, stop=high)
strategy.exit(longExitID, longtEntryID, stop=stopLossInLong, limit=takeProfitInLong)
// In pine script, any order scheduled but not yet filled can be canceled.
// Once a order is filled, the trade is only finished with use of close or exit functions.
// As scheduled orders are not stored in the strategy.opentrades array, manual control is required.
for myOrderIndex = 0 to (array.size(myLongOrders) == 0 ? na : array.size(myLongOrders) - 1)
myLongOrder = array.get(myLongOrders, myOrderIndex)
if bar_index - myLongOrder == thresholdForEntryInput
longEntryID = "Long Entry:\n" + str.tostring(myLongOrder)
strategy.cancel(longEntryID)
// Stormer Strategy (123): SHORT
var myShortOrders = array.new_int(0)
shortEntryID = "Short Entry:\n" + str.tostring(bar_index)
shortExitID = "Short Exit:\n" + str.tostring(bar_index)
stopLossInShort = highestPrice + 0.01
takeProfitInShort = low - priceRange
shortEntryHasBeenMet = isInTradeWindow() and isBearishTrend() and isStormer123Sell()
// Scheduling SHORT entry
if shortEntryHasBeenMet
array.push(myShortOrders, bar_index)
strategy.order(shortEntryID, strategy.short, stop=low)
strategy.exit(shortExitID, shortEntryID, stop=stopLossInShort, limit=takeProfitInShort)
// In pine script, any order scheduled but not yet filled can be canceled.
// Once a order is filled, the trade is only finished with use of close or exit functions.
// As scheduled orders are not stored in the strategy.opentrades array, manual control is required.
for myOrderIndex = 0 to (array.size(myShortOrders) == 0 ? na : array.size(myShortOrders) - 1)
myShortOrder = array.get(myShortOrders, myOrderIndex)
if bar_index - myShortOrder == thresholdForEntryInput
shortEntryID := "Short Entry:\n" + str.tostring(myShortOrder)
strategy.cancel(shortEntryID)
// Close all positions at the end of the backtest period
if isBacktestDateRangeOver()
strategy.cancel_all()
strategy.close_all(comment="Date Range Exit")
// Display Signals
plotshape(series=longEntryHasBeenMet, title="123 Buy", style=shape.triangleup, location=location.belowbar, color=buySignalColor, text="123", textcolor=buySignalColor)
plotshape(series=shortEntryHasBeenMet, title="123 Sell", style=shape.triangledown, location=location.abovebar, color=sellSignalColor, text="123", textcolor=sellSignalColor)