
Di mana masalah dengan strategi swing tradisional? terlalu banyak sinyal, kualitas yang tidak konsisten, dan sering terjadi penembusan palsu. Strategi ini langsung mengatasi masalah:Setiap sinyal memiliki nilai kualitas 1-5 dan hanya diperdagangkan sinyal berkualitas tinggi di atas 4 poin。
Logika intinya sederhana dan kasar: identifikasi Higher Low (yang lebih tinggi) dan Lower High (yang lebih rendah), lalu beri nilai pada sinyal dalam empat dimensi.Hanya membutuhkan waktu 4 menit untuk membuka gudang dan langsung menyaring 80% dari sinyal sampah。
1 poin dasarKonfirmasi keberadaan bentuk berayun: Konfirmasi pengiriman + 1 poinJumlah transaksi lebih dari 20 siklus adalah 1,2 kali nilai rata-rata, menunjukkan dukungan dana RSI posisi + 1 poinRSI berada di kisaran 30-70, menghindari sinyal palsu untuk overbought dan oversold. Entitas garis K + 1 poinTercatat lebih dari 60 persen dari jumlah entitas yang terdaftar, memastikan tidak ada bentuk ragu-ragu seperti bintang salib. Kecepatan tren + 1 poinHarga, MA20 dan MA50 berlawanan arah
Hasilnya: 5 poin penuh sinyal paling banyak menang, 4 poin lebih dari sinyal dapat diperdagangkan, 3 poin di bawah langsung diabaikan。
Logika stop loss sangat jelas:
Mengapa 10 siklus?Karena sifat strategi berayun adalah menangkap pembalikan jangka pendek, 10 siklus tidak hanya memberi harga cukup ruang untuk bernafas, tetapi juga tidak membuat jarak stop loss terlalu besar. Lebih sesuai dengan struktur pasar daripada kelipatan ATR tetap.
Strategi ini juga mengidentifikasi “goyang-goyang yang gagal”:
Kegagalan ini seringkali mengindikasikan percepatan tren, dan merupakan waktu yang tepat untuk melakukan perdagangan terbalik.。
Ketika dua garis K berturut-turut muncul di arah yang sama, tanda diamond akan muncul. Ini biasanya berarti:
Keuntungan dari sinyal berturut-turut biasanya 15-20% lebih tinggi daripada sinyal tunggal。
Lingkungan terbaik:
Hindari penggunaan skenario:
Jelaskan Risiko:
Saran manajemen dana: Risiko tunggal tidak lebih dari 2% dari akun, setelah 3 kerugian berturut-turut, trading suspended dan re-evaluasi kondisi pasar.
/*backtest
start: 2024-09-09 00:00:00
end: 2025-09-07 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=6
strategy("Higher Lows, Lower Highs & Failures with Signal Quality Scoring", overlay=true)
// --- Higher Low detection ---
shares = 1
minScore = 4 // Minimum score to take trades
lowPoint = ta.lowest(low, 3)
prevLowPoint = ta.lowest(low[3], 3)
isHigherLow = low == lowPoint and low > prevLowPoint
bullConfirm = isHigherLow and close > open
// --- Lower High detection ---
highPoint = ta.highest(high, 3)
prevHighPoint = ta.highest(high[3], 3)
isLowerHigh = high == highPoint and high < prevHighPoint
bearConfirm = isLowerHigh and close < open
// --- Failures ---
failHigherLow = isHigherLow[1] and low < low[1]
failLowerHigh = isLowerHigh[1] and high > high[1]
// --- 2-in-a-row detection ---
bullSecond = bullConfirm and bullConfirm[1]
bearSecond = bearConfirm and bearConfirm[1]
// --- SIGNAL QUALITY SCORING (1-5 scale) ---
bullScore = if bullConfirm
score = 1 // Base score
// Factor 1: Volume confirmation
avgVolume = ta.sma(volume, 20)
if volume > avgVolume * 1.2
score := score + 1
// Factor 2: RSI positioning
rsi = ta.rsi(close, 14)
if rsi < 70 and rsi > 30
score := score + 1
// Factor 3: Candle strength
bodySize = math.abs(close - open)
candleRange = high - low
bodyRatio = candleRange > 0 ? bodySize / candleRange : 0
if bodyRatio > 0.6
score := score + 1
// Factor 4: Trend alignment
ma20 = ta.sma(close, 20)
ma50 = ta.sma(close, 50)
if ma20 > ma50 and close > ma20
score := score + 1
math.max(1, math.min(5, score))
else
na
bearScore = if bearConfirm
score = 1 // Base score
// Factor 1: Volume confirmation
avgVolume = ta.sma(volume, 20)
if volume > avgVolume * 1.2
score := score + 1
// Factor 2: RSI positioning
rsi = ta.rsi(close, 14)
if rsi > 30 and rsi < 70
score := score + 1
// Factor 3: Candle strength
bodySize = math.abs(close - open)
candleRange = high - low
bodyRatio = candleRange > 0 ? bodySize / candleRange : 0
if bodyRatio > 0.6
score := score + 1
// Factor 4: Trend alignment
ma20 = ta.sma(close, 20)
ma50 = ta.sma(close, 50)
if ma20 < ma50 and close < ma20
score := score + 1
math.max(1, math.min(5, score))
else
na
// --- Plot main signals with score-based styling ---
// Bullish signals
plotshape(bullConfirm and bullScore == 1, "Bull Score 1", shape.triangleup, location.belowbar, color.gray, size=size.tiny)
plotshape(bullConfirm and bullScore == 2, "Bull Score 2", shape.triangleup, location.belowbar, color.orange, size=size.small)
plotshape(bullConfirm and bullScore == 3, "Bull Score 3", shape.triangleup, location.belowbar, color.yellow, size=size.normal)
plotshape(bullConfirm and bullScore == 4, "Bull Score 4", shape.triangleup, location.belowbar, color.lime, size=size.normal)
plotshape(bullConfirm and bullScore == 5, "Bull Score 5", shape.triangleup, location.belowbar, color.green, size=size.large)
// Bearish signals
plotshape(bearConfirm and bearScore == 1, "Bear Score 1", shape.triangledown, location.abovebar, color.gray, size=size.tiny)
plotshape(bearConfirm and bearScore == 2, "Bear Score 2", shape.triangledown, location.abovebar, color.orange, size=size.small)
plotshape(bearConfirm and bearScore == 3, "Bear Score 3", shape.triangledown, location.abovebar, color.yellow, size=size.normal)
plotshape(bearConfirm and bearScore == 4, "Bear Score 4", shape.triangledown, location.abovebar, color.lime, size=size.normal)
plotshape(bearConfirm and bearScore == 5, "Bear Score 5", shape.triangledown, location.abovebar, color.green, size=size.large)
// --- Plot failures ---
plotshape(failHigherLow, "Failed Higher Low", shape.arrowdown, location.abovebar, color.red, size=size.small)
plotshape(failLowerHigh, "Failed Lower High", shape.arrowup, location.belowbar, color.green, size=size.small)
// --- Plot consecutive signals ---
plotshape(bullSecond, "Double Bullish Star", shape.diamond, location.bottom, color.lime, size=size.tiny)
plotshape(bearSecond, "Double Bearish Star", shape.diamond, location.top, color.red, size=size.tiny)
// --- Display score labels ---
if bullConfirm
labelColor = bullScore == 1 ? color.gray : bullScore == 2 ? color.orange : bullScore == 3 ? color.yellow : bullScore == 4 ? color.lime : color.green
label.new(bar_index, low - (high - low) * 0.1, "↑ " + str.tostring(bullScore), style=label.style_label_up, color=labelColor, textcolor=color.white, size=size.small)
if bearConfirm
labelColor = bearScore == 1 ? color.gray : bearScore == 2 ? color.orange : bearScore == 3 ? color.yellow : bearScore == 4 ? color.lime : color.green
label.new(bar_index, high + (high - low) * 0.1, "↓ " + str.tostring(bearScore), style=label.style_label_down, color=labelColor, textcolor=color.white, size=size.small)
// --- Alerts for high-quality signals only ---
alertcondition(bullConfirm and bullScore >= 4, "High Quality Bullish", "Strong Bullish Signal Detected")
alertcondition(bearConfirm and bearScore >= 4, "High Quality Bearish", "Strong Bearish Signal Detected")
// --- STRATEGY LOGIC ---
// Track previous highs and lows for stop levels
var float prevHigh = na
var float prevLow = na
// Update previous high/low when we get signals
if bullConfirm and bullScore >= minScore
prevLow := ta.lowest(low, 10) // Previous 10-bar low for stop
if bearConfirm and bearScore >= minScore
prevHigh := ta.highest(high, 10) // Previous 10-bar high for stop
// Entry conditions (only scores 4 or higher)
longCondition = bullConfirm and bullScore >= minScore
shortCondition = bearConfirm and bearScore >= minScore
// Execute trades
if longCondition and strategy.position_size == 0
strategy.entry("Long", strategy.long, qty=shares)
strategy.exit("Long Exit", "Long", stop=prevLow)
if shortCondition and strategy.position_size == 0
strategy.entry("Short", strategy.short, qty=shares)
strategy.exit("Short Exit", "Short", stop=prevHigh)
// Close opposite position if new signal occurs
if longCondition and strategy.position_size < 0
strategy.close("Short")
strategy.entry("Long", strategy.long, qty=shares)
strategy.exit("Long Exit", "Long", stop=prevLow)
if shortCondition and strategy.position_size > 0
strategy.close("Long")
strategy.entry("Short", strategy.short, qty=shares)
strategy.exit("Short Exit", "Short", stop=prevHigh)
// Plot stop levels for visualization
plot(strategy.position_size > 0 ? prevLow : na, "Long Stop", color.red, linewidth=2, style=plot.style_linebr)
plot(strategy.position_size < 0 ? prevHigh : na, "Short Stop", color.red, linewidth=2, style=plot.style_linebr)