Anfänger, schau es dir an Ich bringe dich zum Quantitative Trading mit Kryptowährungen (2)

Schriftsteller:- Ich bin ein Idiot., Erstellt: 2022-04-19 16:46:53, Aktualisiert: 2022-04-20 16:56:43

Anfänger, schau es dir an Ich bringe dich zum Quantitative Trading mit Kryptowährungen (2)

In dem letzten Artikel haben wir über programmierte Handelsscripts gesprochen. Tatsächlich ist die Handelsstrategie ein Handelsscriptprogramm. Der Artikel spricht hauptsächlich über die Notwendigkeit eines Hardware-Trägers für das Handelsscriptprogramm (wo das Programm ausgeführt wird) und das Skripthandelsprogramm kann in dieser Computerprogrammiersprache geschrieben werden (die drei in FMZ Quant Trading Platform verwendeten Programmiersprachen auflisten; natürlich können Sie jede Programmiersprache verwenden, um Strategien im programmierten Handel umzusetzen). In diesem Artikel diskutieren wir weiterhin über die Quantifizierung des Kryptowährungskreises und verstehen das Wissen darüber.

Programmiertes Handelsscript

  • Art der Handelsstrategie Anfänger, die neu im programmierten Handel und quantitativen Handel sind, können durch verschiedene Begriffe wie Trendstrategie, Arbitrage-Strategie, Hochfrequenzstrategie, Gitterstrategie usw. verwirrt werden. In der Tat sind die gemeinsamen Strategientypen im programmierten Handel und quantitativen Handel einfach in mehreren Richtungen.

    • Arbitrage-Strategie Einfach ausgedrückt kann eine Strategie, die im Grunde lange Positionen hält, während sie kurze Positionen hält, als Arbitrage-Strategie eingestuft werden.

    • Trendstrategie Einfach ausgedrückt ist es die Strategie, den Trend zu verfolgen und eine einzige Position zu platzieren, wie z. B. doppelte gleitende Durchschnitte, MACD und andere Strategien.

    • Rückkehrstrategie Zum Beispiel die Netzstrategie, die die Rendite aus Preisschwankungen in volatilen Märkten erzielt.

    • Hochfrequenzstrategie Einfach ausgedrückt, handelt es sich um eine Strategie zur Durchführung von Hochfrequenz-Handel über einige Algorithmen, um Marktmikrostruktur, Regeln, Chancen usw. zu entdecken.

    Die oben genannten Typen werden aus der Sicht der Handelsstrategie klassifiziert; aus der Sicht der Strategieentwicklung auf FMZ Quant können Strategien auch in:

    • Einzeichenstrategie Das heißt, die Strategie kann nur ein Symbol betreiben, z. B. einen BTC-Handel oder einen ETH-Handel.

    • Mehrzeichenstrategie Einfach ausgedrückt ist es, mehrere Symbole mit einer Strategie-Logik zu bedienen.

    • Strategie für mehrere Konten Einfach ausgedrückt, ist es, mehrere Austauschobjekte auf einem Bot zu konfigurieren (das Konzept einer Plattform wurde im vorherigen Artikel eingeführt, und ein Austauschobjekt, das mit einem API KEY konfiguriert ist, stellt ein Plattformkonto dar).

    • Multi-Logik-Strategie Beispielsweise werden MACD-Strategie, gleitende Durchschnittsstrategie, Gitterstrategie usw. gleichzeitig auf einem Bot entwickelt (natürlich soll es verschiedene Austauschobjekte betreiben, und die Austauschobjekte mit der gleichen Operation hängen davon ab, ob die spezifische Strategie logisch widersprüchlich ist)

  • Plattform-API-Schnittstelle Wie funktioniert das programmierte Handelsscript mit dem Plattformkonto? Welche Arten von Schnittstellen sind also für Plattformen offen? Im letzten Artikel haben wir darüber gesprochen, dass Plattformen im Allgemeinen REST- und Websocket-Schnittstellen im Abschnitt Platform haben. Hier fügen wir einige Konzepte aus dem Aspekt der Strategieverfahren hinzu. Die Plattform-Schnittstellen werden je nachdem unterteilt, ob sie verifiziert sind (sowohl REST als auch Websocket), nämlich verifiziert und nicht verifiziert.

    • Schnittstellen, die nicht überprüft werden müssen Im Allgemeinen werden sie als öffentliche Schnittstellen bezeichnet; diese Art von Schnittstellen erfordert keine Überprüfung derAPI KEYDiese Art von Schnittstelle ist im Allgemeinen eine Markt-Schnittstelle, wie zum Beispiel die Abfrage von Tiefenmarktnotierungen, K-Line-Daten, Finanzierungssätzen, Informationen über Handelssymbole, Plattformserver-Zeitstempel usw. Einfach ausgedrückt, kann die Schnittstelle, die grundsätzlich nichts mit Ihrem Konto zu tun hat, grob als öffentliche Schnittstelle bezeichnet werden (keine Verifizierung erforderlich). Auf der FMZ Quant Trading Plattform können bei Aufruf einer nicht verifizierten API-Funktion (die die nicht verifizierte Schnittstelle der Plattform einkapselt; öffentliche Schnittstelle), auch wenn die API KEY-Konfiguration falsch ist, die vom Interface zurückgegebenen Daten normal erhältlich sein (keine Verifizierung erforderlich).

    • Schnittstellen, die überprüft werden müssen Einfach ausgedrückt, es sind die Schnittstellen, die überprüft werden müssen (durch API KEY). Diese Art von Schnittstelle wird als private Schnittstelle bezeichnet. Diese Art von Schnittstelle ist normalerweise mit einigen Operationen oder Informationen Ihres Kontos verbunden, wie zum Beispiel Abfragen von Kontovermögen, Kontopositionen, ausstehenden Aufträgen, Überweisungen, Währungsumrechnung, Hebelwirkungsanpassung und Positionsmodus-Einstellung usw. Diese Vorgänge müssen überprüft werden.

      Auf FMZ Quant werden bei Aufruf der API-Funktionen, die eine Verifizierung benötigen (die privaten Schnittstellen, die verkapselt sind und die Plattformverifizierung benötigen), Fehler angezeigt.

    Wie nutzen wir diese Schnittstellen auf der FMZ Quant Trading Plattform?

    FMZ Quant Trading Platform umfasst Plattform-Schnittstellen mit einheitlichen Aktionen und Definitionen (wie K-Line-Schnittstellen, Deep Market-Schnittstellen, aktuelle Asset-Abfrage-Schnittstellen, Order-Schnittstellen, Order-Rücktrittsschnittstellen usw.). Diese Schnittstellen werden auf der FMZ Quant Trading Platform aufgerufen. Die FMZ API-Funktionen können durch Abfragen der API-Dokumentation angezeigt werden: (https://www.fmz.com/api).

    Wie kann man also einige Plattform-Schnittstellen ohne einheitliche Aktionen und Definitionen auf FMZ Quant verwenden?

    Diese Plattformschnittstellen umfassen: Vermögensübertragung, bedingte Bestellung, Batch-Bestellung, Batch-Order Stornierung, Bestelländerung usw. Einige Plattformen haben diese Schnittstellen, andere nicht, und die Funktionen und Nutzungsdetails können sehr unterschiedlich sein, so dass diese Schnittstellen über dieexchange.IOFunktion auf der FMZ Quant (weitere Angaben siehe API-Dokumentation der FMZ Quant-Handelsplattform:https://www.fmz.com/api#exchange.io...). Es gibt auch einige praktische IO-Beispielstrategien im Quadrat von FMZ Quant.

Können alle API-Funktionen in der FMZ-API-Dokumentation eine Netzwerkanfrage stellen?

Wir müssen sagen, dass die Plattform-APIs eine Grenze für die Zugriffsfrequenz haben (z. B. 5 Mal in 1 Sekunde). Der Zugriff kann nicht zu häufig sein, sonst wird der Fehler von http 429 gemeldet, und der Zugriff wird abgelehnt (die meisten Plattformen berichten 429). Daher hat der Aufruf der eingekapselten Plattform-Schnittstellen auf FMZ Quant auch eine Grenze, aber der Aufruf der API-Funktionen, die keine Netzwerkanfragen stellen, hat keine solche Grenze.
Nicht alle API-Funktionen auf FMZ Quant können Netzwerkanfragen stellen; einige API-Funktionen auf FMZ ändern nur einige lokale Einstellungen, wie die Einstellung des aktuellen Handelspaares, des Vertragscodes und der Indikatorberechnungsfunktion sowie den Erwerb des Austauschobjektnamens usw. Grundsätzlich kann man durch die Verwendung der Funktion a bestimmen, ob eine Netzwerkanfrage gestellt wird; solange es sich um den Erwerb der Plattformdaten oder den Betrieb eines Plattformkontos handelt, wird eine Netzwerkanfrage gestellt; diese Schnittstellen müssen alle auf die Aufruffrequenz achten.

  • Lassen Sie uns über einige häufige Probleme und Erfahrungen der Verwendung von API-Funktionen auf FMZ Quant sprechen.

    • Fehlertoleranz Dies ist der häufigste Fehler, der unzählige Anfänger beunruhigt hat. Oft ist der Strategie-Backtest gut und alles ist normal. Warum funktioniert der Bot nach einer Weile abnormal (was jederzeit ausgelöst werden kann)?

      img

      Wenn Sie eine Strategie schreiben, müssen die von der Schnittstelle zurückgegebenen Daten überprüft werden. Zum Beispiel der Code zum Tickern auf FMZ Quant (was dem Schreiben Ihres eigenen Programms entspricht, um direkt auf die Plattformoberfläche zuzugreifen):var ticker = exchange.GetTicker()­ wenn wir die Daten vonLast(letzter Preis) in der Variablenticker(Sie können sich auf die Rücksendungsstruktur der Funktion GetTicker beziehen), müssen wir die Daten erhalten (was ist newPrice? new: die neueste; Price: price; thats right, combine them up!)

      Nun, es ist in Ordnung, wenn die FunktionGetTicker()gibt die normalen Daten zurück; wenn es eine Auszeit Anfrage, Netzwerkfehler, Plattform ziehen aus dem Kabel, Kabel durch Graben gebrochen, oder Kinder schalten den Stromschalter, die FunktionGetTicker()wird zurückkehrennullIm Moment ist der Wert vontickeristnull- wenn ich auf dieLastDas Strategieprogramm wird durch eine Ausnahmeregelung gestoppt. Daraus ergibt sich, dass der Ausfall des Schnittstellenaufrufs (der Aufruf von GetTicker versagt und null zurückgibt) nicht die direkte Ursache für den Stopp des Strategie-Bots ist (die direkte Ursache ist, dass ein Attribut einesnullDie Situation, in der das Versagen des Schnittstellenanrufs einen Fehler meldet, wird nicht dazu führen, dass der Bot stoppt (Hervorhebung hier hinzugefügt).

      Also, was sollten wir tun, um das abnormale Stoppen von Bot zu vermeiden?
      Die Antwort besteht darin, Fehlerverträglichkeitsverfahren für die von Schnittstellen zurückgegebenen Daten durchzuführen; es ist sehr einfach, und Sie müssen nur beurteilen, ob die zurückgegebenen Datennull(hier JavaScript als Beispiel nehmen, für die anderen Sprachen sind ähnlich). Schreiben Sie ein kleines Code-Segment (das nur zur Anleitung dient und nicht direkt ausgeführt werden kann!)

      var ticker = exchange.GetTicker()
      if (ticker) {
          var newPrice = ticker.Last
          Log("Print the latest price:", newPrice)
      } else {
          // data is null, so no operation will make no problem 
      }
      

      Nicht nur dieGetTickerSchnittstelle muss fehlertolerante Verarbeitung durchführen, aber die Schnittstelle mit Netzwerkanfragen muss die fehlertolerante Verarbeitung für den Rückgabewert durchführen (wenn Sie den Rückgabewert der Funktion verwenden) Es gibt viele Fehlerverträglichkeitsmethoden._C()Funktion (siehe FMZ-API-Dokumentation), um Ihre eigene fehlertolerante Funktion zu schreiben und Ihren eigenen fehlertoleranten Mechanismus und Ihre eigene Logik zu entwerfen.

      Die Anwendung der_C()Es ist jedoch sehr wahrscheinlich, dass viele neue Schüler diese Funktion auch falsch verwenden._C()Funktion ist eine Funktionsreferenz, kein Funktionsanruf._C(funcName, param1, param2); der Aufruf ist korrekt; funcName hat keine Klammern, und param1 und param2 sind die zu importierenden Parameter in die Funktion funcName._C(funcName(param1, param2)); der Aufruf ist falsch; normalerweise wird der Aufruf so geschrieben, wenn ein Anfänger die FMZ-API-Dokumentation nicht sorgfältig liest.

    • Bestellbetrag auf dem Spotmarkt

      Anfänger können auch leicht Fehler bei der Bestellmenge der Spotmarktkauforder machen. Wie im vorherigen Artikel erwähnt, ist die Bestellmenge der Spotmarktkauforder normalerweise der Geldbetrag (nur einige wenige Plattformen können andere Einstellungen haben, und im Allgemeinen werden diese speziellen Plattform-Einstellungen in der FMZ API-Dokumentation erklärt). Zum Beispiel habe ich OKEX V5 simulierten Bot verwendet, um zu testen:

      Das Handelspaar wird als:LTC_USDT

      function main() {
          exchange.IO("simulate", true)   // switch to OKEX simulated bot 
          exchange.Buy(-1, 1)             // the price is -1, representing the placed order is market order; the amount of 1 means the order amount of 1 USDT
      }
      

      Da Plattformen im Allgemeinen ein Limit für den Auftragsbetrag haben, werden Aufträge mit einem Betrag, der kleiner als das Limit ist, nicht platziert (z. B. benötigt Binance Spot nur Aufträge mit einem Betrag von mehr als 5 USDT, um erfolgreich platziert werden zu können).

      error	Buy(-1, 1): map[code:1 data:[map[clOrdId: ordId: sCode:51020 sMsg:Order amount should be greater than the min available amount. tag:]] msg:]
      
    • Futures-Orderrichtung

      Bei der Erstellung von Futures-Strategien machen Anfänger häufig Fehler in der Reihenfolge.https://www.fmz.com/api#exchange.setdirection...

      img

      Weil die Bestellfunktion nurBuyundSell. Allerdings Futures (natürlich gibt es kein Problem für den Spot, für den Spot hat nur kaufen und verkaufen) hat die Richtungen der Eröffnung lang, Schließen lang, Eröffnung kurz, und Schließen kurz, so offensichtlich Buy und Sell kann Operationen in so vielen Richtungen nicht ausdrücken, dann ist es notwendig, die Funktion einzuführenexchange.SetDirection()der Festlegung von Futures-Handelsrichtlinien. Auf FMZ,exchange.SetDirection("buy")(die zuerst die Richtung festlegt) wird zusammen mitexchange.Buy, was bedeutet, dass der aufgegebene Auftrag ein Auftrag zur Eröffnung von Long-Positionen ist. Und so weiter:

      Verwendungexchange.SetDirection("sell")undexchange.SellDer Wert des Bestellungsvertrags ist der Wert des Bestellungsvertrags, der für die Eröffnung von Short-Positionen verwendet wird. Verwendungexchange.SetDirection("closebuy")undexchange.SellDer Wert des Bestellungsvertrags ist der Wert des Bestellungsvertrags, der für den Abschluss der Long-Positionen verwendet wird. Verwendungexchange.SetDirection("closesell")undexchange.BuyDer Wert des Bestellungsverfahrens ist der Wert des Bestellungsverfahrens. Die Anfänger benutzen normalerweiseexchange.SetDirection("sell")undexchange.BuyDann wird ein Fehler gemeldet (ein Fehler kann nicht im Backtest gemeldet werden, aber das ist offensichtlich ein Logikfehler, der von zwanghaften Menschen wie mir nicht ignoriert werden kann.) Hier ist ein weiterer Fehler, den Anfänger häufig machen.

      function main() {
          exchange.SetContractType("quarter")   // set the current contract to a quarterly contract 
          exchange.SetDirection("sell")
          var id = exchange.Sell(-1, 1)    
          Log("placed market order, executed, get positions", exchange.GetPosition())    
          exchange.SetDirection("closebuy")   // use closebuy and Sell together, yes, no problem 
          exchange.Sell(-1, 1)
      }
      

      img
      Wenn es hier kommt, könnten Sie fragen:" Ich habe Positionen, und verwenden closebuy und verkaufen zusammen, also warum ein Fehler gemeldet wird und ich kann Positionen nicht schließen? "Ich würde sagen:" falsche Richtung zu schließen Positionen! Sie schlossen lange Positionen. " Darüber hinaus kann der Fehler in einer anderen Situation liegen: Die Einstellung der Position Richtung nahe ist korrekt, die Verwendung der Bestellfunktion ist auch korrekt, und Sie halten auch die Positionen in der Richtung, aber der Fehler wird immer noch gemeldet. Der Grund könnte sein: Ihr Programm hat viele Aufträge platziert, die Aufträge werden zunächst nicht ausgeführt, und die Aufträge von Close-Positionen sind jetzt auf dem Markt und warten auf die Ausführung.

    • Anzeige der Export- und Handelsinformationen Das Entwerfen und Schreiben von programmierten und quantitativen Handelsstrategien ist untrennbar mit dem Entwurf von Mensch-Computer-Interaktionen wie Datenanzeige und Export von Betriebsprotokollen verbunden. Zum Beispiel: Python-Anwendungenprint- Ich weiß. Verwendung von JavaScriptconsole.log- Ich weiß. Verwendungszwecke von Golangfmt.Println()- Ich weiß. C++-Anwendungencout.

      Auf FMZ Quant gibt es hauptsächlich zwei Orte, an denen Informationen angezeigt werden.

      • Statusleiste Nachdem der Bot gestartet wurde, wird die Bot-Seite wie folgt angezeigt:

        img

        Der Anzeigeteil ist die Statusleiste Informationen. Die Statusleiste wird hauptsächlich verwendet, um einige in Echtzeit veränderte Daten anzuzeigen (weil Echtzeitänderungen in Echtzeit beobachtet werden müssen und nicht jedes Mal als Protokoll gedruckt werden können, so dass diese Art von Daten in der Statusleiste angezeigt werden kann. Wenn Sie das Protokoll von jedem drucken, wird es viele bedeutungslose wiederholte Daten geben, die die Abfrage beeinflussen). Die auf der Statusleiste angezeigten Daten verwenden dieLogStatusDetails finden Sie in der FMZ-API-Dokumentation.

      • Log-Bar Es befindet sich auch auf der Bot-Seite, wie auf dem folgenden Bild gezeigt:

        img

        Der Anzeigeteil ist die Protokollleiste. Die Protokollleiste wird hauptsächlich verwendet, um bestimmte Daten zu einem bestimmten Zeitpunkt dauerhaft aufzuzeichnen oder eine Operation einer bestimmten Strategie zu einem bestimmten Zeitpunkt aufzuzeichnen. Die Bausteine sind in verschiedene Typen unterteilt:

        1. Common log; die FMZ-Strategie verwendet die Log-Funktion, um sie im Strategie-Log auszugeben und auszudrucken.

        img

        1. Auftragsprotokollexchange.Sell/exchange.Buyin einer FMZ-Strategie wird automatisch der Datensatz im Protokoll ausgeführt.

        img

        1. Stornierungsprotokoll;exchange.CancelOrderwird in einer FMZ-Strategie verwendet, und das Stornierungsprotokoll wird automatisch im Protokoll ausgeführt.

        img

        1. Fehlerprotokoll; wenn die FMZ-Strategie ausgeführt wird und die Schnittstelle für die Netzwerkanfrage einen Anruffehler hat und eine Ausnahme geworfen wird (z. B. eine throw-Anweisung), wird das Fehlerprotokoll automatisch im Protokoll ausgeführt.

        img

      Unter den FMZ-API-Funktionen können Funktionen, die Log-Ausgabe generieren können, wie Log ((...), exchange.Buy ((Preis, Betrag), exchange.CancelOrder ((Id), etc., nach den notwendigen Parametern, wie zum Beispiel: exchange.CancelOrder ((orders[j].Id, orders[j]), einige zusätzliche Ausgabeparameter folgen; es ist zusätzlich die Auftragsinformationen auszugeben, wenn die Bestellreihenfolge[j] storniert wird.

      function main() {
          Log("data1", "data2", "data3", "...")
          var data2 = 200
          var id = exchange.Sell(100000, 0.1, "additional data1", data2, "...")
          exchange.CancelOrder(id, "additional data1", data2, "...")
          LogProfit(100, "additional data1", data2, "...")
      }
      
    • Verwendung von Indikatorfunktionen Bevor wir über die Indikatorfunktion sprechen, verstehen wir zuerst, was ein Indikator ist. Einfach ausgedrückt ist es eine Linie wie gleitender Durchschnitt, MACD oder ATR.

      F:Wie werden diese Indikatoren erstellt? A: Sie werden sicherlich durch Berechnungen erzeugt.

      F: Worauf beruhen die Berechnungen? A: Daten der K-Linie.

      F: Können Sie ein Beispiel geben? A: Nehmen wir den einfachsten gleitenden Durchschnittsindikator als Beispiel. Wenn wir die täglichen K-Linie (d. h. eine Yang-Linie oder eine Yin-Linie repräsentiert einen Tag) Daten als Datenquelle für die Indikatorberechnung verwenden. Der gleitende Durchschnittsindikatorparameter ist 10, dann ist der berechnete gleitende Durchschnittsindikator der 10-tägige gleitende Durchschnitt.

      F: Kann der gleitende Durchschnittsindikator berechnet werden, wenn die Anzahl der K-Linien BAR kleiner als 10 ist? A: Nicht nur der gleitende Durchschnittsindikator kann nicht berechnet werden, sondern jeder Indikator kann den effektiven Indikatorwert nicht berechnen, wenn die Anzahl der K-Liniendaten BAR nicht dem Indikatorperiodenparameter entspricht und die entsprechende Position des berechneten Arrays mit leeren Werten gefüllt wird, z. B.nullangezeigt wird, wennJavaScriptStrategie druckt die berechneten Indikatordaten aus.

      Es gibt ein Lehrbeispiel auf dem Platz:https://www.fmz.com/strategy/125770Backtest dieses Lehrbeispiel Strategie, und Sie können das Diagramm durch das Backtest-System und den 10-Perioden gleitenden Durchschnitt erzeugt sehen:

      img

      Nach Strategie-Anpassung, gezogener K-Linie und gleitendem Durchschnittsdiagramm:

      img

      F: Was ist, wenn ich einen gleitenden 10-Stunden-Durchschnitt verwenden möchte? A: Verwenden Sie die K-Liniendaten eines stündlichen Zeitraums.

      Einfach ausgedrückt, ist die K-Linie, die wir sehen, ein Array, nachdem wir es digitalisiert haben (wenn Sie das Konzept des Arrays nicht verstehen, können Sie es auf Baidu durchsuchen), und jedes Element des Arrays ist eine K-Linienleiste, die in der Reihenfolge angeordnet ist. Normalerweise ist der letzte Balken der K-Liniendaten der Balken des aktuellen Zeitraums, der sich in Echtzeit ändert und nicht abgeschlossen wird (Sie können die Änderungen beobachten, indem Sie sich auf einer Plattformseite anmelden und ihre K-Line beobachten). Die berechneten Indikatoren entsprechen auch eins zu eins den K-Linienbalken. Im obigen Beispiel können Sie sehen, dass ein Indikatorwert einer K-Linienbalke entspricht. Beachten Sie, dass sich der letzte K-Linienbalken in Echtzeit ändert und der berechnete Indikator sich auch mit der Änderung der K-Linienbalke ändert.

      Auf der FMZ Quant Trading Platform können Sie die TA-Bibliothek (die von FMZ implementierte Bibliothek, die im Docker integriert ist und direkt in verschiedenen Sprachen verwendet werden kann) oder talib (die alte berühmte Indikatorbibliothek talib, die in JS, C++ integriert ist; Python muss zusätzlich installiert werden) verwenden. Zum Beispiel die Berechnung des Durchschnitts im obigen Beispiel: Verwenden Sie die FMZ TA Bibliothek:

      function main() {
          var records = exchange.GetRecords()
          var ma = TA.MA(records, 10)
          Log(ma)       // print average
      }
      

      Verwenden Sie Talib:

      function main() {
          var records = exchange.GetRecords()
          var ma = talib.MA(records, 10)
          Log(ma)       // print average 
      }      
      

      Die berechneten Indexdaten ma sind ein Array und jedes Element entspricht dem K-Linien-Array (Einträge) einzeln, d. h.ma[ma.length -1]entsprichtrecords[records.length - 1], und so weiter.

      Dies gilt auch für andere kompliziertere Indikatoren, und Sie müssen auf Indikatoren wie MACD achten.

      var macd = TA.MACD(records)   // In this way, only the K-line data is passed in, and no indicator parameters are passed in. The indicator parameters use the default values, and that is the same for other indicator functions
      

      In diesem Moment ist die Variable macd ein zweidimensionales Array (Sie können es bei Baidu finden, wenn Sie das Konzept nicht verstehen). Ein zweidimensionales Array ist einfach ein Array, und jedes Element davon ist auch ein Array.

      F: Warum sind MACD-Indikatordaten ein zweidimensionales Array? A: Weil der MACD-Indikator aus zwei Linien (Diff-Linie und DEA-Linie) und einer Reihe von Volumenbalken besteht (die MACD-Volumenbalkendaten können tatsächlich auch als Linie betrachtet werden).

      var dif = macd[0]
      var dea = macd[1]
      var macdbar = macd[2]
      

      Hier ist auch ein vorgefertigtes Lehrbeispiel; wenn Sie interessiert sind, können Sie es studieren:https://www.fmz.com/strategy/151972

      img


Mehr