Indice de mouvement directionnel Stratégie de négociation bidirectionnelle

Auteur:ChaoZhang est là., Date: le 19 décembre 2023 14:13:52
Les étiquettes:

img

Résumé

Cette stratégie calcule l'indice de mouvement directionnel (DI) des matières premières et le combine avec des paramètres limites pour mettre en œuvre le trading bidirectionnel.

Principe de stratégie

L'indicateur de base de cette stratégie est l'indice de mouvement directionnel (DI).

La valeur de l'échantillon doit être la même que celle de l'échantillon. DI- = (DM- / plage réelle) × 100

Le True Range représente la volatilité récente en calculant la valeur maximale du prix le plus élevé, du prix le plus bas et du prix de clôture de la journée précédente sur trois jours.

Selon la définition de DI, lorsque DI+ > DI-, cela signifie que la dynamique actuelle du marché est plus forte, appartenant à un marché haussier; lorsque DI- > DI+, cela signifie que la dynamique baissière est plus forte que la dynamique haussière, appartenant à un marché baissier.

Cette stratégie utilise cette caractéristique et définit un paramètre limite. Lorsque DI + est supérieur à DI- par un paramètre limite, il détermine que le marché actuel est un marché haussier et va long. Lorsque DI- est supérieur à DI + par un paramètre limite, il détermine que le marché actuel est un marché baissier et va court.

Par exemple, si le paramètre limite est défini sur 3, les règles de négociation spécifiques sont les suivantes:

  1. Lorsque DI+ - DI- > 3, passez à long terme
  2. Lorsque DI- - DI+ > 3, faire court

Étant donné qu'il existe souvent de petites différences fluctuantes entre DI+ et DI-, la fixation d'un paramètre limite peut filtrer certaines transactions sans direction significative et réduire les transactions inutiles.

Analyse des avantages

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

  1. DI est fiable pour juger de l'orientation du marché

    DI juge directement les tendances du marché en calculant la puissance des taureaux et des ours.

  2. Le paramètre limite peut filtrer efficacement les signaux

    Le paramètre limite filtre les petites fluctuations sans directionnalité significative, en sélectionnant uniquement les sections ayant une directionnalité significative pour le commerce, évitant ainsi d'être pris au piège.

  3. Réaliser une négociation bidirectionnelle automatisée

    Les positions longues et courtes peuvent être automatiquement basées sur l'indicateur DI sans jugement manuel, ce qui réduit la difficulté de négociation.

  4. Temps de négociation personnalisable

    Prend en charge le réglage de la négociation uniquement dans une plage de dates personnalisable et ferme toutes les positions automatiquement par la suite, flexible et pratique.

  5. Sélectionnable uniquement long ou court

    Grâce aux interrupteurs longs et courts, seuls les signaux unidirectionnels peuvent être sélectionnés pour mettre en œuvre des stratégies longues ou courtes adaptées à différents environnements de marché.

Analyse des risques

Cette stratégie comporte également certains risques:

  1. Possibilité que le DI donne des signaux erronés

    L'indicateur peut donner des signaux erronés à court terme lorsque des fluctuations drastiques se produisent sur le marché, ce qui conduit à l'échec des transactions.

  2. Paramètres de limite incorrectement réglés

    Les paramètres de limite élevés ou bas peuvent entraîner trop peu ou trop de signaux de négociation.

  3. Impossible de déterminer le point final de tendance

    L'ID ne peut déterminer que la direction actuelle de la tendance et ne peut pas juger si la tendance s'est arrêtée ou inversée.

Les solutions pour les risques comprennent:

  1. Combiner la moyenne mobile et d'autres indicateurs pour filtrer les signaux DI

  2. Ajuster les paramètres limites en fonction des résultats des tests antérieurs

  3. Combinez le volume, le MACD, etc. pour déterminer si l'inversion de tendance

Directions d'optimisation

La stratégie peut être encore optimisée de la manière suivante:

  1. Combiner d'autres indicateurs de jugement de tendance tels que le profil de marché

    La combinaison d'indicateurs tels que le profil du marché, qui permet également de juger intuitivement la puissance longue courte avec DI, peut améliorer la précision du jugement.

  2. Ajouter des stratégies de stop-profit et de stop-loss

    La définition d'un stop-profit, d'un temps ou d'un pourcentage d'arrêt-perte peut garantir des bénéfices et réduire les pertes.

  3. Ajustement des paramètres pour des produits spécifiques

    L'ajustement des paramètres limites et des délais de négociation en fonction des différentes caractéristiques du produit peut améliorer les performances de la stratégie.

  4. Optimisation dynamique par apprentissage automatique

    Appliquer des algorithmes d'apprentissage par renforcement pour optimiser dynamiquement les paramètres basés sur des signaux en direct.

Résumé

En résumé, cette stratégie est relativement simple et pratique. Elle utilise le calcul de DI pour déterminer la direction du marché; filtre les signaux via des paramètres de limite; prend en charge le trading bidirectionnel ou long/short uniquement; permet de définir des délais de négociation. Les principaux avantages sont une fiabilité élevée et un filtrage efficace des signaux. Elle présente également des problèmes tels que des signaux et des paramètres incorrects. Nous pouvons l'améliorer en combinant d'autres indicateurs, en définissant un stop-loss/profit, en ajustant des paramètres, etc., ou en l'optimisant dynamiquement avec l'apprentissage automatique.


/*backtest
start: 2022-12-12 00:00:00
end: 2023-12-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Noro's DI Strategy", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
len = input(title="Length", defval=14)
limit = input(3, title = "limit, %")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//DI
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementMinus = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100

//Trend
trend = 0
trend := DIPlus > DIMinus + limit ? 1 : DIPlus < DIMinus - limit ? -1 : trend[1]

//Background
col = trend == 1 ? lime : red
bgcolor(col, transp = 80)

//Lines
plot(DIPlus, color=lime, title="DI+", linewidth = 3)
plot(DIMinus, color=red, title="DI-", linewidth = 3)

//Trading
size = strategy.position_size
lot = 0.0
lot := size != size[1] ? strategy.equity / close * capital / 100 : lot[1]
if trend == 1
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if trend == -1
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()

Plus de