Cette stratégie génère des signaux d'achat et de vente basés sur le croisement du prix avec une moyenne mobile. Elle fournit divers types de moyennes mobiles et un paramètre de tolérance pour filtrer les fausses ruptures.
La stratégie calcule une moyenne mobile de longueur N en fonction du prix de clôture. Les types de moyenne mobile typiques comprennent la moyenne mobile simple (SMA), la moyenne mobile exponentielle (EMA), la moyenne mobile pondérée (WMA) etc. Ensuite, un niveau de tolérance est défini, par exemple 5%, et une bande supérieure (1,05 fois la moyenne mobile) et une bande inférieure (0,95 fois la moyenne mobile) sont calculées. Lorsque le prix de clôture dépasse la bande supérieure, un signal d'achat est généré. Lorsque le prix de clôture dépasse la bande inférieure, un signal de vente est généré. Cela aide à filtrer certaines fausses ruptures.
Dans l'ensemble, il s'agit d'une stratégie de suivi de tendance typique. Il utilise la relation entre le prix et la moyenne mobile pour déterminer les tendances, avec une certaine souplesse. Grâce à l'optimisation des paramètres et à un bon filtrage du signal, il peut devenir une stratégie quantitative décente. Mais contrôler les risques à la baisse lors du shorting est important pour éviter des pertes excessives.
/*backtest start: 2023-12-26 00:00:00 end: 2024-01-25 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/ // © RafaelPiccolo //@version=4 strategy("Price X MA Cross", overlay=true) typ = input("HMA", "MA Type", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"]) len = input(100, minval=1, title="Length") src = input(close, "Source", type=input.source) tol = input(0, minval=0, title="Tolerance (%)", type=input.float) shortOnly = input(false, "Short only") tema(src, len)=> ema1 = ema(src, len) ema2 = ema(ema1, len) ema3 = ema(ema2, len) return = 3 * (ema1 - ema2) + ema3 getMAPoint(type, len, src)=> return = type == "SMA" ? sma(src, len) : type == "EMA" ? ema(src, len) : type == "WMA" ? wma(src, len) : type == "HMA" ? hma(src, len) : type == "VWMA" ? vwma(src, len) : type == "RMA" ? rma(src, len) : tema(src, len) ma = getMAPoint(typ, len, src) upperTol = ma * (1 + tol/100) lowerTol = ma * (1 - tol/100) longCondition = crossover(close, upperTol) shortCondition = crossunder(close, lowerTol) if (shortCondition) strategy.entry("Short", strategy.short) if (longCondition) if (shortOnly) strategy.close("Short") else strategy.entry("Long", strategy.long) plot(ma, "Moving Average", close > ma ? color.green : color.red, linewidth = 2) t1 = plot(tol > 0 ? upperTol : na, transp = 70) t2 = plot(tol > 0 ? lowerTol : na, transp = 70) fill(t1, t2, color = tol > 0 ? color.blue : na)