Desarrollo de estrategias de CTA para obtener ganancias absolutas desde la cuantificación de transacciones hasta la gestión de activos

El autor: , Creado: 2019-06-26 10:27:41, Actualizado: 2023-10-30 20:30:50

[TOC] ¿Qué quieres decir?

img

Prólogo

¿Por qué aprender esta lección?Primero, el curso está basado en lenguajes de programación JavaScript y Python, que son una tecnología, y finalmente, vamos a aplicar esta tecnología a una industria. La transacción cuantitativa es una industria emergente, que está en una fase de rápido crecimiento y la demanda de talento es alta.

El aprendizaje sistemático de este curso le permitirá profundizar en el campo de la negociación cuantitativa, si usted está listo para entrar en el campo de la negociación cuantitativa, si usted es un aficionado a la inversión en acciones o futuros, la negociación cuantitativa puede complementar completamente su objetivo de negociación, desarrollando estrategias de negociación para obtener ganancias en los mercados financieros y ampliando los canales y plataformas de inversión financiera.

Antes de esto, permítanme hablar de mi experiencia personal de negociación, no soy de origen financiero, sino de estadística. Empecé a operar con acciones desde que era estudiante y luego, por casualidad, me convertí en un operador de operaciones cuantificadas de fondos privados nacionales, principalmente en investigación y desarrollo de estrategias.

En este círculo de operaciones, antes, después y después de más de una década, también he desarrollado todo tipo de estrategias. Mi idea de inversión es: controlar el riesgo por encima de todo, centrarse en los beneficios absolutos. Nuestro tema de curso es: Desarrollar estrategias de CTA para obtener beneficios absolutos desde la cuantificación de las operaciones hasta la gestión de activos.

1o, estrategias de CTA de futuros y lógica para ganar dinero

1.1 Conocer el CTA de los futuros

¿Qué es un CTA? ¿Qué es un CTA? Un CTA es un asesor de comercio de productos en el extranjero y un administrador de inversiones en el país. Un CTA tradicional concentra el dinero de los grandes inversores y lo encomenda a una institución de inversión especializada, y finalmente, a través de un asesor de comercio, realiza inversiones en futuros de acciones, futuros de productos y futuros de bonos estatales.

Pero en realidad, a medida que el mercado global de futuros continúa creciendo, el concepto de CTA también se amplía y se expande mucho más allá de los futuros tradicionales. Puede invertir no solo en el mercado de futuros, sino también en los mercados de tipos de interés, mercados de acciones, mercados de divisas y mercados de opciones, etc. Siempre que haya una cantidad de datos históricos de esta variedad, se puede desarrollar una estrategia de CTA correspondiente con base en estos datos históricos.

La tecnología de los discos electrónicos no estaba muy desarrollada hasta la década de 1980, cuando la mayoría de los operadores determinaban el futuro de los futuros de productos mediante el trazado manual de indicadores técnicos como el índice William, KDJ, RSI, MACD y CCI. Más tarde, los operadores crearon fondos CTA dedicados para ayudar a los clientes a administrar sus activos.

Cambios en el tamaño de la administración de fondos de CTA img Unidad: mil millones de dólares

Si miramos el gráfico anterior, especialmente con el auge de las transacciones cuantitativas, el tamaño de los fondos globales de CTA ha aumentado de $ 130.6 mil millones en 2005 a más de $ 300 mil millones en 2015; y la estrategia de CTA también se ha convertido en una de las estrategias de inversión más populares de los fondos de cobertura globales.

Al mismo tiempo que aumentaba su tamaño, el rendimiento de los fondos CTA fue el mismo que el del índice CTA de Ballack, que es el indicador representativo de la industria de los consultores de comercio de productos a nivel mundial. Desde finales de 1979 hasta finales de 2016, el índice CTA de Ballack obtuvo ganancias acumuladas de 28.95 veces, con un rendimiento anual de 9.59%, un índice de Sharpe de 0.37, y un retiro máximo de 15.66%.

Debido a que la estrategia de CTA generalmente mantiene una relación muy baja con otras estrategias en la cartera de asignación de activos. Como se ve en el círculo rojo, durante los mercados de valores globales de 2000-2002 y la crisis de los préstamos globales de 2008, el índice de fondos CTA de Barclays no solo no cayó sino que obtuvo ganancias positivas, y el CTA puede proporcionar ganancias fuertes cuando ocurre una crisis en los mercados de acciones y bonos. Además, también podemos ver que el índice CTA de Barclays Commodities ha mantenido su nivel de ganancias desde 1980 y ha estado presionando el PMI 500 y también ha retrocedido por debajo del PMI 500.

img

El desarrollo de la CTA en nuestro país es solo de casi un decenio, pero el impulso es muy fuerte, en gran parte gracias al entorno comercial más abierto de los futuros de productos domésticos, el umbral de capital de negociación más bajo, la adopción de un sistema de fondos de garantía que permite realizar transacciones de dos vías, las tarifas de transacción más bajas, la arquitectura tecnológica de los intercambios más avanzada y más fácil de negociar en el sistema en comparación con las acciones, etc.

Desde 2010, los fondos de CTA han existido principalmente en forma de fondos privados. A medida que la política nacional se abre gradualmente al ámbito de inversión exclusiva de los fondos, los fondos de CTA comienzan a existir en forma de fondos exclusivos, y su modo de funcionamiento más transparente y público también se convierte en una herramienta necesaria para la asignación de activos de más inversores.

img

Como se puede ver en el gráfico anterior, las estrategias CTA son igualmente más adecuadas para los comerciantes individuales en comparación con otras estrategias de negociación, independientemente de la facilidad de acceso, el umbral de capital, la ejecución de la estrategia de negociación y el emparejamiento de las API. Los contratos de futuros nacionales son muy pequeños, por ejemplo, se pueden negociar miles de dólares de maíz o soja por primera vez, y no hay ningún umbral de capital.

img

El proceso de diseño de las estrategias de CTA es relativamente simple: primero se procesan los datos históricos y luego se introducen en un modelo cuantitativo, que incluye estrategias de negociación formadas por herramientas como modelado matemático, diseño de programación y otros, que generan señales de negociación mediante el análisis computacional de estos datos.

1.2 Tipos de estrategias de CTA de futuros

Desde el punto de vista de la estrategia de negociación, la estrategia de CTA también es diversa: puede ser una estrategia de tendencia o una estrategia de alquiler; puede ser una estrategia de larga línea de ciclo grande o una estrategia de corto plazo diurno; la lógica estratégica puede basarse en el análisis técnico o en el análisis fundamental; puede ser una negociación subjetiva o una negociación sistémica.

