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.
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.
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.
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
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:
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,
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