Jogar JavaScript com o velho branco - criar um parceiro que faça compras e vendas (5)

Autora:Sonhos pequenos, Criado: 2017-03-13 12:53:50, Atualizado: 2017-10-11 10:37:32

Jogar com o velho e criar um parceiro que faça compras e vendas.

A partir daí, a empresa desenvolveu um novo software para criar robôs de quantificação.https://www.fmz.com/bbs-topic/705(Primeiro Mark abaixo)
  • 1, Fundamentos de dados da linha K, Problemas com o uso desses dados em transações quantitativas.

    • O que são dados da linha K:

      O gráfico de linhas-K, originado na época do governo de Tokugawa Ieyasu, foi usado pelos comerciantes do mercado de arroz do Japão para registrar os movimentos e os preços do mercado de arroz, e depois foi introduzido no mercado de ações e no mercado de futuros por seu estilo de etiquetagem exclusivo. Atualmente, esse método de análise de gráficos é particularmente popular em nosso país e em toda a Ásia do Sudeste. (Perguntas do Baidoa)

      O gráfico específico não explica, mas vamos ver a estrutura de dados da linha K definida usando a linguagem JS:

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

      Vamos ver os dados obtidos quando a função GetRecords é chamada: (Lembre-se de chamar primeiro o exchange.SetContractType ((rb1705); especifique o tipo de contrato a ser operado)

      [
          {"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}
      ]
      

      Os dados da linha K são uma matriz de objetos, cada objeto é um Bar da linha K, que contém o preço mais alto, o preço mais baixo, o preço de abertura (ou seja, o preço no início do período da linha K), o preço de fechamento (ou seja, o preço no final do período da linha K), o volume de transações (o volume de transações no ciclo K) e o ciclo é o ciclo da linha K. Por exemplo, como é que os dados do conjunto acima determinam o tamanho do ciclo da linha K? O resultado é: 1800000, que é uma unidade numérica de milissegundos, então convertida em: 1800000 / 1000 / 60 = 30 (minutos), este ciclo da linha K é de 30 minutos.

      A primeira questão que surge facilmente é: Quando usamos dados de linha K, o comprimento de matriz é ignorado. Isso causa um excesso de acesso à matriz (este tipo de BUG era comum quando se escrevia programas em C anteriormente). Portanto, precisamos julgar isso antes de usar a linha K. Por exemplo, para obter uma linha K: exchange.SetContractType ((rb1705); // Configurações de comutação para contrato de aço 1705 de torneira. var records = exchange.GetRecords ((); // Obtenha dados de ciclo de linha K padrão do contrato de aço de rosca rb1705. A quantidade de dados de K-bars que podem ser obtidos depende especificamente da API da bolsa. Portanto, se no início forem necessários mais K-bars, o programa deve ser coletado por algum tempo.

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

      A segunda questão que surge facilmente é: Os dados do último Bar da linha K, além das propriedades Time, Open e Close, podem ser alterados em tempo real. Os iniciantes podem ter muita confusão quando estão lidando com a linha K, pois não entendem esse ponto. Por exemplo, no capítulo anterior, falamos sobre o cruzamento da linha média.

      A terceira pergunta: O período de uma linha K, o fuso horário é o momento do início do ciclo, o fuso horário é um milissegundo, o fuso horário tem um valor de 0. O momento representado é 1o de janeiro de 1970 (o fuso horário também deve ser considerado quando se escreve um programa específico). A frase seguinte pode ser usada paraEscolaOu testar no BotVS Sandbox System:

      var arr = new Date(0);
      

      O que está sendo mostrado é:

      Thu Jan 01 1970 08:00:00 GMT+0800 (CST) // indicado para o horário de oito horas do leste Este valor é acumulado desde 1970 até agora (aumentando 1000 a cada 1 segundo, porque 1 segundo é 1000 milissegundos), então este valor já é muito maior. Aqui está um pequeno truque: uma vez que o cronômetro é único para cada Bar na linha K, que determina o período da linha K, uma vez que o cronômetro é alterado, é possível determinar se recebeu os dados mais recentes da linha K. Isso também é útil no processamento real de dados da linha K.

  • 2, detalhes de chamadas de indicadores, problemas frequentes Período de satisfação, valor de retorno, parâmetros

    Para programar ou quantificar as políticas, muitas funções de indicadores também são usadas. Uma biblioteca de indicadores mais útil é a biblioteca talib, que tem várias versões, e aqui usamos a versão JS.

    A primeira vez que o Old White usou a função do banco de índices, ele também teve muitos erros:

    • Primeiro, o ciclo de parâmetros (parâmetros de indicadores, distinto do ciclo da linha K, quanto é o ciclo da linha K, quanto é o ciclo da linha K do indicador calculado, por exemplo, a linha K calculada em 30 minutos é o indicador MACD do ciclo de 30 minutos, o parâmetro é o ciclo do parâmetro) é muito grande, o comprimento dos dados da linha K é insuficiente: O indicador MACD, por exemplo, descreve:

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

      Se o período de parâmetros estiver configurado para 12, 26, 9 quando usado, nós importamos os registros de dados da linha K para o cálculo do indicador, e o código é escrito assim:

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

      Se os registros que estão sendo transmitidos são muito pequenos, o que acontece é:

      [
        [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]
      ]
      

      Isso é causado por falta de dados da linha K, um indicador calculado que causa um BUG se usado, então nós adicionamos uma condição de limitação antes do programa:

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

      Salte do ciclo até obter 50 linhas K suficientes. Faça o seguinte:img

      Um leitor atento pode ver por que os dados do indicador são calculados como um conjunto bidimensional (isto é, cada elemento de um conjunto é um conjunto), porque o indicador MACD não é calculado como uma linha, mas como três linhas: dif, dea, coluna de quantidade macd.

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

      Algumas vezes, o erro ocorre por não prestar atenção à estrutura de retorno do indicador.

    • Em segundo lugar, as funções de indicadores são calculadas com uma linha média diferente ou com algoritmos de indicadores diferentes que resultam em resultados diferentes.

      O STOCH RSI é um indicador que descreve:

      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 é claramente diferente de outros algoritmos, o indicador para o qual eu dei o meu próprio código de algoritmo no primeiro capítulo da série. Os leitores interessados podem comparar abaixo. A causa pode ser causada pela inconsistência do sistema de linha uniforme usado, alguns algoritmos de biblioteca acostumados a usar MA, outros acostumados a usar EMA. Alguns indicadores são calculados diariamente, e se o número de dados de linha K for diferente, os valores calculados podem ser diferentes.

  • 3, API tolerante de erros

    • Cannot read property length of null Este BUG é o mais frequente e não um deles.

      A razão é que as APIs às vezes ocorrem erros de obtenção de dados ou não obtêm dados por várias razões. Em alguns casos, as APIs de obtenção de dados obtêm valores nulos. Estes dados são geralmente de estrutura de matrizes e, muitas vezes, precisam de acesso ao comprimento da matriz.

      Para todas as chamadas de API é necessário um tratamento de erros, e às vezes até mesmo para verificar se os dados estão corretos ("às vezes há dados anormais"). Nosso programa só pode garantir a precisão dentro de seu próprio código, mas não é possível garantir que as informações de dados que circulam pela rede sejam 100% precisas ("o que é inevitável é perder o pacote"), então é necessário que os dados obtidos sejam maltratados e filtrados para excluir todas as anomalias.

      Como não há depuração de um passo, não há depuração de interrupção, não há monitoramento de valores de variáveis, etc. O meu método de DEBUG é o mais simples, o Logos! Para o uso razoável do Log para a saída de informações de texto, o log da saída do programa de análise no processo do programa. Pode-se, provavelmente, entender o processo de execução do programa, ou combinar a captura de anomalias do try, catch, throw JS para lidar com o BUG, mas minha recomendação é não usar o máximo possível quando for necessário usar a captura de anomalias. Para o DEBUG, usar o método Log mais primitivo é realmente uma experiência, e isso é muito eficaz do ponto de vista do desenvolvimento de habilidades de DEBUG.

Antes de escrever isso, bem-vindo leitores para me deixar um comentário! para fazer sugestões e comentários, se você se sentir divertido pode compartilhar com mais amigos que gostam de programas que gostam de negociação

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

Criado pelo programador littleDream


Mais.