Pelacakan tren persilangan multi-rata-rata bergerak dan strategi penyaringan volatilitas

MA EMA SMA WMA VWMA SMMA RMA
Tanggal Pembuatan: 2024-07-29 13:37:09 Akhirnya memodifikasi: 2024-07-29 13:37:09
menyalin: 0 Jumlah klik: 636
1
fokus pada
1617
Pengikut

Pelacakan tren persilangan multi-rata-rata bergerak dan strategi penyaringan volatilitas

Ringkasan

Strategi ini adalah sistem perdagangan pelacakan tren yang didasarkan pada beberapa penyeberangan rata-rata bergerak dan penyaringan tingkat fluktuasi. Ini menggunakan rata-rata bergerak dari tiga periode yang berbeda untuk mengidentifikasi tren pasar dan menggunakan rata-rata bergerak keempat sebagai acuan untuk penilaian pasar bullish dan bearish. Strategi ini juga memperkenalkan indikator fluktuasi sebagai kondisi penyaringan perdagangan untuk menghindari perdagangan dalam lingkungan fluktuasi rendah.

Prinsip Strategi

  1. Pilihan Moving Average: Strategi ini menggunakan tiga jenis moving average utama (short, medium, dan long term) untuk menilai tren. Pengguna dapat memilih dari enam jenis moving average yang telah ditentukan, dan setiap jenis moving average dapat dikonfigurasi secara terpisah, termasuk periode perhitungan, sumber data, dan jenis (seperti SMA, EMA, dll.).

  2. Pengertian tren:

    • Tren multi-kepala: ketika rata-rata jangka pendek lebih tinggi dari rata-rata jangka panjang, dan rata-rata jangka menengah melintasi rata-rata jangka panjang ke atas.
    • Tren terbalik: Ketika garis rata-rata jangka pendek lebih rendah dari garis rata-rata jangka panjang, dan garis rata-rata jangka menengah ke bawah melewati garis rata-rata jangka panjang.
  3. Pertimbangan bull/bear market: Anda dapat memilih untuk menggunakan Moving Average keempat sebagai garis pemisah bull/bear market. Anda hanya diizinkan untuk melakukan lebih banyak ketika harga berada di atas garis ini; sebaliknya, Anda hanya diizinkan untuk melakukan lebih sedikit.

  4. Filter volatilitas: menggunakan indikator volatilitas yang didasarkan pada harga tertinggi dan terendah. Strategi ini akan mengirimkan sinyal perdagangan hanya jika volatilitas melebihi ambang batas yang ditetapkan pengguna.

  5. Logika input:

    • Masuk Multi Head: Memulai posisi dengan posisi yang lebih tinggi jika tren multi head dikonfirmasi, kondisi volatilitas terpenuhi, dan harga lebih tinggi dari garis rata-rata jangka panjang.
    • Masuk dengan posisi kosong: buka posisi kosong ketika tren kosong dikonfirmasi, kondisi volatilitas terpenuhi, dan harga di bawah garis rata-rata jangka panjang.
  6. Logika Keluar:

    • Posisi yang dipadamkan sebagian: Posisi yang dipadamkan sebagian ketika tren berbalik (jika garis rata-rata jangka menengah dan garis rata-rata jangka panjang bersilang lagi).
    • Seluruh posisi kosong: ketika harga melewati garis pemisah pasar bullish dan bearish, semua posisi kosong di arah yang berlawanan akan dihapus.
  7. Stop loss: Stop loss menggunakan persentase yang tetap, dan pengguna dapat menyesuaikan stop loss proporsi.

  8. Manajemen Posisi: Setiap kali membuka posisi, pengguna dapat menyesuaikan persentase tetap dari hak dan manfaat akun.

Keunggulan Strategis

  1. Analisis tren multi-dimensi: Dengan menggunakan banyak rata-rata bergerak, strategi dapat menangkap tren pasar secara lebih komprehensif dan mengurangi sinyal palsu.

  2. Konfigurasi parameter yang fleksibel: Pengguna dapat menyesuaikan parameter dengan fleksibel sesuai dengan karakteristik pasar dan varietas perdagangan yang berbeda, termasuk jenis rata-rata, siklus, dan sumber data.

  3. Filter volatilitas: Dengan memperkenalkan indikator volatilitas, strategi dapat menghindari perdagangan di lingkungan yang rendah dan meningkatkan kualitas sinyal.

  4. Adaptasi bull/bear market: mekanisme penilaian bull/bear market yang dapat dipilih memungkinkan strategi untuk beradaptasi dengan lebih baik terhadap berbagai kondisi pasar, mengurangi perdagangan berlawanan.

  5. Manajemen Posisi Dinamis: Metode manajemen posisi berbasis kepentingan akun yang dapat secara otomatis menyesuaikan ukuran transaksi dengan perubahan ukuran akun.

  6. Pengendalian risiko bertingkat: mekanisme pengendalian risiko bertingkat, termasuk penyaringan tingkat fluktuasi, konfirmasi tren, posisi kosong parsial, dan stop loss tetap.

  7. Perdagangan dua arah: Dukungan untuk melakukan plus dan minus, kemampuan untuk mencari peluang perdagangan di berbagai lingkungan pasar.

  8. Bantuan visual: Strategi memetakan setiap label moving average dan sinyal perdagangan pada grafik untuk memudahkan analisis dan pengembalian visual.

