Die Quantenchemie-Lerntagebuch der Erfinder (II) (abgeschlossen)

Schriftsteller:Kleine Träume, Erstellt: 2016-05-22 20:05:36, Aktualisiert: 2019-08-01 10:31:58

Vor ein paar Tagen, nachdem ich ein paar Probleme gelöst hatte, fühlte ich mich in der Zeit, als ich den Kunden den Code geschrieben habe, sehr notwendig, eine Diagrammvorlage zu schreiben, die Indikatoren (insbesondere die von mir geschriebenen Indikatoren) und Handelspositionen usw. zeigt.

Frage eins:

 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);
}

Der Code ist nicht gut angebracht - vielleicht sieht man es mit einem kleinen Blick an, man kann es einfach kleben, um den Sublime Text zu sehen.

Es ist merkwürdig, dass die Fortschrittsleiste bis zu 100% steckt und nicht bewegt, sondern nicht tot ist. Ich habe auch verschiedene Methoden verwendet, um zu testen, wie z. B. die Anzahl der Zyklen zu begrenzen, die Anzahl der Zyklen anzuzeigen, was angezeigt wird, bis die letzte Laufzeit des Zyklus feststeckt. Ich habe mir den Code angesehen und dachte, es müsste kein Problem sein. Ich konnte es nicht lösen. Bei der Initiierung des Diagramms schrieb ich die Datenserie so:

 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:[]}   //......
        ] 

Die Daten, die in einem Programm in ein Diagramm geschrieben werden, sehen so aus:

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

Ich habe es also geändert:

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

Alle Daten, die in ein Diagramm geschrieben werden, werden in Code umgewandelt (vor allem 1 in 0 umgewandelt)

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

Es ist fantastisch, es klebt nicht, es funktioniert ohne Probleme.


Frage 2

Heute habe ich den Beitrag aktualisiert, weil ein Freund in der Gruppe ein Problem gestellt hat, und ich habe es durch Recherche, Problemlösung und spezielle Aufzeichnungen aufgezeichnet.

Getticker erhält Futurespreise, die sich von den tatsächlichen Preisen unterscheiden.img

Ich habe es selbst getestet und es ist wirklich anders. Der Erfinder quantifiziert den Roboter. Die Börse ist OK Futures, die neuesten Marktpreise, die mit GetTicker erhalten wurden. Ich schrieb einen Code, um einen Test zu machen:

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);
    }
}

Wie funktioniert es:img imgIch habe zwei verschiedene API-Funktionen verwendet, um den Wechselkurs zu erhalten.imgIch habe die API gesehen und nicht die OK-Futures, die ihren eigenen Wechselkurs verwenden.

Das Ergebnis ist direkt auf der Grafik:imgDa die Preise auf der OK-Webseite nur eine Stelle nach der kleinen Zahl sind (die restlichen sind nicht vollständig angezeigt), wird ein kleiner Fehler geschätzt. Da die Ergebnisse im Wesentlichen gleich sind, kann man nicht ganz sicher sein, ob der Unterschied zwischen dem Marktpreis von GetTicker und dem des OK Futures auf der Website wahrscheinlich durch Wechselkursungleichgewichte verursacht wurde.


