Análisis de la estrategia del canal de Donchian en el entorno de investigación

El autor:- ¿ Por qué?, Creado: 2022-12-26 09:19:00, Actualizado: 2023-09-20 10:43:17

img

Análisis de la estrategia del canal de Donchian en el entorno de investigación

Introducción de la estrategia

Entre muchas estrategias comerciales, la estrategia del canal de Donchian debería ser una de las estrategias de avance más clásicas. Fue famosa ya en 1970.

Más tarde, el más famoso entrenamiento de comerciantes de tortugas en la historia del comercio tuvo lugar en los Estados Unidos, que fue un gran éxito. En ese momento, los métodos comerciales de las tortugas eran confidenciales, pero después de más de diez años, las reglas de comercio de tortugas se publicaron al público, la gente descubrió que las tortugas usaban la versión mejorada de la estrategia del canal Donchian.

La estrategia de negociación de avance es adecuada para las variedades de negociación con tendencia relativamente suave. El método de negociación de avance más común es usar la relación de posición relativa entre precio, soporte y resistencia para juzgar el punto de negociación específico. La estrategia del canal de Donchian en este artículo también se basa en este principio.

Reglas de la estrategia del Canal de Donchian

El canal de Donchian es un indicador de tendencia, y su apariencia y señal son algo similares a los del indicador de la banda de Bollinger. Sin embargo, el canal de precios de Donchian se construye de acuerdo con el precio más alto y el precio más bajo dentro de un cierto período.

img

Como se muestra en la figura anterior, este indicador se compone de tres curvas con diferentes colores. Por defecto, los precios más altos y más bajos dentro de 20 períodos se utilizan para mostrar la volatilidad de los precios del mercado. Cuando el canal es estrecho, significa que la volatilidad del mercado es pequeña. Por el contrario, cuando el canal es ancho, significa que la volatilidad del mercado es grande.

Si el precio sube por encima de la pista superior, es una señal de compra; Por el contrario, si el precio cae por debajo de la pista inferior, es una señal de venta. Dado que las pistas superior e inferior se calculan por los precios más altos y más bajos, generalmente, los precios rara vez suben y caen por debajo de las líneas superior e inferior del canal al mismo tiempo. En la mayoría de los casos, el precio se mueve a lo largo de las pistas superiores o inferiores unilateralmente, o entre las pistas superior e inferior.

La lógica de la estrategia

Hay muchas maneras de usar el canal de Donchian, que se pueden usar solos o combinados con otros indicadores. En esta lección, usaremos el método más simple. Es decir, cuando el precio rompe la pista superior de abajo hacia arriba, es decir, por encima de la línea de presión, creemos que la fuerza de muchas partes está creciendo, se ha formado una ola de mercado ascendente, y se ha generado la señal de posición abierta de compra; Cuando el precio cae por debajo de la pista inferior de arriba hacia abajo, es decir, por debajo de la línea de soporte, creemos que el lado de la posición corta se está fortaleciendo, se ha formado una ola de tendencia a la baja, y se ha generado la señal de posición de apertura de venta.

Si el precio cae de nuevo a la pista media del canal de Donchian después de comprar para abrir una posición, pensamos que la fuerza multipartidista se está debilitando, o la fuerza de la posición corta se está fortaleciendo, y se genera la señal de venta y cierre de la posición; Si el precio sube de nuevo a la pista media del canal de Donchian después de la apertura de la posición de venta, pensamos que el lado de la posición corta se está debilitando, o las fuerzas multipartidistas se están fortaleciendo, y se genera la posición de cierre de la señal de compra.

Condiciones de compra y venta

  • Posición de apertura larga: si no existe una posición y el precio de cierre es superior al nivel superior.
  • Posición de apertura corta: si no existe una posición y el precio de cierre es inferior al de la pista inferior.
  • Posición de cierre larga: si mantiene una posición larga y el precio de cierre es inferior a la línea media.
  • Posición corta de cierre: si mantiene una posición corta y el precio de cierre es mayor que el precio medio.

Aplicación del código de estrategia

A continuación, entenderemos esta estrategia una por una en el entorno de investigación de la plataforma FMZ Quant:

Introduzca el entorno de investigación de la plataforma FMZ Quant, como se muestra a continuación:

img

Estrategia de canal de Donchian en Python versión.ipynb En [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.

En [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.

Fuera de juego[2]:0

En [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.

Fuera[3]: El tipo de combinación: 0, CreateDate: 0, Mes de entrega : 9, Año de entrega: 0, Fecha de entrega : 0, ExchangeID: SHFE, ExchangeInstID: rb888, Fecha de vencimiento : 0, InstLifePhase: 49 años ID del instrumento : rb888, Nombre del instrumento: rb continuidad, Es el comercio : 1, Long MarginRatio : 0,06, MaxLimitOrderVolumen : 500, Máximo Margen Algorítmico : 49, MaxMarketOrderVolumen : 30, MinLimitOrderVolumen: 1, MinMarketOrderVolumen : 1, OpenDate: 0, Tipo de opciones: 48, PosiciónDateType: 49, PosiciónTipo: 50, PriceTick: 1, Clase de producto: 49, ID del producto: rb, Margen cortoRatio: 0,06, Data de entrega : 0, Precio de huelga : 0, InstrID subyacente: rb, Múltiples subyacentes : 1, VolumenMúltiple: 10}

A continuación, obtenemos la matriz de K-line, porque de acuerdo con la lógica estratégica, necesitamos que el mercado se ejecute durante un período de tiempo y luego hacer juicios lógicos, para que nuestra lógica estratégica pueda adaptarse mejor al mercado. Aquí tomaremos 50 K-lines como el requisito inicial temporalmente. La información de K-line de FMZ Quant se almacena en forma de una matriz, que contiene el precio más alto, el precio más bajo, el precio de apertura, el precio de cierre, la cantidad de negociación y otra información.https://www.fmz.com/api

En [4]:

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

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

En [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

Fuera[5]: Los demás:

Luego, necesitamos calcular el valor máximo del precio más alto y el valor mínimo del precio más bajo en las 50 K-líneas utilizando el precio de cierre como estándar.

En [6]:

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

Fuera[6]: Las demás:

En [7]:

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

Fuera[7]: Las demás:

A continuación, tenemos que calcular el valor medio de las vías superiores e inferiores de este canal.

En [8]:

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

Fuera[8]: Las demás:

En la parte superior, hemos completado todos los cálculos requeridos para esta estrategia. A continuación, comenzaremos a juzgar las condiciones de apertura lógicamente y llevaremos a cabo la operación de posición de apertura real de acuerdo con los resultados del juicio lógico. Cabe señalar aquí que necesitamos usar la plantilla de futuros de productos básicos domésticos de la plataforma FMZ Quant. Dado que el entorno de investigación actual no puede admitir esta plantilla, la escribiremos temporalmente, pero la operación reportará un error, en la página de escritura de la estrategia de la plataforma FMZ Quant para la codificación real, importa esta plantilla sin ningún problema, la dirección de la plantilla es:https://www.fmz.com/strategy/24288. Cuando usted codifica en la página de edición de estrategia de la plataforma FMZ Quant, usted necesita copiar esta plantilla a su propia biblioteca de estrategias primero, y luego marcarlo cuando backtesting.

En [ ]:

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.

El siguiente paso es determinar la lógica de la estrategia y abrir y cerrar posiciones de acuerdo con la lógica.

En [ ]:

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

En [ ]:

# 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

Relacionados

Más.