4.2 Cómo implementar el comercio estratégico en el lenguaje JavaScript

El autor:La bondad, Creado: 2019-04-27 11:53:15, Actualizado:

Resumen de las actividades

En el artículo anterior, presentamos los conocimientos fundamentales que cuando se utiliza JavaScript para escribir un programa, incluyendo la gramática básica y materiales.

Introducción de la estrategia

La banda de Bollinger es uno de los indicadores técnicos más utilizados, inventado por John Bollinger en la década de 1980. en teoría, los precios siempre fluctúan alrededor de un cierto rango de valores.

El método de cálculo consiste en utilizar el principio estadístico, primero calcular la desviación estándar del precio durante un período de tiempo, y luego sumar o restar 2 veces la desviación estándar del promedio móvil para encontrar el intervalo de confianza del precio.

img

Debido al concepto de desviación estándar, el ancho de la banda de Bollinger se ajusta dinámicamente en función de las fluctuaciones recientes de precios. Cuando las fluctuaciones son pequeñas, las bandas de Bollinger serán más estrechas; de lo contrario, las fluctuaciones serán más grandes y las bandas de Bollinger serán más anchas. Cuando el canal BOLL está cambiando de estrecho a ancho, el precio regresa gradualmente a la media. Cuando el canal BOLL está cambiando de ancho a estrecho, significa que el precio del mercado comienza a cambiar.

Método de cálculo del indicador de banda de Bollinger

Entre todos los indicadores técnicos, el método de cálculo de la banda de Bollinger es uno de los más complicados, que introduce el concepto de desviación estándar en las estadísticas, que implica el cálculo de la trayectoria media (MB ), la trayectoria superior (UP) y la trayectoria inferior (DN).

  • En el caso de los vehículos de las categorías A y B, el valor de la media móvil simple de los vehículos de las categorías A y B será el valor de la media móvil simple de los vehículos de las categorías A y B.

  • En el caso de los vehículos de las categorías M1, M2 y M3, el valor de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión de la inclusión

  • El valor de las emisiones de CO2 de los motores de combustión renovable se calculará en función de las emisiones de CO2 de los motores de combustión renovable.

function main( ) { // program entry
    while (true) { // enter the loop
        exchange.SetContactType('this_week'); // set contact type
        var records = exchange.GetRecods(); // get the k line array
        var boll = TA.B0LL(records, 50); // get the 50-cycle BOLL indicator array
        var top = boll[0]; // get the upper-rail BOLL indicator array
        var ma = boll[l]; // get the middle-rail BOLL indicator array
        var bottom = boll[2]; // get the lower-rail BOLL indicator array
        Log(top); // print the upper-rail BOLL indicator array to the log
        Log(ma); // print the middle-rail BOLL indicator array to the log
        Log(bottom);// print the lower-rail BOLL indicator array to the log
    }
}

La lógica de la estrategia

Las bandas de Bollinger se utilizan de varias maneras y pueden usarse solas o en combinación con otros indicadores. En esta sección del tutorial lo usaremos de la manera más fácil, que es: cuando el precio rompe el rieles superior, abra una posición larga; cuando el precio rompe el rieles inferior, abra una posición corta.

img

Si el precio vuelve a la línea media de la banda de Bollinger después de abrir 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, por lo tanto, aquí es donde entra la señal de cierre de posición.

Condiciones de negociación

  • Posición larga abierta: Si no hay posición, y el precio de cierre es mayor que la barrera superior.

  • Posición corta: Si no existe una posición y el precio de cierre es inferior al de la línea inferior.

  • Cierre de la posición larga: si mantiene una posición larga y el precio de cierre es inferior al de la línea media,

  • Cierre de posición corta: si se mantiene una posición corta y el precio de cierre es mayor que la línea media,

Aplicación del código de estrategia

Para lograr la estrategia, primero tenemos que considerar qué datos necesitamos? a través de qué API para obtener? luego, cómo calcular la lógica de negociación? Finalmente, ¿qué manera de colocar el pedido? vamos a implementarlo paso a paso:

Paso 1: Utilice el marco de la estrategia de CTA

El llamado marco de estrategia CTA es un conjunto de marcos estándar que FMZ Quant diseñó oficialmente. Al usar este marco, puede ignorar el problema de programación trivial y centrarse directamente en la lógica de la programación. Por ejemplo, si no usa este marco, deberá considerar cambiar el precio del pedido, el tipo de pedido, retirar pedidos y así sucesivamente.

function main() {
    $.CTA("this_week", function(st) {
        // write your strategy here
    })
}

