Analyse de la stratégie du canal de Donchian dans le cadre de la recherche

Auteur:Je ne sais pas., Créé: 2022-12-26 09:19:00, Mis à jour: 2023-09-20 10:43:17

img

Analyse de la stratégie du canal de Donchian dans le cadre de la recherche

Introduction de la stratégie

Parmi de nombreuses stratégies de trading, la stratégie du canal de Donchian devrait être l'une des stratégies de percée les plus classiques. Elle était célèbre dès 1970.

Plus tard, la formation la plus célèbre des traders turtle dans l'histoire du commerce a eu lieu aux États-Unis, ce qui a été un grand succès. À cette époque, les méthodes de trading des Turtles étaient confidentielles, mais après plus de dix ans, les Turtle Trading Rules ont été publiées au public, les gens ont constaté que les Turtles utilisaient la version améliorée de la stratégie du canal Donchian.

La stratégie de négociation de rupture est adaptée aux variétés de négociation avec une tendance relativement lisse. La méthode de négociation de rupture la plus courante consiste à utiliser la relation de position relative entre le prix, le support et la résistance pour juger du point de négociation spécifique.

Règles stratégiques du canal de Donchian

Le canal de Donchian est un indicateur de tendance, et son apparence et son signal sont quelque peu similaires à ceux de l'indicateur de la bande de Bollinger. Cependant, le canal de prix de Donchian est construit en fonction du prix le plus élevé et du prix le plus bas dans une certaine période. Par exemple, la valeur maximale du prix le plus élevé des 50 dernières lignes K est calculée pour former la piste supérieure; Calculer la valeur minimale du prix le plus bas des 50 dernières lignes K pour former la piste inférieure.

img

Comme le montre la figure ci-dessus, cet indicateur est composé de trois courbes de couleurs différentes. Par défaut, les prix les plus élevés et les plus bas au cours de 20 périodes sont utilisés pour montrer la volatilité des prix du marché. Lorsque le canal est étroit, cela signifie que la volatilité du marché est faible. Inversement, lorsque le canal est large, cela signifie que la volatilité du marché est grande.

Si le prix monte au-dessus de la piste supérieure, c'est un signal d'achat; au contraire, si le prix tombe en dessous de la piste inférieure, c'est un signal de vente. Puisque les pistes supérieures et inférieures sont calculées par les prix les plus élevés et les plus bas, en général, les prix augmentent rarement et tombent en dessous des lignes supérieures et inférieures du canal en même temps. Dans la plupart des cas, le prix se déplace le long des pistes supérieures ou inférieures unilatéralement, ou entre les pistes supérieures et inférieures.

La logique de la stratégie

Il existe de nombreuses façons d'utiliser le canal de Donchian, qui peut être utilisé seul ou combiné avec d'autres indicateurs. Dans cette leçon, nous utiliserons la méthode la plus simple. C'est-à-dire que lorsque le prix traverse la piste supérieure de bas en haut, c'est-à-dire au-dessus de la ligne de pression, nous pensons que la force de nombreuses parties augmente, une vague de marché en hausse s'est formée et le signal de position ouverte d'achat a été généré; Lorsque le prix tombe en dessous de la piste inférieure de haut en bas, c'est-à-dire en dessous de la ligne de support, nous pensons que le côté de position courte se renforce, une vague de tendance à la baisse s'est formée et le signal d'ouverture de position de vente a été généré.

Si le prix retombe sur la piste médiane du canal de Donchian après avoir acheté pour ouvrir une position, nous pensons que la force multipartite s'affaiblit, ou que la force multipartite de la position courte se renforce, et le signal de vente et de fermeture de la position est généré; si le prix remonte à la piste médiane du canal de Donchian après l'ouverture de la position de vente, nous pensons que le côté de la position courte s'affaiblit, ou que les forces multipartites se renforcent, et que le signal de fermeture de la position d'achat est généré.

