Stratégie de trading de moyenne mobile de percée dynamique


Date de création: 2023-11-13 10:27:54 Dernière modification: 2023-11-13 10:27:54
Copier: 0 Nombre de clics: 644
1
Suivre
1617
Abonnés

Stratégie de trading de moyenne mobile de percée dynamique

Aperçu

L’idée principale de cette stratégie est de construire plusieurs courbes moyennes à l’aide de l’indicateur Ratio OCHL Averager de différentes périodes, générant un signal d’achat et de vente en fonction de la forme croisée de la courbe. Il est capable de capturer dynamiquement les tendances des prix et convient aux transactions à court et moyen terme.

Principe de stratégie

La stratégie utilise deux indices Ratio OCHL Averager de différentes périodes, respectivement comme ligne rapide et ligne lente. La formule de calcul de l’indicateur Ratio OCHL Averager est la suivante:

b = abs(close-open)/(high - low) 
c = min(max(b, 0), 1)
Ratio OCHL Averager = c*close + (1-c)*前一日Ratio OCHL Averager

où b est le ratio représentant la fluctuation des prix de la journée, c est la valeur de b après traitement normalisé. L’indicateur Ratio OCHL Averager regroupe les quatre prix d’ouverture, de clôture, de plus haut et de moins bas pour construire la moyenne.

La stratégie impose une courte période de ligne rapide et une longue période de ligne lente. Un signal d’achat est généré lorsque la ligne rapide traverse la ligne lente et un signal de vente lorsque la ligne rapide traverse la ligne lente.

Avantages stratégiques

  1. L’indicateur Ratio OCHL Averager est capable d’aplanir les données de prix, de filtrer efficacement le bruit du marché et de rendre les signaux de négociation plus fiables.

  2. Les croisements bi-homogènes combinés à des cycles différents permettent de mieux déterminer la direction de la tendance et le début d’une nouvelle tendance.

  3. En ajustant les paramètres cycliques de la ligne rapide et de la ligne lente, il est possible de s’adapter à différents environnements de marché.

  4. Les stratégies sont simples, intuitives et faciles à comprendre.

  5. Il est possible de définir avec souplesse les paramètres d’arrêt de perte et de contrôle des risques.

Risque stratégique

  1. Les stratégies de croisement de la même ligne peuvent générer plus de faux signaux et nécessitent un filtrage en combinaison avec d’autres indicateurs techniques.

  2. Il faut choisir judicieusement les paramètres périodiques des lignes rapides et des lignes lentes. Un mauvais choix de paramètres peut affecter l’efficacité de la stratégie.

  3. Les stratégies de croisement de deux lignes équivalentes sont des stratégies de suivi de tendance. Elles ne sont pas adaptées à une situation de choc, mais à une situation de tendance.

  4. Les points d’arrêt doivent être ajustés de manière appropriée pour réduire le risque de perte et être raisonnablement réglés.

Direction d’optimisation

  1. Le filtrage des signaux peut être envisagé en combinaison avec des indicateurs de dynamique, etc. pour améliorer la qualité du signal. Par exemple, MACD, KDJ, etc.

  2. Il est possible de tester différentes combinaisons de paramètres de périodes rapides et lentes pour trouver le paramètre optimal.

  3. Le paramètre optimal est trouvé en optimisant le stop loss sur la base des résultats de la rétroanalyse.

  4. Des paramètres d’ajustement dynamique peuvent être envisagés dans des conditions de marché spécifiques, par exemple des paramètres de périodicité d’amplification lors d’une forte oscillation.

Résumer

La stratégie est une stratégie de suivi dynamique adaptée aux transactions à court et à moyen terme. Il y a beaucoup de possibilités d’optimisation. L’efficacité de la stratégie peut être améliorée par l’ajustement des paramètres, le filtrage des signaux, etc.

Code source de la stratégie
/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="[XC] Adaptive Strategy V3 - Ratio OCHL Averager no repaint",shorttitle="R_OHCL", overlay=true, currency=currency.EUR,initial_capital=10000,
     default_qty_value=100, default_qty_type=strategy.percent_of_equity , calc_on_every_tick=false, calc_on_order_fills=true)


//                  ╔═ SETTINGS                  ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

strategy_1     = input ( defval=true   , type=input.bool    , title="STRATEGY 1? —>"      )
Recursive      = input(false)
RES201         = "Min",RES202= "D",RES203 = "W",RES204 = "M"

