Diese Strategie kombiniert den Directional Movement Index (DMI) und den Hull Moving Average (HMA), um mit DMI die Marktrichtung zu ermitteln und ohne Risikomanagement die Trendstärke mit HMA zu bestätigen.
Berechnen Sie den wahren Bereich, DIPlus, DIMinus und ADX.
Berechnen Sie schnelle und langsame Hull Moving Averages (HMA).
Auslöser für den langen Eingang, wenn DIPlus über DIMinus und schnelle HMA über langsame HMA kreuzt.
Auslöser für einen kurzen Einstieg, wenn DIMinus unter DIPlus und schnelle HMA unter langsame HMA fällt.
Verlegen Sie bei Eintrittssignalen Long/Short-Orders.
Die doppelte Bestätigung durch den Trendindikator DMI und Hull MA sorgt für eine genaue Erfassung der Marktentwicklung und vermeidet Schlagsägen.
Das Hauptrisiko liegt in der fehlenden Stop-Loss-Fähigkeit, bei der es nicht möglich ist, Verluste zu kontrollieren, wenn große Marktschwankungen auftreten.
Mögliche Lösungen umfassen das Hinzufügen von beweglichen Stop Loss, die Optimierung des Parametermixes usw.
Hinzufügen von ATR-Stop-Loss auf Basis der wahren Reichweite.
Optimieren Sie Hull-Perioden, um die beste Mischung zu finden.
Dynamische Schwelle für lange/kurze Signale.
Hinzufügen eines Impulsfilters, um die Kontinuität des Trends zu gewährleisten.
Die Kombination von DMI und HMA ist hervorragend in der Identifizierung von Trends mit Einfachheit und Effizienz.
/*backtest start: 2022-12-28 00:00:00 end: 2024-01-03 00:00:00 period: 1d basePeriod: 1h 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/ // © Tuned_Official //@version=4 strategy(title="DMI + HMA - No Risk Management", overlay = false, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.025) //Inputs hullLen1 = input(title="Hull 1 length", type=input.integer, defval=29) hullLen2 = input(title="Hull 2 length", type=input.integer, defval=2) len = input(title="Length for DI", type=input.integer, defval=76) //Calculations TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0 SmoothedTrueRange = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus SmoothedDirectionalMovementMinus = 0.0 SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus //Indicators fasthull = hma(close, hullLen1) slowhull = hma(close, hullLen2) DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100 ADX = sma(DX, len) //Plots plot(DIPlus, color=color.green, title="DI+") plot(DIMinus, color=color.red, title="DI-") plot(ADX, color=color.black, title="ADX") //conditions go_long = crossover(DIPlus, DIMinus) and fasthull > slowhull //crossover(fasthull, slowhull) and DIPlus > DIMinus go_short = crossover(DIMinus, DIPlus) and fasthull < slowhull //crossunder(fasthull, slowhull) and DIMinus > DIPlus //Entry if strategy.position_size < 0 or strategy.position_size == 0 strategy.order("long", strategy.long, when=go_long) if strategy.position_size > 0 or strategy.position_size == 0 strategy.order("Short", strategy.short, when=go_short)