Stratégie d'inversion multiple basée sur la moyenne de tendance


Date de création: 2023-11-21 14:53:48 Dernière modification: 2023-11-21 14:53:48
Copier: 0 Nombre de clics: 604
1
Suivre
1621
Abonnés

Stratégie d’inversion multiple basée sur la moyenne de tendance

Aperçu

La stratégie calcule plusieurs indicateurs de tendance pour effectuer des opérations d’achat et de vente lorsque ceux-ci sont inversés. Les principaux indicateurs de tendance sont les indicateurs TDI, TCF, TTF et TII. La stratégie choisit dans sa configuration l’indicateur à utiliser pour générer un signal de négociation.

Principe de stratégie

  • ### Indicateur TDI

L’indicateur TDI est basé sur la dynamique de variation du prix. Il est construit par la technique de la somme et de l’assouplissement. Lorsque l’indicateur de direction TDI est en hausse sur la courbe TDI, il est en baisse.

  • ### Indicateur TCF

L’indicateur TCF calcule les variations positives et négatives du prix pour juger de la force des plus et des moins. Faites plus lorsque la force de la variation positive est supérieure à la force de la variation négative, sinon déposez.

  • ### Indicateur TTF

L’indicateur TTF juge la tendance en comparant la force des hauts et des bas. Le signal de surcharge est de passer 100 sur l’indicateur TTF et vice versa.

  • ### Indicateur TII

L’indicateur TII combine la moyenne et la fourchette de prix pour juger du renversement de tendance. Il prend en compte à la fois les tendances à court et à long terme.

Logique d’entrée dans une position de multi-paix Sélectionnez les signaux de trading appropriés en fonction des indicateurs de configuration.

Avantages stratégiques

La stratégie intègre plusieurs indicateurs de trading de tendance couramment utilisés et offre la flexibilité nécessaire pour s’adapter aux conditions du marché. Les avantages spécifiques sont:

  1. Les signaux de retournement de tendance permettent de saisir les opportunités de changement de tendance en temps opportun.
  2. Configurer différents indicateurs pour optimiser le ciblage
  3. Une riche combinaison d’indicateurs qui peuvent être utilisés en combinaison pour confirmer les signaux

Risque stratégique

Les principaux risques de cette stratégie sont les suivants:

  1. Les signaux de trading générés par les indicateurs de tendance peuvent être mal interprétés et entraîner des pertes
  2. Les indicateurs individuels ne permettent pas de juger de la tendance et sont vulnérables au bruit du marché.
  3. Une mauvaise configuration des paramètres de l’indicateur et des paramètres de transaction peut entraîner une mauvaise compréhension du marché et des transactions erronées.

Les mesures suivantes peuvent être prises pour réduire le risque:

  1. Optimiser les paramètres de l’indicateur pour trouver la meilleure combinaison de paramètres
  2. Combiner plusieurs signaux d’indicateurs pour effectuer des transactions et améliorer la qualité du signal
  3. Adaptation de la stratégie de gestion des positions et maîtrise des pertes individuelles

Orientation de l’optimisation de la stratégie

Cette stratégie peut être optimisée dans les domaines suivants:

  1. Test des combinaisons optimales d’indicateurs et de paramètres pour différents cycles de marché
  2. Ajoutez ou supprimez des indicateurs pour trouver la combinaison optimale
  3. Filtrer les signaux de transaction pour éliminer les signaux de désinformation
  4. Optimiser les stratégies de gestion des positions, telles que la modification des positions, le suivi des arrêts de perte, etc.
  5. Augmentation de l’indicateur de notation de l’apprentissage automatique pour aider à juger de la qualité du signal

Résumer

La stratégie combine les avantages de plusieurs indicateurs de renversement de tendance, optimisés par la configuration d’indicateurs et de paramètres, qui peuvent s’adapter à différents environnements de marché et opérer à des points de renversement de tendance. La clé est de trouver la combinaison optimale de paramètres et d’indicateurs tout en contrôlant les risques.

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