Risiko Strategis

  1. Lagging: Moving Average pada dasarnya merupakan indikator lagging, yang dapat menyebabkan keterlambatan waktu masuk dan keluar, yang mempengaruhi profitabilitas.

  2. Performa buruk di pasar bergoyang: Dalam pasar bergoyang horizontal, strategi dapat sering menghasilkan sinyal palsu, yang menyebabkan overtrading dan kerugian.

  3. Sensitivitas parameter: Kinerja strategi sangat bergantung pada pengaturan parameter, dengan kombinasi parameter yang berbeda mungkin diperlukan untuk pasar dan kerangka waktu yang berbeda.

  4. Resiko penarikan: Strategi mungkin tidak dapat digunakan sepenuhnya pada waktu yang tepat ketika tren berbalik, menyebabkan penarikan yang lebih besar.

  5. Terlalu mengandalkan indikator teknis: Strategi yang sepenuhnya didasarkan pada indikator teknis, mengabaikan faktor-faktor mendasar, dan mungkin tidak berkinerja baik pada saat berita atau peristiwa penting terjadi.

  6. Manajemen risiko dana: Metode manajemen posisi proporsi tetap dapat menyebabkan risiko yang terlalu besar jika kerugian berturut-turut.

  7. Stop loss setting: Stop loss persentase tetap mungkin tidak berlaku untuk semua kondisi pasar, dan dapat menyebabkan stop loss prematur pada periode fluktuasi tinggi.

Arah optimasi strategi

  1. Parameter adaptasi: Memperkenalkan mekanisme adaptasi, menyesuaikan parameter rata-rata bergerak dan nilai ambang volatilitas sesuai dengan situasi pasar yang dinamis.

  2. Analisis multi-frame: menggabungkan informasi dari jangka waktu yang lebih panjang dan lebih pendek untuk meningkatkan akurasi penilaian tren.

  3. Optimalisasi indikator volatilitas: Pertimbangkan untuk menggunakan indikator volatilitas yang lebih kompleks seperti ATR atau Bollinger Bandwidth untuk menilai kondisi pasar dengan lebih akurat.

  4. Memperkenalkan indikator momentum: menggabungkan indikator momentum seperti RSI atau MACD, mengoptimalkan waktu masuk dan keluar.

  5. Peningkatan mekanisme stop loss: implementasi stop loss tracking atau stop loss dinamis berbasis ATR untuk lebih beradaptasi dengan fluktuasi pasar.

  6. Mengintegrasikan indikator sentimen pasar: memperkenalkan indikator sentimen pasar seperti VIX, dan mengoptimalkan strategi untuk berkinerja di berbagai lingkungan pasar.

  7. Manajemen Posisi Optimasi: Mengimplementasikan manajemen posisi dinamis berdasarkan volatilitas atau keuntungan saat ini, untuk mengendalikan risiko dengan lebih baik.

  8. Tambahkan filter dasar: pertimbangkan faktor dasar seperti publikasi data ekonomi penting atau laporan keuangan perusahaan, dan hindari perdagangan pada periode berisiko tinggi.

  9. Optimasi Pembelajaran Mesin: Menggunakan algoritma pembelajaran mesin untuk mengoptimalkan kombinasi parameter dan aturan keputusan, meningkatkan kemampuan adaptasi strategi.

  10. Retrospeksi dan pengujian ke depan: melakukan retrospeksi yang lebih komprehensif dan pengujian ke depan di berbagai pasar dan periode waktu untuk memverifikasi kekuatan strategi.

Meringkaskan

