Strategi Kombo Crossover Moving Average yang Dinamis

Penulis:ChaoZhang, Tanggal: 2024-02-05 10:23:10
Tag:

img

Gambaran umum

Strategi Kombo Moving Average Crossover adalah strategi perdagangan gabungan yang mengintegrasikan beberapa indikator teknis dan deteksi kondisi pasar. Strategi ini secara dinamis menghitung volatilitas pasar dan menentukan tiga fase pasar berdasarkan jarak harga dari rata-rata bergerak jangka panjang dan volatilitas: volatile, trending dan konsolidasi.

Logika Strategi

Menghitung Volatilitas Pasar

Gunakan indikator ATR untuk mengukur volatilitas pasar 14 hari terakhir. Kemudian gunakan filter SMA 100 hari untuk mendapatkan volatilitas rata-rata.

Tentukan Fase Pasar

Hitung jarak antara harga dan SMA 200 hari. Jika jarak absolut melebihi 1,5 kali volatilitas rata-rata dengan arah yang jelas, itu ditentukan sebagai pasar tren. Jika volatilitas saat ini melebihi 1,5 kali rata-rata, itu adalah pasar volatile.

EMA/SMA Crossover

Periode EMA cepat adalah 10 hari. Periode SMA lambat adalah 30 hari. Sinyal beli dihasilkan ketika EMA cepat melintasi SMA lambat.

MACD

Menghitung MACD dengan 12, 26, 9 parameter. histogram MACD positif memberikan sinyal beli.

Bollinger Bands

Hitung saluran standar deviasi 20 hari. Jika lebar saluran lebih kecil dari SMA 20 hari itu sendiri, itu konsolidasi.

Aturan Masuk

Volatil: Masuk long ketika crossover atau MACD positif dengan harga di dalam band.

Tren: Masukkan panjang ketika crossover atau MACD positif.

Mengkonsolidasikan: Masukkan panjang ketika crossover dan harga di atas band bawah.

Peraturan Keluar

Umum: Keluar ketika MACD negatif selama 2 bar dan harga turun 2 hari.

Volatil: Ditambah keluar ketika StockRSI overbought.

Konsolidasi: Ditambah keluar ketika harga di bawah band atas.

Keuntungan

Strategi ini memiliki kekuatan berikut:

  1. Operasi sistematis dengan intervensi yang kurang subjektif.

  2. Parameter adaptif disesuaikan berdasarkan kondisi pasar.

  3. Keakuratan sinyal yang lebih tinggi dengan kombinasi indikator ganda.

  4. Risiko lebih rendah dengan Bollinger Bands auto stop loss.

  5. Filter kondisi semua dibulatkan untuk menghindari sinyal palsu.

  6. Stop loss dinamis dan mengambil keuntungan untuk mengikuti tren.

Risiko

Risiko utama adalah:

  1. Strategi tidak valid jika pengaturan parameter tidak benar.

  2. Model gagal karena kejadian tiba-tiba.

  3. Margin keuntungan yang terkompresi dari biaya perdagangan.

  4. Kompleksitas yang lebih tinggi dengan beberapa modul.

Peningkatan

Potensi arah optimasi:

  1. Meningkatkan kriteria penilaian lingkungan pasar.

  2. Memperkenalkan pembelajaran mesin untuk adaptasi parameter otomatis.

  3. Tambahkan analisis teks untuk mendeteksi peristiwa.

  4. Multi-market backtesting untuk menemukan parameter terbaik.

  5. Mengimplementasikan strategi trailing stop untuk keuntungan yang lebih baik.

Kesimpulan

Strategi Kombo Crossover Moving Average adalah sistem perdagangan kuantitatif multi-indikator yang cerdas. Ini menyesuaikan parameter secara dinamis berdasarkan kondisi pasar untuk menerapkan perdagangan berbasis aturan yang sistematis. Strategi ini sangat adaptif dan deterministik. Tetapi parameter dan modul tambahan perlu diperkenalkan dengan hati-hati untuk menghindari kompleksitas berlebihan. Secara keseluruhan ini adalah ide strategi kuantitatif yang layak.


