Penjejakan arah aliran crossover purata berbilang bergerak dan strategi penapisan turun naik

MA EMA SMA WMA VWMA SMMA RMA
Tarikh penciptaan: 2024-07-29 13:37:09 Akhirnya diubah suai: 2024-07-29 13:37:09
Salin: 0 Bilangan klik: 636
1
fokus pada
1617
Pengikut

Penjejakan arah aliran crossover purata berbilang bergerak dan strategi penapisan turun naik

Gambaran keseluruhan

Strategi ini adalah sistem perdagangan yang mengesan trend berdasarkan pelbagai persilangan purata bergerak dan penapisan kadar pergerakan. Ia menggunakan purata bergerak dari tiga tempoh yang berbeza untuk mengenal pasti trend pasaran dan menggunakan purata bergerak keempat sebagai asas untuk penilaian bullish dan bearish. Strategi ini juga memperkenalkan indikator kadar pergerakan sebagai syarat penapisan perdagangan untuk mengelakkan perdagangan dalam persekitaran yang tidak stabil.

Prinsip Strategi

  1. Pemilihan purata bergerak: Strategi menggunakan tiga purata bergerak utama (pendek, sederhana, dan jangka panjang) untuk menilai trend. Pengguna boleh memilih dari enam purata bergerak yang telah ditentukan, dan setiap purata bergerak boleh dikonfigurasi secara berasingan, termasuk kitaran pengiraan, sumber data, dan jenis (seperti SMA, EMA, dll.).

  2. Penghakiman Trend:

    • Trend berbilang arah: apabila garis purata jangka pendek lebih tinggi daripada garis purata jangka panjang, dan garis purata jangka menengah melintasi garis purata jangka panjang ke atas.
    • Trend terbalik: apabila garis purata jangka pendek lebih rendah daripada garis purata jangka panjang dan garis purata jangka menengah ke bawah melintasi garis purata jangka panjang.
  3. Penilaian bullish: boleh memilih untuk menggunakan purata bergerak keempat sebagai garis pemisah bullish-bearish. Apabila harga berada di atas garis ini, hanya dibenarkan untuk melakukan lebih banyak; sebaliknya, hanya dibenarkan untuk melakukan kosong.

  4. Penapisan kadar turun naik: menggunakan penunjuk kadar turun naik berdasarkan harga tertinggi dan terendah. Strategi akan menghantar isyarat perdagangan hanya apabila kadar turun naik melebihi had yang ditetapkan oleh pengguna.

  5. Logik input:

    • Masuk ke arah berbilang mata: membuka lebih banyak kedudukan apabila trend berbilang mata disahkan, syarat turun naik dipenuhi, dan harga lebih tinggi daripada garis purata jangka panjang.
    • Masuk kosong: Keluar kosong apabila trend kosong disahkan, syarat turun naik dipenuhi, dan harga lebih rendah daripada garis purata jangka panjang.
  6. Logik keluar:

    • Penutupan separa: apabila trend berbalik arah ((garis purata jangka menengah dan garis purata jangka panjang bersilang semula), menebus sebahagian daripada kedudukan.
    • Semua kedudukan rata: apabila harga melintasi garis pemisah bullish dan bearish, semua kedudukan di arah yang bertentangan akan rata.
  7. Hentikan Kerosakan: Peratusan Hentikan tetap digunakan, pengguna boleh menyesuaikan peratusan Hentikan Kerosakan.

  8. Pentadbiran kedudukan: Peratusan tetap hak dan faedah akaun setiap kali anda membuka kedudukan.

Kelebihan Strategik

  1. Analisis trend pelbagai dimensi: Dengan menggunakan pelbagai purata bergerak, strategi dapat menangkap trend pasaran dengan lebih menyeluruh dan mengurangkan isyarat palsu.

  2. Konfigurasi parameter yang fleksibel: Pengguna boleh menyesuaikan parameter secara fleksibel mengikut ciri-ciri pasaran dan jenis perdagangan yang berbeza, termasuk jenis garis rata, kitaran dan sumber data.

  3. Penapisan kadar lonjakan: Dengan memperkenalkan penunjuk kadar lonjakan, strategi dapat mengelakkan perdagangan dalam persekitaran lonjakan rendah dan meningkatkan kualiti isyarat.

  4. Penyesuaian pasaran bull dan bear: mekanisme penilaian pasaran bull dan bear yang boleh dipilih membolehkan strategi untuk menyesuaikan diri dengan lebih baik dengan keadaan pasaran yang berbeza, mengurangkan perdagangan berlawanan.

  5. Pengurusan kedudukan dinamik: kaedah pengurusan kedudukan berdasarkan hak dan kepentingan akaun, yang dapat menyesuaikan saiz perdagangan secara automatik dengan perubahan saiz akaun.

  6. Kawalan risiko pelbagai peringkat: mekanisme kawalan risiko pelbagai termasuk penapisan kadar turun naik, pengesahan trend, kedudukan kosong sebahagiannya dan berhenti tetap.

  7. Perdagangan dua hala: menyokong perdagangan plus dan minus, membolehkan mencari peluang perdagangan dalam pelbagai keadaan pasaran.

  8. Bantuan visual: Strategi memetakan setiap purata bergerak dan label isyarat dagangan pada carta untuk memudahkan analisis dan tindak balas secara visual.

Risiko Strategik

  1. Ketinggalan: Rata-rata bergerak pada dasarnya adalah penunjuk ketinggalan, yang boleh menyebabkan kelewatan sedikit pada masa masuk dan keluar, yang menjejaskan keuntungan.

  2. Pasaran bergolak tidak berfungsi dengan baik: Dalam pasaran bergolak, strategi mungkin sering menghasilkan isyarat palsu, yang menyebabkan perdagangan berlebihan dan kerugian.

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

  4. Risiko penarikan balik: Apabila trend berbalik, strategi mungkin tidak dapat digunakan sepenuhnya dalam masa yang tepat, menyebabkan penarikan balik yang lebih besar.

  5. Terlalu bergantung kepada petunjuk teknikal: Strategi yang hanya berdasarkan kepada petunjuk teknikal, mengabaikan faktor asas, dan mungkin tidak berfungsi dengan baik apabila berita atau peristiwa penting berlaku.

  6. Risiko pengurusan wang: Kaedah pengurusan kedudukan peratusan tetap mungkin menyebabkan risiko yang terlalu besar jika kerugian berturut-turut.

  7. Tetapan Hentikan Kerosakan: Hentikan peratusan tetap mungkin tidak sesuai untuk semua keadaan pasaran, dan boleh menyebabkan hentikan awal pada masa turun naik yang tinggi.

Arah pengoptimuman strategi

  1. Parameter penyesuaian diri: Memperkenalkan mekanisme penyesuaian diri, menyesuaikan parameter purata bergerak dan nilai ambang kadar turun naik mengikut keadaan pasaran yang dinamik.

  2. Analisis pelbagai jangka masa: menggabungkan maklumat jangka masa yang lebih panjang dan lebih pendek untuk meningkatkan ketepatan penilaian trend.

  3. Optimumkan indikator turun naik: Pertimbangkan untuk menggunakan indikator turun naik yang lebih kompleks seperti ATR atau Bollinger Bandwidth untuk menilai keadaan pasaran dengan lebih tepat.

  4. Memperkenalkan penunjuk momentum: menggabungkan penunjuk momentum seperti RSI atau MACD, mengoptimumkan masa masuk dan keluar.

  5. Peningkatan mekanisme hentian kerugian: mewujudkan hentian yang dikesan atau hentian dinamik berdasarkan ATR untuk lebih menyesuaikan diri dengan turun naik pasaran.

  6. Mengintegrasikan penunjuk sentimen pasaran: memperkenalkan penunjuk sentimen pasaran seperti VIX, strategi pengoptimuman untuk prestasi dalam keadaan pasaran yang berbeza.

  7. Pengurusan kedudukan yang dioptimumkan: Mencapai pengurusan kedudukan dinamik berdasarkan kadar turun naik atau keuntungan semasa, untuk mengawal risiko dengan lebih baik.

  8. Tambah penapis asas: pertimbangkan faktor asas seperti pengumuman data ekonomi penting atau laporan kewangan syarikat, dan elakkan berdagang pada masa risiko tinggi.

  9. Pengoptimuman Pembelajaran Mesin: Menggunakan algoritma pembelajaran mesin untuk mengoptimumkan set parameter dan peraturan keputusan, meningkatkan kebolehpasaran strategi.

  10. Ujian balik dan ke hadapan: Ujian balik yang lebih menyeluruh dan ujian ke hadapan dalam pelbagai pasaran dan tempoh masa untuk mengesahkan strategi yang kukuh.

ringkaskan

Strategi pemantauan trend silang dan penapisan kadar lonjakan adalah sistem perdagangan yang komprehensif dan fleksibel yang menggabungkan banyak purata bergerak, penunjuk kadar lonjakan dan prinsip pemantauan trend. Dengan analisis trend pelbagai dimensi dan kawalan risiko yang ketat, strategi ini berpotensi untuk menangkap trend yang berterusan dalam pelbagai keadaan pasaran.

Kod 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)