Strategi pelacakan tren silang multi rata-rata dan penyaringan tingkat fluktuasi adalah sistem perdagangan yang komprehensif dan fleksibel yang menggabungkan beberapa rata-rata bergerak, indikator tingkat fluktuasi, dan prinsip pelacakan tren. Dengan analisis tren multi-dimensi dan kontrol risiko yang ketat, strategi ini memiliki potensi untuk menangkap tren yang berkelanjutan di berbagai lingkungan pasar. Namun, pengguna perlu memperhatikan optimasi parameter dan masalah adaptasi pasar, dan mempertimbangkan untuk memperkenalkan lebih banyak indikator teknis canggih dan teknologi manajemen risiko untuk meningkatkan kinerja strategi lebih lanjut.

Kode Sumber Strategi
/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="WODIsMA Strategy", shorttitle="WMA_Strategy", overlay=true, overlay=true, pyramiding=2, default_qty_value=6, default_qty_type=strategy.fixed, initial_capital=1000, currency=currency.USD)

// 用户输入参数
capital_pct = input.float(20, title="每笔订单使用的资金百分比(%)", minval=0.1, maxval=100, group="Position") / 100
close_pct = input.float(20, title="每次平仓使用的百分比(%)", minval=0, maxval=100, group="Position") / 100
stop_loss_user = input.float(10, title="止损百分比(%)", minval=0, maxval=100, group="Position") / 100
allow_long = input.bool(true, title="是否做多", group="Position")
allow_short = input.bool(true, title="是否做空", group="Position")