Las estrategias de CTA tienen diferentes métodos de clasificación, según el método de negociación, se pueden dividir en: operaciones subjetivas y operaciones sistémicas, las estrategias de CTA en el extranjero son más avanzadas en su desarrollo, y las estrategias de CTA en las operaciones sistémicas están cerca del 100%. Según el método de análisis, se pueden dividir en: análisis fundamental y análisis técnico. Según la fuente de ingresos, se pueden dividir en: operaciones de tendencia y operaciones de conmoción.

En general, las estrategias de CTA representan alrededor del 70% de las estrategias de tendencia, alrededor del 25% de las estrategias de retorno de valor medio y alrededor del 5% de las estrategias de contratrend o reversión de tendencia. Las estrategias de tendencia que representan el mayor porcentaje, según el ciclo de tenencia, se pueden dividir en: operaciones de alta frecuencia, operaciones diarias, operaciones medias cortas y operaciones medias largas.

Estrategias de la ciudad a menudoEn la actualidad, hay dos estrategias de negociación de alta frecuencia en el mercado, una es la estrategia de mercado de alta frecuencia y la otra es la estrategia de oferta de alta frecuencia. La estrategia de mercado de alta frecuencia proporciona liquidez en el mercado de negociación, es decir, en un mercado de negociación con comerciantes, alguien que quiere comprar o vender una operación, el comerciante debe garantizar que se pueda negociar.

Las estrategias de las tarifas de alta frecuenciaEl precio esperado de un ETF puede ser calculado de la misma manera. El precio del ETF puede ser subtraído del precio esperado del ETF por un índice de ETF y se obtiene un diferencial, que generalmente se opera en un canal de precios, y se puede negociar si el diferencial se rompe en el canal, esperando el regreso del diferencial, para obtener ganancias.

Estrategia de los díasSi literalmente no se mantiene el valor durante la noche, se puede llamar estrategia de intradía. Debido a que el ciclo de intradía es más corto, normalmente no se obtiene un beneficio inmediato después de entrar en el mercado, se sale rápidamente. Por lo tanto, este método de negociación tiene un menor riesgo de mercado.

Estrategias de línea media y largaEn teoría, las posiciones más largas tienen una mayor capacidad estratégica y una menor rentabilidad de riesgo. Especialmente en las operaciones institucionales, debido a que las posiciones cortas tienen una capacidad limitada y los grandes fondos no pueden entrar y salir en un corto período de tiempo, se configuran más posiciones medianas y largas.

Datos estratégicos del CTAGeneralmente, las estrategias de CTA se estudian con datos de minutos, horas y días, que incluyen: precios de apertura, precios máximos, precios mínimos, precios de cierre, volúmenes completos, etc. Sólo un pequeño número de estrategias de CTA utilizan datos de Tick, como datos profundos de precios de compra, venta, compra y venta en los datos L2.

img

La idea básica de las estrategias de CTA se basa en los indicadores técnicos tradicionales, ya que hay más referencias públicas y la lógica es generalmente más simple y se basa en principios estadísticos. Por ejemplo, los indicadores técnicos con los que todos estamos familiarizados: MA, SMA, EMA, MACD, KDJ, RSI, BOLL, W&R, DMI, ATR, SAR, BIAS, OBV, etc.

También hay algunos modelos de negociación clásicos en el mercado que pueden ser utilizados y mejorados, incluyendo: combinaciones de líneas múltiples, DualThrust, R-Breaker, trading de marinas, trading de rejillas, etc.

Estos son estrategias de negociación basadas en el análisis técnico tradicional, cuyo proceso consiste en extraer factores o condiciones de compra y venta que tienen una ventaja de probabilidad en función de los datos históricos y la idea de negociación correcta, y asumir que el mercado seguirá existiendo en el futuro, y finalmente implementar estrategias de negociación en código y negociar automáticamente. Abrir, detener, detener, aumentar, reducir, etc.

La mayor ventaja de la estrategia de CTA es que puede obtener ganancias absolutas independientemente de si el mercado actual es al alza o a la baja, especialmente cuando el mercado se convierte rápidamente en un toro o un oso, o cuando la tendencia del mercado es claramente fluida, esta estrategia tiene una gran ventaja.

1.3 Principios de rentabilidad de la estrategia de CTA de futuros

Las estrategias de CTA de futuros son rentables principalmente por los siguientes motivos:

  1. El movimiento de los precios es contrario a la realidad, y siempre continúa de una manera de tendencia. Cuando los inversores observan que el precio sube, compran con el viento, lo que hace que el precio suba aún más. También ocurre lo mismo con la caída del precio.
  2. La tolerancia de cada inversor a la proporción de ganancias y pérdidas es asimétrica, y la capacidad de asumir el riesgo es diferente. Para la mayoría de los inversores, prefieren optar por un método de negociación más conservador y el mercado es más propenso a la tendencia.
  3. La formación de precios es determinada por las transacciones, y es cierto que las transacciones están impulsadas por el hombre, pero la naturaleza humana es difícil de cambiar, lo que hace que la forma fija se repita, y la estrategia es efectiva en la retroevaluación de los datos históricos, pero también en la predicción del futuro.

El seguimiento de tendencias también se caracteriza por perder poco dinero cuando no hay mercado y ganar mucho dinero cuando el mercado viene, pero todos los que han hecho transacciones saben que el mercado es un mercado inestable la mayor parte del tiempo, y solo es un mercado de tendencia durante un pequeño período de tiempo. Por lo tanto, la estrategia de seguimiento de tendencias tiene una baja tasa de ganancias en las transacciones, pero en general, las ganancias y pérdidas de cada operación son mayores.

Debido a que las estrategias de seguimiento de tendencias no son estables en los rendimientos, muchas instituciones de inversión construyen una cartera de inversiones con una variedad de estrategias múltiples, que también configuran una cierta cantidad de estrategias de inversión. La estrategia de inversión es la relación entre la existencia de coefficientes negativos en la secuencia de tiempo de los precios, es decir, la alta y baja absorción.

Relación entre CTA y activos tradicionales img

Si nos fijamos en el gráfico anterior, en teoría, varias estrategias de diferentes estilos o de menor relevancia harán señales comerciales diferentes al mismo tiempo frente a los diversos cambios en los precios del mercado. Debido a que varias curvas de ganancias se superponen entre sí, lo que hace que la ganancia general se complemente, la curva de ganancias se vuelve más suave, lo que reduce la volatilidad de las ganancias.

