La stratégie Ehlers Instantaneous Trendline est proposée par John Ehlers dans son livre
Le noyau de cette stratégie est le calcul de la ligne de tendance instantanée (TI).
it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]
où src est le prix, a est un facteur de lissage, par défaut à 0,07. Cette formule est un filtre de deuxième ordre qui peut lisser le prix et générer des tendances.
Un autre indicateur clé est la ligne de décalage, calculée par:
lag = 2.0 * it - nz(it[2])
La ligne de retard est en retard de la ligne IT d'un bar. Lorsque le prix traverse au-dessus de la ligne de retard, il signale une rupture à la hausse, allez long. Lorsque le prix traverse en dessous de la ligne de retard, il signale une rupture à la baisse, allez court.
En outre, la stratégie établit des ordres de stop loss pour contrôler les risques.
Les avantages de cette stratégie sont les suivants:
Cette stratégie comporte également certains risques:
Ces risques peuvent être atténués par:
Cette stratégie peut être encore optimisée dans les domaines suivants:
Dans l'ensemble, la stratégie Ehlers Instantaneous Trendline utilise des indicateurs techniques pour identifier les tendances en temps réel dans les actions/futures et les positions ouvertes lorsque les tendances s'inversent. Elle présente les avantages d'un filtrage efficace du bruit, d'une haute réglabilité des paramètres, d'une logique de génération de signal claire et d'un contrôle des risques intégré. Avec une optimisation supplémentaire de la sélection des paramètres, du filtrage des signaux, du dimensionnement des positions et du réglage des pertes, cette stratégie peut obtenir des performances encore meilleures. La structure claire du code facilite également la compréhension et la modification. En résumé, il s'agit d'un système de suivi de tendance efficace qui mérite d'être testé et amélioré.
/*backtest start: 2022-12-13 00:00:00 end: 2023-12-19 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Ehlers Instantaneous Trendline Strategy", shorttitle = "Ehlers Instantaneous Trendline Strategy", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, backtest_fill_limits_assumption = 1) src = input(hl2, title="Source") a = input(0.07, title="Alpha", step=0.01) fr = input(false, title="Fill Trend Region") it = na if (na(it[2]) or na(it[1])) it := (src + 2 * src[1] + src[2]) / 4.0 else it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2] lag = 2.0 * it - nz(it[2]) rngFrac = input(0.35) revPct = input(0.015) stopType = input(title="Stop type", defval = "stop-order", options = ["stop-order", "market-order", "None"]) diff = input(0.5, title = "Spread") LongPrice(p) => LongPrice = diff == 0 ? p : floor(p / diff) * diff ShortPrice(p) => ShortPrice = diff == 0 ? p : ceil(p / diff) * diff strategy.cancel_all() reverseTrade = false if stopType == "market-order" if strategy.position_size > 0 and close < strategy.position_avg_price * (1 - revPct) strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, limit = close - 2 * diff) reverseTrade := true if strategy.position_size < 0 and close > strategy.position_avg_price * (1 + revPct) strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, limit = close + 2 * diff) reverseTrade := true if lag > it and not reverseTrade price = LongPrice(max(close - (high - low) * rngFrac, low)) if strategy.position_size <= 0 strategy.order("Open long", strategy.long, strategy.equity / price - strategy.position_size, limit = price) if stopType == "stop-order" strategy.order("StopLoss open long", strategy.short, 2 * strategy.equity / price, stop = ShortPrice(price * (1 - revPct))) else if stopType == "stop-order" strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, stop = ShortPrice(strategy.position_avg_price * (1 - revPct))) if lag < it and not reverseTrade price = ShortPrice(min(close - (high - low) * rngFrac, high)) if strategy.position_size >= 0 strategy.order("Open short", strategy.short, strategy.equity / price + strategy.position_size, limit = price) if stopType == "stop-order" strategy.order("StopLoss open short", strategy.long, 2 * strategy.equity / price, stop = LongPrice(price * (1 + revPct))) else if stopType == "stop-order" strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, stop = LongPrice(strategy.position_avg_price * (1 + revPct))) itPlot=plot(it, color=red, linewidth=1, title="Trend") lagPlot=plot(lag, color=blue, linewidth=1, title="Trigger") fill(itPlot, lagPlot, it < lag ? green : red, transp=70) // === Backtesting Dates === testPeriodSwitch = input(false, "Custom Backtesting Dates") testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(9, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testStartHour = input(0, "Backtest Start Hour") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0) testStopYear = input(2018, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(14, "Backtest Stop Day") testStopHour = input(14, "Backtest Stop Hour") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false isPeriod = testPeriodSwitch == true ? testPeriod() : true // === /END if not isPeriod strategy.cancel_all() strategy.close_all()