
Jangan lagi percaya pada satu rata-rata atau RSI. Ini adalah kombinasi dari 8 bentuk grafik klasik: kaki panjang, kaki terang, garis terang / garis terang, lubang loncat, dasar menara, penjaga bentuk dan pencocokan tinggi. Data retrospektif menunjukkan bahwa kombinasi multi-bentuk memiliki 35% lebih banyak kemenangan daripada bentuk tunggal, itulah sebabnya pedagang di Wall Street menggunakan strategi kombinasi.
Logika inti strategi sederhana dan kasar: sinyal multihead harus berada di atas SMA50, dan sinyal headless harus berada di bawah SMA50. Desain ini secara langsung menyaring sebagian besar perdagangan yang berisik di pasar yang bergoyang.
Stop loss diatur dengan 10 siklus minimum/maksimum, yang lebih ilmiah daripada stop loss pada titik-titik tetap konvensional. ATR dikali 1,5 kali untuk mengidentifikasi bentuk yang efektif, memastikan hanya menangkap perilaku harga yang benar-benar berarti.
Rasio risiko-pengembalian default strategi adalah 2:1, yang berarti bahwa setiap unit risiko yang ditanggung, tujuan untuk mendapatkan 2 unit keuntungan. Dengan kemenangan 45% dalam kombinasi portofolio multiform, ekspektasi matematis adalah positif 0,35, jauh di atas rata-rata pasar - 0,1 ekspektasi. Inilah daya tarik perdagangan kuantitatif: menghasilkan uang dengan probabilitas matematis, bukan dengan keberuntungan.
Setiap bentuk memiliki definisi matematis yang ketat, seperti garis kaki cahaya kepala cahaya yang mengharuskan entitas untuk lebih dari 90% dari keseluruhan garis K, dan garis bayangan atas dan bawah tidak lebih dari 5% . Definisi yang tepat ini memastikan keandalan sinyal.
Strategi yang mengatur jumlah maksimum transaksi simultan menjadi 1, desain yang tampak konservatif, sebenarnya adalah inti dari manajemen risiko. Statistik menunjukkan bahwa memegang beberapa posisi relevansi tinggi sekaligus meningkatkan risiko sistemik 2,5 kali lipat. Lebih baik melewatkan peluang, dan tidak membiarkan akun menanggung risiko yang tidak perlu.
Strategi ini bekerja paling baik di pasar tren unilateral, terutama di pasar yang mengalami lonjakan. Namun, beberapa peluang untuk membalikkan mungkin dilewatkan karena bergantung pada penyaringan tren selama gejolak lateral.
Petunjuk Risiko: Retrospeksi historis tidak mewakili keuntungan masa depan, ada risiko kerugian berturut-turut dalam strategi. Performa yang berbeda dalam berbagai kondisi pasar sangat berbeda, yang memerlukan manajemen dana dan kontrol risiko yang ketat.
/*backtest
start: 2024-11-11 00:00:00
end: 2025-11-11 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Candlestick Combo Strategy - [CLEVER]", overlay=true, initial_capital=100000)
// === User Inputs
sma_len = input.int(50, "SMA Length", minval=1)
atr_len = input.int(14, "ATR Length", minval=1)
atr_mult = input.float(1.5, "ATR Multiplier for pattern size", step=0.1)
rr = input.float(2.0, "Risk:Reward", step=0.1)
maxOpenTrades = input.int(1, "Max concurrent open trades", minval=1)
// === Indicators / Trend Filter
sma50 = ta.sma(close, sma_len)
myATR = ta.atr(atr_len)
uptrend = close > sma50
downtrend = close < sma50
// === Helper: Safe indexing
hasHistory(bars) =>
bar_index >= bars
// === Candlestick Patterns ===
// Long-Legged Doji
isLongLeggedDoji() =>
if not hasHistory(1)
false
else
candleBody = math.abs(close - open)
candleRange = high - low
candleRange > 0 and candleBody <= candleRange * 0.20 and
(high - math.max(open, close)) >= candleRange * 0.40 and
(math.min(open, close) - low) >= candleRange * 0.40
// Bullish Marubozu
isBullishMarubozu() =>
if not hasHistory(1)
false
else
body = close - open
candleRange = high - low
candleRange > 0 and body > 0 and body >= candleRange * 0.90 and
(high - close) <= candleRange * 0.05 and
(open - low) <= candleRange * 0.05
// Bearish Marubozu
isBearishMarubozu() =>
if not hasHistory(1)
false
else
body = open - close
candleRange = high - low
candleRange > 0 and body > 0 and body >= candleRange * 0.90 and
(open - high) <= candleRange * 0.05 and
(close - low) <= candleRange * 0.05
// Rising Window (gap up)
isRisingWindow() =>
if not hasHistory(1)
false
else
open > high[1] and close > open and close[1] > open[1]
// Falling Window (gap down)
isFallingWindow() =>
if not hasHistory(1)
false
else
open < low[1] and close < open and close[1] < open[1]
// Tower Bottom
isTowerBottom() =>
if not hasHistory(4)
false
else
largeBear = (open[4] - close[4]) > myATR * atr_mult
smallBase = true
for i = 3 to 1
smallBase := smallBase and ((high[i] - low[i]) < (open[4] - close[4]) * 0.5)
largeBull = (close > open) and ((close - open) > myATR * atr_mult)
largeBear and smallBase and largeBull
// Mat Hold
isMatHold() =>
if not hasHistory(4)
false
else
firstBullSize = (close[4] - open[4])
longBull = firstBullSize > myATR * atr_mult
gapUp = open[3] > high[4]
smallConsol = true
for i = 3 to 1
smallConsol := smallConsol and ((high[i] - low[i]) < firstBullSize * 0.3) and low[i] > low[4]
finalBull = (close > open) and ((close - open) > firstBullSize * 0.8)
longBull and gapUp and smallConsol and finalBull
// Matching High
isMatchingHigh() =>
if not hasHistory(2)
false
else
bullish1 = close[2] > open[2]
bullish2 = close[1] > open[1]
sameHigh = math.abs(high[2] - high[1]) <= myATR * 0.10
gapDown = open[1] < close[2]
bullish1 and bullish2 and sameHigh and gapDown
// === Trade Conditions
longSignal = uptrend and (isMatHold() or isTowerBottom() or isRisingWindow() or isBullishMarubozu())
shortSignal = downtrend and (isMatchingHigh() or isFallingWindow() or isBearishMarubozu() or isLongLeggedDoji())
// Plot signals on chart
plotshape(longSignal, title="Long Signal", style=shape.triangleup, location=location.belowbar, color=color.new(color.lime, 0), size=size.tiny)
plotshape(shortSignal, title="Short Signal", style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.tiny)
// === Entry / Exit Logic with maxOpenTrades gating
canEnter() =>
strategy.opentrades < maxOpenTrades
if (longSignal and canEnter())
stopLevel = ta.lowest(low, 10)
risk = close - stopLevel
target = close + risk * rr
strategy.entry("Long", strategy.long)
strategy.exit("Exit Long", "Long", stop=stopLevel, limit=target)
if (shortSignal and canEnter())
stopLevel = ta.highest(high, 10)
risk = stopLevel - close
target = close - risk * rr
strategy.entry("Short", strategy.short)
strategy.exit("Exit Short", "Short", stop=stopLevel, limit=target)