Trendhandelsstrategie auf Basis eines dynamischen gleitenden Durchschnitts

Schriftsteller:ChaoZhang, Datum: 21.12.2023
Tags:

img

Übersicht

Diese Strategie erzeugt Handelssignale, die auf dem dynamischen gleitenden Durchschnitt basieren, um bei Anstieg der Aktienkurse lang zu gehen und bei Preisrückgang Positionen zu schließen.

Grundsätze

Die Strategie stützt sich hauptsächlich auf drei Varianten des Hull Moving Average (HMA) normaler HMA, gewichteter HMA (WHMA) und exponentieller HMA (EHMA). Wie der Code zeigt, können Benutzer zwischen den drei Hull-MA wechseln.

Die Formel für HMA lautet:

HMA = WMA(2*WMA(nahe, n/2)-WMA(nahe, n), m2)

Wo WMA der gewichtete gleitende Durchschnitt und n der Periodenparameter ist. Im Vergleich zu SMA reagiert HMA schneller auf Preisänderungen.

Die Formeln für WHMA und EHMA sind ähnlich.

Nach der Berechnung der HMA verwendet die Strategie den Mittelliniewert der HMA als Handelssignale. Sie geht lang, wenn der Preis über die HMA-Mittellinie überschreitet und schließt Positionen, wenn der Preis unter die Linie fällt. Somit verfolgt sie mittelfristige Trends mit der HMA-Mittellinie für Gewinne.

Vorteile

Im Vergleich zu traditionellen MA-Strategien hat diese Strategie folgende Vorteile:

  1. Schnellere Reaktion und stärkere Trendverfolgungsfähigkeit bei rechtzeitigen Ein- und Ausfällen
  2. Verringerung der unnötigen Handelsfrequenz und Vermeidung von Stopps
  3. Flexible HMA-Parameter zur Anpassung an mehr Marktumgebungen
  4. Wechselbare HMA-Varianten zur Erweiterung der Anwendbarkeit

Risiken

Es gibt auch einige Risiken:

  1. Erzeugung mehrerer falscher Signale auf den Märkten mit Bandbreite, erhöhte Handelsfrequenz und Verschiebungskosten
  2. Fehlende Trendumkehrpunkte, wenn die HMA-Parameter nicht ordnungsgemäß festgelegt werden, was zu einem höheren Verlustrisiko führt
  3. Liquiditätsrisiko und große Verschiebungen beim Handel mit Aktien mit geringer Liquidität

Lösungen:

  1. Optimieren Sie die HMA-Parameter für die besten Werte
  2. Hinzufügen anderer Indikatoren zur Bestimmung von Trendumkehrpunkten
  3. Auswahl von Liquiditätsbeständen mit einem hohen durchschnittlichen Tagesvolumen

Verbesserungen

Die Strategie kann auch in folgenden Aspekten verbessert werden:

  1. Zusatz von Lautstärke oder anderen Filtern zur Sicherstellung der Signalzuverlässigkeit
  2. Kombination von MACD, KDJ für besseres Timing, Verbesserung der Gewinnrate
  3. Anpassung von HMA-Perioden auf der Grundlage von Backtests im realen Handel
  4. Wechseln Sie zu der WHMA oder EHMA, die für bestimmte Bestände die besten Ergebnisse erzielt
  5. Hinzufügen von Stop-Loss-Mechanismen zur Kontrolle von Einzelhandelsverlusten

Zusammenfassung

Die dynamische MA-Handelsstrategie integriert die schnelle Reaktion der HMA, um mittelfristige Preistrends effektiv zu verfolgen. Durch das Öffnen von Long-Positionen zu geeigneten Zeitpunkten und Schließstops hat sie gute Rücktestergebnisse gezeigt. Weitere Verbesserungen bei Parameter-Tuning und Aktienfilterung würden zu stabileren Überzugsrenditen führen. Es ist eine einfach umsetzbare, risikokontrollierbare quantitative Strategie.


/*backtest
start: 2022-12-14 00:00:00
end: 2023-12-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Position Investing by SirSeff', overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_order_fills=false, slippage=0, commission_type=strategy.commission.percent, commission_value=0)
strat_dir_input = input.string(title='Strategy Direction', defval='long', options=['long', 'short', 'all'])
strat_dir_value = strat_dir_input == 'long' ? strategy.direction.long : strat_dir_input == 'short' ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
//////////////////////////////////////////////////////////////////////
// Testing Start dates
testStartYear = input(2000, 'Backtest Start Year')
testStartMonth = input(1, 'Backtest Start Month')
testStartDay = input(1, 'Backtest Start Day')
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, 'Backtest Stop Year')
testStopMonth = input(12, 'Backtest Stop Month')
testStopDay = input(30, 'Backtest Stop Day')
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)


testPeriod() => true
// Component Code Stop
//////////////////////////////////////////////////////////////////////
//INPUT
src = input(close, title='Source')
modeSwitch = input.string('Hma', title='Hull Variation', options=['Hma', 'Thma', 'Ehma'])
length = input(55, title='Length(180-200 for floating S/R , 55 for swing entry)')
switchColor = input(true, 'Color Hull according to trend?')
candleCol = input(false, title='Color candles based on Hull\'s Trend?')
visualSwitch = input(true, title='Show as a Band?')
thicknesSwitch = input(1, title='Line Thickness')
transpSwitch = input.int(40, title='Band Transparency', step=5)

//FUNCTIONS
//HMA
HMA(_src, _length) =>
    ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>
    ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length)))
//THMA    
THMA(_src, _length) =>
    ta.wma(ta.wma(_src, _length / 3) * 3 - ta.wma(_src, _length / 2) - ta.wma(_src, _length), _length)

//SWITCH
Mode(modeSwitch, src, len) =>
    modeSwitch == 'Hma' ? HMA(src, len) : modeSwitch == 'Ehma' ? EHMA(src, len) : modeSwitch == 'Thma' ? THMA(src, len / 2) : na

//OUT
HULL = Mode(modeSwitch, src, length)
MHULL = HULL[0]
SHULL = HULL[2]

//COLOR
hullColor = switchColor ? HULL > HULL[2] ? #00ff00 : #ff0000 : #ff9800

//PLOT
///< Frame
Fi1 = plot(MHULL, title='MHULL', color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(visualSwitch ? SHULL : na, title='SHULL', color=hullColor, linewidth=thicknesSwitch, transp=50)
///< Ending Filler
fill(Fi1, Fi2, title='Band Filler', color=hullColor, transp=transpSwitch)
///BARCOLOR
barcolor(color=candleCol ? switchColor ? hullColor : na : na)


if HULL[0] > HULL[2] and testPeriod()
    strategy.entry('Invest', strategy.long)
if HULL[0] < HULL[2] and testPeriod()
    strategy.entry('Pause', strategy.short)



Mehr