Sumber daya yang dimuat... Pemuatan...

Trend Crossover Rata-rata Multi-Moving Mengikuti Strategi dengan Filter Volatilitas

Penulis:ChaoZhang, Tanggal: 2024-07-29 13:37:09
Tag:MAEMASMAWMAVWMASMMARMA

img

Gambaran umum

Strategi ini adalah sistem perdagangan yang mengikuti tren berdasarkan beberapa crossover rata-rata bergerak dan penyaringan volatilitas. Ini memanfaatkan tiga rata-rata bergerak dari periode yang berbeda untuk mengidentifikasi tren pasar dan menggunakan rata-rata bergerak keempat sebagai patokan untuk penentuan pasar bull / bear. Strategi ini juga menggabungkan indikator volatilitas sebagai filter perdagangan untuk menghindari perdagangan di lingkungan volatilitas rendah.

Prinsip Strategi

  1. Pemilihan Moving Average: Strategi ini menggunakan tiga rata-rata bergerak utama (jangka pendek, jangka menengah, dan jangka panjang) untuk menentukan tren. Pengguna dapat memilih dari enam rata-rata bergerak yang telah didefinisikan sebelumnya, yang masing-masing dapat dikonfigurasi secara individual dengan parameter termasuk periode perhitungan, sumber data, dan jenis (misalnya, SMA, EMA).

  2. Penentuan Tren:

    • Trend Bullish: Ketika MA jangka pendek berada di atas MA jangka panjang, dan MA jangka menengah menyeberang di atas MA jangka panjang.
    • Trend bearish: Ketika MA jangka pendek berada di bawah MA jangka panjang, dan MA jangka menengah melintasi di bawah MA jangka panjang.
  3. Determinasi Pasar Bull/Bear: Rata-rata bergerak keempat opsional dapat digunakan sebagai garis pemisah untuk pasar bull dan bear. Hanya posisi panjang yang diizinkan ketika harga di atas garis ini, dan hanya posisi pendek ketika di bawahnya.

  4. Volatility Filter: Sebuah indikator volatilitas berdasarkan harga tertinggi dan terendah digunakan. Strategi hanya menghasilkan sinyal perdagangan ketika volatilitas melebihi ambang batas yang ditentukan pengguna.

  5. Logika entri:

    • Long Entry: Masukkan posisi panjang ketika tren bullish dikonfirmasi, kondisi volatilitas terpenuhi, dan harga berada di atas MA jangka panjang.
    • Short Entry: Masukkan posisi short ketika tren menurun dikonfirmasi, kondisi volatilitas terpenuhi, dan harga berada di bawah MA jangka panjang.
  6. Logika keluar:

    • Parsial Exit: Tutup persentase tertentu dari posisi ketika tren berbalik (MA jangka menengah menyeberangi MA jangka panjang lagi).
    • Full Exit: Tutup semua posisi ke arah yang berlawanan ketika harga melintasi garis pemisah pasar bull/bear.
  7. Stop Loss: Menggunakan stop loss persentase tetap, yang dapat disesuaikan oleh pengguna.

  8. Manajemen Posisi: Menggunakan persentase tetap dari ekuitas akun untuk setiap perdagangan, yang dapat disesuaikan oleh pengguna.

Keuntungan Strategi

  1. Analisis Tren Multidimensional: Dengan menggunakan beberapa rata-rata bergerak, strategi dapat menangkap tren pasar secara lebih komprehensif, mengurangi sinyal palsu.

  2. Konfigurasi Parameter Fleksibel: Pengguna dapat menyesuaikan berbagai parameter secara fleksibel sesuai dengan karakteristik pasar dan instrumen perdagangan yang berbeda, termasuk jenis MA, periode, dan sumber data.

  3. Penyaringan Volatilitas: Dengan memasukkan indikator volatilitas, strategi dapat menghindari perdagangan di lingkungan volatilitas rendah, meningkatkan kualitas sinyal.

  4. Adaptasi Pasar Bull/Bear: Mekanisme penentuan pasar bull/bear opsional memungkinkan strategi untuk lebih beradaptasi dengan lingkungan pasar yang berbeda, mengurangi perdagangan yang bertentangan dengan tren.

  5. Manajemen Posisi Dinamis: Metode manajemen posisi berbasis ekuitas secara otomatis menyesuaikan ukuran perdagangan saat ukuran akun berubah.

  6. Pengendalian Risiko Berlapis-Lapisan: Termasuk beberapa mekanisme pengendalian risiko seperti penyaringan volatilitas, konfirmasi tren, penutupan posisi parsial, dan stop loss tetap.

  7. Perdagangan dua arah: Mendukung posisi panjang dan pendek, memungkinkan peluang perdagangan dalam berbagai kondisi pasar.

  8. Bantuan Visual: Strategi memetakan berbagai rata-rata bergerak dan label sinyal perdagangan pada grafik, memfasilitasi analisis intuitif dan backtesting.