De lo anterior se deduce que, en lugar de desarrollar una estrategia a nivel de maestro, es mejor desarrollar varias estrategias de par en el centro, así que cómo controlarlas? Aquí podemos recurrir a los algoritmos de bosque aleatorio en el aprendizaje automático, el bosque aleatorio no es un algoritmo independiente, es un marco de decisión que contiene varios árboles de decisión.

A continuación, se necesita diseñar una estrategia de base que pueda evaluar la liquidez, rentabilidad y estabilidad de las variedades en todo el mercado de futuros de commodities, seleccionar combinaciones de variedades de futuros de commodities con rendimientos con baja volatilidad, luego realizar una selección neutralizada por la industria, reducir aún más la volatilidad general mediante la descentralización de la configuración de la industria de la combinación, y finalmente operar mediante la combinación de múltiples variedades de futuros de commodities para construir una combinación real de futuros de commodities que coincida con el valor del mercado.

Cada variedad también puede configurar múltiples estrategias de parámetros, y se puede elegir una combinación de parámetros cercanos a la retrospectiva que se desempeña bien. Cuando las tendencias del mercado son evidentes, las estrategias de múltiples parámetros generalmente se comportan de manera coherente, lo que es equivalente a un aumento de la posición; cuando el mercado está en un mercado turbulento, las estrategias de múltiples parámetros generalmente se comportan de manera inconsistente, lo que significa que cada uno hace más o menos para cubrir el riesgo, lo que es equivalente a un descenso de la posición.

2o Caso clásico de estrategia de CTA de futuros

Newton dijo una vez: "Si puedo ver más lejos que los demás, es porque estoy sobre los hombros de un gigante".

Las estrategias de CTA publicadas en el mercado tienen estrategias uniformes, estrategias de cinturón de browning, estrategias de comerciantes de playa, estrategias de movimiento, estrategias de estrategia, etc. Todas las estrategias de comercio cuantitativo tienen una característica, que es que las estrategias mueren de repente y fallan lentamente una vez que se hacen públicas. Pero eso no afecta a que aprendamos estas estrategias, aprovechemos la esencia de ellas para ver el problema sobre los hombros de los gigantes.

2.1 Análisis básico de los futuros (inventario, diferencia de referencia, precio)

El análisis fundamental no necesita preocuparse por los movimientos de precios a corto plazo, creyendo que el valor se reflejará en el precio, sino más bien analizar los factores que influyen en el precio y determinar cuánto vale la variedad. Generalmente, se utiliza un método de análisis de arriba a abajo: desde factores macroeconómicos, factores de variedad y otros factores.

img

Si nos fijamos en el gráfico de arriba, vemos que hay muchos factores que influyen en los precios de los productos, con un total de docenas de puntos, y decenas más en detalle, y los datos están cambiando constantemente.

En realidad, el análisis fundamental de los futuros de commodities no analiza todos los factores, solo necesitamos tomar los elementos centrales del análisis básico para poder descifrar las reglas de la información compleja y compleja.

Los factores macroscópicosLos datos macroeconómicos son complejos y cambiantes, todos los días y a cada momento, hay una gran cantidad de datos económicos publicados, políticos, bancos centrales, bancos de inversión, oficiales y no oficiales. A excepción de las crisis políticas y económicas, el análisis macroeconómico es un buen material para conversar y no es muy práctico. El famoso experto en gestión de fondos estadounidense Peter Lynch dijo: "No paso más de quince minutos al año analizando las tendencias económicas".

Factores de variedadEn el análisis básico, el análisis de variedades se centra principalmente en el análisis de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida de la subida.

Los amigos que hacen futuros saben que los futuros de productos domésticos se pueden dividir simplemente en: productos industriales y productos agrícolas. Los métodos de análisis de productos industriales y productos agrícolas son diferentes, se explica desde ambos aspectos de la oferta y la demanda. En los productos industriales, la oferta es relativamente estable, a menos que haya un gran avance tecnológico, la capacidad de producción es poco probable que haya cambios significativos en el corto plazo, por lo que los factores que afectan los precios de los productos industriales son principalmente la demanda.

Por lo tanto, de acuerdo con las leyes de la economía, la relación de la oferta y la demanda es la que finalmente determina el precio de los productos, y, en teoría, se puede determinar el precio futuro de los productos siempre que se puedan obtener datos de la oferta y la demanda. Para los productos industriales, los datos de la oferta son más fáciles de obtener, pero los datos de la demanda son más difíciles de obtener.

De hecho, también podemos hacer una reducción adicional, la oferta y la demanda en el mercado económico son el resultado mutuo del inventario, podemos juzgar la relación entre la oferta y la demanda en el mercado a través de los datos de inventario. Si el inventario de un producto es alto, significa que la fuerza de la oferta es mayor que la demanda en el mercado y que los precios de los productos están a punto de caer si las condiciones externas no cambian. Si el inventario de un producto es bajo, significa que la fuerza de la demanda en el mercado es mayor que la oferta y que los precios de los productos están a punto de subir si las condiciones externas no cambian.

Además de analizar el inventario de productos, también se necesita analizar la diferencia de precios entre el mercado de futuros y el mercado de futuros, o lo que se conoce como el margen de referencia. Si el precio del futuro es mayor que el precio del presente, lo llamamos un alza de futuros; si el precio del futuro es menor que el precio del presente, lo llamamos un aplazamiento de futuros.

img

Ya sea que sea un aumento o un descenso, debido a las restricciones del sistema de entrega de futuros, el precio del futuro de la fecha de entrega debería ser el mismo que el precio del futuro. Con la proximidad de la fecha de entrega, el precio del futuro se aproxima al precio del futuro, uno es el retorno del futuro al presente y el otro es el retorno del futuro al futuro.

De acuerdo con el principio anterior, podemos juzgar el precio de los futuros futuros con el inventario y el margen de diferencia. Si un producto tiene un menor inventario, y si el precio de los futuros es mucho más bajo que el precio de los actuales, entonces podemos juzgar: la fuerza de la demanda del mercado de los actuales es mayor que la fuerza de la oferta, y es más probable que los precios de los actuales aumenten en el futuro; y debido al sistema de entrega de futuros, los precios de los futuros se compensarán con la proximidad de la fecha de entrega, manteniéndose en equilibrio con los precios actuales, y es más probable que los precios de los futuros aumenten.

Finalmente, determinamos la dirección de probabilidad de los precios futuros a través de los inventarios y las diferencias, pero no hay puntos de venta más precisos, por lo que también se requiere un análisis técnico para dar señales claras de entrada y salida. La estructura general del análisis fundamental es: bajo inventario + profundidad de agua + análisis técnico de múltiples señales = hacer más; alto inventario + gran aumento de agua + análisis técnico de señales de cabeza baja = hacer nada.

