
Strategi pertarungan berganda adalah strategi kuantiti tinggi yang direka khas untuk perdagangan jangka masa rendah. Ia menggunakan sistem penilaian berasaskan mata yang komprehensif, menggabungkan indikator teknikal yang dioptimumkan, analisis tingkah laku harga dan pengenalan corak pembalikan untuk menghasilkan isyarat perdagangan yang tepat. Inovasi utama strategi ini adalah dengan memperkenalkan mekanisme penilaian ganda yang unik, yang mengiktiraf dasar yang berayun melalui sistem penilaian masuk, dan pada masa yang sama, menentukan masa keluar yang terbaik melalui sistem penilaian keluar.
Strategi ini menggunakan parameter penunjuk yang dioptimumkan yang telah diuji secara meluas, termasuk MACD ((3, 10, 3) dan RSI ((21), yang lebih mudah menyesuaikan diri dengan perubahan pasaran yang cepat daripada konfigurasi standard. Strategi ini memerlukan had skor tinggi sekurang-kurangnya 13 mata untuk masuk dan keluar, memastikan hanya isyarat yang sangat dipercayai akan mencetuskan perdagangan.
Di tengah-tengah strategi pertarungan berganda adalah sistem penilaian komprehensifnya, yang menentukan masa perdagangan dengan menilai kuantitatif pelbagai syarat teknikal. Sistem penilaian masuk terdiri daripada empat komponen utama:
RSI isyarat(maksimum 5 mata):
Isyarat MACD(maksimum 8 mata):
Kelakuan harga(maksimum 4 mata):
Pengenalan corak(maksimum 8 mata):
Sistem penarafan keluar menggunakan sistem berat yang serupa, tetapi menggunakan kriteria yang bertentangan untuk mengenal pasti puncak yang bergoyang. Strategi ini memerlukan masuk dan keluar skor rata-rata sekurang-kurangnya 13 mata, yang memastikan bahawa hanya isyarat dengan kepastian yang tinggi akan dilaksanakan, mengurangkan kemungkinan isyarat palsu.
Satu lagi komponen penting dalam strategi ini ialah parameter penunjuk yang dioptimumkan:
Parameter ini dioptimumkan khas untuk menangkap perubahan harga pantas dan turun naik frekuensi tinggi.
Proses membuat keputusan yang objektif dan kuantitatifDengan menggunakan sistem penilaian berdasarkan mata, strategi ini menghilangkan penilaian subjektif dan memberikan piawaian perdagangan yang jelas. Kaedah ini menjadikan keputusan perdagangan berdasarkan data dan bukan emosi, yang meningkatkan disiplin perdagangan.
Mekanisme pengesahan bergandaStrategi yang memerlukan pengesahan pelbagai petunjuk teknikal dan pola harga pada masa yang sama, meningkatkan kebolehpercayaan isyarat dengan ketara. Perdagangan hanya akan dilakukan apabila sekurang-kurangnya 13 kriteria telah dipenuhi, yang mengurangkan risiko isyarat palsu.
Sensitiviti masa optimumDengan menggunakan parameter MACD ((3, 10, 3) dan RSI ((21) yang dioptimumkan, strategi dapat menangkap perubahan dalam pergerakan harga lebih awal, sambil menapis bunyi pasaran dan memberikan kepekaan masa yang lebih baik.
Pengurusan risiko yang fleksibel: Strategi ini mempunyai pengiraan sasaran stop loss dan profit berdasarkan risiko, dengan nisbah pulangan risiko 5: 1 secara lalai, yang memberikan kerangka pengurusan risiko yang jelas untuk perdagangan. Stop loss dinamik berdasarkan rendah pergerakan baru-baru ini, dengan zon pelindung yang boleh dikonfigurasi, meningkatkan fleksibiliti kawalan risiko.
Sistem perdagangan yang sangat visualStrategi menyediakan sistem paparan skor, termasuk label hijau ((kelas masuk ≥10) dan label merah ((kelas keluar ≥10), serta tanda masuk / keluar perdagangan yang jelas, yang membolehkan peniaga melihat dengan jelas bagaimana sistem berfungsi.
Sangat boleh menyesuaikan diriWalaupun parameter strategi telah dioptimumkan, mereka boleh disesuaikan dengan keadaan pasaran yang berbeza dan jenis perdagangan, menjadikan strategi mempunyai kebolehgunaan yang luas.
Peruntukan risiko kedudukan tinggiStrategi: Secara lalai menggunakan 100% pembahagian dana, pelaburan terpusat ini meningkatkan risiko perdagangan tunggal. Ini boleh menyebabkan turun naik akaun yang ketara dalam keadaan pasaran yang bergolak atau berlaku kejadian yang tidak dijangka.
Kepercayaan kepada keadaan pasaranStrategi ini berfungsi dengan baik dalam pasaran yang jelas dan bergelombang, tetapi kesannya mungkin berkurangan dalam pasaran yang sangat bergolak. Ia perlu digunakan dengan berhati-hati dalam keadaan pasaran yang berbeza, dan pertimbangkan untuk menyesuaikan parameter atau menghentikan perdagangan.
Mengoptimumkan risiko terlalu sesuaiParameter strategi telah dioptimumkan, dan mungkin terdapat risiko untuk data sejarah yang terlalu sesuai. Perubahan keadaan pasaran di masa depan mungkin menyebabkan prestasi strategi kurang daripada hasil ujian semula. Parameter harus disahkan semula dan disesuaikan secara berkala untuk mengekalkan keberkesanan strategi.
Perlindungan tanpa kepelbagaianSebagai strategi kedudukan tunggal, kekurangan perlindungan kepelbagaian meningkatkan risiko pasaran tertentu. Dalam aplikasi praktikal, strategi ini boleh dipertimbangkan sebagai sebahagian daripada portfolio pelaburan yang lebih luas, atau memperkenalkan perdagangan pelbagai jenis untuk meningkatkan kepelbagaian.
Risiko kerosakanSistem penilaian yang rumit dan pelbagai syarat mungkin tidak berfungsi dalam keadaan pasaran tertentu, terutamanya dalam keadaan pasaran yang melampau. Langkah-langkah pengurusan risiko tambahan seperti menetapkan had kerugian maksimum atau menggunakan penapis turun naik disyorkan.
Masukkan parameter penyesuaian: Strategi semasa menggunakan parameter MACD dan RSI yang tetap, dan parameter penyesuaian diri yang diperkenalkan berdasarkan turun naik pasaran atau kekuatan trend boleh dipertimbangkan. Sebagai contoh, menyesuaikan parameter MACD secara automatik dalam persekitaran yang sangat turun naik, atau menyesuaikan tahap overbought / overbought RSI mengikut keadaan pasaran semasa, untuk meningkatkan penyesuaian strategi dalam persekitaran pasaran yang berbeza.
Analisis harga-kuantitiStrategi semasa adalah berasaskan pada pergerakan harga dan dinamika indikator, yang dapat meningkatkan kualiti isyarat dengan mengintegrasikan analisis jumlah transaksi. Khususnya dalam pengesahan mod berbalik, pengesahan jumlah transaksi dapat memberikan kebolehpercayaan tambahan. Pertimbangkan untuk menambah kriteria penilaian yang berkaitan dengan jumlah transaksi, seperti peningkatan jumlah transaksi, penyingkiran jumlah transaksi dan sebagainya.
Tambah penapis persekitaran pasaranMekanisme untuk mengenal pasti keadaan pasaran, secara automatik mengurangkan frekuensi perdagangan atau menyesuaikan parameter dalam keadaan pasaran yang tidak sesuai dengan strategi. Sebagai contoh, meningkatkan ambang markah dalam pasaran yang sangat melintang, atau mengurangkan ruang stop loss dalam persekitaran yang tidak stabil.
Mengoptimumkan sistem pengurusan wangStrategi semasa menggunakan peruntukan kedudukan 100%, yang membolehkan sistem pengurusan wang yang lebih kompleks untuk menyesuaikan saiz kedudukan berdasarkan kekuatan isyarat, turun naik pasaran atau prestasi sejarah. Sebagai contoh, lebih banyak wang diberikan dengan skor yang lebih tinggi, atau mengurangkan saiz kedudukan selepas kerugian berturut-turut.
Integrasi analisis pelbagai kerangka masaMeningkatkan kualiti isyarat masuk dengan menambahkan pengesahan trend pada jangka masa yang lebih tinggi. Sebagai contoh, perdagangan hanya dijalankan apabila arah trend pada jangka masa yang lebih tinggi selaras, atau lebih banyak mata diberikan kepada perdagangan yang mematuhi trend utama.
Pengoptimuman Pembelajaran MesinPertimbangkan untuk menggunakan kaedah pembelajaran mesin untuk mengoptimumkan berat penilaian dan nilai tunjangan. Dengan menganalisis data sejarah, anda dapat menentukan kombinasi isyarat mana yang paling berkesan dalam keadaan pasaran tertentu dan menyesuaikan sistem penilaian dengan sewajarnya.
Strategi pemburu bergelombang pelbagai mesyuarat mewakili kaedah perdagangan jangka masa rendah yang komprehensif dan sistematik yang mewujudkan sistem keputusan perdagangan yang didorong oleh data dengan menggabungkan pelbagai indikator analisis teknikal dan ciri-ciri tingkah laku harga. Kelebihan utama strategi ini adalah kaedah penilaian berbilang standard yang objektif, yang secara efektif menghilangkan keputusan emosi, sambil mengekalkan fleksibiliti yang mencukupi untuk menyesuaikan diri dengan pelbagai jenis perdagangan dan keadaan pasaran.
Strategi ini dapat menangkap pergerakan pasaran dengan berkesan melalui parameter MACD ((3, 10, 3) dan RSI ((21) yang dioptimumkan, digabungkan dengan syarat masuk dan keluar yang ketat, terutamanya di pasaran yang mempunyai turun naik yang tinggi. Fungsi pengurusan risiko yang terbina dalam dan alat visualisasi meningkatkan lagi kepraktisan strategi dan keselesaan pengguna.
Walau bagaimanapun, strategi juga mempunyai beberapa batasan dan risiko, termasuk peruntukan kedudukan tinggi, ketergantungan kepada keadaan pasaran dan kemungkinan optimum overfit. Dengan melaksanakan arah pengoptimuman yang disyorkan, seperti memperkenalkan parameter penyesuaian diri, mengintegrasikan analisis hubungan kuantiti dan harga, menambah penapis persekitaran pasaran, dan lain-lain, strategi dapat meningkatkan lagi kestabilan dan penyesuaian.
Bagi peniaga yang berpengalaman, strategi pemburu pertarungan berganda menyediakan kerangka yang kuat untuk menangkap trend dan perdagangan pertarungan dalam jangka masa yang rendah. Dengan memahami prinsip-prinsip utamanya dan menyesuaikan diri dengan keperluan tertentu, peniaga dapat menggunakan strategi ini untuk mencari peluang perdagangan dengan kebarangkalian tinggi dalam pasaran yang berubah dengan cepat. Perlu diingat bahawa strategi perdagangan apa pun memerlukan pengurusan risiko yang ketat dan penilaian pengawasan berterusan untuk memastikan kejayaan perdagangan jangka panjang.
/*backtest
start: 2024-06-30 00:00:00
end: 2025-06-28 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":50000000}]
*/
// ____ _ _______ _ _ _____
// / __ \ | | |__ __| | (_) | __ \
// | | | |_ _ __ _ _ __ | |_ | |_ __ __ _ __| |_ _ __ __ _ | |__) |
// | | | | | | |/ _` | '_ \| __| | | '__/ _` |/ _` | | '_ \ / _` | | ___/ '__/ _ \
// | |__| | |_| | (_| | | | | |_ | | | | (_| | (_| | | | | | (_| | | | | | | (_) |
// \___\_\\__,_|\__,_|_| |_|\__| |_|_| \__,_|\__,_|_|_| |_|\__, | |_| |_| \___/
// __/ |
// |___/
// Quant Trading Pro
//@version=6
strategy("Multi-Confluence Swing Hunter V1", overlay=true,
default_qty_type=strategy.percent_of_equity, default_qty_value=100,
commission_type=strategy.commission.percent, commission_value=0.1,
slippage=3, initial_capital=1000, margin_long=0, margin_short=0)
// === DESCRIPTION ===
// High-conviction swing bottom entry strategy using optimized MACD(3,10,3) and RSI(21)
// Entry: Point-based scoring system for swing bottoms (divergences, momentum, price action)
// Exit: Inverse scoring system for swing tops (no stop-loss, exit only on swing top signals)
// Position: Single position with 100% allocation, scores displayed only when ≥10 points
// Based on analysis showing 23.7% improvement over standard parameters
// === INPUT PARAMETERS ===
// Optimized Indicator Settings
macdFast = input.int(3, "MACD Fast Length", minval=1, maxval=50, group="Optimized Indicators")
macdSlow = input.int(10, "MACD Slow Length", minval=1, maxval=100, group="Optimized Indicators")
macdSignal = input.int(3, "MACD Signal Length", minval=1, maxval=50, group="Optimized Indicators")
rsiLength = input.int(21, "RSI Length", minval=2, maxval=100, group="Optimized Indicators")
// Entry Settings - Swing Bottom Scoring
minEntryScore = input.int(13, "Minimum Entry Score", minval=5, maxval=20, group="Entry Settings")
showEntryScores = input.bool(true, "Show Entry Scores (Above 10)", group="Entry Settings")
// Exit Settings - Swing Top Scoring (Inverse of Entry Criteria)
minExitScore = input.int(13, "Minimum Exit Score", minval=5, maxval=20, group="Exit Settings")
showExitScores = input.bool(true, "Show Exit Scores (Above 10)", group="Exit Settings")
// Price Action Settings
minLowerWickPercent = input.float(50.0, "Min Lower Wick %", minval=10.0, maxval=90.0, step=5.0, group="Price Action")
quickRecoveryPercent = input.float(0.3, "Quick Recovery %", minval=0.1, maxval=2.0, step=0.1, group="Price Action")
quickRecoveryBars = input.int(3, "Quick Recovery Bars", minval=1, maxval=10, group="Price Action")
// RSI Levels
rsiOversold = input.float(30.0, "RSI Oversold Level", minval=10.0, maxval=50.0, step=1.0, group="RSI Settings")
rsiExtremeOversold = input.float(25.0, "RSI Extreme Oversold", minval=10.0, maxval=40.0, step=1.0, group="RSI Settings")
rsiOverbought = input.float(70.0, "RSI Overbought Level", minval=50.0, maxval=90.0, step=1.0, group="RSI Settings")
rsiExtremeOverbought = input.float(75.0, "RSI Extreme Overbought", minval=60.0, maxval=90.0, step=1.0, group="RSI Settings")
// Reversal Signals Settings
reversalLookback = input.int(12, "Reversal Candle Lookback", minval=5, maxval=50, group="Reversal Signals")
reversalConfirm = input.int(3, "Reversal Confirm Within", minval=1, maxval=10, group="Reversal Signals")
useVolumeConfirmation = input.bool(false, "Use Volume Confirmation", group="Reversal Signals")
// Trade Management
allowShortTrades = input.bool(false, "Allow Short Trades?", group="Short Trades")
// Risk/Reward TP/SL Settings
useRiskReward = input.bool(true, "Use Risk/Reward TP/SL", group="Risk Management")
riskRewardRatio = input.float(5, "Risk/Reward Ratio", minval=1.0, maxval=5.0, step=0.1, group="Risk Management")
stopLossLookback = input.int(10, "Stop Loss Lookback Bars", minval=3, maxval=50, group="Risk Management")
stopLossBuffer = input.float(0.15, "Stop Loss Buffer %", minval=0.05, maxval=1.0, step=0.05, group="Risk Management")
// Advanced Settings
maxLookbackBars = input.int(8, "Divergence Lookback Bars", minval=3, maxval=20, group="Advanced")
// === 1️⃣ CALCULATIONS ===
// Optimized MACD Calculation
[macdLine, signalLine, macdHist] = ta.macd(close, macdFast, macdSlow, macdSignal)
// Optimized RSI Calculation
rsi = ta.rsi(close, rsiLength)
// Price Action Calculations
bodySize = math.abs(close - open)
lowerWick = math.min(open, close) - low
upperWick = high - math.max(open, close)
totalRange = high - low
lowerWickPercent = totalRange > 0 ? (lowerWick / totalRange) * 100 : 0
upperWickPercent = totalRange > 0 ? (upperWick / totalRange) * 100 : 0
bodyPercent = totalRange > 0 ? (bodySize / totalRange) * 100 : 0
// Reversal Signals Calculation
var int bullCandleScore = 0
var int bearCandleScore = 0
var bool bullReversalCandidate = false
var bool bearReversalCandidate = false
var float bullReversalLow = 0.0
var float bullReversalHigh = 0.0
var float bearReversalLow = 0.0
var float bearReversalHigh = 0.0
var bool bullSignalConfirmed = false
var bool bearSignalConfirmed = false
var int bullCandleCounter = 0
var int bearCandleCounter = 0
volumeIsHigh = volume > ta.sma(volume, 20)
// Reset scores
bullCandleScore := 0
bearCandleScore := 0
// Calculate reversal scores
if bar_index >= reversalLookback
for i = 0 to (reversalLookback - 1)
if close < low[i]
bullCandleScore += 1
if close > high[i]
bearCandleScore += 1
// Bear signal setup
if bearCandleScore == (reversalLookback - 1)
bearReversalCandidate := true
bearReversalLow := low
bearReversalHigh := high
bearSignalConfirmed := false
bearCandleCounter := 0
if bearReversalCandidate
bearCandleCounter += 1
if close > bearReversalHigh
bearReversalCandidate := false
bearCondition = bearReversalCandidate and close < bearReversalLow and not bearSignalConfirmed and bearCandleCounter <= (reversalConfirm + 1)
bearSignal = false
if bearCondition
bearSignalConfirmed := true
if not useVolumeConfirmation or volumeIsHigh
bearSignal := true
// Bull signal setup
if bullCandleScore == (reversalLookback - 1)
bullReversalCandidate := true
bullReversalLow := low
bullReversalHigh := high
bullSignalConfirmed := false
bullCandleCounter := 0
if bullReversalCandidate
bullCandleCounter += 1
if close < bullReversalLow
bullReversalCandidate := false
bullCondition = bullReversalCandidate and close > bullReversalHigh and not bullSignalConfirmed and bullCandleCounter <= (reversalConfirm + 1)
bullSignal = false
if bullCondition
bullSignalConfirmed := true
if not useVolumeConfirmation or volumeIsHigh
bullSignal := true
// === 2️⃣ ENTRY & EXIT LOGIC ===
// Helper Functions for Divergence Detection
findLowerLow(lookback) =>
var float lowestPrice = na
var int lowestIndex = na
if bar_index >= lookback
lowestPrice := low
lowestIndex := bar_index
for i = 1 to lookback
if low[i] < lowestPrice
lowestPrice := low[i]
lowestIndex := bar_index - i
[lowestPrice, lowestIndex]
findHigherHigh(lookback) =>
var float highestPrice = na
var int highestIndex = na
if bar_index >= lookback
highestPrice := high
highestIndex := bar_index
for i = 1 to lookback
if high[i] > highestPrice
highestPrice := high[i]
highestIndex := bar_index - i
[highestPrice, highestIndex]
// SWING BOTTOM SCORING SYSTEM
// 1. RSI Signals
rsiOversoldSignal = rsi < rsiOversold
rsiExtremeOversoldSignal = rsi < rsiExtremeOversold
rsiTurningUp = rsi > rsi[1]
// RSI Bullish Divergence
[prevLowPrice, prevLowIndex] = findLowerLow(maxLookbackBars)
rsiBullishDivergence = false
if not na(prevLowPrice) and not na(prevLowIndex) and bar_index > prevLowIndex
prevRSI = rsi[bar_index - prevLowIndex]
if low < prevLowPrice and rsi > prevRSI and not na(prevRSI)
rsiBullishDivergence := true
// 2. MACD Signals
macdNegative = macdLine < 0
macdTurningUp = macdLine > macdLine[1]
macdHistImproving = macdHist > macdHist[1]
// MACD Bullish Divergence
macdBullishDivergence = false
if not na(prevLowPrice) and not na(prevLowIndex) and bar_index > prevLowIndex
prevMACD = macdLine[bar_index - prevLowIndex]
if low < prevLowPrice and macdLine > prevMACD and not na(prevMACD)
macdBullishDivergence := true
// 3. Price Action Signals
longLowerWick = lowerWickPercent > minLowerWickPercent
smallBody = bodyPercent < 30.0
bullishClose = close > open
// 4. Quick Recovery Check
quickRecovery = false
if bar_index >= quickRecoveryBars
recoveryTarget = close * (1 + quickRecoveryPercent / 100)
for i = 1 to quickRecoveryBars
if high[i] > recoveryTarget
quickRecovery := true
break
// ENTRY SCORE CALCULATION
entryScore = 0
entryScore := entryScore + (rsiOversoldSignal ? 2 : 0)
entryScore := entryScore + (rsiExtremeOversoldSignal ? 2 : 0)
entryScore := entryScore + (rsiBullishDivergence ? 4 : 0)
entryScore := entryScore + (rsiTurningUp ? 1 : 0)
entryScore := entryScore + (macdNegative ? 1 : 0)
entryScore := entryScore + (macdTurningUp ? 2 : 0)
entryScore := entryScore + (macdHistImproving ? 2 : 0)
entryScore := entryScore + (macdBullishDivergence ? 3 : 0)
entryScore := entryScore + (longLowerWick ? 2 : 0)
entryScore := entryScore + (smallBody ? 1 : 0)
entryScore := entryScore + (bullishClose ? 1 : 0)
entryScore := entryScore + (quickRecovery ? 2 : 0)
entryScore := entryScore + (bullSignal ? 4 : 0) // Green reversal signal +4
// SWING TOP SCORING SYSTEM (for exits)
// 1. RSI Exit Signals
rsiOverboughtSignal = rsi > rsiOverbought
rsiExtremeOverboughtSignal = rsi > rsiExtremeOverbought
rsiTurningDown = rsi < rsi[1]
// RSI Bearish Divergence
[prevHighPrice, prevHighIndex] = findHigherHigh(maxLookbackBars)
rsiBearishDivergence = false
if not na(prevHighPrice) and not na(prevHighIndex) and bar_index > prevHighIndex
prevRSIHigh = rsi[bar_index - prevHighIndex]
if high > prevHighPrice and rsi < prevRSIHigh and not na(prevRSIHigh)
rsiBearishDivergence := true
// 2. MACD Exit Signals
macdPositive = macdLine > 0
macdTurningDown = macdLine < macdLine[1]
macdHistDeclining = macdHist < macdHist[1]
// MACD Bearish Divergence
macdBearishDivergence = false
if not na(prevHighPrice) and not na(prevHighIndex) and bar_index > prevHighIndex
prevMACDHigh = macdLine[bar_index - prevHighIndex]
if high > prevHighPrice and macdLine < prevMACDHigh and not na(prevMACDHigh)
macdBearishDivergence := true
// 3. Price Action Exit Signals
longUpperWick = upperWickPercent > minLowerWickPercent
bearishClose = close < open
// EXIT SCORE CALCULATION
exitScore = 0
exitScore := exitScore + (rsiOverboughtSignal ? 2 : 0)
exitScore := exitScore + (rsiExtremeOverboughtSignal ? 2 : 0)
exitScore := exitScore + (rsiBearishDivergence ? 4 : 0)
exitScore := exitScore + (rsiTurningDown ? 1 : 0)
exitScore := exitScore + (macdPositive ? 1 : 0)
exitScore := exitScore + (macdTurningDown ? 2 : 0)
exitScore := exitScore + (macdHistDeclining ? 2 : 0)
exitScore := exitScore + (macdBearishDivergence ? 3 : 0)
exitScore := exitScore + (longUpperWick ? 2 : 0)
exitScore := exitScore + (bearishClose ? 1 : 0)
exitScore := exitScore + (bearSignal ? 1 : 0) // Red reversal signal +1
// SIGNAL CONDITIONS
longCondition = entryScore >= minEntryScore and barstate.isconfirmed
exitCondition = exitScore >= minExitScore and barstate.isconfirmed
// === TP/SL LEVELS (Clean Logic) ===
var float stopLossLevel = na
var float takeProfitLevel = na
var bool tpslSet = false
// Clear levels when no position
if strategy.position_size == 0
stopLossLevel := na
takeProfitLevel := na
tpslSet := false
// Calculate TP/SL levels ONCE when position is opened
if strategy.position_size > 0 and strategy.position_size[1] == 0 and useRiskReward and not tpslSet
// Find recent low for stop loss
recentLow = low
for i = 1 to stopLossLookback
if low[i] < recentLow
recentLow := low[i]
// Set levels using actual entry price
entryPrice = strategy.opentrades.entry_price(0)
stopLossLevel := recentLow * (1 - stopLossBuffer / 100) // Configurable buffer below recent low
riskAmount = entryPrice - stopLossLevel
takeProfitLevel := entryPrice + (riskAmount * riskRewardRatio)
tpslSet := true
// === 3️⃣ TRADE EXECUTIONS ===
// Long Entry - Single Position Only
if longCondition and strategy.position_size == 0
strategy.entry("Long", strategy.long, comment="Entry Score: " + str.tostring(entryScore))
// Set TP/SL ONLY ONCE per trade (when levels are calculated and not yet set)
if strategy.position_size > 0 and useRiskReward and tpslSet and not na(stopLossLevel) and not na(takeProfitLevel)
strategy.exit("TP/SL", "Long", stop=stopLossLevel, limit=takeProfitLevel)
// Long Exit - Close Position on Swing Top Signal (Only when NOT using TP/SL)
if exitCondition and strategy.position_size > 0 and not useRiskReward
strategy.close("Long", comment="Exit Score: " + str.tostring(exitScore))
// === 4️⃣ VISUALIZATIONS ===
// Entry Score Display (Only When Score ≥ 10) - Shows on ALL qualifying bars
if showEntryScores and entryScore >= 10 and barstate.isconfirmed
label.new(bar_index, low,
text=str.tostring(entryScore),
yloc=yloc.belowbar,
color=na,
style=label.style_label_up,
textcolor=color.green,
size=size.small)
// Exit Score Display (Only When Score ≥ 10) - Shows on ALL qualifying bars
if showExitScores and exitScore >= 10 and barstate.isconfirmed
label.new(bar_index, high,
text=str.tostring(exitScore),
yloc=yloc.abovebar,
color=na,
style=label.style_label_down,
textcolor=color.red,
size=size.small)
// Large Trade Entry Triangle (Only when actually entering a position) - Using plotshape to avoid label limits
plotshape(longCondition and strategy.position_size == 0, title="Trade Entry", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.normal, text="BUY")
// Large Trade Exit Triangle (Only when actually exiting a position) - Using plotshape to avoid label limits
plotshape(exitCondition and strategy.position_size > 0, title="Trade Exit", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.normal, text="SELL")
// Reversal Signal Triangles
plotshape(bullSignal, title="Bull Reversal", location=location.belowbar,
color=color.lime, style=shape.triangleup, size=size.tiny)
plotshape(bearSignal, title="Bear Reversal", location=location.abovebar,
color=color.red, style=shape.triangledown, size=size.tiny)
// === TP/SL LEVEL PLOTS ===
plot(strategy.position_size > 0 and useRiskReward ? stopLossLevel : na, title="Stop Loss", color=color.red, linewidth=2, style=plot.style_linebr)
plot(strategy.position_size > 0 and useRiskReward ? takeProfitLevel : na, title="Take Profit", color=color.green, linewidth=2, style=plot.style_linebr)
// MACD and RSI Plots (in separate panes)
macdPlot = plot(macdLine, title="MACD Line", color=color.blue, display=display.none)
signalPlot = plot(signalLine, title="Signal Line", color=color.red, display=display.none)
histPlot = plot(macdHist, title="MACD Histogram", color=color.gray, style=plot.style_histogram, display=display.none)
rsiPlot = plot(rsi, title="RSI", color=color.purple, display=display.none)
rsiOverboughtLine = hline(rsiOverbought, title="RSI Overbought", color=color.red, linestyle=hline.style_dashed, display=display.none)
rsiOversoldLine = hline(rsiOversold, title="RSI Oversold", color=color.green, linestyle=hline.style_dashed, display=display.none)