Stratégie de ratio MA du filtre à double tendance premium

Auteur:ChaoZhang est là., Date: le 28 décembre 2023 17:37:14
Les étiquettes:

img

Résumé

Cette stratégie est basée sur l'indicateur de double ratio de moyenne mobile combiné avec le filtre Bollinger Bands et l'indicateur de double filtre de tendance. Elle adopte des mécanismes de sortie en chaîne pour suivre la tendance.

La logique de la stratégie

  1. Calculer la moyenne mobile rapide (10 jours) et la moyenne mobile lente (50 jours), obtenir leur rapport appelé rapport de moyenne mobile de prix. Ce rapport peut identifier efficacement les changements de tendance à moyen et long terme.
  2. Convertissez le ratio moyen mobile des prix en percentile, qui représente la force relative du ratio actuel dans les périodes précédentes.
  3. Lorsque l'oscillateur dépasse le seuil d'entrée d'achat (10), le signal long est déclenché.
  4. Combinez avec l'indice de largeur des bandes de Bollinger pour filtrer le signal.
  5. Utilisez l'indicateur à double filtre de tendance, en prenant seulement du long lorsque le prix est dans le canal de tendance haussière et du court lorsque la tendance baisse pour éviter le trading inverse.
  6. Les stratégies de sortie de chaîne sont définies, y compris le profit, le stop loss et la sortie combinée.

Les avantages

  1. Le double filtre de tendance assure une fiabilité dans l'identification de la tendance principale, évitant ainsi les transactions inversées.
  2. L'indicateur du ratio MA détecte mieux les changements de tendance que l'indicateur unique MA.
  3. La largeur BB permet de localiser efficacement les périodes de faible volatilité pour des signaux plus fiables.
  4. Le mécanisme de sortie en chaîne maximise le profit global.

Risques et solutions

  1. Plus de faux signaux et de renversements avec une tendance peu claire pendant les marchés en variation.
  2. La solution consiste à raccourcir correctement les paramètres de MA.
  3. Le stop loss peut être frappé instantanément avec des écarts de prix, provoquant une grande perte.

Directions d'optimisation

  1. Optimisation des paramètres sur les périodes de MA, les seuils des oscillateurs, les paramètres BB par des tests exhaustifs pour trouver la meilleure combinaison.
  2. Incorporer d'autres indicateurs jugant l'inversion de tendance comme KD, MACD pour améliorer la précision.
  3. Formation de modèles d'apprentissage automatique avec des données historiques pour l'optimisation de paramètres dynamiques.

Résumé

Cette stratégie intègre l'indicateur double MA ratio et BB pour déterminer la tendance à moyen et long terme. Il entre sur le marché au meilleur moment après la confirmation de la tendance avec des mécanismes de prise de profit en chaîne. Il est très fiable et efficace. D'autres améliorations peuvent être obtenues grâce à l'optimisation des paramètres, l'ajout d'indicateurs d'inversion de tendance et l'apprentissage automatique.


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



Plus de