EMA-Trendverfolgungsstrategie zur Unterdrückung von Oszillationen

Schriftsteller:ChaoZhang, Datum: 23.12.2023
Tags:

img

Übersicht

Diese Strategie kombiniert die Vorteile von drei Indikatoren: EMA, Trend Tracking Strategy (TTS) und Schaff Trend Cycle (STC), um eine starke kurzfristige Trend-Tracking-Strategie zu bilden. Insbesondere wird die Strategie beurteilen, ob die Kauf- und Verkaufssignale der drei Indikatoren konsistent sind. Wenn sie konsistent sind, werden Handelssignale generiert; andernfalls werden keine Trades getätigt. Dies filtert einige falsche Signale aus und macht die Strategie zuverlässiger.

Strategieprinzip

Die Strategie besteht aus drei Hauptteilen: EMA-Indikator, TTS-Trendverfolgungsstrategie und STC-Indikator.

Zunächst wird die 200-Perioden-Exponential Moving Average-Linie berechnet. Wenn der Preis unter dieser EMA-Linie liegt, gibt der EMA-Indikator ein Verkaufssignal: -1; wenn der Preis über der Linie liegt, gibt der EMA-Indikator ein Kaufsignal: 1.

Zweitens werden die relevanten Parameter der TTS-Trend-Tracking-Strategie berechnet. Gemäß den Preisbrechungen der oberen und unteren Schienen wird die Markttrendrichtung bestimmt. Wenn der Preis durch die oberen Schienen bricht, wird ein Kaufsignal 1 erzeugt; wenn der Preis durch die unteren Schienen bricht, wird ein Verkaufssignal -1 erzeugt.

Schließlich wird der Schaff Trend Cycle (STC) berechnet, der den Trend der Preiskonsolidierung widerspiegelt.

Nach Erhalt der Urteilssignale aus den drei Indikatoren wird die Strategie bestimmen, ob sie konsistent sind. Nur wenn alle drei Indikator-Urteilssignale konsistent sind, werden tatsächliche Handelssignale generiert. Dies kann einige falsche Signale effektiv filtern und die Strategie zuverlässiger machen.

Nach der Feststellung, dass Handelssignale generiert werden sollen, werden Long- oder Short-Positionen eröffnet und Stop-Profit/Stop-Loss-Punkte festgelegt.

Vorteile

  1. Die Strategie kombiniert drei verschiedene Arten von Indikatoren, um die Marktentwicklung effektiv zu bestimmen.

  2. Die Konsistenz der Beurteilungssignale von drei Indikatoren zur Filterung falscher Signale kann unnötige Trades reduzieren und die Strategie zuverlässiger machen.

  3. Die Festlegung angemessener Stopp-Gewinn-/Stop-Loss-Punkte kann Gewinne sichern und Verluste verhindern.

  4. Die optimierten Parameter eignen sich für die meisten Aktien und Devisenprodukte.

  5. Einfache und leicht verständliche Handelslogik.

Risiken

  1. Die Inkonsistenzen zwischen den Indikatorurteilen können zu einem Verlust von Handelschancen führen.

  2. Der STC-Indikator ist empfindlich für Parameter.

  3. Bei Abwärtstrends kann ein Stop Loss durchdrungen werden, was zu enormen Verlusten führt.

  4. Seitliche Konsolidierungen können nicht effektiv ermittelt werden, was zu Fallenpositionen führt.

Verbesserungen

  1. Testen Sie mehr Indikatorenkombinationen, um stärkere Urteilsregeln zu finden, z. B. Hinzufügen eines RSI-Indikators.

  2. Optimieren Sie STC-Parameter für eine bessere Anpassung an verschiedene Produkte.

  3. Erhöhen Sie das adaptive Stop-Loss-Modul, um die Stop-Loss-Punkte dynamisch zu optimieren.

  4. Verbessern Sie das Positionsschließmodul, um Seitenbereiche zu identifizieren und Fallen zu vermeiden.

  5. Optimierung von Algorithmen für den Hochfrequenzhandel, Verringerung der Latenzzeit und Verbesserung der Auftragsabwicklungsraten.

Schlussfolgerung

Die Strategie kombiniert EMA-, TTS- und STC-Indikatoren, um die Marktrichtung zu bestimmen, mit konsistenten Urteilen aus allen drei auslösenden Trades, die effektiv falsche Signale herausfiltern. Es gibt immer noch viel Raum für Optimierungen, z. B. mehr Indikatorenkombinationen testen, adaptive Algorithmen hinzufügen, Hochfrequenz-Handelsmodule optimieren usw., um die Trendverfolgungsfähigkeit weiter zu stärken. Im Vergleich zu traditionellen Strategien, die einfach gleitenden Durchschnitten folgen, kann diese Strategie Märkte intelligenter beurteilen, Trends erfassen und gleichzeitig Fallen vermeiden.


