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.
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:
É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.
Les principaux avantages de cette stratégie sont les suivants:
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.
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.
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.
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.
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é.
Cette stratégie comporte également certains risques:
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.
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.
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:
Combiner la moyenne mobile et d'autres indicateurs pour filtrer les signaux DI
Ajuster les paramètres limites en fonction des résultats des tests antérieurs
Combinez le volume, le MACD, etc. pour déterminer si l'inversion de tendance
La stratégie peut être encore optimisée de la manière suivante:
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.
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.
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.
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.
En résumé, cette stratégie est relativement simple et pratique. Elle utilise le calcul de DI
/*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()