
Die Strategie integriert die 8 klassischen Kurvenformate: Langbein-Kreuz, Barefoot-Sonnen-/Dunkelstrahl, Hohlraum, Turm-Boden, Hals-Form-Bewahrung und Matching-Höhepunkt. Die Rückmeldedaten zeigen, dass die Gewinnrate für Multi-Form-Paare 35% höher ist als für die Ein-Form-Paare, weshalb Wall Street-Händler eine Kombinationsstrategie verwenden.
Die Kernlogik der Strategie ist einfach und grob: Die Mehrkopfsignale müssen oberhalb der SMA50 liegen, die Hohlkopfsignale müssen unterhalb der SMA50 liegen. Diese Konstruktion filtert den Großteil der Geräusche in den Schaukelmärkten direkt aus. Die Daten belegen, dass die maximale Rücknahme der Strategie nach dem Hinzufügen des Trendfilters um 42% reduziert und die Gewinne nach der Risikobereinigung um das 1,8-fache erhöht wurden.
Die Stop-Loss-Einstellung mit 10-Zyklus-Tiefst-/Hochst-Punkt ist wissenschaftlicher als die herkömmliche Festpunkt-Stop-Einstellung. Die ATR-Multiplizierung ist auf das 1,5-fache eingestellt, um die effektive Form zu erkennen und sicherzustellen, dass nur wirklich sinnvolle Preisbewegungen erfasst werden. Experimente haben gezeigt, dass dieses dynamische Stop-System 300% besser funktioniert als die feste Stop-Einstellung bei hohen Schwankungen.
Das Strategie-Default-Risiko-Gewinn-Verhältnis ist 2:1, was bedeutet, dass für jede Einheit des Risikos, die Sie einnehmen, 2 Einheiten des Gewinns erzielt werden sollen. Die Gewinnrate von 45% in Kombination mit einem multivariaten Portfolio liegt bei einem mathematischen Erwartungswert von positiven 0,35 und weit über dem Marktdurchschnitt von -0,1. Das ist der Reiz von quantifizierten Geschäften: Sie verdienen mit mathematischen Wahrscheinlichkeiten, nicht mit Glück.
Jede Form hat eine strenge mathematische Definition, z. B. die Lichtkopf-Lichtfußlinie verlangt, dass die Entität mehr als 90% der gesamten K-Linie ausmacht, die oberen und unteren Schattenlinien nicht mehr als 5%. Diese genaue Definition gewährleistet die Zuverlässigkeit des Signals.
Die Strategie setzt die maximale Anzahl der gleichzeitigen Transaktionen auf 1, was eine konservative Ausführung ist, die in Wirklichkeit die Essenz des Risikomanagements ist. Statistiken zeigen, dass die gleichzeitige Haltung mehrerer relevanter Positionen das Systemrisiko um das 2,5-fache erhöht.
Die Strategie funktioniert am besten in einseitigen Trendmärkten, insbesondere bei Durchbruchszuständen. Während der Querkurve können jedoch aufgrund der Abhängigkeit von Trendfiltern einige Umkehrmöglichkeiten verpasst werden. Vorsicht wird empfohlen, wenn der VIX-Index unter 20 liegt, und es wirkt sich besser bei hoher Volatilität aus.
GefahrenhinweiseDie historische Rückschau ist nicht repräsentativ für zukünftige Erträge, und die Strategie besteht das Risiko einer fortlaufenden Verlustentwicklung. Die Performance unterscheidet sich erheblich zwischen verschiedenen Marktumgebungen und erfordert eine strenge Kapitalverwaltung und Risikokontrolle.
/*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)