2.2 Leyes de comercio de marinas

Hablando de estrategias de negociación, tenemos que hablar de las reglas de negociación de mariscos representativas. Las reglas de negociación de mariscos provienen de uno de los experimentos más famosos en la historia de la negociación, en el que el especulador de productos Richard Dennis quería averiguar si los grandes comerciantes nacían o se desarrollaban más tarde. Para ello, en 1983 reclutó a 13 personas para enseñarles los conceptos básicos de la negociación de futuros, así como sus propios métodos y principios de negociación.

En los cuatro años siguientes, las mariposas lograron una rentabilidad anual promedio del 80% de ganancias. Dennis también demostró que con un simple sistema y un conjunto de reglas, se puede convertir a personas con poca o ninguna experiencia en las operaciones en excelentes operadores. Pero hay mariscos individuales que venden reglas de negociación de mariscos en sitios web que son rentables.

Después de que la verdad saliera a la luz, se descubrió que las reglas de negociación de la mariposa utilizaban canales de Dongjian optimizados y que se administraban las posiciones con el indicador ATR. Después de decenios de prueba histórica, se convirtió en un método de negociación que también puede ser fácil para el consumidor común y sigue siendo efectivo en algunas variedades.

Principios básicos de la playa

  • Tener ventaja: encontrar una estrategia de negociación con un valor esperado positivo, ya que en el largo plazo puede generar un retorno positivo.
  • Manejar el riesgo: controlar el riesgo, mantenerse en su posición, de lo contrario no puede esperar el día de crear resultados.
  • Persistencia: Sólo si ejecutas tu estrategia con firmeza y perseverancia obtendrás los resultados reales del sistema.
  • Es muy simple y claro: los sistemas simples son más vitales en el largo plazo que los sistemas complejos.

Entonces, ahora, vamos a ver qué dice la ley de comercio de la playa. 1, el mercado - lo que se compra y lo que se vende, esencialmente en qué mercados se negocia, los marineros son comerciantes de futuros, y solo eligen mercados con un gran volumen de transacciones y una alta liquidez, ya que elegir mercados inactivos aumenta los precios adicionales de entrada y salida y también pierde muchas oportunidades de tendencia. 2. el tamaño de la posición - cuánto se compra y cuánto se vende - es una parte muy importante de la estrategia general, que a menudo la mayoría de la gente ignora o trata erróneamente. La ley de operaciones de margen utiliza el ATR, el indicador de amplitud de fluctuación real promedio, para calcular la posición abierta, la señal de aumento de la posición, la señal de stop loss. Este es un diseño muy ingenioso, con el propósito de ajustar el tamaño de la posición a través de la amplitud absoluta de la volatilidad del mercado, reduciendo la tenencia cuando la volatilidad del mercado es alta, y aumentando la tenencia cuando la volatilidad del mercado es baja. 3, Entrada en el mercado -- La entrada en el mercado de la mariposa se basa en el canal de Dongjian, cuando el precio sube a través del precio más alto de la línea K de 20 o 55 puntos, se entra más, cuando el precio cae a través del precio más bajo de la línea K de 20 o 55 puntos, se entra en blanco. Cuando aparece la señal, se entra en el mercado, no importa si se cierra o baja la línea K. 4, Stop-Loss --- En el largo plazo, las operaciones sin stop-loss no son exitosas, pero la mayoría de los comerciantes tienen posiciones perdedoras, tratando de despertar la esperanza de que el mercado se convierta. Las tortugas establecen estrictamente cuándo salir de las posiciones perdedoras, si se mantienen varios pedidos y el precio cae 2 unidades, la mayoría de las cabezas daña el equilibrio. Si se mantiene un pedido vacío y el precio sube 2 unidades, el vacío detiene el equilibrio. 5o. Parado - el parado de las tortugas significa la pérdida de muchos flotadores, que es una parte difícil de aceptar para muchos comerciantes. Si se mantiene un exceso de órdenes y el precio cae por debajo de la trayectoria del canal de Dongguan del día 10, se liquidan todas las órdenes; si se mantiene un pedido vacío y el precio sube por encima de la trayectoria del canal de Dongguan del día 10, se liquidan todas las órdenes vacías.

Por lo tanto, podemos ver que las reglas de comercio de mariscos, aunque parecen simples, en realidad han formado una forma de sistema de comercio en el verdadero sentido, que abarca todos los aspectos de un sistema de comercio completo, sin dejar margen a los operadores para tomar decisiones de imaginación subjetiva, lo que permite aprovechar las ventajas de operar el sistema de forma programada. Incluye: reglas de entrada y salida, administración de fondos y control de viento, etc.

La mayor ventaja de la metodología de trading en la playa es que nos ayuda a establecer un método de trading eficaz, es una combinación de estrategias de compra por lotes, de stop loss dinámicos y de seguimiento de tendencias, especialmente el uso de valores ATR y la gestión de posiciones, que vale la pena aprender. Por supuesto, también tiene un problema común con la estrategia de seguimiento de tendencias, que es el rebote. El rebote obtenido es muy probable que se desprenda por completo debido a la ola de caídas que lo acompaña.

3o, estrategias de CTA para desarrollar futuros en la vida real

3.1 Desarrollo de estrategias de tendencias de CTA basadas en el idioma maya

A finales del siglo pasado, en los Estados Unidos, se popularizó un método de negociación muy mágico en el ámbito de la inversión financiera, que después de ser practicado por miles de personas, se descubrió que era eficaz y tenía un gran valor práctico, y que fue reconocido por muchos expertos en inversión y comerciantes profesionales, y que hasta ahora se puede aplicar perfectamente a casi todos los campos de inversión financiera, ya sean divisas, oro, acciones, futuros, crudo, índices y bonos.

El término caos originalmente se refiere a la descripción de un estado de caos universal, cuya idea es: el resultado es inevitable, pero debido a que el conocimiento existente no puede calcular el resultado, ya que el cálculo mismo también está cambiando el resultado, y en última instancia puede producir el mayor o menor resultado, sin resultados inevitables. Esto es muy similar a los mercados comerciales, los participantes analizan el mercado y también cambian el mercado cuando compran y venden transacciones.

La teoría del caos es una idea relativamente nueva, por lo que hay pocas personas que estudian la teoría del caos en nuestro país. Dado que la teoría del caos es una estrategia de negociación muy universal, que se puede aplicar a casi todos los campos de la inversión financiera, incluidas las acciones, bonos, divisas, divisas y bienes digitales, la versión simplificada de este curso sobre el caos se utiliza como estrategia para apostar en la inversión y aumentar el interés y los beneficios.

