Stratégie d'inversion de tendance basée sur plusieurs moyennes mobiles

Auteur:ChaoZhang est là., Date: 2023-11-21 14:53:48
Les étiquettes:

img

Résumé

Cette stratégie génère des signaux d'achat et de vente basés sur l'inversion de plusieurs indicateurs de tendance, y compris TDI, TCF, TTF et TII. La stratégie permet de choisir le signal d'indicateur à utiliser pour les entrées et les sorties.

La logique de la stratégie

  • Indicateur TDI

    L'indicateur TDI est construit en utilisant la dynamique des prix avec des techniques de somme et de lissage.

  • Indicateur de la FTC

    L'indicateur TCF mesure les variations positives et négatives des prix pour mesurer les forces haussières et baissières.

  • Indicateur TTF

    L'indicateur TTF compare la puissance des prix les plus élevés et les plus bas pour déterminer la tendance.

  • Indicateur TII

    Le TII combine la moyenne mobile et les bandes de prix pour identifier les renversements de tendance. Il prend en compte les tendances à court et à long terme.

La logique d'entrée longue et proche sélectionne les signaux appropriés en fonction de l'indicateur configuré.

Les avantages

La stratégie intègre plusieurs indicateurs de négociation de tendance couramment utilisés, ce qui permet une flexibilité d'adaptation aux conditions changeantes du marché.

  1. Capture les opportunités d'inversion de tendance en temps opportun à l'aide de signaux d'inversion
  2. Optimiseable par la configuration de différents indicateurs
  3. Des combinaisons riches d'indicateurs peuvent être utilisées pour confirmer les signaux

Les risques

Les principaux risques auxquels cette stratégie est confrontée:

  1. Les signaux d'indicateur peuvent avoir de faux signaux entraînant des pertes.
  2. Les indicateurs individuels ne peuvent pas évaluer pleinement les tendances et sont sensibles au bruit du marché
  3. Des configurations incorrectes d'indicateurs et de paramètres de négociation peuvent induire en erreur le marché et générer des transactions erronées

Les risques peuvent être réduits par:

  1. Optimisation des paramètres des indicateurs pour trouver les meilleures combinaisons
  2. Exigence de confirmations de signaux multiples pour améliorer la qualité
  3. Adaptation de la taille des positions pour contrôler les pertes d'une seule transaction

Des possibilités d'amélioration

La stratégie peut être améliorée dans plusieurs domaines:

  1. Test des indicateurs et paramètres optimaux à travers différents cycles de marché
  2. Ajouter ou réduire les indicateurs pour trouver les meilleures combinaisons
  3. Filtrer les faux signaux
  4. Optimiser les stratégies de dimensionnement des positions, par exemple taille variable, stop loss à la traîne
  5. Incorporer la notation par apprentissage automatique pour aider à la qualité du signal

Conclusion

En combinant de multiples indicateurs d'inversion de tendance et en optimisant les configurations, cette stratégie est adaptable à différents environnements de marché pouropérer à des points de basculement de tendance.La clé est de trouver les paramètres et indicateurs optimaux tout en contrôlant le risque.Des optimisations et des validations continues peuvent construire une stratégie alpha stable.


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

Plus de