Strategi rasio MA Premium Double Trend Filter

Penulis:ChaoZhang, Tanggal: 2023-12-28 17:37:14
Tag:

img

Gambaran umum

Strategi ini didasarkan pada indikator rasio rata-rata bergerak ganda yang dikombinasikan dengan filter Bollinger Bands dan indikator filter tren ganda. Ini mengadopsi mekanisme keluar berantai untuk mengikuti tren. Strategi ini bertujuan untuk mengidentifikasi arah tren jangka menengah hingga panjang melalui indikator rasio rata-rata bergerak.

Logika Strategi

  1. Menghitung rata-rata bergerak cepat (10 hari) dan rata-rata bergerak lambat (50 hari), mendapatkan rasio mereka yang disebut rasio rata-rata bergerak harga. rasio ini dapat secara efektif mengidentifikasi perubahan tren jangka menengah hingga panjang.
  2. Mengkonversi rasio rata-rata pergerakan harga ke persentil, yang mewakili kekuatan relatif rasio saat ini dalam periode yang lalu.
  3. Ketika osilator melintasi di atas ambang masuk beli (10), sinyal panjang memicu. Ketika melintasi di bawah ambang jual (90), sinyal pendek memicu tren berikutnya.
  4. Menggabungkan dengan indeks lebar Bollinger Bands untuk penyaringan sinyal. Perdagangan ketika lebar BB menyusut.
  5. Gunakan indikator filter tren ganda, hanya mengambil panjang ketika harga berada di saluran tren naik dan pendek ketika berada di tren turun untuk menghindari perdagangan terbalik.
  6. Strategi keluar rantai ditetapkan, termasuk mengambil keuntungan, stop loss, dan keluar gabungan.

Keuntungan

  1. Filter tren ganda memastikan keandalan dalam mengidentifikasi tren utama, menghindari perdagangan terbalik.
  2. Indikator rasio MA mendeteksi perubahan tren lebih baik daripada MA tunggal.
  3. Lebar BB secara efektif menemukan periode volatilitas rendah untuk sinyal yang lebih andal.
  4. Mekanisme keluar berantai memaksimalkan keuntungan keseluruhan.

Risiko dan Solusi

  1. Lebih banyak sinyal palsu dan pembalikan dengan tren yang tidak jelas selama pasar berkisar Solusi adalah untuk menggabungkan dengan filter lebar BB untuk sinyal yang lebih ketat.
  2. Solusi adalah untuk memperpendek parameter MA dengan benar.
  3. Stop loss dapat dipukul secara instan dengan celah harga, menyebabkan kerugian besar.

Arahan Optimasi

  1. Optimasi parameter pada periode MA, ambang oscillator, parameter BB melalui tes yang komprehensif untuk menemukan kombinasi terbaik.
  2. Masukkan indikator lain yang menilai pembalikan tren seperti KD, MACD untuk meningkatkan akurasi.
  3. Pelatihan model pembelajaran mesin dengan data historis untuk optimasi parameter dinamis.

Ringkasan

Strategi ini mengintegrasikan indikator rasio MA ganda dan BB untuk menentukan tren jangka menengah hingga panjang. Ini memasuki pasar pada titik terbaik setelah konfirmasi tren dengan mekanisme pengambilan keuntungan berantai. Ini sangat dapat diandalkan dan efisien. Peningkatan lebih lanjut dapat dicapai melalui optimasi parameter, menambahkan indikator pembalikan tren dan pembelajaran mesin.


