Jugar JavaScript con el viejo blanco - crear un compañero que haga compras y ventas (5)

El autor:Un sueño pequeño., Creado: 2017-03-13 12:53:50, Actualizado: 2017-10-11 10:37:32

Jugar con el viejo blanco y el viejo ladrón de JavaScript para crear un compañero de compras y ventas.

Un tutorial para escribir un robot cuantificado con JS:https://www.fmz.com/bbs-topic/705(Primero bajo el nombre de Mark)
  • Los problemas que se presentan con el uso de estos datos en transacciones cuantitativas.

    • ¿Qué es la información de la línea K:

      El gráfico de la línea K se originó en la época del gobierno de Tezuka en Japón y fue utilizado por los comerciantes del mercado de arroz de Japón para registrar el mercado de arroz y las fluctuaciones de precios, y luego se introdujo en las bolsas de valores y los mercados de futuros debido a su estilo de etiquetado único y sutil. Actualmente, este método de análisis de gráficos es especialmente popular en nuestro país y en toda la región del sudeste asiático. (Búsqueda desde Baidoa)

      Sin explicar el gráfico en concreto, veamos la estructura de datos de la línea K definida con el lenguaje JS:

      {
          Time    :   1487034000000, // 一个时间戳, 精确到毫秒,与Javascript的 new Date().getTime() 得到的结果格式一样
          Open    :   3425,          // 开盘价
          High    :   3446,          // 最高价
          Low     :   3423,          // 最低价
          Close   :   3438,          // 收盘价
          Volume  :   177657.99,     // 交易量
      }
      

      Vamos a ver los datos obtenidos al llamar a la función GetRecords: (recuerda llamar primero a exchange.SetContractType ((rb1705); el tipo de contrato que se desea operar)

      [
          {"Time":1487034000000,"Open":3425,"High":3446,"Low":3423,"Close":3438,"Volume":177657.9999999999},
          {"Time":1487035800000,"Open":3438,"High":3448,"Low":3382,"Close":3385,"Volume":494882},
          {"Time":1487037600000,"Open":3385,"High":3398,"Low":3383,"Close":3394,"Volume":83656.00000000015}
      ]
      

      Los datos de la línea K son una matriz de objetos, cada objeto es una barra de la línea K, que contiene el precio más alto, el precio más bajo, el precio de apertura (el precio al que comienza la línea K), el precio de cierre (el precio al que termina la línea K) y el volumen de transacciones (el volumen de transacciones en el ciclo K). Por ejemplo, ¿cómo los datos de la matriz anterior determinan cuál es la longitud de la línea K de ciclo? Se obtiene: 1800000, la unidad de este valor numérico es milisegundos, por lo que en cambio: 1800000 / 1000 / 60 = 30 (minutos), este ciclo de la línea K es de 30 minutos.

      La primera pregunta que surge fácilmente: El uso de datos de línea K ignora la longitud de la matriz. Esto causa un desbordamiento de acceso a la matriz (esta clase de BUG era común cuando se escribía un programa de C antes). Por lo tanto, necesitamos juzgarlo antes de usar la línea K. Por ejemplo, para obtener la línea K: exchange.SetContractType ((rb1705); // Configuración de cambio para el contrato de acero roscado 1705. var records = exchange.GetRecords ((); // Obtiene datos de ciclo de línea K por defecto del contrato de acero roscado rb1705. La cantidad de datos de K-bar que se pueden obtener depende de la API de la bolsa. Por lo tanto, si al principio se necesita más K-bar, se debe permitir que el programa recopile durante un tiempo.

      if(records.length < n){    // n 就是我们限定的 n线数量。
          return;                // 当前函数返回。
      }
      

      La segunda pregunta que surge fácilmente es: Los datos de la última barra de la línea K, además de las propiedades Time, Open y Close, pueden cambiar en tiempo real. Los principiantes pueden tener mucha confusión cuando tratan la línea K, ya que no entienden este punto. Por ejemplo, en el capítulo anterior, hablamos del cruce de la línea media.

      La tercera pregunta: El punto de inicio del ciclo de la línea K es el punto de inicio del ciclo, el punto de inicio es un milisegundo y el punto de inicio es 0. El momento representado es el 1 de enero de 1970 (también se debe tener en cuenta la zona horaria al escribir un programa específico). Se puede usar la siguiente frase en¿Qué es eso?En la actualidad, la mayoría de los usuarios de BotVS no tienen acceso a los servicios de seguridad de la red, o pueden probar en BotVS Sandbox:

      var arr = new Date(0);
      

      Se muestra como:

      Thu Jan 01 1970 08:00:00 GMT+0800 (CST) // se muestra en la zona horaria 8 Este Este valor se ha acumulado desde 1970 hasta ahora (aumentando 1000 cada 1 segundo, porque 1 segundo es 1000 milisegundos), por lo que este valor ya es bastante grande. Aquí hay un pequeño truco: como el cronómetro es único en cada Bar de la K-línea en la que se determina el ciclo de la K-línea, una vez que el cronómetro cambia, se puede determinar si se reciben los datos más recientes de la K-línea. Esto también es útil en el procesamiento real de los datos de la K-línea.

  • 2, Detalles de las llamadas de indicadores, problemas frecuentes Ciclo de satisfacción, Valores de retorno, Parámetros

    También se utilizan muchas funciones de indicadores cuando se escriben políticas de programación o cuantificación.

    La primera vez que el Sr. White usó las funciones de la base de datos también tuvo muchos errores:

    • Primero, el ciclo de parámetros (parámetros de indicadores, distinto del ciclo de la línea K, cuánto es el ciclo de la línea K, cuánto es el ciclo de la línea K del indicador calculado, por ejemplo, la línea K de 30 minutos calculada es el indicador MACD del ciclo de 30 minutos, los parámetros para el ciclo de parámetros) está configurado demasiado grande, la longitud de los datos de la línea K es insuficiente: Por ejemplo, el indicador MACD describe:

      MACD(Records[Close],Fast Period = 12,Slow Period = 26,Signal Period = 9) = [Array(outMACD),Array(outMACDSignal),Array(outMACDHist)]
      

      Si el parámetro de ciclo está configurado para 12, 26, 9 cuando se usa, se ingresan los registros de datos de línea K para el cálculo del indicador, y el código dice:

      var macd = talib.MACD(records, 12, 26, 9);
      

      Si los registros que se envían son demasiado pequeños; el resultado es el siguiente:

      [
        [null,null,null,null,null,null,null,null,null,null,null,null,null],
        [null,null,null,null,null,null,null,null,null,null,null,null,null],
        [null,null,null,null,null,null,null,null,null,null,null,null,null]
      ]
      

      Esto es debido a que la falta de datos de la línea K, el indicador calculado causaría un BUG si se usara, por lo que añadimos una condición límite antes del programa:

      while(!records || records.length < 50){
          records = exchange.GetRecords();
          Sleep(1000);
      }
      

      Salta del círculo hasta que obtengas 50 K. Haz lo siguiente:img

      Un lector atento puede ver por qué los datos que se calculan en este indicador son un conjunto bidimensional (es decir, cada elemento de un conjunto es un conjunto), ya que el indicador MACD se calcula no como una línea, sino como tres líneas: dif, dea, columna de cantidad macd. Por lo tanto, el valor de retorno de cada indicador puede ser diferente, o se debe ver la descripción del indicador.

      [
        [null,null,null,null,null,null,null,null,数据...],
        [null,null,null,null,null,null,null,null,数据...],
        [null,null,null,null,null,null,null,null,数据...]
      ]
      

      Algunas veces, también se produce un BUG debido a la falta de atención a la estructura de retorno de los indicadores.

    • En segundo lugar, las medias utilizadas para calcular las funciones de indicadores o los algoritmos de indicadores diferentes dan resultados diferentes.

      El STOCH RSI es el indicador más evidente, que describe lo siguiente:

      STOCHRSI(Records[Close],Time Period = 14,Fast-K Period = 5,Fast-D Period = 3,Fast-D MA = 0) = [Array(outFastK),Array(outFastD)]
      

      Este valor calculado es claramente diferente a otros algoritmos, el cual he dado mi propio código de algoritmo en el primer capítulo de esta serie. La razón puede ser la inconsistencia del sistema uniforme utilizado, algunos algoritmos de la biblioteca están acostumbrados a usar MA, otros están acostumbrados a usar EMA. Algunos indicadores se calculan de forma iterativa todos los días, y si la cantidad de datos de K-line es diferente, es posible que haya una diferencia en los valores calculados.

  • 3. API permite el tratamiento de errores

    • Cannot read property length of null Este BUG es el más frecuente y no es uno de ellos.

      Esto se debe a que las API a veces tienen errores en la obtención de datos o no se obtienen datos por diversas razones. En este caso, algunas API de obtención de datos obtienen valores null. Estos datos generalmente son una estructura de matrices y, a menudo, se necesita acceder a la longitud de las matrices.

      Para todas las llamadas de la API se requiere errorización, e incluso a veces se requiere detectar si los datos son normales (a veces hay datos anormales). Nuestros programas solo pueden garantizar la exactitud dentro de su propio código, pero no se puede garantizar la exactitud del 100% de la información de datos que se corre por la red (lo inevitable es perder paquetes), por lo que se debe errorizar los datos obtenidos y filtrar todos los datos anormales.

      Sin embargo, la mayoría de los usuarios de los dispositivos móviles no tienen acceso a los datos de los dispositivos móviles, ya que no hay depuración en un solo paso, no hay depuración de interrupción, no hay monitoreo de valores de variables, etc. El método de DEBUG que uso es el más sencillo, el método Log. Para el uso razonable de Log para la producción de información de texto en el proceso del programa, el registro de la producción del programa de análisis. Probablemente se puede entender el proceso de ejecución del programa, también se puede combinar con la captura de anomalías de try, catch, throw JS para tratar con BUG, pero mi recomendación es que no lo hagas hasta que sea necesario usar captura de anomalías. Para DEBUG, el uso de la metodología Log más primitiva es realmente una experiencia, y es muy eficaz desde el punto de vista de desarrollar la capacidad de DEBUG.

Antes de escribir esto, bienvenido a los lectores a dejarme un comentario! para sugerencias y comentarios, si se siente divertido puede compartir con más amigos que aman los programas que aman las transacciones

https://www.fmz.com/bbs-topic/728

Programador littleDream, originalmente


Más.