Stratégie homogène entre le microphone et le multi-temps

Auteur:ChaoZhang est là., Date: 2023-11-01 16h37 et 17h
Les étiquettes:

麦克风散架与多时间框架均线策略

Résumé

Cette stratégie utilise les indicateurs MACD et l'équilibre multi-temporel pour former une stratégie de trading à double sens à court et à long terme qui utilise les signaux de tendance et de renversement de tendance.

Les principes stratégiques

  1. L'utilisation de deux groupes de filtres à fuseaux horaires différents pour le filtrage de l'EMA en combinaison avec des groupes de filtres à fuseaux horaires multiples permet de déterminer l'orientation de l'air: 15 minutes pour un EMA rapide supérieur à 1 heure et 15 minutes pour un EMA rapide inférieur à 1 heure.

  2. Lorsque l'on observe la formation d'un écart entre les étagères de microphones (l'écart entre les lignes de colonne et le prix), le jugement peut être inversé.

  3. Lorsqu'un filtre à vue s'ouvre, si un marché haussier s'écarte (le prix est nouveau et le MACD n'est pas innovant), attendez que le MACD se déplace sur l'axe zéro et faites plus; lorsque le filtre à vue s'ouvre, si un marché baissier s'écarte (le prix est nouveau et le MACD n'est pas innovant), attendez que le MACD se déplace sur l'axe zéro et faites vide.

  4. Le mode de stop-loss est un stop-loss de type traceur continu, calculé en fonction de la plage de fluctuation des prix les plus élevés et les plus bas.

  5. L'équilibre lorsque la ligne MACD s'écrase dans le sens zéro.

Analyse des avantages

  1. Les EMA multi-frame permettent de juger des tendances des grands cycles et d'éviter les transactions contraires.

  2. La déviation du MACD capte les opportunités d'inversion des prix et convient à une stratégie d'inversion.

  3. Le suivi dynamique des pertes peut bloquer les gains et éviter que les pertes ne se multiplient.

  4. Le prix de vente est calculé en fonction de la distance de freinage pour obtenir le retour attendu.

L'analyse des risques

  1. L'EMA est un filtrage de l'équilibre des lignes, qui peut entraîner des erreurs de direction au cours de la phase de réglage.

  2. La reprise est faible après la reprise du MACD et pourrait ne pas être rentable.

  3. La distance d'arrêt est mal réglée, peut être trop large ou trop serrée.

  4. Les bénéfices sont limités et il n'y a pas assez d'espace de reprise.

  5. Il est nécessaire de saisir correctement l'heure de l'inversion, car trop tôt ou trop tard peut entraîner des pertes.

Optimisation

  1. L'EMA peut être testé avec différentes combinaisons de paramètres pour obtenir des jugements de tendance plus précis.

  2. On peut essayer d'ajuster les paramètres MACD à des combinaisons de paramètres plus sensibles.

  3. Il est possible de tester différents réglages de taux d'arrêt-perte.

  4. Des conditions de filtrage supplémentaires peuvent être ajoutées pour éviter de tomber dans un faux rebond. Par exemple, l'ajout d'un EMA à un délai plus long pour déterminer les tendances globales.

  5. L'optimisation des conditions de confirmation de l'inversion peut être effectuée pour assurer que la tendance d'inversion est suffisamment mature.

Résumé

Cette stratégie utilise intégralement des moyens tels que le filtrage des tendances, les signaux de renversement des tendances, la gestion dynamique des arrêts-pertes et des arrêts-déperditions, qui peuvent évoluer et capter les renversements. Grâce à l'ajustement et à l'optimisation des paramètres des conditions de filtrage, elle peut s'adapter à un environnement de marché plus large et obtenir des rendements stables dans la mesure où le risque est contrôlé. Cette stratégie a une certaine universalité et une valeur pratique.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-06-16 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © maxits
//@version=4

// MACD Divergence + Multi Time Frame EMA
// This Strategy uses 3 indicators: the Macd and two emas in different time frames
// The configuration of the strategy is:
// Macd standar configuration (12, 26, 9) in 1H resolution
// 10 periods ema, in 1H resolution
// 5 periods ema, in 15 minutes resolution

// We use the two emas to filter for long and short positions. 
// If 15 minutes ema is above 1H ema, we look for long positions
// If 15 minutes ema is below 1H ema, we look for short positions 

// We can use an aditional filter using a 100 days ema, so when the 15' and 1H emas are above the daily ema we take long positions
// Using this filter improves the strategy 

// We wait for Macd indicator to form a divergence between histogram and price
// If we have a bullish divergence, and 15 minutes ema is above 1H ema, we wait for macd line to cross above signal line and we open a long position
// If we have a bearish divergence, and 15 minutes ema is below 1H ema, we wait for macd line to cross below signal line and we open a short position

