Diese Strategie ist ein umfassendes Handelssystem, das K-Nearest Neighbors (KNN) Machine Learning Algorithmus, Kerzenmustererkennung und Volumenanalyse kombiniert.
Die Kernlogik der Strategie beruht auf mehreren Schlüsselelementen: 1. Verwendung des einfachen gleitenden Durchschnitts (SMA) und der Standardabweichung zur Konstruktion von Preiskanälen zur Identifizierung von Überkauf- und Überverkaufsbereichen 2. Identifizierung von neun klassischen Kerzenmustern durch programmatisch definierte Bedingungen, einschließlich Hammer, Shooting Star, Engulfing-Muster usw. 3. Einbeziehung des KNN-Algorithmus, um aus historischen Preisbewegungen zu lernen und zukünftige Preisrichtungen vorherzusagen 4. Die Verwendung von Lautstärke als Signalbestätigungsindikator, der verlangt, dass die Lautstärke über dem festgelegten Schwellenwert liegt, wenn Signale ausgelöst werden 5. Berechnung der Wahrscheinlichkeitsverteilungen für Aufwärts- und Abwärtsbewegungen als eine der Signalfilterbedingungen
Diese Strategie baut ein robustes Handelssystem auf, indem sie traditionelle technische Analysen mit modernen Machine-Learning-Methoden kombiniert. Der mehrdimensionale Analyse-Rahmen der Strategie und der strenge Signalbestätigungsmechanismus liefern eine zuverlässige Grundlage für Handelsentscheidungen. Durch kontinuierliche Optimierung und Risikokontrolle wird erwartet, dass die Strategie eine stabile Performance unter verschiedenen Marktbedingungen aufrechterhält.
/*backtest start: 2024-01-17 00:00:00 end: 2025-01-16 00:00:00 period: 2d basePeriod: 2d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}] */ //@version=6 strategy("Candle Pattern Analyzer with Volume", overlay=true) // Input parameters length = input.int(20, "Channel Length", minval=1) mult = input.float(2.0, "Volatility Multiplier", minval=0.1) candleLength = input.int(5, "Candle Length", minval=1) k = input.int(5, "KNN Neighbors", minval=1) volumeThreshold = input.int(100000, "Volume Threshold", minval=1) // Calculate channel basis = ta.sma(close, length) dev = mult * ta.stdev(close, length) upper = basis + dev lower = basis - dev // Plot channel plot(basis, color=color.blue) plot(upper, color=color.green) plot(lower, color=color.red) // Identify candle patterns isBullish = close > open isBearish = close < open // Pre-calculate SMAs smaLow = ta.sma(low, candleLength) smaHigh = ta.sma(high, candleLength) smaClose = ta.sma(close, candleLength) // Hammer pattern isHammer = isBullish and low < smaLow and close > smaClose and (close - low) / (high - low) > 0.6 and low < low[1] // Shooting Star pattern isShootingStar = isBearish and high > smaHigh and close < smaClose and (high - close) / (high - low) > 0.6 and high > high[1] // Inverse Hammer pattern isInverseHammer = isBullish and high > smaHigh and close < smaClose and (high - close) / (high - low) > 0.6 and high > high[1] // Bullish Engulfing pattern isBullishEngulfing = isBullish and close > high[1] and open < low[1] // Bearish Engulfing pattern isBearishEngulfing = isBearish and close < low[1] and open > high[1] // Morning Star pattern isMorningStar = isBullish and close[2] < open[2] and close[1] < open[1] and close > open[1] // Evening Star pattern isEveningStar = isBearish and close[2] > open[2] and close[1] > open[1] and close < open[1] // Three Black Crows pattern isThreeBlackCrows = isBearish and close < close[1] and close[1] < close[2] and close[2] < close[3] // Three White Soldiers pattern isThreeWhiteSoldiers = isBullish and close > close[1] and close[1] > close[2] and close[2] > close[3] // Compare previous candles prevCandleUp = close[1] > open[1] prevCandleDown = close[1] < open[1] // Calculate probability probUp = ta.sma(close > open ? 1 : 0, candleLength) / candleLength probDown = ta.sma(close < open ? 1 : 0, candleLength) / candleLength // Generate signals buySignal = isHammer and prevCandleDown and probUp > probDown and volume > volumeThreshold sellSignal = isShootingStar and prevCandleUp and probDown > probUp and volume > volumeThreshold // Highlight patterns color candleColor = na if (isHammer) candleColor := color.green label.new(bar_index, high, "Hammer", color=color.green, style=label.style_label_up) else if (isShootingStar) candleColor := color.red label.new(bar_index, low, "Shooting Star", color=color.red, style=label.style_label_down) else if (isInverseHammer) candleColor := color.blue label.new(bar_index, high, "Inverse Hammer", color=color.blue, style=label.style_label_up) else if (isBullishEngulfing) candleColor := color.yellow label.new(bar_index, high, "Bullish Engulfing", color=color.yellow, style=label.style_label_up) else if (isBearishEngulfing) candleColor := color.purple label.new(bar_index, low, "Bearish Engulfing", color=color.purple, style=label.style_label_down) else if (isMorningStar) candleColor := color.orange label.new(bar_index, high, "Morning Star", color=color.orange, style=label.style_label_up) else if (isEveningStar) candleColor := color.new(color.red, 80) label.new(bar_index, low, "Evening Star", color=color.new(color.red, 80), style=label.style_label_down) else if (isThreeBlackCrows) candleColor := color.black label.new(bar_index, low, "Three Black Crows", color=color.black, style=label.style_label_down) else if (isThreeWhiteSoldiers) candleColor := color.white label.new(bar_index, high, "Three White Soldiers", color=color.white, style=label.style_label_up) // Plot candles barcolor(candleColor) // KNN algorithm var float[] knnData = array.new_float(k, na) var float[] knnLabels = array.new_float(k, na) // Create an array to store KNN labels array.set(knnLabels, 0, 1.0) // Label for "up" movement // Shift KNN dataset to make room for new data point for i = 1 to k-1 array.set(knnData, i, array.get(knnData, i-1)) array.set(knnLabels, i, array.get(knnLabels, i-1)) // Predict next movement using KNN algorithm float prediction = 0.0 for i = 0 to k-1 float distance = math.abs(close - array.get(knnData, i)) prediction += array.get(knnLabels, i) / distance prediction /= k // Plot prediction // line.new(bar_index, close, bar_index + 1, prediction, color=color.purple) // Plot resistance and support lines float resistance = ta.sma(high, length) float support = ta.sma(low, length) // line.new(bar_index, resistance, bar_index + 1, resistance, color=color.green, style=line.style_dashed) // line.new(bar_index, support, bar_index + 1, support, color=color.red, style=line.style_dashed) // Plot buy and sell signals with prices if (buySignal) // label.new(bar_index, low, "Buy at " + str.tostring(low), color=color.green, style=label.style_label_up) strategy.entry("Buy", strategy.long, comment="Buy at " + str.tostring(low)) if (sellSignal) // label.new(bar_index, high, "Sell at " + str.tostring(high), color=color.red, style=label.style_label_down) strategy.entry("Sell", strategy.short, comment="Sell at " + str.tostring(high)) // Create alerts alertcondition(buySignal, title="Buy Signal", message="Buy signal generated!") alertcondition(sellSignal, title="Sell Signal", message="Sell signal generated!")