/*backtest
start: 2024-01-28 00:00:00
end: 2024-02-04 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Improved Custom Strategy", shorttitle="ICS", overlay=true)

// Volatility
volatility = ta.atr(14)
avg_volatility_sma = ta.sma(volatility, 100)
avg_volatility = na(avg_volatility_sma) ? 0 : avg_volatility_sma

// Market Phase detection
long_term_ma = ta.sma(close, 200)
distance_from_long_term_ma = close - long_term_ma
var bool isTrending = math.abs(distance_from_long_term_ma) > 1.5 * avg_volatility and not na(distance_from_long_term_ma)
var bool isVolatile = volatility > 1.5 * avg_volatility

// EMA/MA Crossover
fast_length = 10
slow_length = 30
fast_ma = ta.ema(close, fast_length)
slow_ma = ta.sma(close, slow_length)
crossover_signal = ta.crossover(fast_ma, slow_ma)

// MACD
[macdLine, signalLine, macdHistogram] = ta.macd(close, 12, 26, 9)
macd_signal = crossover_signal or (macdHistogram > 0)

// Bollinger Bands
source = close
basis = ta.sma(source, 20)
upper = basis + 2 * ta.stdev(source, 20)
lower = basis - 2 * ta.stdev(source, 20)
isConsolidating = (upper - lower) < ta.sma(upper - lower, 20)

// StockRSI
length = 14
K = 100 * (close - ta.lowest(close, length)) / (ta.highest(close, length) - ta.lowest(close, length))
D = ta.sma(K, 3)
overbought = 75
oversold = 25

var float potential_SL = na
var float potential_TP = na
var bool buy_condition = na
var bool sell_condition = na

// Buy and Sell Control Variables
var bool hasBought = false
var bool hasSold = true

// Previous values tracking
prev_macdHistogram = macdHistogram[1]
prev_close = close[1]

// Modify sell_condition with the new criteria
if isVolatile
    buy_condition := not hasBought and crossover_signal or macd_signal and (close > lower) and (close < upper)
    sell_condition := hasBought and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2])
    potential_SL := close - 0.5 * volatility
    potential_TP := close + volatility

if isTrending
    buy_condition := not hasBought and crossover_signal or macd_signal
    sell_condition := hasBought and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2])
    potential_SL := close - volatility
    potential_TP := close + 2 * volatility

if isConsolidating
    buy_condition := not hasBought and crossover_signal and (close > lower)
    sell_condition := hasBought and (close < upper) and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2])
    potential_SL := close - 0.5 * volatility
    potential_TP := close + volatility

// Update the hasBought and hasSold flags
if buy_condition
    hasBought := true
    hasSold := false

if sell_condition
    hasBought := false
    hasSold := true

// Strategy Entry and Exit
if buy_condition
    strategy.entry("BUY", strategy.long, stop=potential_SL, limit=potential_TP)
    strategy.exit("SELL_TS", from_entry="BUY", trail_price=close, trail_offset=close * 0.05)

if sell_condition
    strategy.close("BUY")
    
// Visualization
plotshape(series=buy_condition, style=shape.labelup, location=location.belowbar, color=color.green, text="BUY", size=size.small)
plotshape(series=sell_condition, style=shape.labeldown, location=location.abovebar, color=color.red, text="SELL", size=size.small)

plot(long_term_ma, color=color.gray, title="200-Day MA", linewidth=1)
plot(potential_SL, title="SL Level", color=color.red, linewidth=1, style=plot.style_linebr)
plot(potential_TP, title="TP Level", color=color.green, linewidth=1, style=plot.style_linebr)

bgcolor(isVolatile ? color.new(color.purple, 90) : isTrending ? color.new(color.blue, 90) : isConsolidating ? color.new(color.orange, 90) : na)


Lebih banyak