// We close both position after a cross in the oposite direction of macd line and signal line
// Also we can configure a Take profit parameter and a trailing stop loss


// strategy("Macd + MTF EMA",
//          overlay=true,
//          initial_capital=1000,
//          default_qty_value=20,
//          default_qty_type=strategy.percent_of_equity,
//          commission_value=0.1,
//          pyramiding=0)

// User Inputs
i_time          = input(defval = timestamp("01 Apr 2018 13:30 +0000"), title = "Start Time",  type = input.time)    // Starting  time for backtest
f_time          = input(defval = timestamp("30 Sep 2021 13:30 +0000"), title = "Finish Time", type = input.time)    // Finishing time for backtest

long_pos        = input(title="Show Long Positions",  defval=true, type=input.bool)                                 // Enable Long  Positions
short_pos       = input(title="Show Short Positions", defval=true, type=input.bool)                                 // Enable Short Positions
src             = input(close, title="Source")                                                                      // Price value to calculate indicators

emas_properties = input(title="============ EMAS Properties ============", defval=false, type=input.bool)           // Properties

mtf_15          = input(title="Fast EMA", type=input.resolution, defval="15")                                         // Resolucion para MTF EMA 15 minutes
ma_15_length    = input(5, title = "Fast EMA Period")                                                              // MTF EMA 15 minutes Length
mtf_60          = input(title="Slow EMA", type=input.resolution, defval="60")                                         // Resolucion para MTF EMA 60 minutes
ma_60_length    = input(10, title = "Slow EMA Period")                                                              // MTF EMA 60 minutes Length

e_new_filter    = input(title="Enable a Third Ema filter?", defval=true, type=input.bool) 
slowest_ema_len = input(100, title = "Fast EMA Period")
slowest_ema_res = input(title="Slowest EMA", type=input.resolution, defval="D")
macd_res        = input(title="MACD TimeFrame", type=input.resolution, defval="")                                   // MACD Time Frame

macd_properties = input(title="============ MACD Properties ============", defval="")                               // Properties

fast_len        = input(title="Fast Length", type=input.integer, defval=12)                                         // Fast MA Length
slow_len        = input(title="Sign Length", type=input.integer, defval=26)                                         // Sign MA Length
sign_len        = input(title="Sign Length", type=input.integer, defval=9) 

syst_properties = input(title="============ System Properties ============", defval="")                             // Properties

lookback        = input(title="Lookback period", type=input.integer, defval=14, minval=1)                            // Candles to lookback for swing high or low
multiplier      = input(title="Profit Multiplier based on Stop Loss", type=input.float, defval=6.0, minval=0.1)     // Profit multiplier based on stop loss
shortStopPer    = input(title="Short Stop Loss Percentage", type=input.float, defval=1.0, minval=0.0)/100           
longStopPer     = input(title="Long Stop Loss Percentage",  type=input.float, defval=2.0, minval=0.0)/100


// Indicators

[macd, signal, hist] = security(syminfo.tickerid, macd_res, macd(src, fast_len, slow_len, sign_len))
ma_15  = security(syminfo.tickerid, mtf_15, ema(src, ma_15_length))
ma_60  = security(syminfo.tickerid, mtf_60, ema(src, ma_60_length))
ma_slo = security(syminfo.tickerid, slowest_ema_res, ema(src, slowest_ema_len))

// Macd Plot

col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350

plot(macd,   color=color.new(color.blue, 0))              // Solo para visualizar que se plotea correctamente
plot(signal, color=color.new(color.orange, 0))
plot(hist,   style=plot.style_columns,
     color=(hist >= 0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : 
     (hist[1] < hist ? col_grow_below : col_fall_below)))


// MTF EMA Plot
 
bullish_filter = e_new_filter ? ma_15 > ma_60 and ma_60 > ma_slo : ma_15 > ma_60 
bearish_filter = e_new_filter ? ma_15 < ma_60 and ma_60 < ma_slo : ma_15 < ma_60
    
plot(ma_15,  color=color.new(color.blue, 0))
plot(ma_60,  color=color.new(color.yellow, 0))
plot(e_new_filter ? ma_slo : na, color = ma_60 > ma_slo ? color.new(color.green, 0) : color.new(color.red, 0))

////////////////////////////////////////////// Logic For Divergence

zero_cross = false                                     
zero_cross := crossover(hist,0) or crossunder(hist,0)  //Cruce del Histograma a la linea 0
// plot(zero_cross ? 1 : na)

// MACD DIVERGENCE TOPS (Bearish Divergence) 

