Suivi des tendances à court terme et stratégie de suppression des chocs


Date de création: 2023-12-12 15:52:37 Dernière modification: 2023-12-12 15:52:37
Copier: 1 Nombre de clics: 657
1
Suivre
1621
Abonnés

Suivi des tendances à court terme et stratégie de suppression des chocs

Aperçu

Cette stratégie utilise les avantages de l’indicateur EMA, de la stratégie de suivi de tendance TTS et de la stratégie de suivi de tendance du cycle de Shuffle STC, pour former une stratégie de suivi de tendance plus courte. Plus précisément, la stratégie juge simultanément si les signaux plus ou moins marginaux des trois indicateurs sont cohérents.

Principe de stratégie

La stratégie est principalement composée de trois parties: l’indicateur d’aplatissement EMA, la stratégie de suivi de la tendance TTS et l’indicateur de cycle de tendance STC Schweitzer.

Tout d’abord, calculer la moyenne mobile de l’indice EMA sur 200 cycles pour déterminer si le prix est inférieur ou supérieur à cette ligne EMA, si le prix est inférieur à cette ligne, l’indicateur EMA donne un signal de tête vide; -1; si le prix est supérieur à cette ligne, l’indicateur EMA donne un signal de tête multiple:

Ensuite, calculer les paramètres pertinents de la stratégie de suivi de la tendance TTS pour déterminer la direction de la tendance en fonction de la hausse ou de la baisse du prix. Si le prix est en hausse, un signal à plusieurs têtes est généré; si le prix est en baisse, un signal à vide est généré.

Enfin, calculer l’indicateur STC du cycle de tendance de Shuffle, qui reflète la tendance de variation du centre des prix. Si l’indicateur STC est en hausse, il génère un signal à plusieurs têtes; si l’indicateur STC est en baisse, il génère un signal à tête nue -1.

Après avoir reçu les signaux de jugement des trois indicateurs, la stratégie juge s’ils sont conformes. Un signal de transaction réel n’est généré que lorsque les trois signaux de jugement des indicateurs sont conformes. Cela permet de filtrer efficacement certains faux signaux, ce qui rend la stratégie plus fiable.

Si le signal de transaction est détecté, un ordre de prise de plus ou de moins est lancé et un point de stop-loss est défini.

Avantages stratégiques

  1. La stratégie utilise trois types d’indicateurs différents pour déterminer efficacement la direction des tendances du marché.

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

  3. Il est possible de fixer des points de stop-loss raisonnables, afin de bloquer les profits et d’éviter que les pertes ne s’étendent.

  4. Les paramètres sélectionnés ont été optimisés pour la plupart des variétés d’actions et de devises.

  5. La logique des transactions est claire et concise, facile à comprendre et à modifier.

Risque stratégique

  1. Lorsque les jugements des trois indicateurs sont incohérents, des dimers apparaissent et il est facile de manquer des opportunités de trading. Vous pouvez envisager d’optimiser les règles de jugement.

  2. L’indicateur STC est plus sensible aux paramètres et les différentes variétés ont besoin d’ajuster les paramètres.

  3. En période de récession, le stop loss peut être dépassé et entraîner des pertes plus importantes.

  4. L’accès à l’espace de rangement peut entraîner des emprisonnements.

Optimisation de la stratégie

  1. Il est possible de tester plus de combinaisons d’indicateurs pour trouver des règles de jugement plus fortes. Par exemple, ajouter un indicateur RSI.

  2. Optimiser les paramètres de l’indicateur STC pour le rendre plus adapté aux différentes variétés. Ajout d’un module d’optimisation des paramètres d’adaptation.

  3. Ajout d’un module d’arrêt adaptatif qui permet d’optimiser les paramètres d’arrêt en temps réel en fonction de la situation.

  4. Renforcer les modules de placement pour déterminer si le placement est en ordre horizontal et éviter les emprisonnements

  5. Optimisation de l’algorithme pour les transactions à haute fréquence, réduction de la latence du système et amélioration du taux de réussite des commandes.

Résumer

La stratégie utilise les trois indicateurs EMA, TTS et STC pour déterminer la direction de la tendance, et la règle de jugement est configurée pour générer un signal de transaction lorsque les trois sont cohérents, ce qui permet de filtrer efficacement les faux signaux. Il y a encore beaucoup de place pour l’optimisation de la stratégie, en testant davantage de combinaisons d’indicateurs, en ajoutant des algorithmes d’adaptation et en optimisant le module de trading à haute fréquence.

Code source de la stratégie
/*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")