Conditions d'achat et de vente

  • Position d'ouverture longue: si aucune position n'existe et que le prix de clôture est supérieur à la piste supérieure.
  • Position d'ouverture courte: si aucune position n'existe et que le prix de clôture est inférieur à la piste inférieure.
  • Position de clôture longue: si vous détenez une position longue et que le prix de clôture est inférieur à la moyenne.
  • Position de clôture courte: si vous détenez une position courte et que le prix de clôture est supérieur à la moyenne.

Mise en œuvre du code de stratégie

Ensuite, nous allons comprendre cette stratégie une par une dans l'environnement de recherche de la plateforme FMZ Quant:

Entrez dans l'environnement de recherche de la plateforme FMZ Quant, comme indiqué ci-dessous:

img

Stratégie du canal de Donchian dans Python version.ipynb Dans [1]:

from fmz import *
task = VCtx('''backtest
start: 2019-08-01 09:00:00
end: 2019-10-10 15:00:00
period: 5m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
''')
# Create a Backtesting Environment
# The example format of the backtest information in red above can be obtained by clicking "Save settings" on the strategy edting page of the FMZ Quant platform.

Dans [2]:

# First, we need to get the position information, and we define a mp() function to do this.

def mp():
    positions = exchange.GetPosition() # Get position array
    if len(positions) == 0: # If the length of the position array is 0
        return 0 # Prove a short position, return 0
    for i in range(len(positions)): # Iterate through the positions array
        if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD):
            return 1 # If there are long position orders, return 1
        elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD):
            return -1 # If there are short position orders, return -1
        
    print(positions)
    
mp() # Next, we execute this function to get the position information, and we can see that the result is 0, which means that the current position is short.

Éliminé [2]:0

Dans [3]:

# Let's start testing this strategy using the current main rebar contract as an example.

exchange.SetContractType("rb888") # Set the variety code, the main contract is the contract code followed by the number 888.

Extrait [3]: {Types de combinaisons: 0, Créer Date: 0, Month de livraison: 9, Année de livraison: 0, Date de fin de livraison : 0, ExchangeID: SHFE, ExchangeInstID: rb888, Expiration : 0, InstLifePhase: 49, ID de l'instrument : rb888, Nom de l'instrument: rb continuité, IsTrading: 1, Long MarginRatio : 0,06, Maximum du volume de commande : 500, L'algorithme de la marge maximale: 49, MaxMarketOrderVolume : 30, MinLimitOrderVolume: 1, MinMarketOrderVolume: 1, OpenDate: 0, Types d'options: 48, Position DateTypes: 49 Types de postes: 50, PriceTick: 1, Classe de produit: 49, ID du produit: rb, Ratio de marge courte : 0,06, Date de début de livraison : 0, Price de grève: 0, InstrID sous-jacent: rb, Multiple sous-jacent: 1, VolumeMultiple: 10}

Ensuite, nous obtenons le tableau de K-line, car selon la logique stratégique, nous avons besoin que le marché fonctionne pendant une période de temps et puis de faire des jugements logiques, afin que notre logique stratégique puisse mieux s'adapter au marché. Ici, nous prendrons 50 K-lines comme condition de départ temporairement.https://www.fmz.com/api

Dans [4]:

# Next we define a variable to store the K-line array.

records = exchange.GetRecords() # Get the K-line array

Dans [5]:

# According to the strategy logic description, we use the closing price as the price to open a position, so we need to calculate the closing price of the latest K-line.

close = records[len(records) - 1].Close # Get the latest K-line closing price
close

À l'extérieur [5]: Les produits de base:

Ensuite, nous devons calculer la valeur maximale du prix le plus élevé et la valeur minimale du prix le plus bas dans les 50 lignes K en utilisant le prix de clôture comme norme.

Dans [6]:

upper = TA.Highest(records, 50, 'High') # Get the maximum value of the 50-period maximum price
upper

À l'extérieur [6]: Autres produits du secteur de la construction

Dans [7]:

lower = TA.Lowest(records, 50, 'Low') # Get the minimum value of the 50-period minimum price
lower