highest_top  = 0.0
highest_top := (zero_cross == true ? 0.0 : (hist > 0 and hist > highest_top[1] ? hist : highest_top[1]))
prior_top    = 0.0
prior_top   := (crossunder(hist,0) ? highest_top[1] : prior_top[1])  // Búsqueda del Maximo en MACD
// plot(highest_top)
// plot(prior_top)

highest_top_close  = 0.0
highest_top_close := (zero_cross == true ? 0.0 : (hist > 0 and hist > highest_top[1] ? close : highest_top_close[1]))
prior_top_close    = 0.0
prior_top_close   := (crossunder(hist,0) ? highest_top_close[1] : prior_top_close[1]) // Búsqueda del Maximo en pRECIO
// plot(highest_top_close)
// plot(prior_top_close)

top = false 
top := highest_top[1] < prior_top[1]
     and highest_top_close[1] > prior_top_close[1]
     and hist < hist[1]
     and crossunder(hist,0)                         // Bearish Divergence: top == true 


// MACD DIVERGENCE BOTTOMS (Bullish Divergence) 

lowest_bottom  = 0.0
lowest_bottom := (zero_cross == true ? 0.0 : (hist < 0 and hist < lowest_bottom[1] ? hist : lowest_bottom[1]))
prior_bottom   = 0.0
prior_bottom  := (crossover(hist,0) ? lowest_bottom[1] : prior_bottom[1])

lowest_bottom_close = 0.0
lowest_bottom_close := (zero_cross == true ? 0.0 : (hist < 0 and hist < lowest_bottom[1] ? close : lowest_bottom_close[1]))
prior_bottom_close = 0.0
prior_bottom_close := (crossover(hist,0) ? lowest_bottom_close[1] : prior_bottom_close[1])

bottom = false
bottom := lowest_bottom[1] > prior_bottom[1]
     and lowest_bottom_close[1] < prior_bottom_close[1]
     and hist > hist[1]
     and crossover(hist,0)                              // Bullish Divergence: bottom == true 


////////////////////////////////////////////// System Conditions //////////////////////////////////////////////

inTrade     = strategy.position_size != 0       // In Trade
longTrade   = strategy.position_size  > 0       // Long position
shortTrade  = strategy.position_size  < 0       // Short position
notInTrade  = strategy.position_size == 0       // No trade
entryPrice  = strategy.position_avg_price       // Position Entry Price

////////////////////////////////////////////// Long Conditions //////////////////////////////////////////////

sl = lowest(low, lookback)                  // Swing Low for Long Entry

longStopLoss    = 0.0                       // Trailing Stop Loss calculation
longStopLoss   := if (longTrade)
    astopValue  = sl * (1 - longStopPer)
    max(longStopLoss[1], astopValue)
else
    0

longTakeProf  = 0.0                         // Profit calculation based on stop loss
longTakeProf := if (longTrade)
    profitValue = entryPrice + (entryPrice - longStopLoss) * multiplier
    max(longTakeProf[1], profitValue)
else
    0
    
// Long Entry Conditions

if bottom and notInTrade and bullish_filter and long_pos
    strategy.entry(id="Go Long", long=strategy.long, comment="Long Position")

// strategy.close(id="Go Long", when=zero_cross)

if longTrade
    strategy.exit("Exit Long", "Go Long", limit = longTakeProf, stop = longStopLoss)

plot(longTrade and longStopLoss ? longStopLoss  : na, title="Long Stop Loss",  color=color.new(color.red, 0),   style=plot.style_linebr)
plot(longTrade and longTakeProf ? longTakeProf  : na, title="Long Take Prof",  color=color.new(color.green, 0), style=plot.style_linebr)

////////////////////////////////////////////// Short Conditions //////////////////////////////////////////////

sh = highest(high, lookback) // Swing High for Short Entry

shortStopLoss  = 0.0 
shortStopLoss := if (shortTrade)
    bstopValue = sh * (1 + shortStopPer)
    min(shortStopLoss[1], bstopValue)
else 
    999999
    
shortTakeProf    = 0.0    
shortTakeProf   := if (shortTrade)
    SprofitValue = entryPrice - (shortStopLoss - entryPrice) * multiplier
    min(SprofitValue, shortTakeProf[1])
else 
    999999
    
// Short Entry
if top and notInTrade and bearish_filter and short_pos
    strategy.entry(id="Go Short", long=strategy.short, comment="Short Position")

// strategy.close(id="Go Short", when=zero_cross)

if shortTrade
    strategy.exit("Exit Short", "Go Short", limit = shortTakeProf, stop = shortStopLoss)


plot(shortTrade and shortStopLoss ? shortStopLoss : na, title="Short Stop Loss", color=color.new(color.red, 0),   style=plot.style_linebr)
plot(shortTrade and shortTakeProf ? shortTakeProf : na, title="Short Take Prof", color=color.new(color.green, 0), style=plot.style_linebr)






En savoir plus