En el artículo anterior, aprendimos sobre la introducción al lenguaje Python, la sintaxis básica, el marco de la estrategia y más. Aunque el contenido era aburrido, pero es una habilidad imprescindible en el desarrollo de su estrategia comercial.
Entre muchas estrategias comerciales, la estrategia de canal Donchian debería ser una de las estrategias de avance más clásicas. Ha sido famosa desde 1970.
Más tarde, en los Estados Unidos, ocurrieron los famosos eventos de capacitación de comerciantes de tortugas, que tuvieron un gran éxito en la historia del comercio de valores.
La estrategia de negociación de avance se adapta a la tendencia relativamente suave de las variedades de negociación. La forma más común de avance es utilizar la relación posicional relativa entre el soporte de precio y la resistencia para determinar la posición de negociación específica.
El canal de Donchian es un indicador orientado a la tendencia, y su apariencia y señal son algo similares al indicador de la banda de Bollinger. Sin embargo, su canal de precios se construye de acuerdo con los precios más altos y más bajos en un determinado período.
como se muestra anteriormente: este indicador con la curva compuesta por tres colores diferentes, la configuración predeterminada es el precio más alto y el más bajo en el ciclo 20 para mostrar la volatilidad de los precios.
Si los precios suben por encima del carril superior, aparecerá la señal de compra; a la inversa, si el precio cae por debajo del carril inferior, aparecerá la señal de venta.
En la plataforma FMZ Quant, el cálculo del canal Donchian es simple, usted sólo puede acceder al precio más alto o más bajo en el ciclo dado, como se muestra a continuación: la 5a línea es obtener el precio más alto de 50 ciclos, la 6a línea es obtener el precio más bajo de 50 ciclos.
def main(): # program entry
exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
while True: # enter the loop
records = exchange.GetRecords() # get the k line array
upper = TA.Highest(record, 50, 'high') # get the highest price of 50 cycles
lower = TA.Lowest(record, 50, 'low') # get the lowest price of 50 cycles
middle = (upper + lower) / 2 # calculate the average value of upper and lower rails
Log("upper rail: ", upper) # print the upper rail value in the log
Log("lower rail: ", lower) # print the lower rail value in the log
Log("middle rail: ", middle) # print the middle rail value in the log
Hay muchas maneras de usar el canal de Donchian, que se puede usar solo o en combinación con otros indicadores. En esta sección lo usaremos de la manera más fácil. Es decir: cuando los precios rompen el tren superior, lo que significa que rompen por encima de la línea de presión, el poder adquisitivo es fuerte, se ha formado una ola de energía ascendente, se genera una señal de compra; cuando el precio rompe por debajo del tren inferior, lo que significa que rompe por debajo de la línea de soporte, se genera la señal de venta.
Si el precio vuelve a caer al carril medio del canal después de la apertura de la posición larga, creemos que la fuerza del poder de compra se está debilitando, o la fuerza del poder de venta se está fortaleciendo, y se genera la señal de apertura de la posición corta; el mismo principio se aplica a la posición corta de apertura
Posición larga abierta: si no hay posición mantenida y el precio de cierre es mayor que la barrera superior
Posición corta abierta: Si no hay posición mantenida y el precio de cierre es inferior al nivel inferior
Posición larga de cierre: si se mantiene actualmente una posición larga y el precio de cierre es inferior al precio medio
Posición corta de cierre: si se mantiene actualmente una posición corta y el precio de cierre es mayor que el precio medio
El primer paso en la implementación de la estrategia es obtener los datos primero, porque los datos son un requisito previo parte de la estrategia de comercio.
El siguiente paso es calcular la lógica de negociación basada en estos datos; el paso final es el comercio de acuerdo con la lógica. pasos como sigue:
Puede pensar en la biblioteca de clase de trading como un módulo funcional. La ventaja de usar una biblioteca de clase de trading es que le permite centrarse en escribir lógica de estrategia. Por ejemplo, cuando usamos la biblioteca de clase de trading, para abrir o cerrar una posición, podemos usar directamente la interfaz API en la biblioteca de clase de trading; pero si no usamos la biblioteca de clase de trading, necesitamos obtener el precio de mercado al abrir la posición. Necesitamos considerar el tema de las órdenes no ejecutadas y el tema de las órdenes de retiro, y así sucesivamente.
def main();
wile true:
obj = ext.NewPositionManager() # using the trading class library
# followed by strategy logic and placing order part
La parte de codificación anterior es el marco de estrategia de CTA utilizando la herramienta FMZ Quant. Este es un formato de codificación fijo, y todo el código de lógica de negociación comenzará en la línea 4.
Piense en ello, ¿qué tipo de datos necesitamos? desde nuestra lógica de la estrategia de negociación, primero necesitamos obtener el estado de la posición actual, y luego comparar el precio de cierre con el indicador de la banda de Bollinger superior, media e inferior rieles.
La primera es obtener la matriz de datos de línea K y el precio de cierre de línea K actual, con la matriz de línea K, podemos calcular el período de ciclo N del precio más alto y más bajo a través de la interfaz API. se puede escribir así:
def main(): # main function
exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
while True: # enter the loop
records = exchange.GetRecords() # get the k line array
if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
close = records[len(records) - 1].Close # get the closing price of the latest k-line
Como se muestra anteriormente:
Línea 4: Obtener la matriz línea K, que es un formato fijo.
Línea 5: Filtrar la longitud de la línea K, porque el parámetro para calcular el indicador del canal de Donchian es 50, cuando el número de líneas K es menor a 50, es imposible calcularlo.
Línea 6: Utilizamos el código "records[ len (records) - 1] " para obtener los últimos datos de la matriz de la línea K, que es el último dato de la línea K. Estos datos son un objeto, que contiene: el precio de apertura, el precio más alto, más bajo y de cierre, también el volumen de negociación, tiempo y otros datos, ya que es un objeto, por lo que sólo utilizamos
La información de posición es una condición muy importante en la estrategia de negociación cuantitativa. Cuando se establecen las condiciones de negociación, es necesario juzgar si colocar un pedido por el estado de la posición y el número de posiciones. Por ejemplo, cuando se establecen las condiciones para abrir posiciones largas, si hay posiciones de retención, no colocar el pedido; si no hay posición de retención, colocar el pedido. Esta vez encapsulamos directamente la información de posición en una función, simplemente podemos llamar a esta función para usarla. así:
# get the position information function
def mp():
positions = exchange.GetPosition() # get the holding position array
if len(position) == 0: # if the holding position array is 0
return 0 # meaning currently has no position holding, return 0
for i in range(len(position)): # Traversing the position array
if (position[i]['Type'] == PD_LONG):
return 1 # if there are long position holding, return 1
elif (position[i]['Type'] == PD_SHORT):
return -1 # if there are short position holding, return -1
def main(): # main function
exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
while True: # enter the loop
records = exchange.GetRecords() # get the k line array
if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
close = records[len(records) - 1].Close # get the closing price of the latest k-line
position = mp() # get the position information function
Como se muestra anteriormente:
Esta es una función que obtiene la información de posición. Si hay posición larga, el valor es 1; si hay posición corta, el valor es -1; si no hay posición, el valor es 0.
Línea 2: Crear una función con el nombre
Línea 3: Obtener la matriz de posición, que es un formato fijo.
Línea 4: Determine la longitud de la matriz de posiciones. Si su longitud es igual a 0, significa que no tiene posición de retención, devuelve 0.
Línea 6 : Usando el bucle for, comenzando a atravesar esta matriz, la siguiente lógica es muy simple, si está sosteniendo posición larga, devuelve 1 ; si está sosteniendo posición corta, devuelve -1.
Línea 18: Llamar a la función de información de posición
En la herramienta de comercio cuantitativo de FMZ Quant, puede usar directamente las funciones "TA.Highest" y "TA.Lowest" sin tener que escribir sus propios cálculos lógicos. Y la función
# get the position information function
def mp():
positions = exchange.GetPosition() # get the holding position array
if len(position) == 0: # if the holding position array is 0
return 0 # meaning currently has no position holding, return 0
for i in range(len(position)): # Traversing the position array
if (position[i]['Type'] == PD_LONG):
return 1 # if there are long position holding, return 1
elif (position[i]['Type'] == PD_SHORT):
return -1 # if there are short position holding, return -1
def main(): # main function
exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
while True: # enter the loop
records = exchange.GetRecords() # get the k line array
if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
close = records[len(records) - 1].Close # get the closing price of the latest k-line
position = mp() # get the position information function
upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail
Como se muestra anteriormente:
Línea 19: llame a la función
Línea 20: llame a la función
Línea 21: calcular el valor medio del carril superior e inferior según el precio más alto y el más bajo de 50 ciclos
Con los datos anteriores, podemos escribir la lógica de negociación y la parte de la orden de colocación ahora. También es muy simple, la más comúnmente utilizada es la declaración
# get the position information function
def mp():
positions = exchange.GetPosition() # get the holding position array
if len(position) == 0: # if the holding position array is 0
return 0 # meaning currently has no position holding, return 0
for i in range(len(position)): # Traversing the position array
if (position[i]['Type'] == PD_LONG):
return 1 # if there are long position holding, return 1
elif (position[i]['Type'] == PD_SHORT):
return -1 # if there are short position holding, return -1
def main(): # main function
exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
while True: # enter the loop
records = exchange.GetRecords() # get the k line array
if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
close = records[len(records) - 1].Close # get the closing price of the latest k-line
position = mp() # get the position information function
upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail
obj = ext.NewPositionManager() # using the trading class library
if position > 0 and close < middle: # If currently holding long position, and the closing price is less than the middle rail
obj.CoverAll() # close all position
if position < 0 and close > middle: # If currently holding short position, and the closing price is greater than the middle rail
obj.CoverAll() # close all position
if position == 0: # if currently holding no position
if close > upper: # if the closing price is greater than the middle rail
obj.OpenLong("this_week", 1) # open long position
elif close < lower: # if the closing price is less than the middle rail
obj.OpenShort("this_week", 1) # open short position
Como se muestra anteriormente:
Línea 22 : Utilizando la biblioteca de clases de negociación, este es un formato fijo
Líneas 23, 24: Esta es una declaración de posición larga de cierre que utiliza los operadores de comparación y operadores lógicos que hemos aprendido antes, lo que significa que si la tenencia actual es una posición larga y el precio de cierre es menor que el medio, cierre todas las posiciones.
Líneas 25, 26: Esta es una declaración de posición corta de cierre que utiliza los operadores de comparación y operadores lógicos que hemos aprendido antes, lo que significa que si la orden actual es una posición corta y el precio de cierre es mayor que la línea media, cierre todas las posiciones.
Línea 27: Determine el estado de la posición actual.
Líneas 28, 29: Determinar si el precio de cierre es mayor que la línea superior. Si el precio de cierre sube por encima de la línea superior, abrir una posición larga.
Líneas 30, 31: Determinar si el precio de cierre es inferior al nivel inferior.
En la sección anterior hemos aprendido cada paso para desarrollar una estrategia de trading cuantitativa completa utilizando Python, incluyendo: introducción de estrategia, método de cálculo de canal Donchian, lógica de estrategia, condiciones de trading, implementación de código de estrategia, etc. Esta sección es solo una estrategia simple. Como método de inspiración, hay más de una manera de lograrlo. Puede superponer diferentes métodos de trading de acuerdo con su sistema de trading para formar su propia estrategia de trading cuantitativa.
En el desarrollo de estrategias de negociación cuantitativas, desde la perspectiva de la velocidad de ejecución del lenguaje de programación, ¿cuál es el más rápido? debe ser el C ++. Especialmente en el campo de los derivados financieros y el comercio de alta frecuencia. El C ++ es único en la especificidad del lenguaje y tiene ventajas en los cálculos numéricos. En comparación con JavaScript y Python, su velocidad se puede aumentar en varios órdenes de magnitud. Si desea ir al campo de los derivados financieros o el comercio de alta frecuencia en el futuro. Este será el curso que no debe perderse.
Comience con lo básico e implemente la estrategia de esta sección.
Trate de añadir un indicador de media móvil a la estrategia de esta sección para reducir la frecuencia de negociación.