À l'extérieur[7]: Les produits de base:

Ensuite, nous devons calculer la valeur moyenne des voies supérieures et inférieures de ce canal.

Dans [8]:

middle = (upper + lower) / 2 # Calculate the average value of the upper and lower tracks.
middle

À l'extérieur[8]: Les produits de base

Ci-dessus, nous avons complété tous les calculs nécessaires à cette stratégie. Ensuite, nous commencerons à juger logiquement les conditions d'ouverture et à effectuer l'opération de position d'ouverture réelle en fonction des résultats du jugement logique. Il convient de noter ici que nous devons utiliser le modèle de contrats à terme sur les matières premières domestiques de la plate-forme FMZ Quant. Étant donné que l'environnement de recherche actuel ne peut pas prendre en charge ce modèle, nous l'écrirons temporairement, mais l'opération signalera une erreur, dans la page d'écriture de la stratégie de la plate-forme FMZ Quant pour le codage réel, importez ce modèle sans aucun problème, l'adresse du modèle est:https://www.fmz.com/strategy/24288. Lorsque vous codez sur la page d'édition de stratégie de la plateforme FMZ Quant, vous devez d'abord copier ce modèle dans votre propre bibliothèque de stratégies, puis le cocher lors du backtesting.

Dans [ ]:

obj = ext.NewPositionManager() # When using the FMZ Quant trading class library, errors will be reported at runtime, which can be ignored. Now it is the research environment,
                               # This problem does not occur during the actual coding process, and the following is the same without further comment.

L'étape suivante consiste à déterminer la logique de la stratégie et à ouvrir et fermer des positions en fonction de cette logique.

Dans [ ]:

if positions > 0 and close < middle: # If you hold a long position order and the closing price falls below the middle track
            obj.CoverAll() # Close all positions
        if positions < 0 and close > middle: # If you hold a short position order and the closing price rises above the middle track
            obj.CoverAll() # Close all positions
        if positions == 0: # If it's a short position
            if close > upper: # If the closing price rises above the upper track
                obj.OpenLong("rb888", 1) # Buy opening positions
            elif close < lower: # If the closing price falls below the lower track
                obj.OpenShort("rb888", 1) # Sell opening positions

Dans [ ]:

# Complete strategy code:
def mp():
    positions = exchange.GetPosition() # Get the position array
    if len(positions) == 0: # If the length of the position array is 0
        return 0 # It proved a short position, return 0
    for i in range(len(positions)): # Iterate through the positions array
        if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD):
            return 1 # If there are long position orders, return 1
        elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD):
            return -1 # If there are short position orders, return -1

def main(): # Main function
    exchange.SetContractType("rb888") # Set the variety code, the main contract is the contract code followed by the number 888
    while True: # Enter the loop
        records = exchange.GetRecords() # Get the K-line array
        if len(records) < 50: continue # If there are less than 50 K-lines, skip the loop
        close = records[len(records) - 1].Close # Get the latest K-line closing price
        positions = mp() # Get position information function
        upper = TA.Highest(records, 50, 'High') # Get the maximum value of the 50-period maximum price
        lower = TA.Lowest(records, 50, 'Low') # Get the minimum value of the 50-period minimum price
        middle = (upper + lower) / 2 # Calculate the average value of the upper and lower tracks
        obj = ext.NewPositionManager() # Use the Trading Library
        if positions > 0 and close < middle: # If you hold a long position order and the closing price falls below the middle track
            obj.CoverAll() # Close all positions
        if positions < 0 and close > middle: # If you hold a short position order and the closing price rises above the middle track
            obj.CoverAll() # Close all positions
        if positions == 0: # If it's a short position
            if close > upper: # If the closing price rises above the upper track
                obj.OpenLong("rb888", 1) # Buy opening positions
            elif close < lower: # If the closing price falls below the lower track
                obj.OpenShort("rb888", 1) # Sell opening positions

Relationnée

Plus de