Como su nombre indica, el fundamento teórico de la operación del caos es la teoría del caos, propuesta por el meteorólogo Edward Lorenz, que fue uno de los mayores descubrimientos científicos de la última parte del siglo XX. Fue él quien introdujo el famoso efecto mariposa. Bill Williams creativamente aplicó la teoría del caos al campo de las inversiones financieras y combinó disciplinas como la geometría de fracciones y la dinámica no lineal para crear una serie de indicadores de análisis técnicos muy efectivos.

La totalidad de los mecanismos de caos se componen de cinco dimensiones (indicadores técnicos):

  • La línea del alligador

  • El fractal

  • El momento.

  • Aceleración

  • La línea de equilibrio

    img

Como vemos en el gráfico anterior, las líneas de trozo son un conjunto de líneas de equilibrio que utilizan la geometría de la fracción y la dinámica no lineal, que en esencia es una media móvil ponderada por el índice de expansión, que pertenece a una línea uniforme, aunque el método de cálculo es un poco más complejo que la línea uniforme normal. A continuación, vamos a ver cómo definir las líneas de trozo en lenguaje Mac:

// 参数
N1:=11;
N2:=21;

// 定义价格中线
N3:=N1+N2;
N4:=N2+N3;
HL:=(H+L)/2;

// 鳄鱼线
Y^^SMA(REF(HL,N3),N4,1);
R:=SMA(REF(HL,N2),N3,1);
G:=SMA(REF(HL,N1),N2,1);

Primero definimos los dos parámetros externos N1 y N2, y luego, según los parámetros externos, calculamos el promedio HL del precio más alto y el precio más bajo, y luego, respectivamente, el promedio de HL se calcula con diferentes parámetros.

En el modo de operar caótico, podemos definir un concepto de fraccionamiento que es muy representativo: abrir la palma de la mano con los dedos hacia arriba, el dedo medio es el fraccionamiento superior, el dedo meñique y el dedo sin nombre a la izquierda, el dedo índice y el dedo pulgar a la derecha representan respectivamente la línea K no innovadora y alta.

// 分形
TOP_N:=BARSLAST(REF(H,2)=HHV(H,5))+2;
BOTTOM_N:=BARSLAST(REF(L,2)=LLV(L,5))+2;

TOP:=REF(H,TOP_N);
BOTTOM:=REF(L,BOTTOM_N);

MAX_YRG^^MAX(MAX(Y,R),G); 
MIN_YRG^^MIN(MIN(Y,R),G); 

TOP_FRACTAL^^VALUEWHEN(H>=MAX_YRG,TOP);
BOTTOM_FRACTAL^^VALUEWHEN(L<=MIN_YRG,BOTTOM);

Al calcular la línea de peces y la fracción, podemos escribir una estrategia de operación de caos simple en función de estas dos condiciones, utilizando un conjunto de índices de medias móviles ponderadas como precios de referencia para calcular la línea de peces y la fracción. Por supuesto, la estrategia de operación de caos original sería más compleja.

// 如果当前无多单,并且收盘价升破上分形,并且上分形在鳄鱼线上方时,多头开仓
BKVOL=0 AND C>=TOP_FRACTAL AND TOP_FRACTAL>MAX_YRG,BPK(1);
// 如果当前无空单,并且收盘价跌破下分形,并且下分形在鳄鱼线下方时,空头开仓
SKVOL=0 AND C<=BOTTOM_FRACTAL AND BOTTOM_FRACTAL<MIN_YRG,SPK(1);

// 如果收盘价跌破鳄鱼的下巴时,多头平仓
C<Y,SP(BKVOL);
// 如果收盘价升破鳄鱼的下巴时,空头平仓
C>Y,BP(SKVOL);

Para facilitar la comprensión, también he escrito una nota detallada directamente en el código, y podemos resumir la lógica de transacción de esta estrategia en los siguientes puntos:

  • Multiple posiciones abiertas: si no hay muchos pedidos en la actualidad y el precio de cierre sube a través de la división, y la división superior se encuentra por encima de la línea del tiburón.
  • Posiciones vacías: si no hay órdenes vacías y el precio de cierre cae por debajo de la línea de ruptura y la línea de ruptura está por debajo de la línea de Shark.
  • El precio de cierre de la bolsa de divisas es el siguiente: Si el precio de cierre cae, el marisco se rompe la mandíbula.
  • El precio de la bolsa de valores de los bancos centrales de Japón es el más alto en el mundo.

A continuación, vamos a ver cómo es el resultado de esta simple estrategia de retrospección de operaciones caóticas. Para acercar la retrospección a un entorno de mercado real, aquí se establece la tarifa de tramitación a dos veces la del mercado, con una apertura y una salida más dos saltos por deslizamiento.

img img img

Desde la curva de capital y los datos de rendimiento de la retrospección, la estrategia ha funcionado bien, y la curva de capital general es de manera estable hacia arriba. Sin embargo, desde finales de 2016, las características del mercado de la variedad de acero roscado han cambiado, pasando de un movimiento unilateral de alta volatilidad anterior a un movimiento oscilante amplio. Desde la curva de capital, las ganancias han sido claramente débiles desde 2017 hasta la fecha.

En resumen, la esencia de la estrategia caótica es encontrar un punto de inflexión, sin preocuparse por cómo va el mercado, sin preocuparse por la verdadera o falsa ruptura, si se rompe la fractura, entrar directamente. Nunca trate de predecir el mercado, sino ser un observador y un seguidor.

3.2 Desarrollo de estrategias de paquetes de CTA basadas en JavaScript

Soros, en su libro de 1987 El Alquimista de la Dinámica de las Finanzas, formula una importante proposición: "Creo que los precios de los mercados siempre están equivocados en el sentido de que tienen un sesgo sobre el futuro". Él cree que la hipótesis de la eficacia del mercado es sólo una hipótesis teórica, que en realidad los participantes en el mercado no siempre son racionales, y que en cada punto del tiempo los participantes no pueden obtener y interpretar objetivamente toda la información, y que, incluso si es la misma información, todos reciben la misma respuesta. Es decir, que el precio en sí mismo ya contiene las expectativas erróneas de los participantes en el mercado, por lo que el precio del mercado siempre es erróneo en su esencia. Tal vez esta sea la fuente de las ganancias de los especuladores".

De acuerdo con los principios anteriores, también sabemos que en un mercado de futuros ineficaz, los contratos de intercambio de periodos no siempre son influenciados por el mercado y no siempre son sincronizados, por lo que su fijación de precios no es totalmente efectiva. Entonces, si los dos precios presentan una gran diferencia de precio, se puede comprar y vender contratos de futuros de diferentes periodos al mismo tiempo y obtener un apalancamiento a través de los períodos.

