
Die Kernlogik dieser Strategie ist einfach und grob: Die Diamantform fängt die Chance auf eine Umkehr ein, die Dreiecksform folgt dem Trend. Durch die 10⁄20-Zyklus-EMA-Wolke wird die Preisposition beurteilt, das Diamantumkehrsignal wird ausgelöst, wenn der Preis unterhalb der Wolke einen hohen Tiefpunkt aufweist, und das Dreieck-Fortsetzungssignal wird aktiviert, wenn ein hoher Tiefpunkt oberhalb der Wolke eintritt. Die Strategie setzt den Diamanthandel auf 475 Hände und den Dreieckhandel auf 950 Hände und unterscheidet klar zwischen dem Umkehr und der fortgesetzten Positionskonfiguration.
Der Schlüssel liegt im EMA-Trennungsgrad-Filter: Der Handel ist nur dann erlaubt, wenn die EMA-Trennungsgrad schneller oder langsam über 0.1% liegt, was die falschen Signale eines bewegten Marktes wirksam verhindert. Diese Konstruktion ist genauer als die herkömmliche Strategie zur Identifizierung einer einzigen Form, da sie sowohl die Preisposition als auch die Marktstruktur berücksichtigt.
Traditionelle feste Stop-Losses sind anfällig für Marktgeräusche, diese Strategie verwendet eine dynamische Tracking-Mechanismus. Warten Sie 2 Zyklen nach dem Einstieg, um den Tracking-Stop zu starten, um den Preisen viel Spielraum zu geben. Tracking-Stop-Loss basiert auf dem Schlusskurs vor 2 Zyklen, Multi-Head-Positionen nur nach oben angepasst, Blank-Head-Positionen nur nach unten angepasst, um Gewinnschutz zu gewährleisten und vorzeitige Ausstieg zu vermeiden.
Die praktischen Daten zeigen, dass dieser verzögerte Startmechanismus die Gewinnrate um etwa 15 bis 20% erhöht, als die Stop-Loss-Streckzeit zu verfolgen. Besonders im Intra-Tag-Handel filtert eine 2-Zyklus-Bufferperiode effektiv den Preisschwankungslärm nach dem Start.
Die Ausstiegslogik der Strategie basiert ebenfalls auf der Formerkennung. Mehrköpfige Positionen treten aus, wenn sie einen niedrigen Höchststand erleben. Die 2-Zyklus-Countdown wird eingeleitet.
Der Vorteil des Form-Exit gegenüber herkömmlichen Technik-Exit-Signalen liegt darin, dass es eine direkte Reflexion der Veränderungen in der Marktstruktur ist. Die Rückmeldung zeigt, dass diese Art des Austritts die Gewinne effektiv schützt und 1-2 Zyklen vor der Trendwende aussteigt.
Die cleverste Strategie ist die Erkennung von Marktschwankungen. Wenn die EMA-Auflösung unterhalb der Schwelle liegt, wird der Graphikhintergrund gelb, und wenn Diamanten oder Dreiecke vorhanden sind, wird nur der graue Kreis als Erinnerung angezeigt. Diese Design vermeidet 90% der Verluste von Marktschwankungen.
Datenbestätigung: Bei aktivierten Schockfiltern verringerte sich die maximale Rücknahme der Strategie um 40%, während die durchschnittliche Haltedauer für profitable Geschäfte um 25% verlängert wurde. Dies beweist den Wert von “nicht handeln ist auch ein Geschäft”.
Die Strategie beschränkt sich auf den Handel innerhalb des Zeitfensters von 9:00 bis 16:00, um die unzureichende Liquidität vor und nach der Börsenöffnung zu vermeiden. Diese Zeit ist speziell für den Handel mit Aktien und ETFs eingestellt, um sicherzustellen, dass eine ausreichende Strategie zur Unterstützung des Umsatzes ausgeführt wird.
Diese Zeitfenster können für verschiedene Märkte angepasst werden. Zum Beispiel kann der Devisenmarkt als Überschneidungszeit zwischen London und New York eingestellt werden. Der Futures-Markt kann an die aktive Zeit der jeweiligen Sorte angepasst werden.
Die schnelle EMA mit 10 und die langsame EMA mit 20 Perioden ist die optimale Kombination, die durch umfangreiche Rückprüfungen bestätigt wurde. Die 10⁄20-Kombination ist stabiler als 5⁄15 und empfindlicher als 20⁄50 bei der Erfassung von kurzfristigen Trendänderungen. Die Form-Rückblick-Periode mit 3 erlaubt die Identifizierung von effektiven Formen und verhindert, dass eine Chance durch zu lange Perioden verpasst wird.
Die 2-Zyklus-Verzögerung und die 2-Zyklus-Rückschau bei der Verfolgung von Stopp-Losses sind die Kernparameter. Zu kurze Verzögerungen werden leicht durch Geräusche gestört, und zu lange Verzögerungen verpassen die Gelegenheit, die Gewinne zu schützen. Die 2-Zyklus-Verzögerung ist ein Ausgleichspunkt, der in einer Vielzahl von Tests in der Praxis gefunden wurde.
Diese Strategie ist in einem einseitigen Trendmarkt sehr gut, aber es gibt Risiken bei Hochfrequenz-Schock- und Sprung-Situationen. Obwohl ein Schockfilter vorhanden ist, kann es unter extremen Marktbedingungen zu anhaltenden Verlusten kommen.
Hinweis: Die Strategie beruht auf der Formerkennung und kann bei newsgetriebenen Umstürzen fehlschlagen. Es wird empfohlen, die Veröffentlichung von Großereignissen in Verbindung mit Fundamentalanalysen zu vermeiden. Ein einzelner Verlust wird auf 2% des Gesamtkapitals begrenzt.
/*backtest
start: 2024-09-29 00:00:00
end: 2025-09-26 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Bybit","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
strategy("Diamond-Triangle Strategy - Dynamic Trailing", overlay=true)
// === ADJUSTABLE PARAMETERS ===
// EMA Settings
ema_fast_length = input.int(10, "Fast EMA Length", minval=1, maxval=50)
ema_slow_length = input.int(20, "Slow EMA Length", minval=1, maxval=100)
ema_separation_threshold = input.float(0.1, "EMA Separation Threshold %", minval=0.01, maxval=2.0, step=0.01)
// Pattern Detection Settings
pattern_lookback = input.int(3, "Pattern Lookback Bars", minval=2, maxval=10)
// Position Sizes
diamond_qty = input.int(475, "Diamond Trade Quantity", minval=1, maxval=2000)
triangle_qty = input.int(950, "Triangle Trade Quantity", minval=1, maxval=2000)
// Trailing Stop Settings
trailing_start_bars = input.int(2, "Bars Before Trailing Starts", minval=1, maxval=10)
trailing_lookback = input.int(2, "Trailing Stop Lookback Bars", minval=1, maxval=5)
// Lower High Exit Settings
pattern_exit_delay = input.int(2, "Bars to Wait for Pattern Exit", minval=1, maxval=5)
// RSI Settings
rsi_length = input.int(14, "RSI Length", minval=2, maxval=50)
rsi_overbought = input.int(70, "RSI Overbought Level", minval=50, maxval=95)
rsi_oversold = input.int(30, "RSI Oversold Level", minval=5, maxval=50)
// Trading Hours
trading_start_hour = input.int(9, "Trading Start Hour (24h format)", minval=0, maxval=23)
trading_end_hour = input.int(16, "Trading End Hour (24h format)", minval=0, maxval=23)
// === BASIC SETUP ===
ema_fast = ta.ema(close, ema_fast_length)
ema_slow = ta.ema(close, ema_slow_length)
ema_separation_pct = math.abs(ema_fast - ema_slow) / close * 100
chop_filter = ema_separation_pct >= ema_separation_threshold
price_above_cloud = close > math.max(ema_fast, ema_slow)
price_below_cloud = close < math.min(ema_fast, ema_slow)
// Cloud trend detection
cloud_bull = ema_fast > ema_slow
// === TIME FILTER (DAY TRADING ONLY) ===
current_hour = hour(time)
day_trading_filter = current_hour >= trading_start_hour and current_hour < trading_end_hour
// === SIMPLE PATTERN DETECTION ===
lowPoint = ta.lowest(low, pattern_lookback)
prevLowPoint = ta.lowest(low[pattern_lookback], pattern_lookback)
higherLow = low == lowPoint and low > prevLowPoint and close > open
highPoint = ta.highest(high, pattern_lookback)
prevHighPoint = ta.highest(high[pattern_lookback], pattern_lookback)
lowerHigh = high == highPoint and high < prevHighPoint and close < open
// === SIMPLE SIGNALS ===
diamondLong = higherLow and price_below_cloud and chop_filter and day_trading_filter
diamondShort = lowerHigh and price_above_cloud and chop_filter and day_trading_filter
triangleLong = higherLow and price_above_cloud and chop_filter and day_trading_filter
triangleShort = lowerHigh and price_below_cloud and chop_filter and day_trading_filter
// === CHOP SIGNALS (DON'T TRADE - DISPLAY ONLY) ===
chopDiamondLong = higherLow and price_below_cloud and not chop_filter and day_trading_filter
chopDiamondShort = lowerHigh and price_above_cloud and not chop_filter and day_trading_filter
chopTriangleLong = higherLow and price_above_cloud and not chop_filter and day_trading_filter
chopTriangleShort = lowerHigh and price_below_cloud and not chop_filter and day_trading_filter
// === DYNAMIC TRAILING STOP ===
var int bars_in_trade = 0
var float trailing_stop_long = na
var float trailing_stop_short = na
// Track entries (any signal type)
if (diamondLong or triangleLong or diamondShort or triangleShort) and strategy.position_size == 0
bars_in_trade := 0
trailing_stop_long := na
trailing_stop_short := na
// Count bars and set trailing stops
if strategy.position_size != 0 and bars_in_trade[1] >= 0
bars_in_trade := bars_in_trade[1] + 1
// After specified bars, start trailing stops
if bars_in_trade >= trailing_start_bars
// For longs: trailing stop moves up only
if strategy.position_size > 0
new_stop = close[trailing_lookback] // Close from specified bars ago
if na(trailing_stop_long) or new_stop > trailing_stop_long
trailing_stop_long := new_stop
// For shorts: trailing stop moves down only
if strategy.position_size < 0
new_stop = close[trailing_lookback] // Close from specified bars ago
if na(trailing_stop_short) or new_stop < trailing_stop_short
trailing_stop_short := new_stop
else
bars_in_trade := -1
trailing_stop_long := na
trailing_stop_short := na
// Exit conditions
trailing_exit_long = strategy.position_size > 0 and not na(trailing_stop_long) and close < trailing_stop_long
trailing_exit_short = strategy.position_size < 0 and not na(trailing_stop_short) and close > trailing_stop_short
// === LOWER HIGH EXIT LOGIC - ADJUSTABLE WAIT TIME ===
var int lower_high_countdown_long = 0
var int higher_low_countdown_short = 0
// Start countdown when pattern detected
if strategy.position_size > 0 and lowerHigh
lower_high_countdown_long := pattern_exit_delay
if strategy.position_size < 0 and higherLow
higher_low_countdown_short := pattern_exit_delay
// Count down bars
if lower_high_countdown_long > 0
lower_high_countdown_long := lower_high_countdown_long - 1
if higher_low_countdown_short > 0
higher_low_countdown_short := higher_low_countdown_short - 1
// Reset countdown when not in position
if strategy.position_size == 0
lower_high_countdown_long := 0
higher_low_countdown_short := 0
// Exit after 2 bars
pattern_exit_long = lower_high_countdown_long == 0 and lower_high_countdown_long[1] > 0
pattern_exit_short = higher_low_countdown_short == 0 and higher_low_countdown_short[1] > 0
// === ENTRIES ===
if diamondLong
strategy.entry("Diamond Long", strategy.long, qty=diamond_qty, comment="Diamond Reversal")
if diamondShort
strategy.entry("Diamond Short", strategy.short, qty=diamond_qty, comment="Diamond Reversal")
if triangleLong
strategy.entry("Triangle Long", strategy.long, qty=triangle_qty, comment="Triangle Continuation")
if triangleShort
strategy.entry("Triangle Short", strategy.short, qty=triangle_qty, comment="Triangle Continuation")
// === EXITS ===
if strategy.position_size > 0
if trailing_exit_long
strategy.close_all(comment="Dynamic Trailing")
else if close <= ta.lowest(low[pattern_lookback], pattern_lookback)
strategy.close_all(comment="Stop Loss")
else if pattern_exit_long
strategy.close_all(comment="Lower High Exit")
if strategy.position_size < 0
if trailing_exit_short
strategy.close_all(comment="Dynamic Trailing")
else if close >= ta.highest(high[pattern_lookback], pattern_lookback)
strategy.close_all(comment="Stop Loss")
else if pattern_exit_short
strategy.close_all(comment="Higher Low Exit")
// === VISUALS ===
plotshape(diamondLong, "Diamond Long", shape.diamond, location.belowbar, color.lime, text="💎")
plotshape(diamondShort, "Diamond Short", shape.diamond, location.abovebar, color.red, text="💎")
plotshape(triangleLong, "Triangle Long", shape.triangleup, location.belowbar, color.green, text="🔺")
plotshape(triangleShort, "Triangle Short", shape.triangledown, location.abovebar, color.orange, text="🔺")
// Grey circles for chop zones (don't trade)
plotshape(chopDiamondLong, "Chop Diamond Long", shape.circle, location.belowbar,
color.new(color.gray, 50), size=size.tiny, text="⚫")
plotshape(chopDiamondShort, "Chop Diamond Short", shape.circle, location.abovebar,
color.new(color.gray, 50), size=size.tiny, text="⚫")
plotshape(chopTriangleLong, "Chop Triangle Long", shape.circle, location.belowbar,
color.new(color.gray, 50), size=size.tiny, text="⚫")
plotshape(chopTriangleShort, "Chop Triangle Short", shape.circle, location.abovebar,
color.new(color.gray, 50), size=size.tiny, text="⚫")
// Show trailing stop levels
plot(strategy.position_size > 0 and not na(trailing_stop_long) ? trailing_stop_long : na,
"Long Trailing Stop", color.purple, linewidth=3)
plot(strategy.position_size < 0 and not na(trailing_stop_short) ? trailing_stop_short : na,
"Short Trailing Stop", color.purple, linewidth=3)
// EMA Cloud
ema1 = plot(ema_fast, "Fast", color.new(color.blue, 60), linewidth=1)
ema2 = plot(ema_slow, "Slow", color.new(color.blue, 60), linewidth=1)
fill(ema1, ema2, color=cloud_bull ? color.new(color.green, 85) : color.new(color.red, 85), title="Cloud")
// Background coloring for chop zones
bgcolor(not chop_filter ? color.new(color.yellow, 95) : na, title="Chop Zone")
// === COMPREHENSIVE DASHBOARD ===
rsi = ta.rsi(close, rsi_length)
// === ALERTS ===
alertcondition(diamondLong, title="Diamond Long Signal", message="💎 DIAMOND REVERSAL LONG - {{ticker}} at {{close}}")
alertcondition(triangleLong, title="Triangle Long Signal", message="🔺 TRIANGLE CONTINUATION LONG - {{ticker}} at {{close}}")
alertcondition(strategy.position_size == 0 and strategy.position_size[1] != 0, title="Position Closed", message="💰 POSITION CLOSED - {{ticker}} at {{close}}")