/*backtest
start: 2022-12-05 00:00:00
end: 2023-04-14 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/
// © ajahanbin1374

//@version=5
strategy(title = "EMA + TTS + STC", shorttitle = "EMA + TTS + STC", overlay = true, calc_on_order_fills=false, calc_on_every_tick = false, initial_capital = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.01)

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
profit = input.float(defval = 0.1, minval = 0.0, title="Profit %", step=0.01, group = "Strategy") * 0.01

////////////////////////////////////////////////////////////
// Emponential Moving Average
////////////////////////////////////////////////////////////
ema = ta.ema(close, 200)
posEma = close < ema ? -1 : 1

////////////////////////////////////////////////////////////
// Trend Trader Strategy
////////////////////////////////////////////////////////////
Length = input.int(21, minval=1, group="Trend Trader Strategy")
Multiplier = input.float(3, minval=0.000001, group="Trend Trader Strategy")
avgTR = ta.wma(ta.atr(1), Length)
highestC = ta.highest(Length)
lowestC = ta.lowest(Length)
hiLimit = highestC[1] - avgTR[1] * Multiplier
loLimit = lowestC[1] + avgTR[1] * Multiplier
ret = 0.0
posTts = 0.0
ret:= close > hiLimit and close > loLimit ? hiLimit :
         close < loLimit and close < hiLimit ? loLimit : nz(ret[1], close)
posTts:=  close > ret ? 1 :close < ret ? -1 : nz(posTts[1], 0)


////////////////////////////////////////////////////////////
// Schaff Trend Cycle (STC)
////////////////////////////////////////////////////////////
EEEEEE = input.int(12, 'Length', group ="Schaff Trend Cycle")
BBBB = input.int(26, 'FastLength', group ="Schaff Trend Cycle")
BBBBB = input.int(50, 'SlowLength', group ="Schaff Trend Cycle")

AAAA(BBB, BBBB, BBBBB) =>
    fastMA = ta.ema(BBB, BBBB)
    slowMA = ta.ema(BBB, BBBBB)
    AAAA = fastMA - slowMA
    AAAA

AAAAA(EEEEEE, BBBB, BBBBB) =>
    AAA = input.float(0.5, group ="Schaff Trend Cycle")
    var CCCCC = 0.0
    var DDD = 0.0
    var DDDDDD = 0.0
    var EEEEE = 0.0
    BBBBBB = AAAA(close, BBBB, BBBBB)
    CCC = ta.lowest(BBBBBB, EEEEEE)
    CCCC = ta.highest(BBBBBB, EEEEEE) - CCC
    CCCCC := CCCC > 0 ? (BBBBBB - CCC) / CCCC * 100 : nz(CCCCC[1])
    DDD := na(DDD[1]) ? CCCCC : DDD[1] + AAA * (CCCCC - DDD[1])
    DDDD = ta.lowest(DDD, EEEEEE)
    DDDDD = ta.highest(DDD, EEEEEE) - DDDD
    DDDDDD := DDDDD > 0 ? (DDD - DDDD) / DDDDD * 100 : nz(DDDDDD[1])
    EEEEE := na(EEEEE[1]) ? DDDDDD : EEEEE[1] + AAA * (DDDDDD - EEEEE[1])
    EEEEE

mAAAAA = AAAAA(EEEEEE, BBBB, BBBBB)
mColor = mAAAAA > mAAAAA[1] ? color.new(color.green, 20) : color.new(color.red, 20)
posStc = mAAAAA > mAAAAA[1] ? 1 : -1

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
pos = posEma == 1 and posTts == 1 and posStc == 1 ? 1 : posEma == -1 and posTts == -1 and posStc == -1 ? -1 : 0

currentPostition = strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0
noOpenPosition = strategy.position_size == 0

signal = pos != pos[1] and pos == 1 and noOpenPosition ? 1 : pos != pos[1] and pos == -1 and noOpenPosition ? -1 : 0

stopPriceForLong = math.min(close * (1 - profit), low[1] * 0.9998, low[2] * 0.9998)
limitPriceForLong = close + (close - stopPriceForLong)
stopPriceForShort = math.max(close * (1 + profit), high[1] * 1.0002, high[2] * 1.0002)
limitPriceForShort = close - (stopPriceForShort - close)

if signal == 1
    strategy.entry(id="L", direction=strategy.long)
    strategy.exit(id='EL', from_entry='L', limit=limitPriceForLong, stop=stopPriceForLong)
if signal == -1
    strategy.entry(id="S", direction=strategy.short)
    strategy.exit(id='ES', from_entry='S', limit=limitPriceForShort, stop=stopPriceForShort)

////////////////////////////////////////////////////////////
// Plots - Debuger
////////////////////////////////////////////////////////////
plotchar(signal, title='singal', char = '')
plotchar(posEma, title='posEma', char = '')
plotchar(posTts, title='posTts', char = '')
plotchar(pos, title='pos', char = '')
plotchar(currentPostition, title = 'currentPostition', char='')
plotchar(stopPriceForLong, title = "stopPriceForLong", char ='')
plotchar(limitPriceForLong, title = 'limitPriceForLong', char='')
plotchar(stopPriceForShort, title = "stopPriceForShort", char ='')
plotchar(limitPriceForShort, title = 'limitPriceForShort', char='')

////////////////////////////////////////////////////////////
// Plots
////////////////////////////////////////////////////////////
plot(ret, color=color.new(color.black, 0), title='Trend Trader Strategy')
plotchar(mAAAAA, color=mColor, title='STC', location = location.bottom, char='-', size=size.normal)
plot(series = ema, title = "ema")


Mehr