Al igual que los futuros de productos, las monedas digitales también tienen combinaciones de contratos de apalancamiento a largo plazo asociados; como en el mercado OkEX: ETC de la semana, ETC de la próxima semana, ETC trimestral. Por ejemplo, supongamos que la diferencia de precios entre ETC de la semana y ETC trimestral se mantiene a largo plazo en torno a 5. Si una diferencia de precios de un día alcanza 7, esperamos que la diferencia de precios regrese a 5 en algún momento futuro.

A pesar de la existencia de esta diferencia de precios, las operaciones artificiales son demasiado largas, con poca precisión y con el efecto de los cambios en los precios, y las cotizaciones artificiales suelen tener muchas incertidumbres. El atractivo de las cotizaciones cuantificadas se encuentra en la captura de oportunidades de venta y la elaboración de estrategias de venta mediante modelos cuantitativos y algoritmos programáticos que automáticamente envían pedidos a los intercambios, capturan oportunidades rápidamente y con precisión, y obtienen beneficios de manera eficiente y estable.

Este curso enseñará a los estudiantes cómo utilizar las plataformas de comercio cuantificado de inventores y los contratos de futuros ETC en OkEX para demostrar una estrategia de ventaja sencilla en el comercio de divisas digitales, capturando los beneficios visibles de cada oportunidad de ventaja instantánea y el riesgo potencial de cobertura.

Crear una estrategia de intercambio de divisasDificultad: nivel medioEntorno estratégico

  • Se trata de una de las marcas de Ethereum Classic (ETC).
  • Datos de diferencias de precios: ETC semana - ETC trimestre (excluye la comprobación de la coherencia)
  • Ciclo de las transacciones: 5 minutos
  • 头寸匹配:1:1
  • Tipo de transacción: entre variedades

La lógica estratégica

  • Si la cuenta actual no tiene un activo y el precio es inferior al valor del boll, se abre con un déficit excesivo; es decir, se compra ETC durante la semana y se vende ETC durante el trimestre.
  • Si la cuenta actual no tiene acciones, y el precio es mayor que el valor del boll, entonces el precio es negativo; es decir, vender ETC durante la semana y comprar ETC durante el trimestre.
  • Si la cuenta actual tiene ETC en el día de la semana, y tiene ETC en el día del trimestre, y el precio es mayor que el boll en el trayecto medio, entonces el precio de la diferencia es igual.
  • Condición de liquidación de diferencia de precio: si la cuenta actual tiene ETC en la semana y tiene varios pedidos de ETC trimestrales, y el precio es inferior al boll en el medio, el precio de liquidación es igual. Es decir: comprar ETC en la semana y vender ETC en el trimestre.

Lo anterior es una sencilla descripción lógica de la estrategia de arbitraje a largo plazo de la moneda digital, así que, ¿cómo implementar sus ideas en el programa?

function Data() {}  // 基础数据函数
Data.prototype.mp = function () {}  // 持仓函数
Data.prototype.boll = function () {}  // 指标函数
Data.prototype.trade = function () {}  // 下单函数
Data.prototype.cancelOrders = function () {}  // 撤单函数
Data.prototype.isEven = function () {}  // 处理单只合约函数
Data.prototype.drawingChart = function () {}  // 画图函数

function onTick() {
    var data = new Data(tradeTypeA, tradeTypeB);  // 创建一个基础数据对象
    var accountStocks = data.accountData.Stocks;  // 账户余额
    var boll = data.boll(dataLength, timeCycle);  // 计算boll技术指标
    data.trade();  // 计算交易条件下单
    data.cancelOrders();  // 撤单
    data.drawingChart(boll);  // 画图
    data.isEven();  // 处理持有单个合约
}

//入口函数
function main() {
    while (true) {  // 进入轮询模式
        onTick();  // 执行onTick函数
        Sleep(500);  // 休眠0.5秒
    }
}

Imagínese cómo es el proceso de transacción en las transacciones de la autoridad. En las transacciones del sistema no hay ninguna diferencia esencial, sino: obtener datos, calcular datos, realizar transacciones, procesar después de realizar pedidos. Así también en el programa, primero el programa ejecuta la función principal de la línea 20, una regla convencional, cuando el programa ejecuta la función de onTick repetitiva, cuando el programa ejecuta la estrategia de transacción y luego (si la hay) entra en el modo de ciclo infinito, es decir, el modo de consulta, en el modo de consulta.

Entonces, en la función onTick, es el proceso de negociación que tenemos en las transacciones subjetivas: primero obtiene datos de precios básicos, luego obtiene el saldo de la cuenta, luego calcula el indicador, luego comienza a calcular las condiciones de la transacción y ordena, y finalmente el procesamiento después de la orden, incluido: retiro de la orden, dibujo gráfico, procesamiento de contratos individuales.

Es muy fácil construir un marco estratégico basado en la idea estratégica y el proceso de negociación.

  • El proceso de tramitación previo a la transacción.
  • Los usuarios pueden obtener y calcular datos.
  • El pedido y su posterior procesamiento.

Una vez que el marco de estrategia de transacción está construido, se necesita completar el código de detalles necesario en el marco de estrategia según el proceso de transacción real y los detalles de la transacción.

Primero, el procesamiento previo de las transacciones.

1. Declaración de las variables globales necesarias

  • Declare un objeto de gráfico para configurar un gráficovar chart = {}
  • Llama a la función Chart, inicializa el gráficovar ObjChart = Chart ( chart )
  • Declare una matriz vacía para almacenar una serie de diferencias de preciovar bars = []
  • Declare una variable de tiempo de registro de datos históricosvar oldTime = 0

2. Parámetros externos de la política de configuración

var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量

3. Definir las funciones de procesamiento de datos

  • Función de base de datos: Data ()) Crear una función constructiva Data y definir sus propiedades internas. Incluye: datos de cuenta, datos de tenencia, datos de tiempo de línea K, precio de compra / venta de contratos de apalancamiento A / B, diferencias positivas / contrarias.
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
    this.accountData = _C(exchange.GetAccount); // 获取账户信息
    this.positionData = _C(exchange.GetPosition); // 获取持仓信息
    var recordsData = _C(exchange.GetRecords); //获取K线数据
    exchange.SetContractType(tradeTypeA); // 订阅套利A合约
    var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
    exchange.SetContractType(tradeTypeB); // 订阅套利B合约
    var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
    this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
    this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
    this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
    this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
    this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
    // 正套价差(合约A卖一价 - 合约B买一价)
    this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
    // 反套价差(合约A买一价 - 合约B卖一价)
    this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}
  • Obtención de la función de retención: mp () Recorre toda la matriz de tenencias y devuelve el número de tenencias en el contrato especificado, la dirección especificada, si no, devuelve false
