Le journal d'apprentissage de la chimie quantique de l'inventeur (II) (Complet)

Auteur:Le petit rêve, Créé: 2016-05-22 20:05:36, Mis à jour: 2019-08-01 10:31:58

Il y a quelques jours, après avoir résolu quelques problèmes, j'ai eu l'impression de devoir écrire un modèle de graphique pour mon client, montrant des indicateurs (en particulier les indicateurs que j'ai écrits moi-même), des positions de négociation, etc. Comme je suis un débutant, je ne connais pas les highcharts, mais j'ai vu un exemple d'un produit à terme de taille Z.

Question 1: Quelle est la différence?

 var ChartObj = {//画图
    tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},
    chart: { zoomType:'x',panning:true },//图表类型  
    title: { text: ''}, //标题
    rangeSelector: {
            buttons:  [{type: 'hour',count: 1, text: '1h'}, {type: 'hour',count: 3, text: '3h'}, {type: 'hour', count: 8, text: '8h'}, {type: 'all',text: 'All'}],
            selected: 0,
            inputEnabled: false
        },
    subtitle: {text: " "},//副标题
    xAxis:{type: 'datetime'},
    yAxis: [{
            title: {text: 'K线'},//标题
            style: {color: '#4572A7'},//样式 
            opposite: false  //生成右边Y轴
        },
       {
            title:{text: 'WT'},
            opposite: true  //生成右边Y轴  ceshi
       }
    ],
    series: [//系列
        {name:'wt1',type:'spline',yAxis:1,data:[]},
        {type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},
        {name:'wt2',type:'spline',yAxis:1,data:[]},
        {type:'flags',onSeries:'wt',data:[]}
        ]                  
};
var chart = Chart(ChartObj);
var isFirst = true;
var preRecordTime = 0;
function Draw(){
    var strState = "";
    var fcolor = "";
    var msg = "";
    getRecords();
    if(isFirst === true){
        chart.reset();
        isFirst = false;
        preRecordTime = globalRecords[globalRecords.length - 1].Time;
    }
    if(preRecordTime === globalRecords[globalRecords.length - 1].Time){
        chart.add([1,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRecords.length - 1].Open,globalRecords[globalRecords.length - 1].High,globalRecords[globalRecords.length - 1].Low,globalRecords[globalRecords.length - 1].Close ],-1]);
    }else{
        //更新前一柱
        chart.add([1,[globalRecords[globalRecords.length - 2].Time,globalRecords[globalRecords.length - 2].Open,globalRecords[globalRecords.length - 2].High,globalRecords[globalRecords.length - 2].Low,globalRecords[globalRecords.length - 2].Close ],-1]);

        chart.add([1,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRecords.length - 1].Open,globalRecords[globalRecords.length - 1].High,globalRecords[globalRecords.length - 1].Low,globalRecords[globalRecords.length - 1].Close ]]);
       
        preRecordTime = globalRecords[globalRecords.length - 1].Time;
    }
    chart.update(ChartObj);
    //chart.reset(500);
}

Le code n'est pas bien affiché - cela peut sembler un peu bizarre, mais vous pouvez coller le texte sublime pour le voir. Tout d'abord, le problème est simple: lorsque le code est écrit, vous rencontrez une scène étrange.

C'est étrange, la barre de progression atteint 100%, elle est toujours coincée, elle ne bouge pas, elle devrait être coincée. J'ai également utilisé toutes sortes de méthodes pour tester, par exemple: limiter le nombre de cycles, afficher le nombre de cycles, ce qui est affiché jusqu'à la dernière fois que le cycle est bloqué. J'ai regardé le code du programme et j'ai eu l'impression qu'il ne devait pas y avoir de problème. La séquence de données que j'ai écrite lors de l'initialisation du graphique est la suivante:

 series: [//系列
        {name:'wt1',type:'spline',yAxis:1,data:[]},        //    索引为0的 数据项,   
        {type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},  // 索引为1
        {name:'wt2',type:'spline',yAxis:1,data:[]},    //索引为2
        {type:'flags',onSeries:'wt',data:[]}   //......
        ] 

