Trendumkehrstrategie auf der Grundlage mehrerer gleitender Durchschnitte

Schriftsteller:ChaoZhang, Datum: 2023-11-21 14:53:48
Tags:

img

Übersicht

Diese Strategie erzeugt Kauf- und Verkaufssignale, die auf Umkehrungen mehrerer Trendindikatoren basieren, einschließlich TDI, TCF, TTF und TII. Die Strategie ermöglicht die Auswahl des Indikatorsignals für Ein- und Ausstiege.

Strategie Logik

  • TDI-Indikator

    Der TDI-Indikator wird unter Verwendung von Kursmomentum mit Summierungs- und Glättungstechniken konstruiert.

  • TCF-Indikator

    Der TCF-Indikator misst positive und negative Preisänderungen, um bullische und bärische Kräfte zu messen.

  • TTF-Indikator

    Der TTF-Indikator vergleicht die Stärke der höchsten und niedrigsten Preise, um den Trend zu bestimmen.

  • TII-Indikator

    Der TII kombiniert gleitende Durchschnittswerte und Preisbänder, um Trendumkehrungen zu identifizieren. Er berücksichtigt sowohl kurz- als auch langfristige Trends. Das Langsignal liegt über 80 und der Ausgang unter 80.

Die Eingabe-Lange- und Nahlogik wählt die geeigneten Signale anhand des konfigurierten Indikators aus.

Vorteile

Die Strategie umfasst mehrere häufig verwendete Trendhandelsindikatoren, die eine Flexibilität bei der Anpassung an sich ändernde Marktbedingungen ermöglichen.

  1. Erfasst Trendumkehrchancen rechtzeitig unter Verwendung von Umkehrsignalen
  2. Optimierbar durch Konfiguration verschiedener Indikatoren
  3. Rich Indicator Kombinationen können verwendet werden, um Signale zu bestätigen

Risiken

Die wichtigsten Risiken dieser Strategie sind:

  1. Indikatorsignale können falsche Signale aufweisen, die zu Verlusten führen
  2. Einzelne Indikatoren können Trends nicht vollständig beurteilen und sind anfällig für Marktlärm
  3. Falsche Konfigurationen von Indikatoren und Handelsparametern können den Markt falsch interpretieren und zu fehlerhaften Trades führen

Die Risiken können verringert werden, indem

  1. Optimierung der Indikatorparameter zur Suche nach den besten Kombinationen
  2. Erforderung mehrerer Bestätigungen von Signalindikatoren zur Verbesserung der Qualität
  3. Anpassung der Positionsgröße zur Kontrolle von Einzelverlusten

Möglichkeiten zur Verbesserung

Die Strategie kann in mehreren Bereichen verbessert werden:

  1. Prüfung optimaler Indikatoren und Parameter in verschiedenen Marktzyklen
  2. Hinzufügen oder Verringern von Indikatoren, um die besten Kombinationen zu finden
  3. Falsche Signale ausfiltern
  4. Optimierung von Positionsgrößenstrategien, z. B. variable Größe, Trailing Stop Loss
  5. Einbeziehung von Machine-Learning-Scoring zur Unterstützung der Signalqualität

Schlussfolgerung

Durch die Kombination mehrerer Trendumkehrindikatoren und die Optimierung von Konfigurationen ist diese Strategie an unterschiedliche Marktumgebungen angepasst, um an Trendwendepunkten zu agieren.Der Schlüssel besteht darin, die optimalen Parameter und Indikatoren zu finden und gleichzeitig das Risiko zu kontrollieren.Durch kontinuierliche Optimierungen und Validierungen kann eine stetige Alpha-Strategie aufgebaut werden.