Problem 3: Bitcoin OKcoin-Plattform Marktliste Problem (Dieses Problem wurde angepasst, um die Marktliste bei der Rückprüfung und die Marktliste bei der Echtzeit zu vereinheitlichen: Der zweite Parameter für den Einkauf ist die Menge an RMB, der zweite Parameter für den Verkauf ist die Anzahl der angebotenen Gegenstände.https://www.fmz.com/bbs-topic/474


Frage 4: Letzte Nacht fragte mich ein Freund, wo ich ein Beispiel für die Strategie und den Einsatz von Interaktionsknöpfen hätte, und ich dachte, ich schreibe einfach selbst und übe meine Hände, um es übrigens für alle einfach zu machen.

/* 交互按钮 测试
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);
    }
}

Der Code, den ich getestet habe, ist nicht öffentlich zugänglich, also müssen Freunde, die es testen möchten, manuell einen Interaktionsknopf hinzufügen.imgDas ist eine sehr schwierige Aufgabe.

Sieh mal, wie es läuft:

img img

Natürlich ist die Strategiewiederholung nicht zu testen. Man muss den Roboter selbst erstellen und mit der Analogdiskette testen. Klicken Sie auf den Interaktionsknopf, und der entsprechende Vorgang wird auf dem Diagramm markiert.


Frage 5: Ein Benutzer fragt, wie man den Namen der aktuell betriebenen E-Währung erhält und wie man die aktuellen K-Linien-Zyklen erhält.

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);
}

Interessierte Freunde können es ausprobieren.


Frage 6: Wenn die Funktionen, die für die neue Version der Commodity Futures Trading Library hinzugefügt wurden, nicht verstanden werden, können Sie den neuen Kommentarcode an die QQ-Gruppe herunterladen.

  • Die Strategie-Vorlage kann auf Strategie-Platz kopiert werden.img

Frage 7: Was bedeutet x = [1 for i in range ((n)) ]?

  • Ich habe zwei freie Tage mit Python verbracht, und das Lernen ist insgesamt nicht schwer, aber ich habe immer noch viele Probleme.

    Die Frage ist: Was bedeutet x = [1 für i in range ((n))? Als ich das erste Mal hier sah, war ich auch schon erwachsen, und es schien, als hätte ich diese Grammatik noch nie zuvor gesehen.

Dies ist eine Listeanalyse in Python, die eine Liste von 1 bis n bildet. Definition und Beschreibung Eine der starken Eigenschaften von >Python ist die Paralyse von Listen, die eine kompakte Methode bietet, um eine Liste auf eine andere Liste zu übertragen, indem man eine Funktion auf jedes Element in einer Liste anwendet. >Listenparalyse, auch als Listeinführung bezeichnet. >Listenparalyse ist schneller und leichter zu betreiben als for. 2. Grundlisten zu analysieren Grundlisten [x for x in range ((5)] # [0, 1, 2, 3, 4] l1 = [1, 2, 3,4] [x*2 for x in l1] # [2, 4, 6,8] Mehrwertige [ %s = %s for (k, v) in a_map.items (()) ] Zwei Runden l1 ist [1, 2, 3, 4]. L2 ist gleich [1, 2, 3, 4]. [x+y für x in l1 für y in l2] [Zwei, drei, vier, fünf, drei, vier, fünf, sechs, vier, fünf, sechs, sieben, fünf, sechs, sieben] Die Funktion [ func ((x) for x in l1] # ist gleich der Map Bitte beachten Sie, dass das Parsen der Liste die Werte der ursprünglichen Liste nicht ändert, sondern eine neue Liste erzeugt. 3. Analyse der Bedingungenliste [ x for x in range ((100) if x%2 == 0 ] 4., Nischenliste analysierenmat = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]] Wechsel Matrix [ [row[i] for row in mat] for i in (0,1,2)] # [[1, 4, 7, [2, 5, 8], [3, 6, 9]] Das ist ein CSDN-Blog-Artikel von Ling Yue.

Ich habe nicht viel von dem oben genannten verstanden, aber es scheint mir konzeptionell ein wenig klar zu sein, dass es eine Art Wiederholung geben sollte.
Sieh dir auch andere Hilfsbereitschaften an:

i wird im Bereich von range ((n), d. h. i = 0, 1, 2,..., n-1, als Punkt in der Liste umgedreht, wobei der Wert des vorherigen Ausdrucks for berechnet wird Der Ausdruck ist 1, die entsprechenden Werte sind 1, 1, 1..., für n 1, erzeugt eine Liste, die n 1 enthält [1, 1...]

Das scheint klar zu sein, schauen wir mal.

x = [i für i in der Liste] Eine Liste wird auf eine andere Liste mit jeder einzelnen Variablen i abgebildet x = [1 für i in range ((n) ] Mappung der Listerange ((n) auf eine Liste x, wobei jedes Element auf die Konstante 1 gesetzt wird Bitte besuchen Sie die Seite forpython.com

Problem 8: Die Python-Grundlagen sind nicht solide, wurde zurückgegeben, wurde für einen halben Tag vernachlässigt.

Gestern schrieb ich eine Teststrategie für die Python CTP Commodity Futures Equilibrium, und mein Chef ließ mich das Python CTP Commodity Futures Retesting System testen. Heute weiter zu testen und festzustellen, dass die Strategie nicht ganz nach der Gleichlinien-Goldfork-Tod-Fork-Operation zu öffnen, das Gefühl, dass es Probleme geben muss, einzelne Funktionen zu überprüfen, zu testen und zu finden. Die Cross-Funktion kehrt nicht den richtigen Code zurück, wie sie entworfen wurde:

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

Wie? Siehst du, das ist ein sehr neuer Fehler! Ich habe die return n in den bedingten Zweig geschrieben, das scheint kein Problem zu sein. Was wird zurückgegeben?

Wir haben ein kleines Experiment gemacht:

img

Definition einer Testfunktion, die nur eine Nachricht ausgibt

img

Wir schreiben es so, um zu sehen, ob None gleich -1 ist.

img

Die Ergebnisse zeigen, dass, wenn keine return ausgeführt wird, der Wert der Funktion zurückgegeben wird, der auch nicht gleich -1 ist, aber wenn None kleiner als 0 ist, dann ist dies ein wahrer Wert.

Frage 9: JS-Zyklus-Zitat-Problem

Der Code liefert einen Fehler, zum Beispiel:

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 (Dieser Fehler hat mich eine halbe Stunde gekostet!), Dieser Fehler wurde bei Baidu nachgefragt.

Ich habe einen halben Tag nachgedacht, und dann habe ich das Problem entdeckt.obj.exchange = exchange;Der daraus resultierende Kreislaufbezug springt über, wenn er in der For ((var k in obj) Kreislauf k === exchange trifft.

Der Code lautet:

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

Das ist natürlich normal, aber kann man sehen, wie man die Quellen kreist?

Frage 10: Kommoditäts-Futures Am Freitagabend Eröffnen der Position, halten die Position, rufen Sie die Funktion GetPosition an, nachdem sie am nächsten Montag eröffnet wurde.

img

Die Gründe hierfür sind:

img

Für die einzelnen Werte der type-Attribute für die Positions-Spezifikationen der Informationsaufbewahrungsobjekte:https://www.fmz.com/bbs-topic/672

Als ich das sah, fühlte ich mich verpflichtet, es in die Praxis umzusetzen.

Mehr

- Das ist nicht wahr.Ich habe es einfach aufgeschrieben.

Kleine TräumeIch bin bereit, viel zu schreiben, also habe ich speziell einen QQ-Bereich beantragt, um es einfach zu sehen und zu finden.