Der Erfinder-Quantitätschemie-Lehrbuch (I) abgeschlossen

Schriftsteller:Kleine Träume, Erstellt: 2016-05-23 23:10:46, aktualisiert: 2019-08-01 10:31:25

Früher schrieb man selten ein Tagebuch, jetzt fühlt es sich so an, als müsste man jeden Tag etwas notieren, kann man sich nicht in die Finsternis stürzen!

Frage eins:

  • 1, Die K-Zeile des Diagramms fehlt manchmal an einem BAR und sucht nach BUG. Das Problem wurde gefunden, analysiert und keine Daten erhalten, als es mit der Analogdiskette getestet wurde. Zum Zeitpunkt der Annahme der Daten sind 2 BARs vergangen, so dass die neuesten Daten auf dem Diagramm abgebildet sind, was dazu führt, dass eine oder mehrere Zwischenstufen vergangen sind.
  • 2, läuft eine Weile (K-Linienzyklus von 1 Minute) ohne Probleme, versucht es noch einmal (K-Linienzyklus von 30 Minuten) und es kommt ein seltsames Problem:

TypeError: cannot read property length of null duk_hobject_props.c:2258 WToneAndWTtwo __FIL Dieser Fehler wird zurückgegeben.

Wenn ich einen Fehler sehe, der in der Funktion WToneAndWTtwo erscheinen sollte, dann lese ich die Eigenschaft der Namen der Null-Werte, genannt length, also eine Variable wie var name = null; dann lese ich die Null-Werte, die die Namen der Null-Werte, die Namen der Null-Werte, genannt length, haben. Name.length wurde gelesen, um den Ort zu finden, an dem sich die Länge im gesamten Code befindet.

function isNullAndLog(arr,strArrName){//空数组报错
     if(!arr){
         Log("arr is:",arr,"name:",strArrName);
         return true;
      }
      return false;
}

Denken Sie, hey! Ich habe alle Variablen, die bis zur Länge verwendet werden, in diese Funktion eingegeben, um zu testen, ob es einen Null-BUG gibt. Ich habe 30 Minuten lang K-Funk getestet, und dann ist es wieder gegangen:

TypeError: kann Eigenschaft length von null duk_hobject_props.c:2258 WToneAndWTtwo nicht lesenDateiEin Fehler wurde gemeldet.

Das ist nicht zu verstehen! Geduld! Geh raus und dreh dich um, um deine Gedanken zu ändern, oder du wirst aufwachen! Als ich zurückkam, dachte ich mir, ob ich die Indikatorbank aufgerufen habe, die eingegebenen Parameter waren null, die Indikatorbank wurde ausgeführt und es gab einen Fehler.

function isNullAndLog(arr,strArrName){//空数组报错
    if(!arr){
        Log("arr is:",arr,"name:",strArrName);
        return true;
    }
    return false;
}

function main(){
   if(typeof(x) === undefined ){
       Log(typeof(x));
   }
    var aaa = null;
    Log(isNullAndLog(aaa));
    /*
    while(!aaa || aaa.length < 9){
        Log("while xunhuan");
        Sleep(5000 * 1000);
    } 
    */
    talib.EMA(aaa,5);
} 

