Sumber dimuat naik... memuat...

Trend Crossover Purata Multi-Moving Mengikut Strategi dengan Penapis Volatiliti

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

img

Ringkasan

Strategi ini adalah sistem perdagangan yang mengikuti trend berdasarkan pelbagai persilangan purata bergerak dan penapisan turun naik. Ia menggunakan tiga purata bergerak dari tempoh yang berbeza untuk mengenal pasti trend pasaran dan menggunakan purata bergerak keempat sebagai penanda aras untuk penentuan pasaran lembu / beruang. Strategi ini juga menggabungkan penunjuk turun naik sebagai penapis perdagangan untuk mengelakkan perdagangan dalam persekitaran turun naik yang rendah. Ia menyokong kedua-dua kedudukan panjang dan pendek dan menyediakan pengurusan kedudukan yang fleksibel dan mekanisme hentian kerugian.

Prinsip Strategi

  1. Pemilihan purata bergerak: Strategi ini menggunakan tiga purata bergerak utama (jangka pendek, jangka sederhana, dan jangka panjang) untuk menentukan trend. Pengguna boleh memilih dari enam purata bergerak yang telah ditentukan, yang masing-masing boleh dikonfigurasikan secara individu dengan parameter termasuk tempoh pengiraan, sumber data, dan jenis (contohnya, SMA, EMA).

  2. Penentuan Trend:

    • Trend Bullish: Apabila MA jangka pendek berada di atas MA jangka panjang, dan MA jangka sederhana melintasi di atas MA jangka panjang.
    • Trend penurunan: Apabila MA jangka pendek berada di bawah MA jangka panjang, dan MA jangka sederhana menyeberang di bawah MA jangka panjang.
  3. Penentuan pasaran Bull/Bear: Purata bergerak keempat pilihan boleh digunakan sebagai garis pemisah untuk pasaran bull dan bear. Hanya kedudukan panjang dibenarkan apabila harga di atas garis ini, dan hanya kedudukan pendek apabila di bawah.

  4. Penapis Volatiliti: Penunjuk volatiliti berdasarkan harga tertinggi dan terendah digunakan. Strategi hanya menghasilkan isyarat perdagangan apabila volatiliti melebihi ambang yang ditakrifkan oleh pengguna.

  5. Logika kemasukan:

    • Masuk panjang: Masukkan kedudukan panjang apabila trend menaik disahkan, keadaan turun naik dipenuhi, dan harga berada di atas MA jangka panjang.
    • Entry Pendek: Masukkan kedudukan pendek apabila trend menurun disahkan, keadaan turun naik dipenuhi, dan harga berada di bawah MA jangka panjang.
  6. Logik Keluar:

    • Keluar Sebahagian: Tutup peratusan tertentu kedudukan apabila trend berbalik (MA jangka sederhana menyeberangi MA jangka panjang lagi).
    • Keluar penuh: Tutup semua kedudukan ke arah yang bertentangan apabila harga melintasi garis pembahagian pasaran lembu / beruang.
  7. Stop Loss: Menggunakan peratusan stop loss tetap, yang boleh disesuaikan oleh pengguna.

  8. Pengurusan Kedudukan: Menggunakan peratusan tetap ekuiti akaun untuk setiap perdagangan, yang boleh disesuaikan oleh pengguna.

Kelebihan Strategi

  1. Analisis Trend Berbilang Dimensi: Dengan menggunakan pelbagai purata bergerak, strategi dapat menangkap trend pasaran dengan lebih komprehensif, mengurangkan isyarat palsu.

  2. Konfigurasi Parameter Fleksibel: Pengguna boleh menyesuaikan pelbagai parameter dengan fleksibel mengikut ciri-ciri pasaran dan instrumen perdagangan yang berbeza, termasuk jenis MA, tempoh, dan sumber data.

  3. Penapisan Volatiliti: Dengan menggabungkan penunjuk volatiliti, strategi dapat mengelakkan perdagangan dalam persekitaran volatiliti rendah, meningkatkan kualiti isyarat.

  4. Penyesuaian pasaran bull/bear: Mekanisme penentuan pasaran bull/bear pilihan membolehkan strategi untuk menyesuaikan diri dengan lebih baik dengan persekitaran pasaran yang berbeza, mengurangkan perdagangan yang bertentangan dengan trend.

  5. Pengurusan Posisi Dinamik: Kaedah pengurusan kedudukan berasaskan ekuiti menyesuaikan saiz dagangan secara automatik apabila saiz akaun berubah.

  6. Pengendalian Risiko berlapis-lapis: Merangkumi pelbagai mekanisme kawalan risiko seperti penapisan turun naik, pengesahan trend, penutupan kedudukan separa, dan stop loss tetap.

  7. Perdagangan dua arah: Menyokong kedua-dua kedudukan panjang dan pendek, yang membolehkan peluang perdagangan dalam pelbagai keadaan pasaran.

  8. Bantuan Visual: Strategi merangka pelbagai purata bergerak dan label isyarat perdagangan pada carta, memudahkan analisis intuitif dan pengujian belakang.