/*backtest
start: 2023-12-20 00:00:00
end: 2023-12-27 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Premium MA Ratio Strategy", overlay = true)

// Input: Adjustable parameters for Premium MA Ratio
fast_length = input(10, title = "Fast MA Length")
slow_length = input(50, title = "Slow MA Length")
oscillator_threshold_buy = input(10, title = "Oscillator Buy Threshold")
oscillator_threshold_sell = input(90, title = "Oscillator Sell Threshold")

// Input: Adjustable parameters for Bollinger Bands
bb_length = input(20, title = "Bollinger Bands Length")
bb_source = input(close, title = "Bollinger Bands Source")
bb_deviation = input(2.0, title = "Bollinger Bands Deviation")
bb_width_threshold = input(30, title = "BB Width Threshold")
use_bb_filter = input(true, title = "Use BB Width Filter?")

// Input: Adjustable parameters for Trend Filter
use_trend_filter = input(true, title = "Use Trend Filter?")
trend_filter_period_1 = input(50, title = "Trend Filter Period 1")
trend_filter_period_2 = input(200, title = "Trend Filter Period 2")
use_second_trend_filter = input(true, title = "Use Second Trend Filter?")

// Input: Adjustable parameters for Exit Strategies
use_exit_strategies = input(true, title = "Use Exit Strategies?")
use_take_profit = input(true, title = "Use Take Profit?")
take_profit_ticks = input(150, title = "Take Profit in Ticks")
use_stop_loss = input(true, title = "Use Stop Loss?")
stop_loss_ticks = input(100, title = "Stop Loss in Ticks")
use_combined_exit = input(true, title = "Use Combined Exit Strategy?")
combined_exit_ticks = input(50, title = "Combined Exit Ticks")

// Input: Adjustable parameters for Time Filter
use_time_filter = input(false, title = "Use Time Filter?")
start_hour = input(8, title = "Start Hour")
end_hour = input(16, title = "End Hour")

// Calculate moving averages
fast_ma = sma(close, fast_length)
slow_ma = sma(close, slow_length)

// Calculate the premium price moving average ratio
premium_ratio = fast_ma / slow_ma * 100

// Calculate the percentile rank of the premium ratio
percentile_rank(src, length) =>
    rank = 0.0
    for i = 1 to length
        if src > src[i]
            rank := rank + 1.0
    percentile = rank / length * 100

// Calculate the percentile rank for the premium ratio using slow_length periods
premium_ratio_percentile = percentile_rank(premium_ratio, slow_length)

// Calculate the oscillator based on the percentile rank
oscillator = premium_ratio_percentile

// Dynamic coloring for the oscillator line
oscillator_color = oscillator > 50 ? color.green : color.red

// Plot the oscillator on a separate subplot as a line
hline(50, "Midline", color = color.gray)
plot(oscillator, title = "Oscillator", color = oscillator_color, linewidth = 2)

// Highlight the overbought and oversold areas
bgcolor(oscillator > oscillator_threshold_sell ? color.red : na, transp = 80)
bgcolor(oscillator < oscillator_threshold_buy ? color.green : na, transp = 80)

// Plot horizontal lines for threshold levels
hline(oscillator_threshold_buy, "Buy Threshold", color = color.green)
hline(oscillator_threshold_sell, "Sell Threshold", color = color.red)

// Calculate Bollinger Bands width
bb_upper = sma(bb_source, bb_length) + bb_deviation * stdev(bb_source, bb_length)
bb_lower = sma(bb_source, bb_length) - bb_deviation * stdev(bb_source, bb_length)
bb_width = bb_upper - bb_lower

// Calculate the percentile rank of Bollinger Bands width
bb_width_percentile = percentile_rank(bb_width, bb_length)

// Plot the Bollinger Bands width percentile line
plot(bb_width_percentile, title = "BB Width Percentile", color = color.blue, linewidth = 2)

// Calculate the trend filters
trend_filter_1 = sma(close, trend_filter_period_1)
trend_filter_2 = sma(close, trend_filter_period_2)

// Strategy logic
longCondition = crossover(premium_ratio_percentile, oscillator_threshold_buy)
shortCondition = crossunder(premium_ratio_percentile, oscillator_threshold_sell)

// Apply Bollinger Bands width filter if enabled
if (use_bb_filter)
    longCondition := longCondition and bb_width_percentile < bb_width_threshold
    shortCondition := shortCondition and bb_width_percentile < bb_width_threshold

// Apply trend filters if enabled
if (use_trend_filter)
    longCondition := longCondition and (close > trend_filter_1)
    shortCondition := shortCondition and (close < trend_filter_1)

// Apply second trend filter if enabled
if (use_trend_filter and use_second_trend_filter)
    longCondition := longCondition and (close > trend_filter_2)
    shortCondition := shortCondition and (close < trend_filter_2)

// Apply time filter if enabled
if (use_time_filter)
    longCondition := longCondition and (hour >= start_hour and hour <= end_hour)
    shortCondition := shortCondition and (hour >= start_hour and hour <= end_hour)

// Generate trading signals with exit strategies
if (use_exit_strategies)
    strategy.entry("Buy", strategy.long, when = longCondition)
    strategy.entry("Sell", strategy.short, when = shortCondition)
    
    // Define unique exit names for each order
    buy_take_profit_exit = "Buy Take Profit"
    buy_stop_loss_exit = "Buy Stop Loss"
    sell_take_profit_exit = "Sell Take Profit"
    sell_stop_loss_exit = "Sell Stop Loss"
    combined_exit = "Combined Exit"
    
    // Exit conditions for take profit
    if (use_take_profit)
        strategy.exit(buy_take_profit_exit, from_entry = "Buy", profit = take_profit_ticks)
        strategy.exit(sell_take_profit_exit, from_entry = "Sell", profit = take_profit_ticks)
    
    // Exit conditions for stop loss
    if (use_stop_loss)
        strategy.exit(buy_stop_loss_exit, from_entry = "Buy", loss = stop_loss_ticks)
        strategy.exit(sell_stop_loss_exit, from_entry = "Sell", loss = stop_loss_ticks)
    
    // Combined exit strategy
    if (use_combined_exit)
        strategy.exit(combined_exit, from_entry = "Buy", loss = combined_exit_ticks, profit = combined_exit_ticks)



Lebih banyak