Risiko Strategi

  1. Sifat keterlambatan: Rata-rata bergerak secara inheren merupakan indikator keterlambatan, yang dapat menyebabkan sedikit penundaan waktu masuk dan keluar, yang mempengaruhi profitabilitas.

  2. Kinerja yang buruk di pasar yang bervariasi: Di pasar yang bergolak, strategi dapat menghasilkan sinyal palsu yang sering, yang menyebabkan overtrading dan kerugian.

  3. Sensitivitas Parameter: Kinerja strategi sangat tergantung pada pengaturan parameter, dan pasar dan kerangka waktu yang berbeda mungkin memerlukan kombinasi parameter yang berbeda.

  4. Risiko penarikan: Selama pembalikan tren, strategi mungkin tidak keluar dari posisi sepenuhnya pada waktunya, yang berpotensi menyebabkan penarikan yang signifikan.

  5. Terlalu mengandalkan Indikator Teknis: Strategi ini sepenuhnya didasarkan pada indikator teknis, mengabaikan faktor-faktor fundamental, yang dapat menyebabkan kinerja yang buruk selama berita atau peristiwa besar.

  6. Risiko Pengelolaan Uang: Metode ukuran posisi persentase tetap dapat mengakibatkan eksposur risiko yang berlebihan selama kerugian berturut-turut.

  7. Pengaturan Stop Loss: Stop loss persentase tetap mungkin tidak cocok untuk semua lingkungan pasar dan dapat menyebabkan keluar dini selama periode volatilitas tinggi.

Arah Optimasi Strategi

  1. Parameter Adaptif: Memperkenalkan mekanisme adaptif untuk menyesuaikan secara dinamis parameter rata-rata bergerak dan ambang volatilitas berdasarkan kondisi pasar.

  2. Analisis Multi-Timeframe: Menggabungkan informasi dari jangka waktu yang lebih panjang dan lebih pendek untuk meningkatkan akurasi penentuan tren.

  3. Optimasi Indikator Volatilitas: Pertimbangkan untuk menggunakan indikator volatilitas yang lebih canggih seperti ATR atau Bollinger Bandwidth untuk penilaian kondisi pasar yang lebih akurat.

  4. Integrasi Indikator Momentum: Gabungkan indikator momentum seperti RSI atau MACD untuk mengoptimalkan waktu masuk dan keluar.

  5. Mekanisme Stop Loss yang Ditingkatkan: Menerapkan trailing stop atau stop loss dinamis berbasis ATR untuk lebih beradaptasi dengan volatilitas pasar.

  6. Integrasi Sentimen Pasar: Menggabungkan indikator sentimen pasar seperti VIX untuk mengoptimalkan kinerja strategi di lingkungan pasar yang berbeda.

  7. Optimasi Manajemen Posisi: Melaksanakan ukuran posisi dinamis berdasarkan volatilitas atau laba/rugi saat ini untuk pengendalian risiko yang lebih baik.

  8. Penambahan Filter Dasar: Pertimbangkan faktor-faktor dasar seperti rilis data ekonomi penting atau laporan laba perusahaan untuk menghindari perdagangan selama periode berisiko tinggi.

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

  10. Backtesting dan Forward Testing: Melakukan backtesting yang lebih komprehensif dan pengujian ke depan di pasar dan periode waktu yang berbeda untuk memverifikasi kekuatan strategi.

Kesimpulan

Multi-Moving Average Crossover Trend Following Strategy with Volatility Filter adalah sistem perdagangan yang komprehensif dan fleksibel yang menggabungkan beberapa moving average, indikator volatilitas, dan prinsip-prinsip trend-following. Melalui analisis tren multi-dimensi dan kontrol risiko yang ketat, strategi ini memiliki potensi untuk menangkap tren yang terus-menerus di berbagai lingkungan pasar. Namun, pengguna perlu memperhatikan isu optimasi parameter dan kemampuan beradaptasi pasar, dan mempertimbangkan untuk memperkenalkan indikator teknis yang lebih maju dan teknik manajemen risiko untuk lebih meningkatkan kinerja strategi. Secara keseluruhan, ini adalah kerangka strategi yang solid yang memberikan dasar yang baik untuk penelitian dan optimasi lebih lanjut.


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

Berkaitan

Lebih banyak