Lo anterior es el marco de estrategia de CTA utilizando la herramienta FMZ Quant. Es un formato de código fijo, y todo el código de lógica de negociación comienza en la línea 3.

Tenga en cuenta que el código de variedad de negociación anterior es this_week, lo que significa que representa el uso de la línea k semanal, los datos de negociación utilizando los datos semanales.

Paso 2: Obtener todo tipo de datos

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.

  • Obtener datos de la línea K

La primera es obtener la matriz de datos de la línea K y el precio de cierre de la línea K anterior, con la matriz de la línea K, podemos calcular el indicador de la banda de Bollinger. se puede escribir así:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

    })
}

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 de la banda de Bollinger es 20, cuando la línea K es menor que 20, es imposible calcular el indicador de la banda de Bollinger.

Línea 6 : De la matriz de líneas K obtenida, primero obtenga el objeto de la línea K anterior, y luego obtenga el precio de cierre de este objeto. Obtener el penúltimo elemento en esta matriz, que es la longitud de esta matriz menos 2 ((r[r.length - 2]).

Los elementos de la matriz K-line son todos objetos, el objeto contiene el precio de apertura, más alto, más bajo y de cierre; también el volumen y el tiempo de negociación.

Por ejemplo, para obtener el precio de cierre, sólo hay que añadir ". " seguido del nombre del atributo (r[r.length - 2].Close).

  • Obtener datos de tiempo de línea K

Debido a que esta es una estrategia intradiaria, necesitamos cerrar todas las posiciones antes de cierto tiempo ((la mayoría de los intercambios de criptomonedas suelen estar abiertos las 24 horas del día), por lo que debemos juzgar si la línea actual K está cerca de ese cierto momento cuando debemos dejar de operar o tomar un descanso. Si está cerca de ese tiempo de cierre, cerrar todas las posiciones. Si no lo es, continúa con la estrategia.

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours
    })
}

Como se muestra anteriormente:

Línea 8: obtenga los objetos del atributo timestamp de la línea K y luego cree un objeto time ((nuevo Date (timestamp)).

Línea 9: Calcular las horas y minutos de acuerdo con el objeto de tiempo, y determinar si el tiempo de la línea actual K es 14:45.

  • Obtener datos de posición

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 una orden 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 posición de retención, no coloque la orden; si no hay posición de retención, coloque la orden. así:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

    })
}

Como se muestra anteriormente:

Línea 11: Obtener el estado de la posición actual. Si hay posiciones largas, el valor es 1; si hay posiciones cortas, el valor es -1; si no hay posición, el valor es 0.

  • Obtener datos de la banda de Bollinger

A continuación, necesitamos calcular los valores de los rieles superiores, medios e inferiores del indicador de la banda de Bollinger. necesitamos obtener la matriz booleana primero, y luego obtener los valores de los rieles superiores, medios e inferiores de esta matriz. En la herramienta cuántica FMZ, es muy simple obtener la matriz booleana, simplemente llame directamente a la API de la banda de Bollinger, es una matriz bidimensional.

El orden para obtener el valor es: primero obtener la matriz especificada en la matriz, y luego obtener el elemento especificado de la matriz especificada, como se muestra a continuación:

var arr = [[100, 200, 300],[10,20,30],[1,2,3]]; // this is a two-dimensional array
var test = arr[0]; //first obtain the specified array in the array and assign the value to variable "test"
var demo1 = test[0]; //then get a value from the test array
demo1; // the result is : 100

var demo2 = arr[0][0]; // you also can write like this
demo2; // the result is the same : 100

De abajo, de las líneas 13 a 19 se obtiene la parte de codificación de la banda de Bollinger superior, media e inferior, donde la línea 13 utiliza la herramienta FMZ Quant API, que puede acceder directamente a la matriz de bandas de Bollinger; de la línea 14 a la línea 16 se obtiene la matriz bidimensional respectivamente para la matriz de rieles superior, media e inferior; de la línea 17 a la línea 19 se obtiene el valor especificado de la matriz de rieles superior, media e inferior.

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2];  // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value

    })
}

Etapa 3: Posicionamiento de pedidos y comercio

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 if, que se puede describir como: si la condición 1 y la condición 2 son ciertas, coloque el pedido; si la condición 3 o la condición 4 son ciertas, coloque el pedido. Como se muestra a continuación:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2]; // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value

        if (mp == 1 && (close < midPrice || isClose)) return -1; // if holding long position, and the closing price is less than the mid-rail, or the current time is 14:45, closing long position.
        if (mp == -1 && (close > midPrice || isClose)) return 1; // if holding short position, and the closing price is greater than the mid-rail, or the current time is 14:45, closing short position.
        if (mp == 0 && close > upPrice && !isClose) return 1; // if there are no holding position, and the closing price is greater than the upper-rail, or the current time is not 14:45, open long position.
        if (mp == 0 && close < downPrice && !isClose) return -1;// if there are no holding position, and the closing price is less than the lower-rail, or the current time is not 14:45, open short position.

    })
}