//++ Resolution 1 ++
inp_resolution1 = input(600, minval=1, title="Resolution Line 1")
restype1        = input ( defval="Min"  , type=input.string , title= "Resolution Line 1" , options=[ "Min","D","W","M"])
multiplier1     = restype1 == "Min" ? "" : restype1 == "D" ? "D" : restype1 == "W" ? "W" : "M"
resolution1     = tostring(inp_resolution1)+ multiplier1

//++ Resolution 2 ++
inp_resolution2 = input(1440, minval=1, title="Resolution Line 2")
restype2        = input ( defval="Min"  , type=input.string , title= "Resolution Line 2" , options=["Min","D","W","M"])
multiplier2     = restype2 == "Min" ? "" : restype2 == "D" ? "D" : restype2 == "W" ? "W" : "M"
resolution2     = tostring(inp_resolution2)+ multiplier2

StopLoss        = input(defval = 500 , title = "Stop Loss", minval = 0)
TakeProfit      = input(defval = 2500 , title = "Take Profit", minval = 0)
// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = TakeProfit  >= 1 ? TakeProfit  : na
useStopLoss     = StopLoss    >= 1 ? StopLoss    : na


//                  ╔═ BACKTEST RANGE            ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
line_breakBTR  = input ( defval = true   , type=input.bool   , title="BACKTEST RANGE —"      ) 
FromYear       = input ( defval = 2019, title = "From Year", minval = 2017)
FromMonth      = input ( defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay        = input ( defval = 2, title = "From Day", minval = 1, maxval = 31)
//FromHour     = input ( defval = 1, title = "From Hour", minval = 1, maxval = 24)
ToYear         = input ( defval = 9999, title = "To Year", minval = 2017)
//ToHour       = input ( defval = 0, title = "From Hour", minval = 0, maxval = 24)
ToMonth        = input ( defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay          = input ( defval = 1, title = "To Day", minval = 1, maxval = 31)

// === FUNCTION EXAMPLE ===
start     = timestamp(syminfo.timezone, FromYear, FromMonth, FromDay, 0, 00)  // backtest start window
finish    = timestamp(syminfo.timezone, ToYear  , ToMonth  , ToDay  , 0, 59)  // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

//                  ╔═ INDICATOR                 ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

// "Ratio OCHL Averager" -> alexgrover / tradingview.com/script/RGAtOI6h-Ratio-OCHL-Averager-An-Alternative-to-VWAP/

rochla( res,Recursive)=>
    //Recursive = false
    H =  security(syminfo.tickerid,res,high[1],gaps = barmerge.gaps_off,  lookahead = barmerge.lookahead_on)
    L =  security(syminfo.tickerid,res,low[1] ,gaps = barmerge.gaps_off,  lookahead = barmerge.lookahead_on)
    d = 0.
    //----
    a = Recursive ? nz(d[1],open) : open
    b = abs(close-a)/(H - L)
    c = b > 1 ? 1 : b
    d := c*close+(1-c)*nz(d[1],close)



strat1_line1=rochla(resolution1,Recursive)
strat1_line2=rochla(resolution2,Recursive)

plot(strat1_line1, title="Ratio OCHL Averager 1", color=#DAA520,linewidth=2,transp=0)
plot(strat1_line2, title="Ratio OCHL Averager 2", color=#B22222,linewidth=2,transp=0)



//                  ╔═ STRATEGY 1                ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

trading_strat1_line1 = strategy_1 == 1    ? strat1_line1   : na
trading_strat1_line2 = strategy_1 == 1    ? strat1_line2   : na

longCross  = crossunder (trading_strat1_line2, trading_strat1_line1) ? true : false
shortCross = crossover  (trading_strat1_line2, trading_strat1_line1) ? true : false

plot( longCross  ? trading_strat1_line1 : na , title = "Long"  , color=color.aqua, style=plot.style_circles, linewidth=5, offset= 0)
plot( shortCross ? trading_strat1_line2 : na , title = "Short" , color=color.red , style=plot.style_circles, linewidth=5, offset= 0)



//                  ╔═ Backtest 1                ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░


strategy.exit("close",loss = useStopLoss, profit = useTakeProfit)

if longCross  and window() and strategy_1 == 1 
    strategy.entry("Go Long", strategy.long)
if shortCross and window() and strategy_1 == 1 
    strategy.entry("Go Short", strategy.short)

//end