Die Ressourcen sind geladen. Beförderung...

Mehrdimensionaler KNN-Algorithmus mit Volumen-Preis-Candlestick-Pattern-Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2025-01-17 16:10:07
Tags:SMAKNNRSIVOL- Nein.S.D.

 Multi-Dimensional KNN Algorithm with Volume-Price Candlestick Pattern Trading Strategy

Übersicht

Diese Strategie ist ein umfassendes Handelssystem, das K-Nearest Neighbors (KNN) Machine Learning Algorithmus, Kerzenmustererkennung und Volumenanalyse kombiniert.

Strategieprinzipien

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

Strategische Vorteile

  1. Mehrstufiger Signalbestätigungsmechanismus verbessert die Handelssicherheit erheblich
  2. Die Einführung des KNN-Algorithmus bietet eine Maschinenlernperspektive für die traditionelle technische Analyse
  3. Der Mechanismus zur Mengeüberprüfung verhindert wirksam falsche Ausbrüche
  4. Eine dynamische Grafik der Unterstützungs- und Widerstandslinien hilft, wichtige Preisniveaus zu erfassen
  5. Ein umfassendes Warnsystem sorgt dafür, dass keine wichtigen Handelschancen verpasst werden
  6. Starke Anpassungsfähigkeit der Parameter an unterschiedliche Marktumgebungen

Strategische Risiken

  1. Der KNN-Algorithmus kann auf volatilen Märkten zurückbleiben
  2. Mehrfache Signalfilterbedingungen könnten dazu führen, dass einige Handelsmöglichkeiten verpasst werden
  3. Festvolumensschwellenwerte können in verschiedenen Zeiträumen dynamisch angepasst werden müssen
  4. Kann während der Konsolidierungsphasen zu viele falsche Signale erzeugen Empfohlene Lösungen:
  • Dynamische Algorithmusparameteranpassung
  • Einführung eines Anerkennungsmechanismus für das Marktumfeld
  • Festlegung von Höchstverlustgrenzen
  • Einrichtung eines Positionsmanagementsystems

Optimierungsrichtlinien

  1. Einführung eines anpassungsfähigen Parameteranpassungsmechanismus zur automatischen Anpassung der Parameter an die Marktbedingungen
  2. Integration von Deep Learning-Algorithmen zur Verbesserung der Vorhersagegenauigkeit
  3. Mehr Marktmikrostrukturindikatoren hinzufügen
  4. Optimierung der dynamischen Berechnungsmethode für Volumenschwellenwerte
  5. Einführung eines umfassenderen Risikokontrollsystems

Zusammenfassung

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!")


Verwandt

Mehr