Data.prototype.mp = function (tradeType, type) {
    var positionData = this.positionData; // 获取持仓信息
    for (var i = 0; i < positionData.length; i++) {
        if (positionData[i].ContractType == tradeType) {
            if (positionData[i].Type == type) {
                if (positionData[i].Amount > 0) {
                    return positionData[i].Amount;
                }
            }
        }
    }
    return false;
}
  • K línea y función de indicadores:boll ()) Se componen nuevas secuencias de K-línea basadas en los datos positivos/contrarios de diferencia de precios; y se devuelven los datos de trayectoria superior, media y inferior calculados por el indicador Boll.
Data.prototype.boll = function (num, timeCycle) {
    var self = {}; // 临时对象
    // 正套价差和反套价差中间值
    self.Close = (this.basb + this.sabb) / 2;
    if (this.timeA == this.timeB) {
        self.Time = this.time;
    } // 对比两个深度数据时间戳
    if (this.time - oldTime > timeCycle * 60000) {
        bars.push(self);
        oldTime = this.time;
    } // 根据指定时间周期,在K线数组里面传入价差数据对象
    if (bars.length > num * 2) {
        bars.shift(); // 控制K线数组长度
    } else {
        return;
    }
    var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
    return {
        up: boll[0][boll[0].length - 1], // boll指标上轨
        middle: boll[1][boll[1].length - 1], // boll指标中轨
        down: boll[2][boll[2].length - 1] // boll指标下轨
    } // 返回一个处理好的boll指标数据
}
  • La siguiente función:trade () Introduce el nombre y el tipo de contrato del pedido, luego el precio del pedido, y devuelve el resultado del pedido. Como se requieren dos pedidos en diferentes direcciones al mismo tiempo, se realiza una conversión dentro de la función según el nombre del contrato del pedido.
Data.prototype.trade = function (tradeType, type) {
    exchange.SetContractType(tradeType); // 下单前先重新订阅合约
    var askPrice, bidPrice;
    if (tradeType == tradeTypeA) { // 如果是A合约下单
        askPrice = this.askA; // 设置askPrice
        bidPrice = this.bidA; // 设置bidPrice
    } else if (tradeType == tradeTypeB) { // 如果是B合约下单
        askPrice = this.askB; // 设置askPrice
        bidPrice = this.bidB; // 设置bidPrice
    }
    switch (type) { // 匹配下单模式
        case "buy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        case "sell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closebuy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closesell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        default:
            return false;
    }
}
  • La función de cancelación de pedidos:cancelOrders ()) Obtiene todas las órdenes pendientes y las cancela por separado. Y si hay órdenes pendientes, devuelve false, si no hay órdenes pendientes, devuelve true.
Data.prototype.cancelOrders = function () {
    Sleep(500); // 撤单前先延时,因为有些交易所你懂的
    var orders = _C(exchange.GetOrders); // 获取未成交订单数组
    if (orders.length > 0) { // 如果有未成交的订单
        for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
            exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
            Sleep(500); //延时0.5秒
        }
        return false; // 如果取消了未成交的单子就返回false
    }
    return true; //如果没有未成交的订单就返回true
}
  • Tratamiento de contratos individuales: isEven ()) En el tratamiento de operaciones de apalancamiento, se presenta una situación de un solo pie, donde se trata directamente de una simple liquidación de todas las posiciones. Por supuesto, también se puede cambiar a la forma de pago.
Data.prototype.isEven = function () {
    var positionData = this.positionData; // 获取持仓信息
    var type = null; // 转换持仓方向
    // 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
    if (positionData.length % 2 != 0 || positionData.length != 2) {
        for (var i = 0; i < positionData.length; i++) { // 遍历持仓数组
            if (positionData[i].Type == 0) { // 如果是多单
                type = 10; // 设置下单参数
            } else if (positionData[i].Type == 1) { // 如果是空单
                type = -10; // 设置下单参数
            }
            // 平掉所有仓位
            this.trade(positionData[i].ContractType, type, positionData[i].Amount);
        }
    }
}
  • Función de gráfico:drawingChart ()) Llame al método ObjChart.add () para dibujar en el gráfico los datos de mercado e indicadores necesarios: ascendente, mediano, descendente, positivo/contrario.
Data.prototype.drawingChart = function (boll) {
    var nowTime = new Date().getTime();
    ObjChart.add([0, [nowTime, boll.up]]);
    ObjChart.add([1, [nowTime, boll.middle]]);
    ObjChart.add([2, [nowTime, boll.down]]);
    ObjChart.add([3, [nowTime, this.basb]]);
    ObjChart.add([4, [nowTime, this.sabb]]);
    ObjChart.update(chart);
}

4. En la función de entrada main (), ejecuta el código de pre-procesamiento de transacciones que se ejecuta una sola vez después del inicio del programa; incluye:

  • La información no es importante en el filtro.SetErrorFilter ( )
  • Configurar las monedas digitales para ser negociadasexchange.IO ( )
  • Gráficos dibujados antes de que el programa se inicieObjChart.reset ( )
  • Información de la barra de estado antes de que el programa se inicieLogProfitReset ( )

Una vez definido el procesamiento previo de la transacción anterior, el siguiente paso es entrar en el modo de consulta, ejecutar la función onTick () repetidamente y configurar el tiempo de reposo de la consulta Sleep (), ya que algunas API de los intercambios de moneda digital tienen un límite de visitas por tiempo determinado.

function main() {
    // 过滤控制台中不是很重要的信息
    SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP");
    exchange.IO("currency", name + '_USDT'); //设置要交易的数字货币币种
    ObjChart.reset(); //程序启动前清空之前绘制的图表
    LogProfitReset(); //程序启动前清空之前的状态栏信息
    while (true) { // 进入轮询模式
        onTick(); // 执行onTick函数
        Sleep(500); // 休眠0.5秒
    }
}

2. Obtener y calcular datos

  1. Obtener objetos de datos básicos, balances de cuentas, datos de indicadores de bolol para su uso en la lógica de transacción.
function onTick() {
    var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
    var accountStocks = data.accountData.Stocks; // 账户余额
    var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据
    if (!boll) return; // 如果没有boll数据就返回
}

Tercero, el pedido y su posterior procesamiento

  1. De acuerdo con la lógica estratégica anterior, se ejecutan operaciones de compra y venta. Primero se determina si se cumplen las condiciones del precio y del indicador, luego se determina si se cumplen las condiciones de la posición y, finalmente, se ejecuta la función trade ().
