Jouer à JavaScript avec le vieux Blanc - créer un partenaire pour faire des achats et des ventes

Auteur:Le petit rêve, Créé: 2017-03-13 12:53:50, Mis à jour: 2017-10-11 10:37:32

Il a joué avec le vieux Blanc et a créé un petit partenaire pour faire des achats et des ventes.

Un tutoriel pour écrire un robot quantifié en utilisant JS:https://www.fmz.com/bbs-topic/705Je ne peux pas vous dire pourquoi.
  • 1, les bases de données de la ligne K, les problèmes liés à l'utilisation de ces données dans les transactions quantitatives.

    • Qu'est-ce que les données de la ligne K:

      Le K-Line a été inventé par les commerçants japonais à l'époque du shogunat de Tokugawa et utilisé pour enregistrer les mouvements et les fluctuations des prix du riz. Il a ensuite été introduit sur les marchés boursiers et les marchés à terme en raison de sa méthode d'étiquetage unique. Actuellement, cette méthode d'analyse graphique est particulièrement populaire dans notre pays et dans toute l'Asie du Sud-Est. (Cherchée depuis Baidoa)

      Les graphiques n'expliquent pas, mais voyons la structure de données de la ligne K définie en langage JS:

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

      Voyons maintenant les données obtenues en appelant la fonction GetRecords: (n'oubliez pas d'appeler exchange.SetContractType ((rb1705); le type de contrat à utiliser est précis)

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

      Les données de la ligne K sont une matrice d'objets, chaque objet étant une barre de la ligne K, qui contient le prix le plus élevé, le prix le plus bas, le prix d'ouverture (le prix au début de la période de la ligne K), le prix de fermeture (le prix à la fin de la période de la ligne K), le nombre de transactions (le nombre de transactions au cours de la période de la ligne K) dans le cycle de la ligne Bar. Par exemple, comment les données de l'arithmétique ci-dessus peuvent-elles déterminer quelle est la longueur de la ligne K de cycle? On obtient: 1800000, dont la valeur numérique est en millisecondes, donc en échange: 1800000 / 1000 / 60 = 30 (minutes), ce cycle de ligne K est de 30 minutes.

      La première question qui se pose facilement est: La longueur d'une matrice est négligée lorsque vous utilisez des données de ligne K. Cela entraîne un débordement d'accès à l'arithmétique (un bug de ce type était fréquent lors de l'écriture de programmes C précédents). Nous devons donc en juger avant d'utiliser la ligne K. Pour obtenir une ligne K: exchange.SetContractType ((rb1705); // paramètres de commutation pour le contrat 1705 en acier à vis. var records = exchange.GetRecords ((); // Obtenez les données de cycle de ligne K par défaut du contrat de l'acier à vis rb1705. Le nombre de lignes K que l'on peut obtenir dépend de l'API de l'échange. Donc, au début, si l'on a besoin de plus de lignes K, il faut laisser le programme collecter pendant un certain temps.

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

      Le deuxième problème qui se pose facilement: Les données de la dernière barre de la ligne K sont susceptibles d'être modifiées en temps réel, à l'exception des propriétés Time et Open. Les débutants peuvent être très confus en ne comprenant pas ce point lorsqu'ils traitent des lignes K. Par exemple, dans le chapitre précédent, nous avons parlé de l'intersection de la ligne moyenne.

      La troisième question: La période de la ligne K, la fuseau horaire est l'heure du début de cette période, la fuseau horaire est un millisecondes, la valeur de la fuseau horaire est de 0, la date de référence est le 1er janvier 1970 (le fuseau horaire doit être pris en compte lors de l'écriture du programme spécifique). Vous pouvez utiliser la phrase suivanteJe suis à l'école.Vous pouvez également tester le système BotVS Sandbox:

      var arr = new Date(0);
      

      Il s'agit de:

      Thu Jan 01 1970 08:00:00 GMT+0800 (CST) // affichée dans le fuseau horaire 8 est Cette valeur est cumulée depuis 1970 (en ajoutant 1000 toutes les 1 seconde, car 1 seconde est 1000 millisecondes), donc cette valeur est déjà assez grande. Voici une petite astuce: comme le timestamp est unique pour chaque Bar de la ligne K déterminée par le cycle de la ligne K, une fois que le timestamp est modifié, vous pouvez être sûr de recevoir les dernières données de la ligne K. Ceci est également utile dans le traitement réel des données de la ligne K.

  • 2, Détails sur les appels d'indicateurs, problèmes fréquemment rencontrés, cycle de satisfaction, valeur de retour, paramètres

    Il existe de nombreuses fonctions d'indicateur utilisées pour programmer ou quantifier des stratégies.

    Il y a aussi eu beaucoup d'erreurs lors de la première utilisation des fonctions de la bibliothèque d'indicateurs:

    • Premièrement, le paramètre de cycle (paramètre d'indicateur, différent du cycle de ligne K, combien de cycle de ligne K, combien d'indicateur de cycle de ligne K est calculé, par exemple, 30 minutes de ligne K calculée est l'indicateur MACD de 30 minutes de cycle, paramètre pour cycle de paramètre) est trop grand, la longueur des données de ligne K est insuffisante: L'indicateur MACD, par exemple, décrit:

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

      Si le paramètre de la période est défini sur 12, 26, 9 lors de l'utilisation, nous introduisons des enregistrements de données en ligne K utilisés pour calculer les indicateurs, et le code s'écrit comme suit:

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

      Si les enregistrements sont trop petits à ce moment-là, le calcul se fait comme suit:

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

      C'est à cause de l'insuffisance de données de ligne K, les indicateurs calculés provoquent un BUG s'ils sont utilisés, alors nous ajoutons une condition limitante avant le programme:

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

      Sautez de la boucle jusqu'à ce que vous ayez obtenu assez de lignes K pour 50 lignes.img

      Un lecteur attentif peut voir pourquoi les données calculées par l'indicateur sont un ensemble bidimensionnel (c'est-à-dire que chaque élément d'un ensemble est un autre ensemble), car l'indicateur MACD est calculé non pas comme une ligne, mais comme trois lignes: diff, dea, macd colonne de volume.

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

      Il y a aussi eu plusieurs cas de BUG qui ont été causés par le fait que la structure de retour de l'indicateur n'a pas été prise en compte.

    • Deuxièmement, les moyennes utilisées pour calculer les fonctions d'indicateurs sont différentes ou les algorithmes d'indicateurs donnent des résultats différents.

      L'indicateur STOCH RSI est plus évident:

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

      Cette valeur calculée est nettement différente des autres algorithmes, dont j'ai donné le code dans le premier chapitre de cette série. Les lecteurs intéressés peuvent comparer ci-dessous. La raison peut être due à l'incohérence des systèmes homogènes utilisés, certains algorithmes de bibliothèque sont habitués à utiliser MA, d'autres sont habitués à utiliser EMA. Certains indicateurs sont calculés quotidiennement, et si le nombre de données de ligne K est différent, il peut y avoir une différence de valeur.

  • 3, API peut être mal géré

    • Cannot read property length of null Ce bug est le plus fréquent et n'est pas l'un d'entre eux.

      La raison en est que les API peuvent parfois avoir des erreurs ou ne pas obtenir de données pour diverses raisons. Dans certains cas, les API qui obtiennent des données obtiennent une valeur nulle. Ces données sont généralement de structure arithmétique et nécessitent souvent un accès à la longueur de l'arithme.

      Pour tous les appels d'API, il est nécessaire de traiter les erreurs, et parfois même de vérifier si les données sont correctes (parfois, des données anormales apparaissent). Nos programmes ne peuvent garantir l'exactitude que dans leur propre code, mais pour les informations de données qui circulent sur le réseau, il n'est pas possible de garantir leur exactitude à 100% (ce qui est inévitable), il est donc nécessaire de traiter les données obtenues de manière incorrecte et de filtrer toutes les données anormales.

      Il n'y a pas de débogage en une seule étape, pas de débogage en interruption, pas de surveillance des valeurs de variables, etc. La méthode de DEBUG que j'utilise habituellement est la méthode Log la plus simple! Pour un usage raisonnable des journaux pour l'exportation d'informations textuelles, des journaux d'analyse des programmes. Il est possible de comprendre le fonctionnement du programme, ou de combiner les captures d'exception de try, catch, throw JS pour traiter les bugs, mais je recommande de ne pas les utiliser tant qu'il est nécessaire d'utiliser des captures d'exception. Pour le DEBUG, il est vrai que l'utilisation de la méthode Log la plus primitive est une expérience, ce qui est très efficace du point de vue de la culture des capacités DEBUG.

Avant d'écrire ceci, bienvenue les lecteurs à me laisser un message! pour des suggestions et des commentaires, si vous vous sentez amusés, vous pouvez partager avec d'autres amis qui aiment les programmes et les transactions

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

Le programmeur littleDream est originaire


Plus de