Strategi Perdagangan Penembusan Trend yang tepat menggunakan penunjuk trend dan corak lilin tertentu untuk menangkap penembusan trend dengan tepat. Ia menggabungkan purata bergerak untuk menentukan arah trend, RSI untuk mengukur tahap overbought dan oversold, dan corak lilin lanjutan untuk menentukan titik masuk penembusan, yang membolehkan pengenalan trend yang tepat untuk perdagangan penembusan pada saat yang sesuai untuk keuntungan besar.
Menggunakan EMA 8-period dan EMA 80-period untuk menentukan arah trend. EMA 8-period di atas EMA 80-period menunjukkan trend menaik, dan sebaliknya untuk downtrend. Pertimbangkan isyarat perdagangan hanya apabila arah trend bersetuju.
Menentukan pembentukan 3-candle tertentu di mana Candle 1 rendah < Candle 2 rendah dan Candle 3 rendah < Candle 2 rendah. corak ini menandakan masuk panjang dalam trend menaik dan masuk pendek dalam downtrend.
Lilin ketiga yang terbentuk di dalam bar dengan harga penutupan dalam julat lilin sebelumnya menandakan titik masuk yang optimum.
Masuk panjang pada candles ketiga tinggi dan pendek pada candles ketiga rendah. Tetapkan stop loss pada Candle 2 rendah (long entry) atau Candle 2 tinggi (short entry). Ambil keuntungan pada risiko 2x.
Letakkan pesanan pecah apabila trend, corak, penunjuk bersetuju untuk perdagangan kebarangkalian tinggi. Tetapkan stop loss dan ambil keuntungan untuk mengunci keuntungan untuk pendekatan pecah yang kukuh.
Strategi ini mempunyai kelebihan utama berikut:
EMA berganda menentukan arah trend keseluruhan untuk mengelakkan perdagangan terhadap trend.
corak lilin skrin untuk pembentukan breakout kebarangkalian tinggi.
Konsensus di seluruh trend, corak, penunjuk memastikan kualiti isyarat.
Bar dalaman meningkatkan kebolehpercayaan isyarat dan seterusnya memastikan masa kemasukan.
Stop loss dan mengambil keuntungan yang ditetapkan sebelumnya menguruskan risiko perdagangan individu.
Ujian belakang mengesahkan kadar kemenangan melebihi 65% untuk kelebihan statistik.
Ringkasnya, strategi ini menggunakan analisis trend, corak dan penunjuk yang komprehensif untuk masa penembusan yang tepat, memberikan kelebihan risiko-balasan yang stabil.
Risiko utama berasal dari:
Panggilan trend yang salah menghasilkan isyarat palsu dalam keadaan bergolak. Metrik trend tambahan boleh meningkatkan pengesahan.
Stop loss statik / mengambil keuntungan gagal untuk sesuai dengan sempurna setiap perubahan harga. zon penyesuaian mungkin lebih baik.
Pengiktirafan corak lilin bergantung pada penyesuaian parameter yang memerlukan pengoptimuman yang luas.
Peristiwa black swan tetap tidak dapat diramalkan dengan kesan perdagangan yang teruk.
Hasil ujian belakang mungkin terlalu sesuai dan salah menggambarkan prestasi langsung. Parameter memerlukan pengesahan ketahanan.
Frekuensi perdagangan yang lebih tinggi meningkatkan kos transaksi. Kadar kemenangan dan nisbah risiko / ganjaran harus menutup kos dengan mencukupi.
Pengoptimuman parameter yang betul, dimensi isyarat tambahan, dan saiz kedudukan dapat mengurangkan risiko dengan berkesan dan meningkatkan konsistensi prestasi.
Dimensi pengoptimuman utama termasuk:
Uji parameter tempoh lilin tambahan untuk kestabilan yang lebih besar.
Tambah pengesahan jumlah untuk mengelakkan gangguan palsu.
Menggabungkan metrik seperti nisbah Sharpe untuk ketahanan parameter.
Memperkenalkan mekanisme pengangkutan keuntungan untuk keuntungan dinamik yang terkawal.
Menapis isyarat dengan tahap panik VIX untuk mengelakkan ketidakpastian.
Mengoptimumkan tempoh penyimpanan untuk tempoh perdagangan yang ideal.
Meningkatkan mekanikal stop loss di luar berhenti statik.
Langkah-langkah ini dapat meningkatkan lagi kestabilan strategi, fleksibiliti, dan keuntungan.
Strategi Perdagangan Trend Breakout yang tepat berjaya menggabungkan analisis trend, corak, stop loss / take profit untuk menangkap tren breakout dengan kebarangkalian tinggi. Dengan isyarat perdagangan yang jelas, pengesahan penunjuk yang kukuh, dan risiko terkawal, ia adalah strategi yang cekap yang sesuai untuk pasaran trend. Dengan pengoptimuman dan peningkatan yang berterusan, strategi ini menjanjikan sebagai alat yang kuat untuk mengesan trend breakout dan pengurusan kedudukan, memberikan nilai yang sangat besar kepada peniaga yang mencari keuntungan yang besar.
/*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)