Jouer à JavaScript avec le vieux Blanc - créer un partenaire pour faire des achats et des ventes - développer des outils de code utilisés par les robots

Auteur:Le petit rêve, Créé: 2017-03-15 11:22:52, Mis à jour: 2017-10-11 10:37:43

Je joue avec mon père et je crée un partenaire qui vend et achète.


Au cours du développement du robot, de nombreux petits morceaux de code ont été accumulés, dont certains peuvent être tirés de son propre programme de stratégie de quantification.

  • 1, pour convertir n'importe quel cycle de ligne K

    Ce module de code n'est pas écrit comme une bibliothèque de classes, mais seulement une fonction, ce qui permet de modifier et d'étendre ultérieurement. Le rôle est de synthétiser des grandes cycles de données de ligne K basées sur une certaine période. L'adresse du code source:https://www.fmz.com/strategy/35986

    // K线周期合成  扩展为 根据基础K线 合成 为任意周期。
    

var cloneObj = function ((obj) { // Copie en profondeur des fonctions d'objets var str, newobj = obj.constructor === Array? [] : {}; if (typeof obj!== object) { est le type de l'objet retourner; } autre si (JSON) { str = JSON.stringify ((obj); // Objet sérialisé newobj = JSON.parse ((str); // est rendu Je ne sais pas. pour (var i en obj) { newobj[i] = typeof obj[i] === Objet de type? cloneObj ((obj[i]) : obj[i]; Je ne sais pas. Je ne sais pas. retour newobj; Je ne sais pas. Je ne sais pas. Var DAY = 0; Var HOURS = 1; Var MINUTES = 2 var estFirstFind = vrai; Var est le premier imprimé. Je ne sais pas. fonction GetDHM ((objTime, BaseCycle, NewCycleForMS) Var ret = []; if ((% du cycle de base (1000 * 60 * 60 * 24) === 0) { ret[0] = objTime.getDate (); ret[1] = jour; }else if ((% du cycle de base (1000 * 60 * 60) === 0) { Ret[0] = objTime.getHours (); Ret[1] = heures; }else if ((BaseCycle % (1000 * 60) === 0) { Ret[0] = objTime.getMinutes (en anglais seulement); Ret[1] = MINUTES; Je ne sais pas. if ((NewCycleForMS % (1000 * 60 * 60 * 24) === 0) { ret[2] = jour; }else if ((NewCycleForMS % (1000 * 60 * 60) === 0) { Ret[2] = heures; }else if ((NewCycleForMS % (1000 * 60) === 0) { Ret[2] = MINUTES; Je ne sais pas. retour ret; Je ne sais pas. Je ne sais pas. fonction SearchFirstTime ((ret, BaseCycle, NewCycleForMS) if ((ret[1] === DAY && ret[2] === DAY) { Var array_day = []; pour ((var i = 1 ; i < 29; i += (NewCycleForMS / BaseCycle)) { Arrêtez de faire de la publicité. Je ne sais pas. pour ((var j = 0 ; j < array_day.length; j++) { Si le nombre de jours de l'array est supérieur à 0, alors le nombre de jours de l'array est supérieur à 0. retourner vrai; Je ne sais pas. Je ne sais pas. }else if(ret[1] === HOURS && ret[2] === HOURS) { Var array_hours = []; pour ((var i = 0 ; i < 24; i + = (NewCycleForMS / BaseCycle)) { Arrêtez de faire des erreurs. Je ne sais pas. pour ((var j = 0 ; j < array_hours.length ; j++) { Si le nombre d'heures est supérieur au nombre d'heures, alors il est supérieur au nombre d'heures. retourner vrai; Je ne sais pas. Je ne sais pas. }else if(ret[1] === MINUTES && ret[2] === MINUTES) { Var array_minutes = []; pour ((var i = 0; i < 60; i += (NewCycleForMS / BaseCycle)) { Arrêtez de faire des erreurs. Je ne sais pas. pour ((var j = 0; j < array_minutes.length; j++) { si ((ret[0] === Array_minutes[j]) { retourner vrai; Je ne sais pas. Je ne sais pas. Je ne sais pas. Le nombre de millisecondes du cycle de base: millisecondes du cycle de base: millisecondes du cycle de base: + Je ne sais pas. Je ne sais pas. Je ne sais pas. fonction Calc_High ((AssRecords, n, BaseCycle, NewCycleForMS) Var max = AssRecords[n].High; pour ((var i = 1 ; i < NewCycleForMS / BaseCycle; i++) { Max = Math.max ((AssRecords[n + i].High, max) est un enregistrement de mathématiques qui est un enregistrement de mathématiques. Je ne sais pas. retour max; Je ne sais pas. Je ne sais pas. fonction Calc_Low ((AssRecords, n, BaseCycle, NewCycleForMS) Var min = AssRecords[n].Low; pour ((var i = 1 ; i < NewCycleForMS / BaseCycle; i++) { Min = Math.min ((AssRecords[n + i].Low, min); Je ne sais pas. retourner min; Je ne sais pas. Je ne sais pas. fonction AssembleRecords (enregistrements, NewCycleForMS) { var AssRecords = records.slice ((0)); // Copie en profondeur Var AfterAssRecords = [];

if(!records || records.length < 2){
    throw (!records) ? "传入的records参数为 错误" + records : "基础K线长度小于2";
}
var BaseCycle = records[records.length - 1].Time - records[records.length - 2].Time;
if(NewCycleForMS % BaseCycle !== 0){
    throw "目标周期‘" + NewCycleForMS + "’不是 基础周期 ‘" + BaseCycle + "’ 的整倍数,无法合成!";
}
if(NewCycleForMS / BaseCycle > records.length){
    throw "基础K线数量不足,请检查是否基础K线周期过小!";
}

// Déterminez le temps d'attente, trouvez le temps de départ de la ligne K de base par rapport à la ligne K de destination. var objTime = nouvelle Date (); pour (var i = 0; i < AssRecords.length; i++) { ObjTime.setTime ((AssRecords[i].Time) est un fichier de fichiers enregistré par le système de fichiers. Var ret = GetDHM ((objTime, BaseCycle, NewCycleForMS));

    if (isFirstFind === true && SearchFirstTime(ret, BaseCycle, NewCycleForMS) === true) {
        FirstStamp = AssRecords[i].Time;
        for (j = 0; j < i; j++) {
            AssRecords.shift();        // 把目标K线周期前不满足合成的数据排除。
        }
        isFirstFind = false;
        break;                         // 排除后跳出
    }else if(isFirstFind === false){
        if((AssRecords[i].Time - FirstStamp) % NewCycleForMS === 0){
            for (j = 0; j < i; j++) {
                AssRecords.shift();    // 把目标K线周期前不满足合成的数据排除。
            }
            break;
        }
    }
}
var BarObj = {                         // 定义一个 K线柱结构
    Time: 0,
    Open: 0,
    High: 0,
    Low: 0,
    Close: 0,
    Volume: 0,
};
var n = 0;
for (n = 0; n < AssRecords.length - (NewCycleForMS / BaseCycle); n += (NewCycleForMS / BaseCycle)) {     // 合成
    /*
    {
    Time    :一个时间戳, 精确到毫秒,与Javascript的 new Date().getTime() 得到的结果格式一样
    Open    :开盘价
    High    :最高价
    Low :最低价
    Close   :收盘价
    Volume  :交易量
    }
    */
    BarObj.Time = AssRecords[n].Time;
    BarObj.Open = AssRecords[n].Open;
    BarObj.High = Calc_High(AssRecords, n, BaseCycle, NewCycleForMS); 
    BarObj.Low =  Calc_Low(AssRecords, n, BaseCycle, NewCycleForMS); 
    BarObj.Close = AssRecords[n + (NewCycleForMS / BaseCycle) - 1].Close;
    BarObj.Volume = AssRecords[n + (NewCycleForMS / BaseCycle) - 1].Volume;
    AfterAssRecords.push(cloneObj(BarObj));
}

BarObj.Time = AssRecords[n - (NewCycleForMS / BaseCycle)].Time + NewCycleForMS; // La dernière heure ne peut pas être modifiée, mais elle peut être modifiée. BarObj.Open = AssRecords[n].Open; le nom de l'enregistrement est le même que celui de l'enregistrement. BarObj.Close = AssRecords [AssRecords.length - 1].Close; BarObj.Volume = AssRecords [AssRecords.length - 1].Volume; Var max = AssRecords[n].High; Var min = AssRecords[n].Low; pour ((var index_n = n + 1 ;index_n < AssRecords.length; index_n++) { Max = Math.max ((max, AssRecords[index_n].High) est un enregistrement de mathématiques basé sur les données de base. Il est possible de modifier les données de base en utilisant les paramètres suivants: Je ne sais pas. BarObj.High = max; BarObj.Low = min; AprèsAssRecords.push (cloneObj (BarObj)) est une plateforme de téléchargement de contenu.

return AfterAssRecords;

Je ne sais pas. Je ne sais pas. fonction main() { // Le code de test Pendant que!exchange.IOJe ne sais pas si c'est vrai. LogStatus (en anglais seulement) Je ne sais pas. var Info = _C ((exchange.SetContractType, PMA705); // Synthèse des données de la ligne K du contrat du méthanol 705 testé Var records = exchange.GetRecords (en anglais seulement); pendant (!records de longueur < 24) { records = exchange.GetRecords (en anglais seulement); Je ne sais pas.
// Traiter les paramètres de l'interface, si vous avez écrit votre propre politique Var Num_UI_NewCycleForMS = 1 Il est également possible de modifier le nombre de cycles. Var array Num = UI_NewCycleForMS.split (en anglais seulement) pour ((var indexNum = 0 ; indexNum < arrayNum.length ; indexNum++) { Num_UI_NewCycleForMS = Num_UI_NewCycleForMS * Nombre (arrayNum [indexNum]); Je ne sais pas. Log (( le temps de millisecondes du cycle personnalisé est: , Num_UI_NewCycleForMS);
pendant (true) { records = _C (exchange.GetRecords); // Log (( les données de ligne K primitives: les barres de longueur, records.length, les données de barres: les barres, les records); records = AssembleRecords ((records, Num_UI_NewCycleForMS); // Le premier paramètre est la ligne K de base, le second paramètre est le nombre de millisecondes de cycle à convertir, 1000 * 60 * 20 qui est converti en 20 minutes // Log (après conversion des données de ligne K: longueur de la barre, records.length, données de la barre: barre, records); Le site officiel de l'entreprise est le site officiel de la société. Je ne sais pas si c'est vrai. Sleep ((1000); Je ne sais pas. Je ne sais pas.


- #### 2、传统期货差价监控 (CTP)

当需要分析两个品种差价走势的时候,会用上这段代码。有时候也会把这段代码修改集成到自己的策略程序里面(比如跨期对冲策略),代码会绘制出一个差价走势图,在学习如何让机器人程序画图也是很有帮助的,很好的例子。
源码地址: https://www.fmz.com/strategy/5379

Var __lastDiff = 0; Var __AType = [Last type, Buy type, Sell type][AType]; var __BType = [Last type,Buy type,Sell type][BType]; Je ne sais pas. fonction _N ((v, précision) { si (typeof ((precision)!= number ) { la précision est égale à 4; Je ne sais pas. Var d = parseFloat (v.toFixed) (Math.max (v. 10, précision + 5)); s = d.toString (().split ((""); if (s.length < 2 godu s[1]. longueur <= précision) { retour d; Je ne sais pas. Je ne sais pas. Var b = Math.pow ((10, précision); retour Math.floor ((d * b) / b; Je ne sais pas. Je ne sais pas. fonction AssureCall ((méthode) { Je ne sais pas. while (!(r = method.apply ((this, Array.prototype.slice.call ((arguments).slice))) { Je ne peux pas le faire. Je ne sais pas. retourner r; Je ne sais pas. Je ne sais pas. fonction on Tick (() { Var a = AssureCall (exchange.SetContractType, AInstrument) est un type de contrat qui est utilisé pour les appels en ligne. Var ticker A = AssureCall (exchange.GetTicker); Var b = AssureCall (exchange.SetContractType, BInstrument) est un type de contrat qui est utilisé par les utilisateurs pour les appels. Var ticker B = AssureCall (exchange.GetTicker); var diff = _N ((ticker A [__AType] - ticker B [__BType]); LogStatus ((a. InstrumentName, _N ((tickerA[__AType]), b. InstrumentName, _N ((tickerB[__BType]), Différences de prix: diff, diff); Si (__lastDiff! = 0) { si (Math.abs(Math.abs(diff) - Math.abs ((__lastDiff)) > 200) { retourner; Je ne sais pas. Je ne sais pas. si (diff! = __lastDiff) { // add ajoute des données à la série, le format des paramètres est [numéro de série, données]; __chart.add (([0, [new Date (().getTime ((), diff))); __lastDiff = diff; Je ne sais pas. Je ne sais pas. Je ne sais pas. fonction main (() { if (exchange.GetName)).indexOf ((Futures_CTP) == -1) { La plateforme throw ne prend en charge que les futures traditionnelles (CTP). Je ne sais pas. SetErrorFilter ((logininreadydeflowcontroldeflowcontroldeflowcontroldeflowcontrol de connexion de connexion de connexion de connexion de connexion de connexion de connexion de connexion de connexion de connexion)) // La fonction Chart doit être passée par une structure indépendante du contexte (jointe à la règle HighStocks, paramètre détaillé sur la façon d'utiliser HighStocks) __chart = graphique Un conseil: xDateFormat: %Y-%m-%d %H:%M:%S, %A Je ne sais pas. titre: { text: Diagramme de l'analyse des différences de prix Je ne sais pas. Série sélecteur: { Je ne sais pas. Il y a aussi des gens qui ont des problèmes de santé. compte: 1, Le texte est: Je ne sais pas. Il y a aussi des gens qui ont des problèmes de santé. Compte: trois. Le texte est: Je ne sais pas. Il y a aussi des gens qui ont des problèmes de santé. Compte: huit Le texte: 8h Je ne sais pas. Le type: text: all all all all Je ne sais pas. sélectionné: 0, inputActivé: faux Je ne sais pas. L'axe x: { type: le type de la date et du temps Je ne sais pas. L'axe y: { PlotLines: [{] La valeur est normale. La couleur: vert clair, rouge foncé. DashStyle: le style de la barre est le même que celui de la barre. largeur: 1, Je ne sais pas. La valeur: HighDiff Couleur: rouge vif. DashStyle: le style de la barre est le même que celui de la barre. largeur: 1, Je ne sais pas. Il y a une différence de valeur. La couleur: vert clair, rouge foncé. DashStyle: Une vidéo de l'événement. largeur: 1, Je ne sais pas. -Value: -HighDiff, Couleur: rouge vif. DashStyle: le style de la barre est le même que celui de la barre. largeur: 1, Je ne sais pas. Je ne sais pas. série: [{ Nom: Le prix de l'aluminium est en baisse Les données: Un conseil: valeur Décimals: 2 Je ne sais pas. Je ne sais pas. Je ne sais pas. // reset Effacer toutes les informations avant le graphique // __chart.reset (); Var a = AssureCall (exchange.SetContractType, AInstrument) est un type de contrat qui est utilisé pour les appels en ligne. Var b = AssureCall (exchange.SetContractType, BInstrument) est un type de contrat qui est utilisé par les utilisateurs pour les appels. Log ((a. InstrumentName + . + __AType, -, b. InstrumentName + . + __BType, la différence entre les prix de l'instrument et les gains est affichée sur la barre du graphique); TickInterval = Math.max ((TickInterval, 50); le nombre d'heures dans le jeu de mathématiques Interval = Math.max ((Interval, 50); le nombre de fois où le nombre est égal à 50; pendant (true) { OnTick (en anglais seulement); Je ne peux pas vous dire ce que je pense. Je ne sais pas. Je ne sais pas.


- #### 3、CTP手动全平CTP商品期货持仓

在Simnow 上测试 商品期货策略时经常需要把已经开过的仓位平掉重新测试代码,这样就需要个类似一键平仓的程序来处理 恢复模拟账号未开仓状态。这里使用了一个交易处理模块: $.NewPositionManager 就是该模块的接口函数,作用是生成一个对象,可以调用该对象的方法处理具体操作,比如 全平仓: CoverAll(); 。  做了一点额外的功能,在全部平仓完以后,会打印出所有交易的标的物名称。

Var p = $.NewPositionManager (en anglais seulement); fonction principale alors que (vrai) si vous avezexchange.IO("status") === vrai) { p.CoverAll (); Var positions = _C (exchange.GetPosition); Si vous avez un problème avec le paramètre de longueur, Log ((positions is :, positions); Je ne sais pas. Je ne sais pas. Je ne sais pas. LogStatus (le serveur n'est pas connecté, il est en attente); Je ne sais pas. Sleep ((2000) est un film américain. Je ne sais pas. Var dict =exchange.IO("instruments"); // renvoie la liste de tous les produits de l'échange { nom du produit: détails } au format dictionnaire Pour (var k in dict) { Log (nom du produit: dict[k]); Je ne sais pas. Log (exit., _C (exchange.GetPosition)); Je ne sais pas.

  
- #### 4、商品期货主力合约过滤

  在处理商品期货合约的连续性时会遇到主力合约的问题,如何更快的过滤识别出主力合约呢? 同样也写了个代码模块,可以改造,嵌入,或者单独使用。
  在 filter 变量中指定要 扫描的合约代码头。(即不含日期信息的合约代码的部分)  
    

Var est nul. Var strArray = []; fonction main (() { var filter = [MA,CF,zn,SR,pp,l,ni,i,v,jm,al,jd,cs,p]; Var produit = []; Log (en attente de connexion au serveur de transaction); Pendant (!exchange.IOIl est également possible de télécharger des vidéos sur YouTube. Log ((L'appareil a commencé à obtenir tous les appareils sous contrat); Var instruments = _Cexchange.IOIl y a aussi des sites de jeux vidéo. Log (liste de contrats pour accéder à la barre de succès); le nombre de fois où l'on utilise le langage Pour (Identifier les instruments) { Je ne peux pas le faire. Je ne sais pas. Log (liste de longueur des contrats: log, len); Pour (Identifier les instruments) { Si (instruments[instrumentId].IsTrading) { est le nombre d'instruments dans le jeu. Var trouvé = faux; Pour (var i = 0; i < filter.length; i++) { if (instruments[instrumentId].ProductID == filtre[i]) { trouvé = vrai; Je ne sais pas. Je ne sais pas. Si (!found) { est un nombre Continuez; Je ne sais pas. if (typeof(products[instruments[instrumentId].ProductID]) === undefined) { Les produits [instruments [instrumentId].ProductID] = []; Je ne sais pas. Les produits [instruments [instrumentId].ProductID].push ((instrumentId); les produits [instruments [instrumentId].ProductID].push ((instrumentId); les produits [instruments[instrumentId]; les produits [instruments] [instrumentId]; les produits [instruments] [instrumentsId]; les produits [instruments] [instrumentsId]; les produits [instruments] [instrumentsId]; les produits [instrumentsId]; les produits [instrumentsId]; les produits [instrumentsId]; les produits [instrumentsId]; les produits [instrumentsId]; les produits [instrumentsId]; les produits [instrumentsId]; les produits [instrumentsId]; les produits [instrumentsId] [instrumentsId] Je ne sais pas. Je ne sais pas. pour (var produit dans les produits) { Var ss = produits; Log ((Log de l'appareil de souscription, du produit, de l'appareil de l'appareil, ss.length, du contrat de l'appareil, pour identifier l'appareil principal du contrat); Var vol = 0, le volIdx est égal à 0, pour (var i = 0; i < ss.length; i++) { _C ((exchange.SetContractType, ss[i]); Je ne sais pas. Sleep ((5000) est une série de vidéos télévisées. pour (var i = 0; i < ss.length; i++) { _C ((exchange.SetContractType, ss[i]); Var ticker = exchange.GetTicker (en anglais seulement);

        if (ticker) {
            var obj = JSON.parse(exchange.GetRawJSON());
            if (obj.OpenInterest > vol) {
                vol = obj.OpenInterest;
                volIdx = i;
            }
        }
    }
    // 取消订阅行情(之后此合约K线将停止收集), 当然也可以不取消, 这里演示用
    for (var i = 0; i < ss.length; i++) {
        _C(exchange.SetContractType, "-" + ss[i]);
    }
    strArray.push(ss[volIdx]);
    Log("主力合约为", ss[volIdx], "持仓", vol, '#ff0000');
}
for(var i = 0 ; i < strArray.length; i++){
    str += strArray[i] + ',';
}
Log("主力合约:", str);

}


- #### 5、交互模块

  有时候需要给机器人交互,需要下命令、改参数、获取详细运行状态参数 就需要交互代码了。
  

fonction get_Command (() {// fonction responsable de l'interaction, l'interaction est mise à jour en temps réel. var keyValue = 0;// Les paramètres envoyés par la commande Var way = null; // routage var cmd = GetCommand ((); // obtenir l'API de commande interactive Si (cmd) { Log (en appuyant sur le bouton: log, cmd);// affiche le journal ArrStr = cmd.split ((":"); // La fonction GetCommand renvoie une chaîne, ce qui est un problème que j'ai résolu ici, car je veux être familier avec JSON. //, donc on traite d'abord la chaîne et on divise la chaîne de retour de la fonction en deux chaînes avec le chiffre://////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  if(arrStr.length === 2){//接受的不是 按钮型的,是数值型。
      jsonObjStr = '{' + '"' + arrStr[0] + '"' + ':' + arrStr[1] + '}'; // 把 字符串数组中的元素重新 
                                                                        //拼接 ,拼接成 JSON 字符串  用于转换为JSON 对象。
      jsonObj = JSON.parse(jsonObjStr); // 转换为JSON 对象

      for(var key in jsonObj){ // 遍历对象中的  成员名
          keyValue = jsonObj[key]; //取出成员名对应的 值 , 就是交互按钮的值
      }

      if(arrStr[0] == "upDateAmount"){// 此处为 数字型  。这里处理分为  按钮  和  数字型  。 详见 策略参数 设置界面 下的 交互设置
          way = 1;
      }
      if(arrStr[0] == "扩展1"){
          way = 2;
      }
      if(arrStr[0] == "扩展2"){
          way = 3;
      }
      if(arrStr[0] == "扩展3"){
          way = 4;
      }
  }else if(arrStr.length === 1){// 此处为 按钮型  
      //路由
      if(cmd == "cmdOpen"){ 
          way = 0;
      }
      if(cmd == "cmdCover"){
          way = 5;
      }
  }else{
      throw "error:" + cmd + "--" + arrStr;
  }
  switch(way){ // 分支选择 操作
      case 0://处理 发出开仓信号
          tiaojian = 1;
          break;
      case 1://处理
          Amount = keyValue;//把交互界面设置的 数值 传递给 Amount
          Log("开仓量修改为:",Amount);//提示信息
          break;
      case 2://处理

          break;
      case 3://处理

          break;
      case 4://处理

          break;
      case 5://处理 发出平仓信号
          tiaojian = 2;
          break;
      default: break;
  }

} }


  有时我们甚至需要在机器人运行时插入运行JS 代码:

var cmd = GetCommand ((); // Appelle l'API pour obtenir le message du contrôleur d'interaction de l'interface. if (cmd) { // Détermine s'il y a un message var js = cmd.split ((:, 2) [1]; // Split Retour de message Chaîne, limitée à 2 éléments, indexé à 1 Log (( exécute le code de débogage:??, js); // produit Le code exécuté essayez { // Détectez les anomalies eval ((js); // exécute la fonction eval, qui exécute le paramètre (code) transmis. } catch(e) { // Jeter une exception Log ((Exception, e); // produit une erreur Je ne sais pas. Je ne sais pas.




当然还有很多代码工具尽在 : https://www.fmz.com/square


#### 先写到这,欢迎读者给我留言!提出建议和意见,如果感觉好玩可以分享给更多热爱程序热爱交易的朋友 
https://www.fmz.com/bbs-topic/735

### 程序员 littleDream 原创

Plus de