En la figura anterior, las líneas 21 a 24 son la parte de codificación de la lógica de negociación y la colocación de órdenes.

Tomemos la posición larga abierta como ejemplo. Esta es una declaración if. Si solo se ejecuta una línea de código en esta declaración, se pueden omitir los soportes rizados " {} ". La declaración se traduce en texto, lo que significa: si la posición actual es 0 y el precio de cierre es mayor que el tren superior, y el tiempo de la línea k no es 14:45, entonces " return 1 "

puede encontrar que estas líneas tienen "return 1" y "return -1", que es un formato fijo, lo que significa: si es la dirección de compra, escriba "return 1"; si es la dirección de venta, escriba "return -1".

Código completo de la estrategia

En este punto, se escribe un código de estrategia completo. Si el marco de negociación, los datos de negociación, la lógica de negociación y la orden de colocación se escriben por separado, es muy simple.

function main() {
    $.CTA("this_week", function(st) {
        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price
        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours
        var mp = st.position.amount; // get the holding position information
        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2]; // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value
        if (mp == 1 && (close < midPrice || isClose)) return -1; // if holding long position, and the closing price is less than the mid-rail, or the current time is 14:45, closing long position.
        if (mp == -1 && (close > midPrice || isClose)) return 1; // if holding short position, and the closing price is greater than the mid-rail, or the current time is 14:45, closing short position.
        if (mp == 0 && close > upPrice && !isClose) return 1; // if there are no holding position, and the closing price is greater than the upper-rail, or the current time is not 14:45, open long position.
        if (mp == 0 && close < downPrice && !isClose) return -1;// if there are no holding position, and the closing price is less than the lower-rail, or the current time is not 14:45, open short position.
    })
}

Hay dos cosas que hay que tener en cuenta:

  1. Intentar (pero no necesariamente) escribir la lógica de la estrategia a medida que se establece la condición actual de la línea K, y luego colocar el pedido en la siguiente línea K. O la condición anterior de la línea K se establece, colocando pedidos en la línea K actual, de esta manera, el resultado de la prueba de retroceso y el rendimiento real del mercado no son muy diferentes.

  2. En general, la lógica de posición de cierre debe escribir frente a la lógica de posición de apertura. El propósito de esto es tratar de hacer que la lógica de estrategia cumpla con sus expectativas. Por ejemplo, si la lógica de estrategia sólo cumple con la situación en la que necesita hacer la dirección opuesta de la negociación después de cerrar una posición, la regla de este tipo de situación es cerrar la posición primero y luego abrir la nueva posición. Si escribimos la lógica de posición de cierre frente a la lógica de posición de apertura, se cumplirá perfectamente esta regla.

En resumen

En lo anterior hemos aprendido cada paso para desarrollar una estrategia de negociación cuantitativa intradiaria completa, incluyendo: introducción de estrategia, método de cálculo del indicador de Bollinger, lógica de estrategia, condiciones de negociación, implementación de código de estrategia, etc. A través de este caso de estrategia, no solo estamos familiarizados con los métodos de programación de las herramientas FMZ Quant, sino que también podemos construir algunas otras estrategias que se adaptan de acuerdo con esta plantilla.

Si escribimos la experiencia o el sistema utilizado en la negociación subjetiva antes de escribir la estrategia cuantitativa, y luego la traducimos en código uno por uno, encontrarás que escribir una estrategia cuantitativa será mucho más fácil.

Notificación de la siguiente sección

En el desarrollo de estrategias comerciales cuantitativas, si sólo se puede elegir un lenguaje de programación, sin dudarlo, debe ser Python. Desde la obtención de datos hasta la prueba de retroceso, incluso la parte de la colocación de pedidos, Python ha cubierto toda la cadena de negocios. En el campo de la inversión financiera cuantitativa, Python ha ocupado una posición extremadamente importante, la próxima sección del curso comenzaremos a aprender el lenguaje Python.

Ejercicios extraescolares

  1. Trate de utilizar el conocimiento de esta sección para implementar una estrategia de media móvil doble.

  2. Intente implementar la estrategia de indicadores KDJ utilizando el lenguaje JavaScript en la plataforma FMZ Quant.


Más.