Spielen Sie mit dem alten Weißen JavaScript - Erstellen Sie einen kleinen Partner, der einkaufen und verkaufen kann.

Schriftsteller:Kleine Träume, Erstellt: 2017-03-13 12:53:50, Aktualisiert: 2017-10-11 10:37:32

Mit dem alten Weiß spielt man mit dem JavaScript-Macher und schafft einen kleinen Partner, der Kauf und Verkauf macht.

Ein Tutorial zum Schreiben von Quantitative Bots mit JS:https://www.fmz.com/bbs-topic/705(Zunächst Mark.)
  • 1. Grundlagen der Daten der K-Linie; Probleme bei der Verwendung dieser Daten bei quantitativen Transaktionen.

    • Was ist K-Line-Daten:

      Die K-Linien-Charts, die in Japan in der Zeit des japanischen Kagawa-Schauspielers entstanden sind, wurden von den japanischen Reis-Händlern verwendet, um die Marktbewegungen und Preisschwankungen des Reismarktes zu dokumentieren, und wurden später aufgrund ihrer einzigartigen Beschriftung auf den Aktien- und Futuresmärkten eingeführt. Derzeit ist diese Chart-Analyse-Methode in unserem Land und in ganz Südostasien besonders beliebt. (Anfrage von Baidu)

      Die Datenstruktur der K-Linien, definiert in der Sprache von JS, ist nicht in den einzelnen Grafiken erklärt:

      {
          Time    :   1487034000000, // 一个时间戳, 精确到毫秒,与Javascript的 new Date().getTime() 得到的结果格式一样
          Open    :   3425,          // 开盘价
          High    :   3446,          // 最高价
          Low     :   3423,          // 最低价
          Close   :   3438,          // 收盘价
          Volume  :   177657.99,     // 交易量
      }
      

      Lassen Sie uns nun die Daten sehen, die mit der GetRecords-Funktion gewonnen werden: (denken Sie daran, zuerst exchange.SetContractType anzurufen ((rb1705); die Art des Vertrags, den Sie ausführen möchten, ist klar)

      [
          {"Time":1487034000000,"Open":3425,"High":3446,"Low":3423,"Close":3438,"Volume":177657.9999999999},
          {"Time":1487035800000,"Open":3438,"High":3448,"Low":3382,"Close":3385,"Volume":494882},
          {"Time":1487037600000,"Open":3385,"High":3398,"Low":3383,"Close":3394,"Volume":83656.00000000015}
      ]
      

      Die sichtbaren K-Liniendaten sind eine Array von Objekten, wobei jedes Objekt eine K-Linien-Bar ist, die den höchsten Preis, den niedrigsten Preis, den Eröffnungspreis (das ist der Preis, wenn die K-Linien-Zeitlinie beginnt), den Schlusspreis (das ist der Preis, wenn die K-Linien-Zykluszeit endet) und die Transaktionen (die Transaktionen innerhalb des Zyklus) in diesem Bar-Zyklus enthält. Dieser Zyklus ist der K-Linienzyklus. Wie kann man beispielsweise feststellen, wie groß die K-Linien in der oben genannten Array sind? Man kann nur mit einem 2-Bar-Zeitfenster falsch rechnen: 1487035800000 - 1487034000000 Das Ergebnis ist: 1800000, die Einheit für diesen Wert ist die Millisekunde, also umgerechnet: 1800000 / 1000 / 60 = 30 (Minuten), die K-Linien-Zyklus ist 30 Minuten.

      Die erste Frage, die leicht auftaucht: Bei der Verwendung von K-Linien-Daten wird die Array-Länge ignoriert. Das führt zu Array-Zugriffsüberschüssen (diese Art von BUG war in früheren C-Programmen häufig); daher müssen wir darüber urteilen, bevor wir die K-Line verwenden. Das ist ein Beispiel, wie man K-Linien bekommt: exchange.SetContractType ((rb1705); // Schalteseinstellungen für Schraubstahl 1705 Vertrag. var records = exchange.GetRecords ((); // Erhält die standardmäßigen K-Linien-Prozessdaten von rb1705 Schraubstahl-Vertrag. Wie viele Wurzeln von K-Bars erfasst werden können, hängt von der API der Börse ab. Wenn Sie also zu Beginn mehr K-Bars benötigen, müssen Sie den Programmen eine gewisse Zeit erlauben, zu sammeln.

      if(records.length < n){    // n 就是我们限定的 n线数量。
          return;                // 当前函数返回。
      }
      

      Das zweite Problem, das leicht auftaucht: Die Daten der letzten Bar der K-Linie können sich außer den Time- und Open-Eigenschaften ändern. Ein Anfänger kann sich bei der Arbeit mit K-Linien sehr verwirren, weil er das nicht versteht.

      Die dritte Frage: Die Periode der K-Linie, die Zeitstange ist der Beginn des Zyklus, die Zeitstange ist ein Millisekunden-Zahl, die Zeitstange mit einem Wert von 0 ist. Die Zeit ist der 1. Januar 1970 (bei der Erstellung des Programms muss auch der Zeitbereich berücksichtigt werden). Sie können es mit dem folgenden Satz tun:W3schuleSie können auch BotVS Sandbox-Systeme testen:

      var arr = new Date(0);
      

      Das zeigt:

      Thu Jan 01 1970 08:00:00 GMT+0800 (CST) // angezeigt in der östlichen Zeitzone Der Wert ist von 1970 selbst addiert (je 1 Sekunde mehr 1000, weil 1 Sekunde 1000 Millisekunden ist), also ist der Wert schon relativ groß. Hier ist ein kleiner Trick: Da die Zeitleiste einzigartig ist für jede Bar in der K-Linie, in der die Periode der K-Linie festgelegt wird, kann man sicherstellen, dass die neuesten K-Linie-Daten erhalten werden, sobald sich die Zeitleiste ändert.

  • 2, Hinweise auf Anrufe, häufige Probleme, Zufriedenheitszeiten, Rückgabewerte, Parameter

    Bei der Programmierung oder der Quantifizierung von Strategien werden auch viele Indikatorfunktionen verwendet. Eine vergleichsweise nützliche Indikator-Bibliothek ist die Talib-Bibliothek, die verschiedene Versionen hat. Wir verwenden hier die JS-Version.

    Auch bei der ersten Verwendung der Funktion in der Indexbank kam es zu vielen Fehlern:

    • Zuerst, die Parameterzyklen ((Indikatorparameter, unterscheidet sich von K-Linienzyklen, wie viele K-Linienzyklen sind, wie viele Indikatoren K-Linienzyklen sind, die berechnet werden, z. B. 30 Minuten K-Linien, die berechnet werden, sind MACD-Indikatoren mit 30 Minuten-Zyklen, die Parameter für Parameterzyklen) zu groß eingestellt, K-Liniendaten sind nicht lang genug: Der MACD-Indikator beschreibt:

      MACD(Records[Close],Fast Period = 12,Slow Period = 26,Signal Period = 9) = [Array(outMACD),Array(outMACDSignal),Array(outMACDHist)]
      

      Wenn die Parameter-Periode bei Verwendung auf 12, 26, 9 gesetzt ist, geben wir die K-Linien-Datenrekorde ein, die für die Berechnung der Indikatoren verwendet werden, und der Code schreibt:

      var macd = talib.MACD(records, 12, 26, 9);
      

      Wenn die eingegangenen records zu klein sind, wird folgendes berechnet:

      [
        [null,null,null,null,null,null,null,null,null,null,null,null,null],
        [null,null,null,null,null,null,null,null,null,null,null,null,null],
        [null,null,null,null,null,null,null,null,null,null,null,null,null]
      ]
      

      Das ist, weil die K-Leitung Daten nicht ausreichen, und die berechneten Indikatoren, wenn sie verwendet werden, BUG verursachen, so dass wir eine Begrenzungsbedingung vor dem Programm hinzufügen:

      while(!records || records.length < 50){
          records = exchange.GetRecords();
          Sleep(1000);
      }
      

      Sie springen aus der Schleife, bis sie 50 K-Fäden haben.img

      Ein aufmerksamer Leser kann sehen, warum die Daten, die mit diesem Indikator berechnet werden, eine zweidimensionale Array sind (d.h. jedes Element einer Array ist eine Array), da der MACD-Indikator nicht eine Linie, sondern drei Linien berechnet: dif, dea, macd Volumen-Säule.

      [
        [null,null,null,null,null,null,null,null,数据...],
        [null,null,null,null,null,null,null,null,数据...],
        [null,null,null,null,null,null,null,null,数据...]
      ]
      

      Einige Male traten auch Fehler auf, weil die Rückkehrstruktur der Indikatoren nicht beachtet wurde.

    • Zweitens, die Verwendung unterschiedlicher Mittelungen für die Berechnung von Indikatorfunktionen oder unterschiedliche Indikator-Algorithmen führen zu unterschiedlichen Ergebnissen.

      Der STOCH RSI ist deutlich, und beschreibt sich wie folgt:

      STOCHRSI(Records[Close],Time Period = 14,Fast-K Period = 5,Fast-D Period = 3,Fast-D MA = 0) = [Array(outFastK),Array(outFastD)]
      

      Dieser berechnete Wert unterscheidet sich deutlich von den anderen Algorithmen, die ich in Kapitel 1 dieser Serie mit meinem eigenen Algorithmus-Code beschrieben habe. Die Ursache könnte die Ungleichheit der verwendeten linearen Systeme sein. Einige Algorithmen der Bibliothek sind an MA gewöhnt, andere an EMA. Einige Indikatoren werden täglich wiederholt berechnet. Wenn die Anzahl der K-Liniendaten unterschiedlich ist, kann es zu Unterschieden kommen.

  • 3. Die API ist fehlerfrei

    • Cannot read property length of null Dieser BUG tritt am häufigsten auf und ist nicht einer von ihnen.

      Das liegt daran, dass die APIs manchmal aus verschiedenen Gründen Daten fehlerhaft oder nicht zugänglich sind. Die API-Daten werden z. B. mit null erfasst.

      Alle API-Aufrufe müssen fehlerfrei behandelt werden, und manchmal müssen sie sogar überprüft werden, ob die Daten in Ordnung sind. Unsere Programme können nur die Genauigkeit innerhalb ihres eigenen Codes garantieren, aber für Daten, die über das Netzwerk herumlaufen, kann keine Garantie dafür gegeben werden, dass sie zu 100% korrekt sind.

      Da es keine Ein-Schritt-Debugging gibt, keine Abbruch-Debugging, keine Variablen-Wert-Überwachung, usw. Die einfachste Methode, die ich benutze, um DEBUG zu machen, ist die Log-Methode. Für den vernünftigen Einsatz von Logs in Programmprozessen wie Text-Ausgabe, Logs für die Ausgabe von Analysen. Es ist wahrscheinlich möglich, den Ablauf des Programms zu verstehen, und es kann auch versucht werden, Fehler zu erledigen, die mit try, catch, throw JS verknüpft sind, aber ich empfehle, dass man sie nicht verwenden sollte, wenn es notwendig ist, Fehler zu erledigen. Für DEBUG ist es wirklich eine Erfahrung, mit der ursprünglichsten Log-Methode zu arbeiten, was sehr effektiv ist, um DEBUG-Fähigkeiten zu entwickeln.

Bitte schreiben Sie mir einen E-Mail! Bitte schreiben Sie mir einen E-Mail! Bitte schreiben Sie mir einen E-Mail!

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

Der Programmierer littleDream, ursprünglich


Mehr