Talib.EMA ((aaa,5); der Schlüssel ist aaa null, das habe ich absichtlich gesetzt, um zu sehen, was passiert. TypeError: Cannot read property length of null ~~OK. Das ist wahrscheinlich das Problem.

Frage zwei:

Ein weiteres Problem ist, dass man jetzt den Code aufzeichnet, der vorher gedacht wurde:

function DeleteNullEle(initArr){
    var dealArr = [];
    var initArrLen = initArr.length;
    for(var i = 0,j = 0 ; i < initArrLen ; i++,j++){
    //Log("initArr-",i,":",initArr[i]);//ceshi
    if(initArr[i] === null || isNaN(initArr[i]) ){
        j--;
        //Log("i:",i);//ceshi
        continue;
    }
        dealArr[j] = initArr[i];
    }
    //Log("dealArr:",dealArr);//ceshi
return dealArr;
}

Das ist der Grund, warum manche Arrays so aussehen [NaN, NaN, NaN, 22, 3, 56, 78, 4, 23]. Ich habe mich so lange verwirrt, aber ich muss mich daran erinnern, dass du Null oder NaN siehst, also kann man Null nicht beurteilen.
Wenn aaa === null ist, warum gibt es keine Fehlermeldung, denn die Ausdrücke für diesen Operator sind in der Regel null, wenn die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke. Wenn die Ausdrücke in aaa.length immer wahr sind, dann wurde die aaa.length wahrscheinlich nicht ausgeführt. Einige der APIs wurden verwendet.

Frage drei:

Ein weiterer Anforderung, die ich von einem Freund erhalten habe, war die Änderung der Preisdifferenzüberwachung, nämlich die Ermittlung der Differenzbereiche, und WeChat-Push ist sehr einfach.

 if (diff != __lastDiff) {
//--------------------------------------------------------------------------------------------
        if(openWeixin){
            if( (diff <= price1 || diff >= price2 ) && off_on === true ){
                Log("差价:"+diff+"微信推送@");
                off_on = false;
                Sleep(1000);
            }else{
                off_on = true;
                Sleep(1000);
                }
        }
//---------------------------------------------------------------------------------------------
        // add添加数据到series, 参数格式为[series序号, 数据];
        __chart.add([0, [new Date().getTime(), diff]]);
        __lastDiff = diff;
    }

img

Es ist einfach und möglicherweise noch nicht perfekt.

Frage 4 (nicht wirklich eine Frage, nur ein bisschen Aufzeichnungen)

Die Strategie des Futures-Lernens ist heutzutage komplizierter als die des Futures-Lernens. (Wir haben glücklicherweise ein großes Futures-Trading-Modell, sonst ist es einfach genug, die Details zu schreiben.) Es ist wichtig, die Grundlagen zu verstehen, z. B.: Kauf- und Verkaufsposten, Verkaufspositionen, Kauf- und Verkaufspositionen. Außerdem ist die API für Futures-Handel viel komplexer als die für Bargeld.

  • exchange.GetPosition ((() // wird verwendet, um die Informationen zu erhalten. Beachten Sie, dass diese Funktion eine Array von Positionsstrukturen zurückgibt, die alle Informationen zur Position enthalten.
  • exchange.SetMarginLevel (MarginLevel) // Diese Funktion ist für die Einstellung des Hebels verwendet. Spezifische Parameter MarginLevel Auswahl ((5 mal? 10 mal?) je nach Sorte, Börse, spezifisch, einige können nicht geändert werden (z. B. CTP Commodity Futures)
  • exchange.SetDirection ((Direction) // Dies ist eine sehr wichtige API, die vor dem folgenden Aufruf verwendet wird, da gerade vier Operationen eingeführt wurden ((Sell Open Position...), die diese Operationen einstellen.
  • exchange.SetContractType ((ContractType) // Vor der Eröffnung oder dem Ausgleich einer der Optionen besteht darin, die Richtung der Transaktion zu bestimmen (mehr oder weniger oder weniger), und der andere besteht darin, die Art der Transaktion zu bestimmen (Weißzucker? Die Funktionen werden im Wesentlichen mit diesen Funktionen verwendet.
  • exchange.Buy ((() // Kaufen
  • exchange.Sell ((() // Verkaufen Hier ist der Code meines Experiments, der nur einen Abschnitt (der in der Main-Funktion kopiert werden kann) auswählt und wieder testet.img
 if (!manager) {//Z大写的商品期货模板类库,用来管理交易的对象(manager 初始时null)。不明白的可以去看源代码,QQ群共享有注释版。
        if (_C(exchange.GetPosition).length > 0) {
            throw "策略启动前不能有持仓.";
        }
        Log('交易平台:', exchange.GetName(), _C(exchange.GetAccount));  //输出当前交易所 信息
        var insDetail = _C(exchange.SetContractType, ContractTypeName);  // 用容错函数 _C ,容错调用 SetContractType函数  首先明确 设置交易的合约类型。
        Log("合约", insDetail.InstrumentName, "一手", insDetail.VolumeMultiple, "份, 最大下单量", insDetail.MaxLimitOrderVolume, "保证金率:", insDetail.LongMarginRatio.toFixed(4), insDetail.ShortMarginRatio.toFixed(4), "交割日期", insDetail.StartDelivDate);
        // 上面这个Log 显示出合约的一些信息,注意 在回测的时候,与实际运行的结果不一样,可以看图杠杆都是null,保证金率都是0,可以试试看。
        manager = $.NewPositionManager();  // 这个生成管理者 对象
    }
    exchange.SetMarginLevel(10); //不支持       在这里我试着设置了一下杠杆试试,发现  显示 错误:Not support     ,CTP商品期货 应该不能自己调整杠杆
    var positions = exchange.GetPosition();     在所有的操作前 ,我试着调用了一下 GetPosition 函数  获取一下持仓信息,显示的null
    Log(positions[0]);
    exchange.SetDirection("buy"); // 在所有的操作前需要设置  操作方向  ,这里设置 买开仓(做多)。
    var id = exchange.Buy(1911,1); // 执行买入操作  下了一个  限价单,  有兴趣的同学 可以试试 市价单。(嘿嘿!自己动手记得牢)
    positions = _C(exchange.GetPosition); //再获取下 持仓信息 看看
    Log(positions);  //有持仓信息了,  在上面 Buy的时候  有兴趣的同学 试试 用低价格 买入。  Buy(1000,1) 看看。

Frage 5: Heute hat ein Freund einen Code geschrieben, der die Funktion Sleep ((() mit einem großen Fehler beeinflusst, der die Hochfrequenzpolitik beeinträchtigt.

function main(){
    for(var i = 0 ; i < 10 ; i++){
        var b1 = 0;
        var b2 = 0;
        var b3 = 15;
        while(b1 < 200){
            var t2s1 = (new Date()).getTime();
            b1++;
            Sleep(b3);
            var t2s6 = (new Date()).getTime();
            b2 += (t2s6 - t2s1);
        }
        Log("Sleep()",b3,"MS",b1,"平均次数",b2/b1);
    }
    throw 2;
}

Ich habe eine Nachprüfung durchgeführt und festgestellt, dass die Sleep-Funktion in der Nachprüfung 1 Sekunde läuft (Zeitverschiebung von 1000), und dann ist der zeitliche Fehler des Testcodes sehr groß, aber bei einem Analoglauf liegt der Fehler grundsätzlich innerhalb von 1 Millisekunde. Möglicherweise ist der Fehler des Nachprüfsystems im Sandbox-Modell und der Fehler, der durch die Algorithmen des Laufzeitraums verursacht wird. Die Simulation hat einen geringen Fehler (Zwischen 1 Sekunde).

Frage 6: Heute Morgen schickte mir ein Freund, der mir erzählt hat, dass der Host in der Mitte der Nacht abgestürzt ist, ein Systemprotokoll.

- Das ist ein Tagebuch.

runtime/cgo: pthread_create failed: Resource temporarily unavailable
SIGABRT: abort
PC=0x7f332c591cc9 m=2

goroutine 0 [idle]:

goroutine 1 [select, 207 minutes]:

Aus der ersten Zeile sieht man, dass die Threadgenerierung fehlschlägt und die Ressourcen vorübergehend nicht verfügbar sind (nicht ausreichend). Die Lösung: 1. Überprüft, ob der laufende Roboter-Politikcode nicht freigegeben wurde und ob es eine API mit mehreren Themen gibt. 2, mit dem ulimit-Befehl überprüfen Sie die Systembeschränkungen des Administrators ((Linux) ).http://smilejay.com/2012/04/fork_resource/Ich habe ihn nicht gesehen. 3. Achten Sie auf den Einsatz von Systemspeicher.

Siehe ulimit -a:img

Die Parameter des Befehls ulimit: -H setzt Hardware-Ressourcen-Beschränkungen. -S setzt Soft-Resource-Einschränkungen. -a zeigt alle aktuellen Ressourcenbeschränkungen an. -c size: Maximaler Wert der Kerndatei. Einheit: blocks -d size: Maximaler Wert des eingestellten Datensatzes. Einheit: kbytes -f size: Setzen Sie den maximalen Wert für die Erstellung der Datei. Einheit: blocks -l size: Maximaler Wert, den ein Prozess im Speicher sperren kann. Einheit: kbytes -m size: Setzen Sie den maximal verfügbaren Speicherwert. Einheit: kbytes -n size: Setzt den maximalen Wert für alle zugleich geöffneten Dokumentenkennzeichen des Kerns. Einheit: n -p size: Maximaler Wert für die Pipeline Bufferzone. Einheit: Kbytes -s size: Setzen Sie den maximalen Wert des Stapels. Einheit: Kbytes -t size: Setzt die maximale CPU-Nutzung. Einheit:seconds -v size: Höchstwert für den virtuellen Speicher. Einheit: Kbytes -u < Anzahl der Programme> Höchstzahl der Programme, die ein Benutzer starten kann

Ein Freund, der das Problem hatte, fand heraus, dass die Fehlerfilterfunktion möglicherweise die Ursache für das Problem war, und fand heraus, warum der Host (die ständig wachsende Speicher) zusammenbrach. SetErrorFilter (( 502: 503: tcp character unexpected networktimeout WSARecv Connect GetAddr no such reset httppreceived EOF reused ); Funktion Missbrauch, die Funktion muss nur einmal aufgerufen werden und kann nicht in die Loop-Struktur geschrieben werden.

Frage 7: Einfache Zusammenfassung der Funktionen _C (((), _N (((), _G ((();

  • Die _C(-Funktion

Beschreibung: Diese Funktion wird hauptsächlich für die Fehlerbewältigung von APIs verwendet, z. B. für die Exchange.GetAccount-Funktion, die so aufgerufen wird: _C ((exchange.GetAccount); beachten Sie, dass der Funktionsname ohne Klammern geschrieben wird. Ein Beispiel.

function main(){
    var account = null;
    var amount = 1;
    var price = 2000;
    account = exchange.GetAccount();
    Log("_C 函数使用前  account :",account);
    //exchange = null; 
    _C(exchange.Buy,price,amount);
    //exchange.Buy(price,1);
    account = exchange.GetAccount();
    Log("_C 函数使用后  account :",account);
}

Die _C-Funktion sieht ungefähr so aus:

 function ___C(functionName,p1){
    functionName("执行需要容错的函数,传入的测试参数为:",p1);
    Log("__C 容错函数启动,容错完毕");
}
function main(){
    pstr = "测试参数--hello";
    ___C(Log,pstr);
}

Das Ergebnis:img

  • Die _N(-Funktion Beschreibung: Diese Funktion dient zur Bearbeitung von zu vielen Komma-Nachzeichen, wobei einige Komma-Nachzeichen behalten werden. Ein Beispiel:
function main(){
    var pi = 3.1415926535897;
    Log("使用_N函数 前pi:",pi);
    var piOfDeal = _N(pi,2);
    Log("使用_N函数后 pi:",piOfDeal);
}

Das Ergebnis:img

  • _G() Funktion Beschreibung: Dies ist eine übersichtliche, speicherbare, übersichtliche und übersichtliche Liste von Wörterbüchern, die in der API-Dokumentation enthalten sind. KV-Tabelle, dauerhaft gespeicherte lokale Dateien, für jeden Roboter eine eigene Datenbank, die nach dem Neustart oder dem Ausscheiden des Administrators besteht K muss eine Zahl oder eine String sein, egal ob groß oder klein, und V kann für alles geschrieben werden, was in JSON sortiert werden kann. _G ((num, 1); // Setzt eine globale Variable num auf 1 _G ((num, ok); // Ändert eine globale Variable num, die als String ok bewertet wird _G ((num, null); // Löscht die globale Variable num _G ((num); // Gibt den Wert der globalen Variablen num zurück _G(); // Gibt die ID des aktuellen Roboters zurück _G(null); // Löscht alle globalen Variablen
function main(){
    Log("totalYLMoney 初始赋值 0");
    var totalYLMoney = 0;
    Log("totalYLMoney 已赋,  = ",totalYLMoney);
    if(typeof(_G("totalYLMoney_save")) !== "object"){
        totalYLMoney = _G("totalYLMoney_save"); 
        Log("读取 totalYLMoney 本地数据库 名称为totalYLMoney_save 的值 赋给 totalYLMoney ");
    }else{
        totalYLMoney = 100.12546328765458;
        _G("totalYLMoney_save",totalYLMoney.toString());
        Log("记录 totalYLMoney 保存到本地数据库");
    }
    Log("totalYLMoney",totalYLMoney);
    Log("typeof\(_G(\"totalYLMoney_save\"))",typeof(_G("totalYLMoney_save")));
}

Der obige _G() Funktionstestcode muss auf dem Roboter getestet werden, Retesting wird nicht unterstützt. Testmethoden, wenn man die Programme auf dem Roboter bereitstellt und den Roboter zum ersten Mal startet, wird der Roboter 100.12546328765458 aufzeichnen. Dieser Wert wird in das globale Wörterbuch "totalYLMoney_save" eingegeben, ein weiteres Mal wird der Roboter ausgeführt, und Sie werden feststellen, dass var totalYLMoney = 0, die Variable totalYLMoney nach der Initialisierung immer noch den Wert aus dem Wörterbuch liest, den die Strategie beim ersten Laufen gespeichert hat.

Frage 8: Ein Gedanke zur Strategie Gewinn-Verlust-Werte:

Ich sehe oft neue Schüler in der Gruppe, die nach Algorithmen fragen, die Strategien gewinnen und verlieren. Im Allgemeinen gibt es verschiedene Behandlungsmethoden, die hier ein wenig einfach sind.

  • Flotter Gewinn:

Das ist, wenn wir das hier tun, dann ist es, wenn wir das hier tun, dann ist es, wenn wir das hier tun.

Ein Beispiel: Zum Beispiel, wenn der Anfangspreis 10 Euro ist, beginnt das Konto mit 5 Euro und 100 Euro. In einem bestimmten Zeitraum kaufte ich 3 Euro mit einem Durchschnittspreis von 15 Euro. Am Ende dieses Zeitraums stieg der Preis auf 20 Euro. Im Moment habe ich 8 Euro und 55 Euro. Profit = (8 - 5) * 20 + (55 - 100) = 60 + (-45) = 15 Diese Berechnungsmethode Der Gewinn beträgt 15 Yuan. Zusätzlich, wenn man bei einem Preis von 20 US-Dollar pro Münze, also 20 US-Dollar für den Verkauf von 3 Münzen, die für 15 US-Dollar gekauft wurden, ein Gleichgewicht herstellt, ist das Konto jetzt: 5 Münzen, 115 US-Dollar; oder der Algorithmus oben: Profit = (5 - 5) * 20 + (115 - 100) = 15, der Gewinn bleibt 15 Yuan, der Unterschied ist, dass der Gewinn nicht mit dem Preis schwankt, wenn die anfängliche Währungsabwertung nicht berücksichtigt wird.

  • Der Profit:

Der Profit in der Rechnung: (jetzt die Münze x, jetzt der Preis + jetzt das Geld) - (Jetzt die Münze x, jetzt der Preis + jetzt das Geld)

Verwenden Sie auch das Beispiel oben: Zum Beispiel, wenn ich anfänglich 10 US-Dollar für einen Monat habe, beginnt mein Konto mit 5 US-Dollar und 100 US-Dollar. In einer gewissen Zeit habe ich 3 Münzen zu einem durchschnittlichen Preis von 15 US-Dollar für einen Monat gekauft. Am Ende dieser Zeit stieg mein Konto auf 20 US-Dollar. Profit = (8 * 20 + 55) - (5 * 10 + 100) = 215 - 150 = 65 Diese Art der Berechnung ist der Gewinn von 65 Yuan. Profit = (5 * 20 + 115) - (5 * 10 + 100) = 215 - 150 = 65.

Es ist nicht schwer zu erkennen, ob man die beiden Methoden vergleicht, eine mit 15, eine mit 65. Die erste Methode ignoriert die Gewinne und Verluste, die durch die Erhöhung der Devaluation der ursprünglichen Währung entstehen. Die zweite Algorithmus berechnet die Gewinne und Verluste, indem sie die Gewinne und Verluste der Erhöhung der Devaluation der ursprünglichen Währung einbeziehen. Die Berechnung des Gewinns wird für die Abwicklung von Geld ausgezahlt. Floating Profit ist ein Gewinn oder Verlust, der über einen bestimmten Zeitraum durch einen Handel entsteht. Dies sind einige Erfahrungen, die ich mit kleinen Träumen gemacht habe, wenn es Fehler gibt, bitte geben Sie mir die Finger und danke im Voraus ^-^

Frage 9: Ein Freund sieht die Tabelle in der Status-Tabelle, in der eine öffentlich zugängliche Strategie angezeigt wird, und geht dann durch die API und sieht, dass es neue Funktionen gibt, die die LogStatus-Funktion in der API hinzufügt.

Einer der wichtigsten Punkte, die wir in diesem Artikel erörtern, ist die Art und Weise, wie wir unsere Produkte vermarkten.

LogStatus(Msg); //	此信息不保存到日志列表里, 只更新当前机器人的状态信息, 在日志上方显示, 可多次调用, 更新状态
LogStatus('这是一个普通的状态提示');
LogStatus('这是一个红色字体的状态提示 #ff0000');
LogStatus('这是一个多行的状态信息\n我是第二行');
var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]};
LogStatus('`' + JSON.stringify(table)+'`'); // JSON序列化后两边加上`字符, 视为一个复杂消息格式(当前支持表格)
LogStatus('第一行消息\n`' + JSON.stringify(table)+'`\n第三行消息'); // 表格信息也可以在多行中出现
LogStatus('`' + JSON.stringify([table, table])+'`'); // 支持多个表格同时显示, 将以TAB显示到一组里

Test-Code: Das ist das erste Mal, dass ich einen Test habe.

function main(){
    var value1 = 99;
    var value2 ="ceshi 01";
    var table1 = { type : "table", title : "ceshi1", cols : ["列1","列2","列3"] , rows : [ ["abc","def","ghi"] , ["1","2","3"] ] };
    var table2 = { type : "table", title : "ceshi2", cols : ["列1","列2","列3"] , rows : [ ["abc",value1,"ghi"] , [value2,"2","3"] ] };
    LogStatus("测试文本1\n`" + JSON.stringify([table1,table2]) + "`");
}

imgDie erste Abbildung zeigt, dass wir in der Tabelle ceshi1 die Datenformate der Tabelle mit den beiden erklärten Variablen var table1 und var table2 haben. Es ist zu beachten, dass vor und nach der JSON.stringify (([table1, table2]) Funktion das ` hinzugefügt werden muss. Sonst wird die Tabelle nicht angezeigt. Natürlich müssen wir mit einer Tabelle dynamisch Daten anzeigen, die nicht immer feststehendes Textinhalt sein können. In dieser Tabelle 2 gibt es zwei Testdaten, value1 und value2.imgNeue Schüler können den Code kopieren, selbst ausprobieren und ändern.

Frage 10: Ein Benutzer schreibt, dass er ein Ergebnisdiagramm wünscht. Die API-Dokumentation, die derzeit von den Erfindern quantifiziert wird, ist möglicherweise einfacher zu beschreiben und kann schwieriger sein.

Ich habe die Ertragsraten der dynamischen Veränderungen mit Hilfe von randomisierten Zahlen getestet, um die Ertragskurve auf dem Diagramm darzustellen.

var ChartObj = {//画图
    tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A',enabled:true,valueDecimals:2,valueSuffix:'%'}, //提示框  就是鼠标在线上时 显示的一个 框框 里面有一些内容,这里是设置提示框的格式
    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'}, //设置 X轴  的数值为时间类型
    yAxis: [{
            title: {text: '收益率 %'},//标题
            style: {color: '#4572A7'},//样式 
            //opposite: false  //生成右边Y轴
        }
    ],
    series: [//系列
        {name:'收益率',dataLables:{enabled:true,format:'{y} %'},type:'spline',yAxis:0,data:[]} //该图标只用到一条曲线  ,所以 只用设置一个数据序列
        ]                  
};
var chart = Chart(ChartObj);  //初始化

function main(){ //测试用的主函数
    chart.update(ChartObj); //更新
    chart.reset(); //清空图表
    var i = 0; //初始一个 i 值 , 后面循环用,   用来限制循环次数
    var randomNum = 0; //声明一个  随机数 初始化 0
    while(i < 5000){ //限制循环次数
        randomNum = Math.random() * 10;  // 生产随机数 0  -  9.9999
        //chart.add([0,[(new Date()),randomNum]]);
        chart.add(0,[(new Date()).getTime(),randomNum + 5]);  //把生成的随机数  按照时间(X 坐标)     把随机数 画在图表上(Y坐标)     
        Sleep(1000*60); // 程序 每次循环暂停60秒
        //chart.update(ChartObj);
        //chart.reset(500);
    }
    Log("over");
}
  • Hier gibt es ein Problem, das mich für einen halben Tag verwirrt hat, und ich habe es auch aufgezeichnet. Es muss eine Millisekundenanzahl sein, wenn man die Zeit schreibt, also schreibt man: new Date (().getTime (()) Das ist eine Millisekundenanzahl, wenn so new Date (()) dann gibt es ein kleines Problem, zum Beispiel die Zeit anzeigt, und die X-Achs-Skalierung kann nicht verwendet werden. Es gibt auch einen Tooltip: {xDateFormat: %Y-%m-%d %H:%M:%S, %A, enabled:true,valueDecimals:2,valueSuffix:%}, der für die Datenansicht angezeigt wird.

Mehr

LiuxinghuiWie soll ich das machen, wenn ich nach der Bestellung noch unvollendete Bestellungen stornieren muss?

LouisDas muss eine sein!

Der Regen ist schrecklich.Es gibt viele Dinge, die in der API-Dokumentation nicht erwähnt werden.

Die Blätter fallen abSchön, dass Sie das alles zusammengestellt haben.

Kurzfristig verkauft Wang Won seine Strategie für hohe PreiseDas ist gut!

Kleine TräumeDas ist nicht gut. Siehe auch: https://dn-filebox.qbox.me/bf52888dc68aba5326c403f2280994e81fbce2ee.png Tutorial: Link: https://www.botvs.com/bbs-topic/475

Kleine TräumeEs ist einfach für alle zu lernen!