Sumber dimuat naik... memuat...

Algoritma KNN Berbilang Dimensi dengan Strategi Dagangan Pola Lilin Volume-Harga

Penulis:ChaoZhang, Tarikh: 2025-01-17 16:10:07
Tag:SMAKNNRSIVOLMASD

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

Ringkasan

Strategi ini adalah sistem perdagangan komprehensif yang menggabungkan algoritma pembelajaran mesin K-Nearest Neighbors (KNN), pengenalan corak lilin, dan analisis jumlah. Melalui kaedah analisis berbilang dimensi termasuk saluran purata bergerak, pengesahan ambang jumlah, dan statistik kebarangkalian, strategi membentuk kerangka analisis tiga dimensi untuk menangkap peluang perdagangan yang berpotensi.

Prinsip Strategi

Logik teras strategi ini dibina di atas beberapa elemen utama: 1. Menggunakan purata bergerak mudah (SMA) dan penyimpangan standard untuk membina saluran harga untuk mengenal pasti kawasan overbought dan oversold 2. Mengenali sembilan corak lilin klasik melalui keadaan yang ditakrifkan secara programatik, termasuk corak Hammer, Shooting Star, Engulfing, dll. 3. Menggabungkan algoritma KNN untuk belajar dari pergerakan harga sejarah dan meramalkan hala tuju harga masa depan 4. Menggunakan jumlah sebagai penunjuk pengesahan isyarat, memerlukan jumlah untuk berada di atas ambang yang ditetapkan apabila isyarat mencetuskan 5. Pengiraan pengedaran kebarangkalian untuk pergerakan ke atas dan ke bawah sebagai salah satu keadaan penapisan isyarat

Kelebihan Strategi

  1. Mekanisme pengesahan isyarat pelbagai peringkat meningkatkan kebolehpercayaan perdagangan dengan ketara
  2. Pengenalan algoritma KNN memberikan perspektif pembelajaran mesin kepada analisis teknikal tradisional
  3. Mekanisme pengesahan kuantiti berkesan mengelakkan gangguan palsu
  4. Pemetaan dinamik garis sokongan dan rintangan membantu memahami tahap harga yang penting
  5. Sistem amaran yang komprehensif memastikan peluang perdagangan penting tidak terlepas
  6. Keupayaan penyesuaian parameter yang kuat untuk menyesuaikan diri dengan persekitaran pasaran yang berbeza

Risiko Strategi

  1. Algoritma KNN mungkin tertinggal di pasaran yang tidak menentu
  2. Keadaan penapisan isyarat berbilang mungkin menyebabkan kehilangan beberapa peluang perdagangan
  3. Sempadan jumlah tetap mungkin memerlukan pelarasan dinamik dalam tempoh yang berbeza
  4. Boleh menghasilkan isyarat palsu yang berlebihan semasa fasa penyatuan Penyelesaian yang disyorkan:
  • Penyesuaian parameter algoritma dinamik
  • Pengenalan mekanisme pengiktirafan persekitaran pasaran
  • Menetapkan had kerugian maksimum
  • Menubuhkan sistem pengurusan kedudukan

Arahan pengoptimuman

  1. Memperkenalkan mekanisme penyesuaian parameter adaptif untuk menyesuaikan parameter secara automatik berdasarkan keadaan pasaran
  2. Mengintegrasikan algoritma pembelajaran mendalam untuk meningkatkan ketepatan ramalan
  3. Tambah lebih banyak penunjuk struktur mikro pasaran
  4. Mengoptimumkan kaedah pengiraan dinamik untuk ambang jumlah
  5. Menubuhkan sistem kawalan risiko yang lebih komprehensif

Ringkasan

Strategi ini membina sistem perdagangan yang kukuh dengan menggabungkan analisis teknikal tradisional dengan kaedah pembelajaran mesin moden. Rangka kerja analisis berdimensi dan mekanisme pengesahan isyarat yang ketat menyediakan asas yang boleh dipercayai untuk keputusan perdagangan. Melalui pengoptimuman dan kawalan risiko yang berterusan, strategi ini dijangka mengekalkan prestasi yang stabil di bawah pelbagai keadaan pasaran.


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


Berkaitan

Lebih lanjut