Le programme écrit les données dans un graphique comme ceci:

  chart.add([1,[globalR.........    (太长了 没写完)      //   可以看到这里 我写入索引为1 的数据序列,就是add后面[ 符号后的 1,代表写入到{type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},  这个序列中。问题就在这,我越过了索引0,直接写入索引1的数据序列里,就会导致卡死。

J'ai donc modifié le texte en:

  series: [//系列
        {type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},
        {name:'wt2',type:'spline',yAxis:1,data:[]},
        {type:'flags',onSeries:'wt',data:[]}
        ]  

Tous les codes utilisés pour écrire des données sur un graphique sont modifiés (principalement en changeant 1 en 0).

 chart.add([0,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRe..........(太长了。。。)

C'est fantastique, ça ne colle pas, ça fonctionne sans problème. Même si je ne sais pas exactement pourquoi, j'ai l'impression que c'est un problème dans la bibliothèque de graphiques.


Question 2

Aujourd'hui, j'ai mis à jour le post car des amis ont posé des questions dans le groupe, et j'ai fait des recherches, résolu des problèmes, enregistré des informations spéciales.

Pourquoi les prix des contrats à terme sont-ils différents des prix réels?img

Je l'ai testé moi-même, et c'est vraiment différent. L'inventeur quantifie le robot. L'échange est OK futures, les dernières tendances du marché obtenues avec GetTicker. Il a écrit un extrait de code pour tester:

function main(){
    exchange.SetContractType("this_week");
    var ticker = exchange.GetTicker();
    var huilv = exchange.GetRate();
    var OKhuilv = exchange.GetUSDCNY();
    while(true){
        huilv = exchange.GetRate();
        ticker = exchange.GetTicker();
        OKhuilv = exchange.GetUSDCNY();
        LogStatus("ticker:",ticker,"\n","huilv",huilv,"OKhuilv",OKhuilv);
        Sleep(1000);
    }
}

Comment fonctionne-t-il?img imgJ'ai découvert que les taux de change sont différents, j'ai obtenu le taux de change avec 2 fonctions API différentes.imgVous avez vu l'API, et vous n'êtes pas d'accord avec le fait que les futures utilisent leur propre taux de change?

Le résultat est immédiatement visible sur la carte:imgComme le prix sur le site d'OK n'est que d'un chiffre après le chiffre inférieur (le reste n'est pas affiché dans son intégralité), il est probable qu'il y ait une légère erreur. Les résultats sont essentiellement les mêmes, et on ne peut pas être certain que les prix du marché obtenus par GetTicker et les prix obtenus par OK futures sur le site officiel soient différents, probablement causés par des taux de change incohérents.


Problème 3: Problème de la liste de prix de la plateforme Bitcoin OKcoin (Ce problème a été modifié et unifie maintenant la liste de prix du marché lors de la réévaluation et la liste de prix du marché en temps réel.https://www.fmz.com/bbs-topic/474


Question 4: Hier soir, un de mes amis m'a demandé où j'avais trouvé des exemples d'utilisation des boutons interactifs, et j'ai pensé, juste écrire moi-même, pratiquer, et par ailleurs, apprendre ensemble, la méthode ancienne, code d'abord!

/* 交互按钮 测试
while (true) {
  var cmd = GetCommand();
  if (cmd) {
    Log(cmd);
  }
  Sleep(1000);
}
*/
function main(){
    var cmd = null; //初始化一些用到的变量,这个变量是直接接受 GetCommand 函数 返回值的。
    var jsonObjStr = null; //接收JSON对象字符串 的变量
    var jsonObj = null; // JSON 对象
    var keyValue = null; // JSON 对象中的  KEY 的值
    var arrStr = null; // 字符串数组
    var ticker = exchange.GetTicker(); 
    while(true){
        $.Draw(); // 画图函数 , 图表模板的 导出函数
        while(!ticker){
            ticker = exchange.GetTicker();
            Sleep(500);
        }
        cmd = GetCommand(); //获取  交互命令
        if (cmd) {
            Log("按下了按钮:",cmd);
            arrStr = cmd.split(":"); // GetCommand 函数返回的 是一个字符串,这里我处理的麻烦了,因为想熟悉一下JSON ,所以先对字符串做出处理,把函数返回的字符串以 : 号分割成2个字符串。储存在字符串数组中。
            
            
            jsonObjStr = '{' + '"' + arrStr[0] + '"' + ':' + arrStr[1] + '}'; // 把 字符串数组中的元素重新 拼接 ,拼接成 JSON 字符串  用于转换为JSON 对象。
            //Log(jsonObjStr);//ceshi
            //Log(typeof(cmd));//ceshi
            /*ceshi
            for(var obj1 in cmd){ //  测试用  注释掉了
                Log(cmd[obj1]);
            }
            */
            
            jsonObj = JSON.parse(jsonObjStr); // 转换为JSON 对象
            //Log("ceshi"); //ceshi
            for(var key in jsonObj){ // 遍历对象中的  成员名
                keyValue = jsonObj[key]; //取出成员名对应的 值 , 就是交互按钮的值
            }
            Log(keyValue); //ceshi 
            switch(keyValue){ // 分支选择 操作
                case 1:
                    $.SignOP((new Date()).getTime(),ticker.Last,1,keyValue ); //开多仓
                    break;
                case 2:
                    $.SignOP((new Date()).getTime(),ticker.Last,1,keyValue ); // 开空仓
                    break;
                case 0:
                    $.SignOP((new Date()).getTime(),ticker.Last,1,keyValue );//平仓
                    break;
                default: break;
            }
        }
        Sleep(2000);
    }
}

J'ai testé le code ci-dessus, il n'est pas disponible sur Square, donc si vous voulez le tester, vous devez ajouter manuellement un bouton d'interaction.imgLes utilisateurs peuvent choisir d'utiliser les paramètres indiqués ci-dessus.

Regardez ce qui se passe:

img img

Bien sûr, la réévaluation des stratégies ne peut pas être testée, vous devez créer vous-même un robot, tester avec un simulateur, cliquez sur le bouton d'interaction, et l'opération correspondante sera marquée sur le graphique.


Question 5: Un utilisateur demande comment obtenir le nom de la monnaie électronique actuellement en activité et comment obtenir le cycle de la ligne K actuelle.

function main() {
    var records = exchange.GetRecords();
    while(!records || records.length < 2){
        records = exchange.GetRecords();
        Sleep(500);
    }
    var currency = exchange.GetCurrency();
    var diffTime = records[records.length - 1].Time - records[records.length - 2].Time;
    if(diffTime/1000 >= 1 && diffTime/1000 < 60){
        Log("周期:",diffTime/1000,"秒");
    }else if(diffTime/1000/60 >= 1 && diffTime/1000/60 < 60 ){
        Log("周期:",diffTime/1000/60,"分钟");
    }else if(diffTime/1000/60/60 >= 1 && diffTime/1000/60/60 < 24 ){
        Log("周期:",diffTime/1000/60/60,"小时");
    }else if(diffTime/1000/60/60/24 >= 1){
        Log("周期:",diffTime/1000/60/60/24,"天");
    }
    Log("货币品种:",currency);
}

Les amis intéressés peuvent essayer.


Question 6: Si vous ne comprenez pas les fonctionnalités ajoutées à la nouvelle bibliothèque de négociation de produits à terme, vous pouvez partager le code de la nouvelle version annotée avec le groupe QQ.

  • Le modèle de stratégie peut être copié sur la place des stratégies.img

Question 7: Que signifie x = [1 for i in range ((n) ]?

  • J'ai passé ces deux jours libres à regarder python, l'apprentissage général n'a pas été difficile, mais j'ai rencontré beaucoup de problèmes.

    Question: que signifie x = [1 pour i in range ((n)) ]? J'ai déjà grandi en voyant ça, et j'ai l'impression de n'avoir jamais vu une telle syntaxe auparavant. Je devine, je ne sais pas ce que cela signifie.

C'est une analyse de liste en python, qui consiste à former une liste de 1 à n. Une des caractéristiques les plus puissantes de Python est son analyse des listes, qui fournit une méthode compacte permettant d'appliquer une fonction à chaque élément de la liste et ainsi de cartographier une liste dans une autre liste. > La compréhension des listes est plus simple et plus rapide que la compréhension des listes. > La compréhension des listes est plus fine et plus rapide que celle des for. 2. analyse de la liste de base de base [x pour x dans la gamme ((5)] # [0, 1, 2, 3, 4] l1 = [1, 2, 3,4] [x*2 pour x dans la gamme l1] # [2, 4, 6,8] [ %s = %s for (k, v) in a_map.items (()) ] est une application de mise en page de fichiers L1 est égal à [1, 2, 3, 4]. L2 est égal à [1, 2, 3, 4]. [x + y pour x dans l1 pour y dans l2] [2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7, 8] Je vais vous montrer comment faire. On peut appeler la fonction [ func ((x) for x in l1] # équivalente à map Notez que le partage des listes ne modifie pas la valeur de la liste originale, mais crée une nouvelle liste. 3. Analyse de la liste des conditions [ x pour x dans la gamme ((100) if x%2 ==0 ] 4., la liste de niches parallèle mat = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]] remplace les matrices [ [row[i] for row in mat] for i in (0,1,2)] # [[1, 4, 7], [2, 5, 8], [3, 6, 9]] Ce billet est tiré d'un article du blog CSDN de Liang Yue.

Pour être honnête, je n'ai pas bien compris ce qui précède, mais il me semble que c'est un peu clair en termes conceptuels, la phrase devrait avoir un rôle d'hypothèse.
Voir d'autres personnes qui aident avec enthousiasme:

i tourne dans une plage de range ((n), c'est-à-dire i = 0, 1, 2,..., n-1, respectivement calculé pour la valeur de l'expression précédente, comme un élément de la liste L'expression est 1, dont les valeurs correspondantes sont respectivement 1, 1, 1..., pour n 1, ce qui donne une liste de n 1 [1, 1...]

Il semble que cela soit plus clair, voyons.

x = [i pour i dans la liste] Mappant une liste à une autre liste, chaque élément étant une variable i x = [1 pour i dans la plage ((n) ] Mettez la liste range ((n) sur la liste x, chaque élément étant une constante de 1 Bienvenue à forpython.com pour discuter

Problème 8: Python n'a pas de base solide, a été retourné négligé pendant une demi-journée, voir ci-dessous le problème

Hier, j'ai écrit une stratégie de test pour une ligne uniforme de Python CTP, et le patron m'a demandé de tester le système de retouche de Python CTP. Aujourd'hui, en continuant à tester, nous avons découvert que la stratégie n'était pas du tout conforme à l'équilibre de la fourchette d'or. Les fonctions croisées ne renvoient pas les valeurs correctes par leur conception:

def Cross(records,fast,slow): # 交叉函数 ,参数是  records K线数据   、  fast 快线周期   、slow 慢线周期
    global array_S_MA,array_F_MA   # 使用外部的 全局变量
    array_F_MA = TA.MA(records,fast)  # 调用指标函数
    array_S_MA = TA.MA(records,slow)
    n = 0   # 返回的信号值   0:不操作   , 1 : 金叉     -1: 死叉 
    if array_F_MA[-2] > array_S_MA[-2] and array_F_MA[-3] < array_S_MA[-3] and array_F_MA[-4] < array_S_MA[-4]:
        n = 1
        return n
    elif array_F_MA[-2] < array_S_MA[-2] and array_F_MA[-3] > array_S_MA[-3] and array_F_MA[-4] > array_S_MA[-4]:
        n = -1 
        return n

Comment? Vous voyez, c'est une erreur très novatrice! J'ai écrit le retour n dans la branche conditionnelle, ce qui semble être un bon problème. Je vais vous donner une autre valeur.

Nous avons fait une petite expérience:

img

Définissez une fonction de test qui ne produit qu'un seul message.

img

Et nous allons appeler cela, et nous allons écrire ça, et voir si None est égal à -1.

img

Il est clair que lorsque la fonction n'exécute pas de retour, la valeur de retour de la fonction est None, et que None n'est pas égale à −1, mais que si None est inférieur à 0, c'est une valeur vraie.

Question 9: Le problème de la citation en boucle de JS.

Par exemple, le code ci-dessous donne une erreur:

function main(){
    obj = {
        exchange : null,
        initAccount : null,
        state : 0,
        exchangeName : "",
    }
    obj.name = "OKCoin";
    obj.exchange = exchange;
    obj.initAccount = obj.exchange.GetAccount();
    obj.state = 2;
    var table = {
        type : 'table',
        title : '测试',
        cols : ['obj属性名', '值'],
        rows : [],
    };
    for(var k in obj){
        table.rows.push([k, obj[k]]);
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

img

TypeError: Converting circular structure to JSON (cette erreur m'a pris une demi-heure!)

J'ai réfléchi pendant une demi-journée et j'ai découvert le problème.obj.exchange = exchange;La citation en boucle qui en résulte est décisive lorsqu'elle rencontre k ===?? exchange?? dans la boucle for (var k in obj).

Le code est le suivant:

function main(){
    obj = {
        exchange : null,
        initAccount : null,
        state : 0,
        exchangeName : "",
    }
    obj.name = "OKCoin";
    obj.exchange = exchange;
    obj.initAccount = obj.exchange.GetAccount();
    obj.state = 2;
    var table = {
        type : 'table',
        title : '测试',
        cols : ['obj属性名', '值'],
        rows : [],
    };
    for(var k in obj){
        if(k === 'exchange'){  // 增加的代码
            continue;
        }
        table.rows.push([k, obj[k]]);
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

img

C'est normal, mais peut-on voir comment la citation circule? (pour l'instant, il y a un peu de confusion, pouce!)

Question 10: Commodity Futures Ouvrir une position vendredi soir, détenir une position, appeler la fonction GetPosition après l'ouverture du marché le lundi suivant, obtenir des informations sur la position et pourquoi

img

La raison en est la suivante:

img

Voir les différentes valeurs des attributs type des positions spécifiques des objets de stockage d'informations:https://www.fmz.com/bbs-topic/672

En voyant cela, j'ai senti que je devais commencer à le faire... et vous?

Plus de

- Je ne sais pas.Je vous écris.

Le petit rêveJe suis prêt à écrire beaucoup, alors j'ai demandé un espace QQ spécialement pour que ce soit facile à voir et à trouver.