Strategi nisbah MA Premium Double Trend Filter

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

img

Ringkasan

Strategi ini berdasarkan kepada penunjuk nisbah purata bergerak berganda yang digabungkan dengan penapis Bollinger Bands dan penunjuk penapis trend berganda. Ia menggunakan mekanisme keluar berantai untuk mengikuti trend. Strategi ini bertujuan untuk mengenal pasti arah trend jangka menengah hingga panjang melalui penunjuk nisbah purata bergerak. Ia memasuki pasaran pada titik kemasukan yang lebih baik apabila arah trend jelas. Ia juga menetapkan mekanisme keluar mengambil keuntungan, menghentikan kerugian untuk mengunci keuntungan dan mengurangkan kerugian.

Logika Strategi

  1. Mengira purata bergerak pantas (10 hari) dan purata bergerak perlahan (50 hari), mendapatkan nisbah mereka yang dipanggil nisbah purata bergerak harga. nisbah ini dapat dengan berkesan mengenal pasti perubahan trend jangka menengah hingga panjang.
  2. Tukar nisbah purata bergerak harga ke perseptil, yang mewakili kekuatan relatif nisbah semasa dalam tempoh yang lalu. Perseptil ini ditakrifkan sebagai osilator.
  3. Apabila pengayun melintasi di atas ambang masuk beli (10), isyarat panjang mencetuskan. Apabila melintasi di bawah ambang jual (90), isyarat pendek mencetuskan trend berikut.
  4. Gabungkan dengan indeks lebar Bollinger Bands untuk penapisan isyarat. Perdagangan apabila lebar BB mengecil.
  5. Gunakan penunjuk penapis trend berganda, hanya mengambil masa yang lama apabila harga berada dalam saluran trend menaik dan pendek apabila dalam trend menurun untuk mengelakkan perdagangan terbalik.
  6. Strategi keluar rantaian ditetapkan, termasuk mengambil keuntungan, hentikan kerugian, dan keluar gabungan.

Kelebihan

  1. Penapis trend berganda memastikan kebolehpercayaan dalam mengenal pasti trend utama, mengelakkan perdagangan terbalik.
  2. Penunjuk nisbah MA mengesan perubahan trend lebih baik daripada MA tunggal.
  3. Lebar BB secara berkesan mencari tempoh turun naik yang rendah untuk isyarat yang lebih boleh dipercayai.
  4. Mekanisme keluar berantai memaksimumkan keuntungan keseluruhan.

Risiko dan Penyelesaian

  1. Lebih banyak isyarat palsu dan pembalikan dengan trend yang tidak jelas semasa pasaran berkisar.
  2. MA mempunyai kesan kelewatan, gagal untuk mengesan pembalikan trend dengan serta-merta.
  3. Stop loss boleh dipukul dengan segera dengan jurang harga, menyebabkan kerugian besar.

Arahan pengoptimuman

  1. Pengoptimuman parameter pada tempoh MA, ambang osilator, parameter BB melalui ujian yang komprehensif untuk mencari kombinasi terbaik.
  2. Masukkan penunjuk lain yang menilai pembalikan trend seperti KD, MACD untuk meningkatkan ketepatan.
  3. Latihan model pembelajaran mesin dengan data sejarah untuk pengoptimuman parameter dinamik.

Ringkasan

Strategi ini mengintegrasikan penunjuk nisbah MA berganda dan BB untuk menentukan trend jangka menengah hingga panjang. Ia memasuki pasaran pada titik terbaik selepas pengesahan trend dengan mekanisme pengambilan keuntungan berantai. Ia sangat boleh dipercayai dan cekap. Penambahbaikan lanjut dapat dicapai melalui pengoptimuman parameter, menambah penunjuk pembalikan trend 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 lanjut