/*backtest
start: 2023-11-13 00:00:00
end: 2023-11-15 03:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © kruskakli
//
// Here is a collection of Trend Indicators as defined by M.H Pee and presented
// in various articles of the "STOCKS & COMMODITIES Magazine"
//
// The actual implementation of the indicators here are made by: everget
//
// I have gather them here so that they easily can be tested.
//
// My own test was made using 15 companies from the OMXS30 list
// during the time period of 2016-2018, and I only went LONG.
//
// The result was as follows:
//
//        Average    Std.Dev
//        profit
//  TDI    3.04%      5.97
//  TTF    1.22%.     5.73
//  TII    1.07%      6.2
//  TCF    0.32%      2.68
//
strategy("M.H Pee indicators", overlay=true)


use = input(defval="TDI", title="Use Indicator", type=input.string,
             options=["TDI","TCF","TTF","TII"])

src = close


//
// TDI
//
length = input(title="Length", type=input.integer, defval=20)
mom = change(close, length)
tdi = abs(sum(mom, length)) - sum(abs(mom), length * 2) + sum(abs(mom), length)
// Direction Indicator
tdiDirection = sum(mom, length)
tdiLong = crossover(tdiDirection, tdi)
tdiXLong = crossunder(tdiDirection, tdi)

//
// TCF
//
tcflength = input(title="Length", type=input.integer, defval=35)

plusChange(src) =>
    change_1 = change(src)
    change(src) > 0 ? change_1 : 0.0
minusChange(src) =>
    change_1 = change(src)
    change(src) > 0 ? 0.0 : -change_1

plusCF = 0.0
plusChange__1 = plusChange(src)
plusCF := plusChange(src) == 0 ? 0.0 : plusChange__1 + nz(plusCF[1])

minusCF = 0.0
minusChange__1 = minusChange(src)
minusCF := minusChange(src) == 0 ? 0.0 : minusChange__1 + nz(minusCF[1])

plusTCF = sum(plusChange(src) - minusCF, tcflength)
minusTCF = sum(minusChange(src) - plusCF, tcflength)

tcfLong = plusTCF > 0 
tcfXLong = plusTCF < 0

//
// TTF
//
ttflength = input(title="Lookback Length", type=input.integer, defval=15)

hh = highest(length)
ll = lowest(length)

buyPower = hh - nz(ll[length])
sellPower = nz(hh[length]) - ll

ttf = 200 * (buyPower - sellPower) / (buyPower + sellPower)

ttfLong = crossover(ttf, 100)
ttfXLong = crossunder(ttf, -100)

//
// TII
//
majorLength = input(title="Major Length", type=input.integer, defval=60)
minorLength = input(title="Minor Length", type=input.integer, defval=30)
upperLevel = input(title="Upper Level", type=input.integer, defval=80)
lowerLevel = input(title="Lower Level", type=input.integer, defval=20)

sma = sma(src, majorLength)

positiveSum = 0.0
negativeSum = 0.0

for i = 0 to minorLength - 1 by 1
    price = nz(src[i])
    avg = nz(sma[i])
    positiveSum := positiveSum + (price > avg ? price - avg : 0)
    negativeSum := negativeSum + (price > avg ? 0 : avg - price)
    negativeSum

tii = 100 * positiveSum / (positiveSum + negativeSum)

tiiLong = crossover(tii, 80)
tiiXLong = crossunder(tii,80)

//
// LOGIC 
//
enterLong = (use == "TDI" and tdiLong) or (use == "TCF" and tcfLong) or (use == "TTF" and ttfLong) or (use == "TII" and tiiLong)
exitLong = (use == "TDI" and tdiXLong) or (use == "TCF" and tcfXLong) or (use == "TTF" and ttfXLong) or (use == "TII" and tiiXLong)


// Time range for Back Testing
btStartYear  = input(title="Back Testing Start Year",  type=input.integer, defval=2016)
btStartMonth = input(title="Back Testing Start Month", type=input.integer, defval=1)
btStartDay   = input(title="Back Testing Start Day",   type=input.integer, defval=1)
startTime = timestamp(btStartYear, btStartMonth, btStartDay, 0, 0)

btStopYear  = input(title="Back Testing Stop Year",  type=input.integer, defval=2028)
btStopMonth = input(title="Back Testing Stop Month", type=input.integer, defval=12)
btStopDay   = input(title="Back Testing Stop Day",   type=input.integer, defval=31)
stopTime  = timestamp(btStopYear, btStopMonth, btStopDay, 0, 0)

window() => time >= startTime and time <= stopTime ? true : false


riskPerc     = input(title="Max Position  %", type=input.float, defval=20, step=0.5)
maxLossPerc  = input(title="Max Loss Risk %", type=input.float, defval=5, step=0.25)

// Average True Range (ATR) measures market volatility.
// We use it for calculating position sizes.
atrLen   = input(title="ATR Length", type=input.integer, defval=14)
stopOffset = input(title="Stop Offset", type=input.float, defval=1.5, step=0.25)
limitOffset = input(title="Limit Offset", type=input.float, defval=1.0, step=0.25)
atrValue = atr(atrLen)


// Calculate position size
maxPos = floor((strategy.equity * (riskPerc/100)) / src)
// The position sizing algorithm is based on two parts:
// a certain percentage of the strategy's equity and
// the ATR in currency value.
riskEquity  = (riskPerc / 100) * strategy.equity
// Translate the ATR into the instrument's currency value.
atrCurrency = (atrValue * syminfo.pointvalue)
posSize0    = min(floor(riskEquity / atrCurrency), maxPos)
posSize     = posSize0 < 1 ? 1 : posSize0

if (window())
    strategy.entry("Long", long=true, qty=posSize0, when=enterLong)
    strategy.close_all(when=exitLong)

Mehr