// 用户选择的移动平均线
short_term_ma = input.string("MA 0", title="短期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
mid_term_ma = input.string("MA 1", title="中期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
long_term_ma = input.string("MA 2", title="长期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
bull_bear_ma = input.string("MA 3", title="牛熊趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
enable_bull_bear = input.bool(false, title="是否启用牛熊趋势线", group="TrendIdentify")
// 波动率指标参数
volatility_k = input.int(60, title="波动率数值K线数" , group="volatility")
volatility_threshold = input.float(1, minval=0, title="波动率值 0则不使用(%)", group="volatility")

// 定义不同类型的移动平均线函数
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

// 定义每根均线的输入参数和颜色
length0 = input.int(16, minval=1, title="Length 0", group="MA 0")
source0 = input.source(hl2, title="Source 0", group="MA 0")
type0 = input.string("SMA", title="Type 0", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 0")
timeframe0 = input.timeframe("", title="Timeframe 0", group="MA 0")
color0 = input.color(color.gray, title="Color 0", group="MA 0")
show0 = input.bool(true, title="Show MA 0", group="MA 0")

length1 = input.int(48, minval=1, title="Length 1", group="MA 1")
source1 = input.source(hl2, title="Source 1", group="MA 1")
type1 = input.string("SMA", title="Type 1", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 1")
timeframe1 = input.timeframe("", title="Timeframe 1", group="MA 1")
color1 = input.color(color.aqua, title="Color 1", group="MA 1")
show1 = input.bool(true, title="Show MA 1", group="MA 1")

length2 = input.int(144, minval=1, title="Length 2", group="MA 2")
source2 = input.source(hl2, title="Source 2", group="MA 2")
type2 = input.string("SMA", title="Type 2", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 2")
timeframe2 = input.timeframe("", title="Timeframe 2", group="MA 2")
color2 = input.color(color.orange, title="Color 2", group="MA 2")
show2 = input.bool(true, title="Show MA 2", group="MA 2")

length3 = input.int(432, minval=1, title="Length 3", group="MA 3")
source3 = input.source(hl2, title="Source 3", group="MA 3")
type3 = input.string("SMA", title="Type 3", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 3")
timeframe3 = input.timeframe("", title="Timeframe 3", group="MA 3")
color3 = input.color(color.green, title="Color 3", group="MA 3")
show3 = input.bool(true, title="Show MA 3", group="MA 3")

length4 = input.int(91, minval=1, title="Length 4", group="MA 4")
source4 = input.source(hl2, title="Source 4", group="MA 4")
type4 = input.string("SMA", title="Type 4", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 4")
timeframe4 = input.timeframe("D", title="Timeframe 4", group="MA 4")
color4 = input.color(color.rgb(159, 110, 208), title="Color 4", group="MA 4") // 浅紫色
style4 = input.string("step", title="Style 4", options=["line", "step"], group="MA 4")
show4 = input.bool(false, title="Show MA 4", group="MA 4")

length5 = input.int(182, minval=1, title="Length 5", group="MA 5")
source5 = input.source(hl2, title="Source 5", group="MA 5")
type5 = input.string("SMA", title="Type 5", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 5")
timeframe5 = input.timeframe("D", title="Timeframe 5", group="MA 5")
color5 = input.color(color.red, title="Color 5", group="MA 5")
style5 = input.string("step", title="Style 5", options=["line", "step"], group="MA 5")
show5 = input.bool(true, title="Show MA 5", group="MA 5")

// 计算每根均线的值
value0 = request.security(syminfo.tickerid, timeframe0, ma(source0, length0, type0))
value1 = request.security(syminfo.tickerid, timeframe1, ma(source1, length1, type1))
value2 = request.security(syminfo.tickerid, timeframe2, ma(source2, length2, type2))
value3 = request.security(syminfo.tickerid, timeframe3, ma(source3, length3, type3))
value4 = request.security(syminfo.tickerid, timeframe4, ma(source4, length4, type4))
value5 = request.security(syminfo.tickerid, timeframe5, ma(source5, length5, type5))

// 绘制每根均线
plot(show0 ? value0 : na, title="MA 0", color=color0)
plot(show1 ? value1 : na, title="MA 1", color=color1)
plot(show2 ? value2 : na, title="MA 2", color=color2)
plot(show3 ? value3 : na, title="MA 3", color=color3)
plot(show4 ? value4 : na, title="MA 4", color=color4, style=style4 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)
plot(show5 ? value5 : na, title="MA 5", color=color5, style=style5 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)

// 添加策略部分

// 选择均线值
get_ma_value(ma_name) =>
    if (ma_name == "MA 0")
        value0
    else if (ma_name == "MA 1")
        value1
    else if (ma_name == "MA 2")
        value2
    else if (ma_name == "MA 3")
        value3
    else if (ma_name == "MA 4")
        value4
    else
        value5

short_ma_value = get_ma_value(short_term_ma)
mid_ma_value = get_ma_value(mid_term_ma)
long_ma_value = get_ma_value(long_term_ma)
bull_bear_ma_value = get_ma_value(bull_bear_ma)

// 计算波动率
high_close = ta.highest(high, volatility_k)
low_close = ta.lowest(low, volatility_k)
volatility = 100 * (high_close - low_close) / low_close

// 波动率条件背景色
volatilityCondition = (volatility > volatility_threshold)
volatilityConditionBG = (volatility > volatility_threshold) and volatility_threshold != 0

bgcolor(volatilityConditionBG ? color.new(color.green, 90) : na, title="Volatility Background")

// 策略信号
long_condition = (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value))
short_condition = (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value))

var float stop_level_long = na
var float stop_level_short = na

// 执行策略
if (volatilityCondition and allow_long and (not enable_bull_bear or close > bull_bear_ma_value)) 
    if (long_condition and close > long_ma_value)  // 判断是否立即触发止损
        strategy.entry("Long", strategy.long, qty=capital_pct * strategy.equity / close)
        label.new(bar_index, low*0.996, text="BUY", color=color.green, textcolor=color.white, style=label.style_label_up, size=size.small)

if (volatilityCondition and allow_short and (not enable_bull_bear or close < bull_bear_ma_value)) 
    if (short_condition and close < long_ma_value)  // 判断是否立即触发止损
        strategy.entry("Short", strategy.short, qty=capital_pct * strategy.equity / close)
        label.new(bar_index, high*1.004, text="SELL", color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small)

// 部分平仓逻辑
if (enable_bull_bear)
    // 当当前价格处在牛熊趋势均线之下时
    if (close < bull_bear_ma_value)
        // 平所有多仓
        if (strategy.position_size > 0)
            strategy.close("Long", comment="平所有多仓")
            label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
        // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
        if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
            if (strategy.position_size < 0)
                strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
                label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)

    // 当当前价格处在牛熊趋势均线之上时
    if (close > bull_bear_ma_value)
        // 平所有空仓
        if (strategy.position_size < 0)
            strategy.close("Short", comment="平所有空仓")
            label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
        // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
        if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
            if (strategy.position_size > 0)
                strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
                label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)
else if (not enable_bull_bear and not (allow_long and allow_short))
    // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
    if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
        if (strategy.position_size < 0)
            strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
            label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)

    // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
    if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
        if (strategy.position_size > 0)
            strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
            label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)

// 止损处理
if (strategy.position_size > 0)
    stop_level_long_user = strategy.position_avg_price * (1 - stop_loss_user)
    strategy.exit("Stop Loss", from_entry="Long", stop=stop_level_long_user)
else if (strategy.position_size < 0)
    stop_level_short_user = strategy.position_avg_price * (1 + stop_loss_user)
    strategy.exit("Stop Loss", from_entry="Short", stop=stop_level_short_user)