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-06 10:41:40, Mis à jour: 2017-10-11 10:36:53

Il a joué avec le vieux Blanc et a créé un partenaire qui vend et achète.

Né dans une boîte de sable

  • Système de sable

    Lors de la recherche sur Internet de toutes sortes d'informations d'apprentissage, vous découvrez que le programme informatique pour faire des transactions financières est appelé transaction programmatique, transaction quantitative. Le niveau de mathématiques de l'ancien président est également au niveau de l'université, et la statistique n'a que quelques concepts de base: distribution normale, attentes, intégration, etc. Je n'ose pas dire que je suis le plus quantifié dans l'apprentissage de la programmation, de la quantification. Dans l'apprentissage de la programmation, de la quantification ou dans la pratique.

    Le vieux Blanc pense qu'une boîte à sable utile doit avoir les éléments suivants:

    • 1° Simuler au maximum les séquences de temps réelles, c'est-à-dire les séquences de temps le plus proches possible de la réalité lors de l'exécution d'un programme dans un bac à sable, basées sur le niveau de tick, afin que les résultats obtenus aient une valeur de référence. Cela peut entraîner une vitesse de fonctionnement limitée du programme dans le bac à sable, mais la vitesse de fonctionnement est également un facteur important.

    • 2, divers paramètres de contrôle d'options, qui ne sont pas requis par les paramètres du programme testé, mais par les paramètres du système de sandbox. Par exemple: les paramètres de l'échange (futures? A-actions? devises?), les informations de compte simulé de l'échange testé, les frais de transaction de l'échange, le taux de glissement qui peut se produire, le contrôle de la portée du temps, etc.

    • 3, Modification des paramètres du programme: Parfois, il y a un tas de paramètres de secours, vous voulez essayer de voir lequel est le meilleur.

    • 4, test d'erreur: les simulations de programmes sont souvent sans heurts, car elles sont dans le bassin de la sable (combien de vagues peuvent-elles y avoir?), alors qu'en réalité, il y a des océans profonds inattendus et des tempêtes inconnues à tout moment.

    • Les graphiques peuvent enregistrer de nombreuses données utiles pour l'analyse, telles que les graphiques de revenus, les courbes de différence, etc.

  • Nous avons un système de sable à portée de main, et nous avons commencé par écrire du code simple en JS.

    • 1. L'architecture générale des programmes automatisés de CTP pour les contrats à terme sur produits La couche inférieure utilisée par Old White a déjà enveloppé une fonction.exchange.IO("status")Pour identifier si le serveur avant est connecté au serveur avant de la société de futures. Le vieil homme répond: Les futures sur produits utilisent le protocole CTP et la structure de connexion est la suivante: le terminal du client de la société de futures (code en blanc) ------> le serveur avant de la société de futures ------> le serveur de l'échange Retour sur le sujet, lorsque les futures de produits sont hors marché, il est impossible de se connecter au serveur avant de la société de futures (après une certaine période de l'arrêt, le serveur avant de la société de futures est fermé); ou certaines situations entraînent la CTP à se déconnecter.

      function MainLoop(){  //  处理具体工作的函数
                          //  编写处理具体交易逻辑
      }
      function main() {
          var status = null;
          while(true){
              status = exchange.IO("status");      //  调用API 确定连接状态
              if(status === true){                 //  判断状态
                  LogStatus("已连接!");            //  在回测或者实际运行中显示一些实时数据、信息。
                  MainLoop();                      //  连接上 交易所服务器后,执行主要工作函数。
              }else{                               //  如果没有连接上 即 exchange.IO("status") 函数返回 false
                  LogStatus("未连接状态!");         //  显示 未连接状态。
              }
              Sleep(1000);                         //  封装的睡眠函数,参数是毫秒,1000毫秒 等于 1秒,需要有轮询间隔, 以免访问过于频繁。CTP协议是每秒推送2次数据。
          }
      }
      

      Dans le sable, courez:

      img img

      Si vous voyez le graphique, le montant du compte de réévaluation que nous avons mis en place est de 100 W.

      img

    • Comment obtenir vos données d'informations de compte dans le programme, puisque vous enveloppez la couche inférieure en une fonctionexchange.GetAccount()Vous pouvez essayer cette simple phrase.

      function MainLoop(){  //  处理具体工作的函数
          exchange.GetAccount();    
      }
      

      Il n'y a que dans cette personnalisationMainLoop()Écrire dans une fonctionexchange.GetAccount();

      Rien n'est affiché. ============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================Log(), les paramètres de la fonction sont de produire toutes sortes de variables, vous pouvez transmettre plusieurs intervalles de virgule.

      function MainLoop(){                     // 处理具体工作的函数
          Log(exchange.GetAccount());          // 写法1
          var Account = exchange.GetAccount(); // 写法2
      }
      

      img

      Le MainLoop est exécuté en continu (à intervalles de 1 seconde, entièrement basé sur la fonction Sleep) de sorte que tous les logs du système de récupération sont des informations de compte d'analogie.
    • Ensuite, dans la boîte à sable, demandez d'autres données, le vieux Blanc s'intéressait souvent à l'acier à visée, une variété de produits à terme, car il s'intéressait également au prix des maisons.

      Il faut d'abord savoir quelle est la variété de marché à comprendre, par exemple sur les contrats en acier 1705 à visée galvanisée.exchange.SetContractType("rb1705")J'aimerais également savoir si le contrat rb1705 est en cours d'exécution (le point de temps dans le système de retouche est le moment où il est en cours d'exécution).exchange.GetTicker()Je veux ensuite connaître les statistiques du cycle de prix historique de ce contrat.exchange.GetRecords()Je vous en prie.MainLoopLa fonction est modifiée:

      var index = 0;                                                // 声明一个全局变量 用来记录循环次数
      function MainLoop(){
          var ContractInfo = exchange.SetContractType("rb1705");    // 设置我要操作的 商品期货合约类型 即 螺纹钢1705合约。
          if(!ContractInfo){
              return;                                               // 如果设置合约没有成功,即返回函数,再次进入重试。
          }
          Log("rb1705 Info:", ContractInfo);                        // 显示一下合约详细信息。
          var ticker = exchange.GetTicker();                        // 通过CTP协议请求 此刻行情数据
          var records = exchange.GetRecords();                      // 通过CTP协议请求 历史K线数据,K线的周期默认周期是在沙盒系统上设置的。
          Log("ticker:", ticker);                                   // 打印出来 此刻行情数据
          Log("records:", records);                                 // 打印出来 历史K线数据
          Log("index:", index++, "#FF0000");                        // 打印循环次数, 在最后参数传入 "#FF0000" 可以使打印的日志显示为红色。
      }
      

      img

      Sélectionnez une partie des records La valeur de la variable (type d'arrow): Je ne sais pas. {Time:1486083600000,Open:3354,High:3358,Low:3071,Close:3272,Volume:328708.00000000006}, {Time:1486083900000,Open:3272,High:3272,Low:3228,Close:3228,Volume:133542},...}, est une série de jeux vidéo télévisés réalisés par le groupe de jeux vidéo américain, le groupe de jeux vidéo américain, le groupe de jeux vidéo américain, le groupe de jeux vidéo américain, le groupe de jeux vidéo américain, le groupe de jeux vidéo américain, le groupe de jeux vidéo américain, le groupe de jeux vidéo américain, le groupe de jeux vidéo américain, le groupe de jeux vidéo américain, le groupe de jeux vidéo américain, le groupe de jeux vidéo américain, le groupe de jeux vidéo américain, le groupe de jeux vidéo américain, le groupe de jeux vidéo américain, le groupe de jeux Time: le timestamp, le temps à l'échelle des millisecondes. Open: prix d'ouverture 、High: prix le plus élevé 、Low: prix le plus bas 、Close: prix de clôture 、Volume: volume de transaction

      La valeur de la variable ticker (objet) est imprimée: Je ne sais pas si tu as bien compris. Je ne sais pas. High: le prix le plus élevé en cours 、 Low: le prix le plus bas en cours 、 Sell: le prix de vente 、 Buy: le prix de l'achat 、 Last: le prix de la transaction la plus récente, Volume: le volume de la transaction la plus récente

      Les informations relatives au contrat rb1705: ((Voir la description des champs dans le protocole CTP)). Je ne sais pas. Le type de soupape: 0, Je ne suis pas d'accord avec vous. Le mois de la livraison: 5 Il est également possible d'envoyer un message à la police. Vous pouvez également télécharger les vidéos de l'événement en cliquant ici. Il y a aussi une autre version de l'application. Il s'agit d'un groupe de personnes qui travaillent dans le domaine de la santé publique. Il y a un problème avec le code de la route. Elle a été adoptée par le gouvernement de l'Etat. Il a été conçu pour être utilisé par des personnes âgées et âgées. Il a été conçu pour être utilisé par des personnes âgées. Il y a aussi des sites de jeux vidéo. Le taux de dépôt de la marge de longueur est de 0,06%. Il y a un problème avec le nombre de fois où vous avez besoin d'une commande. L'algorithme de côté de la marge maximale est de 48 Il y a une différence de taille entre les deux. Le nombre de fois où vous avez besoin d'une commande est le nombre de fois où vous avez besoin d'une commande Il y a une différence entre les deux types de commandes. Il est possible que vous ayez un problème avec la date d'expiration. Le type d'options est: 0, Je ne sais pas si je peux le faire. Vous pouvez utiliser le formulaire suivant: Il y a aussi des gens qui ont été victimes de violences. Je ne peux pas le faire. Il y a un problème avec le produit. Le taux d'intérêt de la marge de manœuvre est de 0,06%. La date de délivrance est fixée à: 20170516 Il a été tué par un policier. "UnderlyingInstrID" est un mot qui signifie "sous-entendu". Le nombre de fois où vous le faites. Le volume multiple est de 10 mm. Je ne sais pas.

    • Enfin, nous avons fait fonctionner le robot à l'intérieur du bac.

      Ici, un peu de concept de l'avenir des produits, les contrats à terme, qu'il s'agisse d'acheter des contrats à plus de positions (contrats à la hausse) ou d'acheter des contrats à plus de positions (contrats à la baisse) sont appelés des positions ouvertes, afin de faire la distinction entre: acheter des contrats à plus de positions, acheter des contrats à plus de positions ouvertes. De même, les contrats à plus de positions détenus et les contrats à plus de positions détenues sont appelés des positions ouvertes.

Le placement est l'acte par lequel un négociant achète ou vend des contrats à terme de même type, quantité et mois de livraison que ceux qu'il détient, mais dans la direction opposée. Les négociants de contrats à terme ont la possibilité de vendre ou de racheter les contrats à terme achetés avant la fin de la dernière journée de négociation afin d'obtenir un montant égal. Les contrats à terme dans la direction opposée pour annuler les contrats à terme d'origine, mettant ainsi fin aux transactions à terme et supprimant l'obligation de livraison physique à la date d'échéance. Je ne sais pas.

##### 所以在期货市场做买卖就有4个方向:

用 ```SetDirection()``` 函数来 确定操作的方向

- 开多仓:SetDirection("buy") ,传入参数 "buy" 字符串,明确 exchange.Buy() 函数为 开多仓 操作, Buy 函数稍后讲到。

- 开空仓:SetDirection("sell"), 传入参数 "sell" 字符串,明确 exchange.Sell() 函数为 开空仓 操作,Sell 函数稍后讲到。

- 平多仓:SetDirection("closebuy"), 传入参数 "closebuy" 字符串, 明确 exchange.Sell()函数为 平多仓操作。

- 平空仓:SetDirection("closesell"), 传入参数 "closesell" 字符串,明确 exchange.Buy()函数为 平空仓操作。

下个单试试!继续改写 MainLoop 函数,我们让程序在沙盒里面每隔10分钟 交易一次,开多仓平多仓交替进行。
```
var index = 0;
var isFirst = true;
function MainLoop(){
    if(isFirst){
        Log(exchange.GetAccount());
        isFirst = false;
    }
    var ContractInfo = exchange.SetContractType("rb1705");
    if(!ContractInfo){
        return;                                               // 如果设置合约没有成功,即返回函数,再次进入重试。
    }
    var ticker = exchange.GetTicker();
    if(index % 2 === 0){
        exchange.SetDirection("buy");
        exchange.Buy(ticker.Last + 1, 1, ticker); // exchange.Buy 函数有2个必要参数,第一个参数为下单价格,
                                          // 第二个参数为下单数量(希望交易的数量),之后还可以跟一些参数输出在日志信息。 
                                          //ticker.Last + 1 是为了让单子能成交,意思是在最后成交价的基础上多出1块钱。
    }else if(index % 2 === 1){
        exchange.SetDirection("closebuy");
        exchange.Sell(ticker.Last - 1, 1, ticker); // ticker.Last - 1 是为了在最后成交价的基础上减去1元 卖出。
    }
    index++;
    Sleep(1000 * 60 * 10 - 1000);         // 这里暂停10分钟 ,减去的1000 即1秒是 main 函数循环中的1秒。
    Log(exchange.GetAccount());
}
```

![img](/upload/asset/bd6dd2ef0e5db88c70f0585aee3a417c92227d31.png) 

##### 开始的账户信息 和 最后一次开仓 前的账户信息比较,可见不能胡乱开仓平仓。 >_<

Avant d'écrire ceci, bienvenue les lecteurs à me laisser un commentaire! pour des suggestions et des commentaires, et si cela vous semble amusant, partagez-le avec d'autres amis qui aiment les programmes et les transactions.

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

Le programmeur littleDream est originaire


Plus de