La stratégie de suivi des tendances de l' EMA visant à supprimer les oscillations

Auteur:ChaoZhang est là., Date: 2023-12-12 15:52:37 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie combine les avantages de trois indicateurs: EMA, Stratégie de suivi des tendances (TTS) et Cycle de tendance de Schaff (STC) pour former une stratégie de suivi des tendances à court terme forte. Plus précisément, la stratégie jugera si les signaux d'achat et de vente des trois indicateurs sont cohérents. S'ils sont cohérents, des signaux de trading seront générés; sinon, aucun commerce ne sera effectué. Cela filtre certains faux signaux et rend la stratégie plus fiable.

Principe de stratégie

La stratégie est composée de trois parties principales: l'indicateur EMA, la stratégie de suivi des tendances TTS et l'indicateur STC.

Tout d'abord, la ligne de moyenne mobile exponentielle EMA de 200 périodes est calculée. Si le prix est inférieur à cette ligne EMA, l'indicateur EMA donne un signal de vente: -1; si le prix est supérieur à la ligne, l'indicateur EMA donne un signal d'achat: 1.

Deuxièmement, les paramètres pertinents de la stratégie de suivi de tendance TTS sont calculés. Selon les écarts de prix des rails supérieur et inférieur, la direction de la tendance du marché est déterminée. Si le prix traverse le rails supérieur, un signal d'achat 1 est généré; si le prix traverse le rails inférieur, un signal de vente -1 est généré.

Enfin, l'indicateur Schaff Trend Cycle (STC) est calculé, qui reflète l'évolution de la tendance de la consolidation des prix.

Après avoir obtenu les signaux de jugement des trois indicateurs, la stratégie déterminera s'ils sont cohérents.

Une fois que les signaux de négociation ont été déterminés, des positions longues ou courtes seront ouvertes et des points de stop-profit/stop-loss seront fixés.

Les avantages

  1. La stratégie combine trois types d'indicateurs différents pour déterminer efficacement l'orientation de la tendance du marché.

  2. L'utilisation de la cohérence des signaux de jugement de trois indicateurs pour filtrer les faux signaux peut réduire les transactions inutiles et rendre la stratégie plus fiable.

  3. La fixation de points raisonnables d'arrêt des bénéfices/arrêt des pertes peut garantir des bénéfices et empêcher les pertes de s'accroître.

  4. Les paramètres optimisés conviennent à la plupart des actions et des produits de change.

  5. Une logique simple et facile à comprendre.

Les risques

  1. L'incohérence entre les jugements d'indicateurs peut entraîner une perte d'opportunités de négociation.

  2. L'indicateur STC est sensible aux paramètres.

  3. Dans les tendances à la baisse, le stop loss peut être pénétré, causant d'énormes pertes.

  4. Les consolidations latérales ne peuvent pas être identifiées efficacement, ce qui conduit à des positions de piège.

Améliorations

  1. Testez plus de combinaisons d'indicateurs pour trouver des règles de jugement plus strictes, par exemple en ajoutant un indicateur RSI.

  2. Optimiser les paramètres STC pour une meilleure adaptation entre différents produits. Ajouter le module d'optimisation des paramètres adaptatifs.

  3. Augmenter le module d'arrêt de perte adaptatif pour optimiser dynamiquement les points d'arrêt de perte.

  4. Améliorer le module de fermeture de position pour identifier les distances latérales et éviter les pièges.

  5. Optimiser les algorithmes pour le trading à haute fréquence, réduire la latence et améliorer les taux de traitement des commandes.

Conclusion

La stratégie combine les indicateurs EMA, TTS et STC pour déterminer l'orientation du marché, avec des jugements cohérents des trois transactions déclenchantes, filtrant efficacement les faux signaux. Il y a encore beaucoup de marge d'optimisation, par exemple en testant plus de combinaisons d'indicateurs, en ajoutant des algorithmes adaptatifs, en optimisant les modules de trading à haute fréquence, etc., pour renforcer davantage la capacité de suivi des tendances. Par rapport aux stratégies traditionnelles qui suivent simplement les moyennes mobiles, cette stratégie peut juger les marchés de manière plus intelligente, capturer les tendances tout en évitant les pièges.


/*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")


Plus de