// 价差说明
// basb = (合约A卖一价 - 合约B买一价)
// sabb = (合约A买一价 - 合约B卖一价)
if (data.sabb > boll.middle && data.sabb < boll.up) { // 如果sabb高于中轨
    if (data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
        data.trade(tradeTypeA, "closebuy"); // 合约A平多
    }
    if (data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
        data.trade(tradeTypeB, "closesell"); // 合约B平空
    }
} else if (data.basb < boll.middle && data.basb > boll.down) { // 如果basb低于中轨
    if (data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
        data.trade(tradeTypeA, "closesell"); // 合约A平空
    }
    if (data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
        data.trade(tradeTypeB, "closebuy"); // 合约B平多
    }
}
if (accountStocks * Math.max(data.askA, data.askB) > 1) { // 如果账户有余额
    if (data.basb < boll.down) { // 如果basb价差低于下轨
        if (!data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
            data.trade(tradeTypeA, "buy"); // 合约A开多
        }
        if (!data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
            data.trade(tradeTypeB, "sell"); // 合约B开空
        }
    } else if (data.sabb > boll.up) { // 如果sabb价差高于上轨
        if (!data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
            data.trade(tradeTypeA, "sell"); // 合约A开空
        }
        if (!data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
            data.trade(tradeTypeB, "buy"); // 合约B开多
        }
    }
}
  1. Una vez finalizado el pedido, es necesario tratar las anomalías de los pedidos pendientes, tener un solo contrato y dibujar gráficos.
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约

A través de más de 200 líneas, hemos creado una sencilla estrategia de apalancamiento a largo plazo para la moneda digital.

// 全局变量
// 声明一个配置图表的 chart 对象
var chart = {
    __isStock: true,
    tooltip: {
        xDateFormat: '%Y-%m-%d %H:%M:%S, %A'
    },
    title: {
        text: '交易盈亏曲线图(详细)'
    },
    rangeSelector: {
        buttons: [{
            type: 'hour',
            count: 1,
            text: '1h'
        }, {
            type: 'hour',
            count: 2,
            text: '3h'
        }, {
            type: 'hour',
            count: 8,
            text: '8h'
        }, {
            type: 'all',
            text: 'All'
        }],
        selected: 0,
        inputEnabled: false
    },
    xAxis: {
        type: 'datetime'
    },
    yAxis: {
        title: {
            text: '价差'
        },
        opposite: false,
    },
    series: [{
        name: "上轨",
        id: "线1,up",
        data: []
    }, {
        name: "中轨",
        id: "线2,middle",
        data: []
    }, {
        name: "下轨",
        id: "线3,down",
        data: []
    }, {
        name: "basb",
        id: "线4,basb",
        data: []
    }, {
        name: "sabb",
        id: "线5,sabb",
        data: []
    }]
};
var ObjChart = Chart(chart); // 画图对象
var bars = []; // 存储价差序列
var oldTime = 0; // 记录历史数据时间戳

// 参数
var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量

// 基础数据
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
    this.accountData = _C(exchange.GetAccount); // 获取账户信息
    this.positionData = _C(exchange.GetPosition); // 获取持仓信息
    var recordsData = _C(exchange.GetRecords); //获取K线数据
    exchange.SetContractType(tradeTypeA); // 订阅套利A合约
    var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
    exchange.SetContractType(tradeTypeB); // 订阅套利B合约
    var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
    this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
    this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
    this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
    this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
    this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
    // 正套价差(合约A卖一价 - 合约B买一价)
    this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
    // 反套价差(合约A买一价 - 合约B卖一价)
    this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}

// 获取持仓
Data.prototype.mp = function (tradeType, type) {
    var positionData = this.positionData; // 获取持仓信息
    for (var i = 0; i < positionData.length; i++) {
        if (positionData[i].ContractType == tradeType) {
            if (positionData[i].Type == type) {
                if (positionData[i].Amount > 0) {
                    return positionData[i].Amount;
                }
            }
        }
    }
    return false;
}

// 合成新K线数据和boll指标数据
Data.prototype.boll = function (num, timeCycle) {
    var self = {}; // 临时对象
    // 正套价差和反套价差中间值
    self.Close = (this.basb + this.sabb) / 2;
    if (this.timeA == this.timeB) {
        self.Time = this.time;
    } // 对比两个深度数据时间戳
    if (this.time - oldTime > timeCycle * 60000) {
        bars.push(self);
        oldTime = this.time;
    } // 根据指定时间周期,在K线数组里面传入价差数据对象
    if (bars.length > num * 2) {
        bars.shift(); // 控制K线数组长度
    } else {
        return;
    }
    var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
    return {
        up: boll[0][boll[0].length - 1], // boll指标上轨
        middle: boll[1][boll[1].length - 1], // boll指标中轨
        down: boll[2][boll[2].length - 1] // boll指标下轨
    } // 返回一个处理好的boll指标数据
}

// 下单
Data.prototype.trade = function (tradeType, type) {
    exchange.SetContractType(tradeType); // 下单前先重新订阅合约
    var askPrice, bidPrice;
    if (tradeType == tradeTypeA) { // 如果是A合约下单
        askPrice = this.askA; // 设置askPrice
        bidPrice = this.bidA; // 设置bidPrice
    } else if (tradeType == tradeTypeB) { // 如果是B合约下单
        askPrice = this.askB; // 设置askPrice
        bidPrice = this.bidB; // 设置bidPrice
    }
    switch (type) { // 匹配下单模式
        case "buy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        case "sell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closebuy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closesell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        default:
            return false;
    }
}

// 取消订单
Data.prototype.cancelOrders = function () {
    Sleep(500); // 撤单前先延时,因为有些交易所你懂的
    var orders = _C(exchange.GetOrders); // 获取未成交订单数组
    if (orders.length > 0) { // 如果有未成交的订单
        for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
            exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
            Sleep(500); //延时0.5秒
        }
        return false; // 如果取消了未成交的单子就返回false
    }
    return true; //如果没有未成交的订单就返回true
}

// 处理持有单个合约
Data.prototype.isEven = function () {
    var positionData = this.positionData; // 获取持仓信息
    var type = null; // 转换持仓方向
    // 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
    if (positionData.length % 2 != 0 || positionData.length != 2) {
        for (var i = 0; i < positionData.length; i++) { // 遍历持仓数

Relacionados

Más.

- ¿ Qué pasa?Aprender a aprender

Papá, ¿ qué haces?Aprendiendo

¿Qué es esto?Aprendiendo