Risiko Strategi

  1. Sifat ketinggalan: Purata bergerak secara semula jadi merupakan penunjuk ketinggalan, yang boleh menyebabkan penangguhan sedikit masa masuk dan keluar, mempengaruhi keuntungan.

  2. Prestasi yang lemah dalam pasaran yang berbeza: Dalam pasaran yang berbelit-belit, strategi boleh menghasilkan isyarat palsu yang kerap, yang membawa kepada perdagangan berlebihan dan kerugian.

  3. Sensitiviti Parameter: Prestasi strategi sangat bergantung kepada tetapan parameter, dan pasaran dan jangka masa yang berbeza mungkin memerlukan kombinasi parameter yang berbeza.

  4. Risiko Penarikan: Semasa pembalikan trend, strategi mungkin tidak keluar dari kedudukan sepenuhnya dengan cara yang tepat, yang berpotensi membawa kepada penarikan yang ketara.

  5. Terlalu bergantung kepada Penunjuk Teknikal: Strategi ini sepenuhnya berdasarkan penunjuk teknikal, mengabaikan faktor asas, yang boleh menyebabkan prestasi yang buruk semasa berita atau peristiwa utama.

  6. Risiko Pengurusan Wang: Kaedah saiz kedudukan peratusan tetap boleh menyebabkan pendedahan risiko yang berlebihan semasa kerugian berturut-turut.

  7. Tetapan Stop Loss: Peratusan stop loss tetap mungkin tidak sesuai untuk semua persekitaran pasaran dan boleh menyebabkan keluar awal semasa tempoh turun naik yang tinggi.

Arahan Pengoptimuman Strategi

  1. Parameter penyesuaian: Memperkenalkan mekanisme penyesuaian untuk menyesuaikan parameter purata bergerak dan ambang turun naik secara dinamik berdasarkan keadaan pasaran.

  2. Analisis pelbagai jangka masa: Menggabungkan maklumat dari jangka masa yang lebih panjang dan lebih pendek untuk meningkatkan ketepatan penentuan trend.

  3. Pengoptimuman Penunjuk Volatiliti: Pertimbangkan untuk menggunakan penunjuk volatiliti yang lebih canggih seperti ATR atau Bollinger Bandwidth untuk penilaian keadaan pasaran yang lebih tepat.

  4. Integrasi Indikator Momentum: Gabungkan penunjuk momentum seperti RSI atau MACD untuk mengoptimumkan masa masuk dan keluar.

  5. Mekanisme Stop Loss yang dipertingkatkan: Melaksanakan stop trailing atau stop loss dinamik berasaskan ATR untuk menyesuaikan diri dengan lebih baik dengan turun naik pasaran.

  6. Integrasi Sentimen Pasaran: Menggabungkan penunjuk sentimen pasaran seperti VIX untuk mengoptimumkan prestasi strategi dalam persekitaran pasaran yang berbeza.

  7. Pengoptimuman Pengurusan Posisi: Melaksanakan saiz kedudukan dinamik berdasarkan turun naik atau keuntungan / kerugian semasa untuk kawalan risiko yang lebih baik.

  8. Penambahan Penapis Dasar: Pertimbangkan faktor asas seperti siaran data ekonomi penting atau laporan pendapatan syarikat untuk mengelakkan perdagangan semasa tempoh berisiko tinggi.

  9. Pengoptimuman Pembelajaran Mesin: Gunakan algoritma pembelajaran mesin untuk mengoptimumkan kombinasi parameter dan peraturan keputusan, meningkatkan fleksibiliti strategi.

  10. Pengujian Backtesting dan Forward Testing: Melakukan pengujian backtesting dan forward testing yang lebih komprehensif di pasaran dan tempoh masa yang berbeza untuk mengesahkan kekuatan strategi.

Kesimpulan

Strategi Mengikuti Trend Crossover Purata Berbilang Bergerak dengan Penapis Volatiliti adalah sistem dagangan yang komprehensif dan fleksibel yang menggabungkan pelbagai purata bergerak, penunjuk turun naik, dan prinsip mengikuti trend. Melalui analisis trend berbilang dimensi dan kawalan risiko yang ketat, strategi ini mempunyai potensi untuk menangkap trend yang berterusan dalam pelbagai persekitaran pasaran. Walau bagaimanapun, pengguna perlu memberi perhatian kepada isu pengoptimuman parameter dan penyesuaian pasaran, dan mempertimbangkan pengenalan penunjuk teknikal yang lebih maju dan teknik pengurusan risiko untuk meningkatkan prestasi strategi. Secara keseluruhan, ini adalah rangka kerja strategi yang kukuh yang memberikan asas yang baik untuk penyelidikan dan pengoptimuman 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 lanjut