Die Ressourcen sind geladen. Beförderung...

Kryptowährungsquantitativer Handel für Anfänger - Sie näher an Kryptowährungsquantitativer Handel bringen (2)

Schriftsteller:FMZ~Lydia, Erstellt: 2022-07-27 16:34:41, Aktualisiert: 2023-09-24 19:31:16

img

Kryptowährungsquantitativer Handel für Anfänger - Sie näher an Kryptowährungsquantitativer Handel bringen (2)

In dem letzten Artikel haben wir über programmatische 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 welcher Art von Computerprogrammiersprache geschrieben werden (drei Programmiersprachen, die auf der FMZ Quant Trading Platform verwendet werden, sind aufgeführt. Natürlich können Sie jede Programmiersprache verwenden, um Strategien für den programmatischen Handel umzusetzen). In diesem Artikel diskutieren wir weiter über die Quantifizierung der Kryptowährung und erfahren mehr darüber.

Programmatisches Handelsscript

  • Arten von Handelsstrategien Neulinge beim programmierten Handel und beim quantitativen Handel können durch Begriffe wie verschiedene Trendstrategien, Arbitragestrategien, Hochfrequenzstrategien, Gitterstrategien usw. verwirrt sein. In der Tat sind die gemeinsamen Strategientypen im programmierten Handel und quantitativen Handel einfach mehrere Richtungen.

    • Strategie zur Absicherung durch Arbitrage Einfach ausgedrückt kann eine Strategie, die eine Long-Position hält, während eine Short-Position gehalten wird, grundsätzlich als Arbitrage-Strategie eingestuft werden.
    • Trendstrategie Einfach ausgedrückt ist es die Strategie, den Trend zu verfolgen, um Aufträge zu platzieren und Positionen zu halten, wie z. B. doppelter gleitender Durchschnitt, MACD und andere Strategien.
    • Regressionsstrategie Zum Beispiel die Netzstrategie, die von Preisschwankungen in volatilen Märkten profitiert.
    • Hochfrequenzstrategie Einfach ausgedrückt ist es eine Strategie für den Hochfrequenzhandel durch einige Algorithmen, um Marktmikrostrukturen, Muster, Chancen usw. zu entdecken.

    Aus der Perspektive der Strategieentwicklung auf der FMZ Quant Trading Plattform lassen sich Strategien auch in:

    • Strategie für eine einzige Sorte Dies bedeutet, dass diese Strategie nur eine Art betreibt, wie BTC-Handel oder ETH-Handel.
    • Strategie für mehrere Arten Einfach ausgedrückt, ist es, mehrere Arten nach einer strategischen Logik zu betreiben.
    • Strategie für mehrere Konten Einfach ausgedrückt werden mehrere Austauschobjekte auf einem echten Bot konfiguriert (das Konzept eines Austauschs wurde im vorherigen Artikel eingeführt, und ein Austauschobjekt mit einem konfigurierten API KEY stellt ein Austauschkonto dar).
    • Mehrfachlogikstrategie Beispielsweise werden MACD-Strategie, gleitende Durchschnittsstrategie, Gitterstrategie usw. gleichzeitig in einem echten Bot entwickelt (natürlich soll es verschiedene Tauschobjekte betreiben, und der Betrieb desselben Tauschobjekts hängt davon ab, ob die spezifische Strategie logisch in Konflikt steht)
  • Schnittstelle der Exchange API Wie funktioniert das programmatische Handelsscript mit dem Börsenkonto? Welche Arten von Schnittstellen sind also für den Austausch offen? Im vorherigen Artikel haben wir im Abschnitt Exchange über den Austausch REST- und Websocket-Schnittstellen im Allgemeinen gesprochen. Hier fügen wir einige Konzepte aus der Ebene der Strategieverfahren hinzu. Die Austauschschnittstellen werden in zwei Teile unterteilt, ob sie validiert sind oder nicht (sowohl REST als auch Websocket), es gibt Verifizierung und Nicht-Verifizierung.

    • Schnittstellen, für die keine Überprüfung erforderlich ist Diese Art von Schnittstelle, die allgemein als öffentliche Schnittstelle bezeichnet wird, erfordert keine Überprüfung derAPI KEY(wenn Sie vergessen haben, was der API-Key ist, können Sie sich dem vorherigen Artikel zuwenden). Diese Art von Schnittstelle ist allgemein Markt-Schnittstelle, wie zum Beispiel Abfragen von tiefgreifenden Marktpreisen, Abfragen von K-Line-Daten, Abfragen von Finanzierungssätzen, Abfragen von Informationen über Handelsvarianten, Abfragen von Exchange-Server-Zeitstempeln usw. Einfach ausgedrückt, kann die Schnittstelle, die nicht mit Ihrem Konto zusammenhängt, grob als öffentliche Schnittstelle bestimmt 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 Börse, die öffentliche Schnittstelle verkapselt), auch wenn die API KEY-Konfiguration nicht korrekt ist, die vom Schnittstellen zurückgegebenen Daten normal (wegen Nichtverifizierung) erhalten werden.

    • Schnittstellen, die überprüft werden müssen Einfach ausgedrückt, es ist die Schnittstelle, die überprüft werden muss (über API KEY), diese Art von Schnittstelle wird als private Schnittstelle bezeichnet. Sie ist normalerweise mit einigen Operationen oder Informationen Ihres Kontos verbunden, wie zum Beispiel Abfragen von Kontovermögen, Abfragen von Kontopositionen, Abfragen von ausstehenden Aufträgen, Abfragen von Überweisungen, Übertragen von Währungen, Anpassung von Hebelwirkung, Einstellung von Positionsmodus usw. Alle diese Vorgänge müssen überprüft werden. Wenn auf der FMZ Quant Trading Platform die API-Funktion, die überprüft werden muss, aufgerufen wird (die Schnittstelle, die für den eingekapselten Austausch überprüft werden muss, private Schnittstelle), wenn der API KEY falsch konfiguriert ist, wird bei Aufruf der Schnittstelle ein Fehler gemeldet und ein Nullwert zurückgegeben.

    Wie werden diese Schnittstellen auf der FMZ Quant Trading Plattform verwendet?

    Die FMZ Quant Trading Platform fasst das Börsenverhalten und die Schnittstellen mit konsistenten Definitionen zusammen (z. B. die K-Line-Schnittstelle, die tiefgreifende Marktschnittstelle, die aktuelle Asset-Abfrage-Schnittstelle, die Order-Schnittstelle, die Order-Annullierungs-Schnittstelle usw.), diese Schnittstellen werden als FMZ Quant Trading Platform API-Funktionen auf der FMZ Quant Trading Platform bezeichnet und können über die API-Dokumentation (https://www.fmz.com/api).

    Wie werden einige der Austausch-Schnittstellen mit unterschiedlichen Verhaltensweisen und Definitionen auf der FMZ Quant Trading Platform verwendet?

    Diese Austauschschnittstellen umfassen: Vermögensübertragung, bedingte Bestellung, Platzierung von Chargenbestellungen, Stornierung von Chargenbestellungen, Änderung von Bestellungen usw. Einige Börsen haben diese Schnittstellen, andere nicht, und ihre Funktionen und Nutzungsdetails können sehr unterschiedlich sein, so dass auf diese Schnittstellen über dieexchange.IOFunktion auf der FMZ Quant Trading Platform (Weitere Informationen finden Sie in der API-Dokumentation der FMZ Quant Trading Platform:https://www.fmz.com/api#exchange.io..Es gibt auch einige praktische IO-Beispielstrategien auf dem FMZ Quant Trading Platform Strategie-Feld.

    Generieren alle API-Funktionen im FMZ Quant Trading Platform API-Dokument Netzwerkanfragen?

    Zunächst und vor allem hat die API-Schnittstelle der Börse Zugriffsfrequenzbeschränkungen (z. B. 5 Mal pro Sekunde), und der Zugriff kann nicht zu häufig sein, sonst wird ein http 429-Fehler gemeldet und der Zugriff wird verweigert (die meisten Börsen melden 429). Nicht alle API-Funktionen der FMZ Quant Trading Platform werden Netzwerkanfragen generieren. Einige von ihnen ändern nur einige lokale Einstellungen, wie z. B. das Einstellen des aktuellen Handelspares, das Einstellen des Vertragscodes, die Indikatorberechnungsfunktion und das Erhalten des Austauschobjektnamens usw. Im Allgemeinen lässt sich beurteilen, ob eine Netzwerkanfrage aus dem Zweck der Funktion erfolgt. Solange die Austauschdaten, die Austauschkontooperationen usw. generierte Netzwerkanfragen sind, müssen diese Schnittstellen auf die Anruffrequenz achten.

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

      • Fehlervermögen Dies ist der häufigste Fehler, der unzählige Anfänger beunruhigt.

        img

        Wenn wir eine Strategie schreiben, müssen wir alle die von der Schnittstelle zurückgegebenen Daten beurteilen und überprüfen.var ticker = exchange. GetTicker(), wenn wir dieLast(letzter Preis)tickerVariable (siehe Struktur zurückgegeben von der GetTicker-Funktion), müssen wir verwendenvar newPrice = ticker.LastBei der Erfassung von Daten wie dieser (was ist newPrice? new: latest, Price: price, ja! alle zusammen!)GetTicker()Funktion kehrt zu normalen Daten zurück, es ist in Ordnung, aber wenn es eine Anforderung Timeout, Netzwerkfehler, der Austausch zieht das Netzwerkkabel, das Kabel ist abgeschnitten, das Kind zieht den Stromschalter, usw.GetTicker()Funktion zurückkehrennullDer Wert vontickeristnull, und wenn ich gehe auf seinen ZugangLast, wird eine Ausnahme des Programms auftreten und das Strategieprogramm wird gestoppt. Es scheint, dass das Scheitern des Schnittstellenaufrufs (der GetTicker-Aufruf scheitert und null zurückgibt) nicht der direkte Grund für den Stopp von strategys realer Bot ist (der direkte Grund ist, dass ein Attribut einesnullDer Fehlerbericht des Interface-Aufruffehlers wird den echten Bot-Stop nicht verursachen (Hervorhebung). Also, was können wir tun, um das abnormale Stoppen des echten Bots zu vermeiden? Die Antwort besteht darin, eine fehlertolerante Verarbeitung der von der Schnittstelle zurückgegebenen Daten durchzuführen.null(ein Beispiel für die JavaScript-Sprache, andere Sprachen sind in der Regel die gleichen) Schreiben Sie ein kurzes Code-Segment zur Beschreibung (dies ist nur eine Beschreibung, Sie können es nicht direkt ausführen!)

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

        Nicht nur dieGetTickerSchnittstelle muss fehlertolerant sein, aber die Schnittstelle mit Netzwerkanfragen muss für den Rückgabewert fehlertolerant sein (wenn Sie den Rückgabewert der Funktion verwenden) Es gibt viele fehlertolerante Methoden, Sie können die_C()Funktion (siehe FMZ-API-Dokumentation), um selbst eine fehlertolerante Funktion zu schreiben und einen fehlertoleranten Mechanismus und eine fehlertolerante Logik zu entwickeln. Die Verwendung von_C()Die Funktion ist für viele Anfänger üblicherweise falsch._C()Funktion ist eine Funktionsreferenz, kein Funktionsanruf._C(funcName, param1, param2), der Aufruf ist korrekt, funcName ist ohne Klammern, und param1 und param2 sind die Parameter, die an die Funktion funcName weitergegeben werden sollen._C(funcName(param1, param2)), der Aufruf ist falsch, in der Regel von Anfängern geschrieben, die die FMZ-API-Dokumentation nicht ernst nehmen.

      • Die Bestellmenge der Bestellung zum Kauf auf dem Spotmarkt Die Bestellmenge der Spotmarkt-Bestellung Kauf-Bestellung ist auch leicht zu Fehlern von Anfängern zu machen, wie im vorherigen Artikel erwähnt, die Bestellmenge der Spotmarkt-Bestellung Kauf-Bestellung ist in der Regel der Betrag (sehr wenige Börsen können andere Einstellungen sein, im Allgemeinen werden diese speziellen Exchange-Einstellungen auf FMZ im FMZ API-Dokument erklärt), zum Beispiel benutze ich OKEX V5 Demo zu testen: Das Handelspaar wird so eingestellt:LTC_USDT

        function main() {
            exchange.IO("simulate", true)   // Switch to the demo of OKEX exchange
            exchange.Buy(-1, 1)             // The price is -1, indicating that the order placed is a market order, and the quantity is 1, indicating that the order amount is 1USDT
        }
        

        Da die Börsen im Allgemeinen ein Limit für den Auftragsbetrag haben, werden Aufträge, die kleiner als das Limit sind, nicht platziert (z. B. benötigt Binance Spot jede Bestellung von mehr als 5 USDT, bevor sie erfolgreich platziert werden kann). Daher wird ein Fehler gemeldet, wenn Sie eine Bestellung wie diese platzieren:

        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:]
        
      • Anleitung bei der Abgabe zukünftiger Aufträge Bei der Erstellung von Futures-Strategien wird die Richtung der Auftragserteilung oft von Anfängern falsch gemacht, was zu Problemen führt. Schauen wir uns zunächst die Beschreibung in der API-Dokumentation an:https://www.fmz.com/api#exchange.setdirection...

        img

        Da die Ordnungsfunktion nurBuy, SellEs ist jedoch offensichtlich, dass Buy/Sell keine Operationen in so viele Richtungen ausdrücken kann. Zu diesem Zeitpunkt ist es notwendig, die Funktion einzuführenexchange.SetDirection(), die die Richtung des Futures-Handels bestimmt. Auf FMZ,exchange.SetDirection("buy")(die Richtung zuerst einstellen) wird in Verbindung mitexchange.Buy, bedeutet dies, dass der aufgegebene Auftrag ein Auftrag zur Eröffnung einer Long-Position ist. Und so weiter:exchange.SetDirection("sell")wird in Verbindung mitexchange.Sell, bedeutet dies, dass die aufgegebene Order eine Order zur Eröffnung einer Shortposition ist.exchange.SetDirection("closebuy")wird in Verbindung mitexchange.Sell, bedeutet dies, dass der aufgegebene Auftrag ein Auftrag zum Schließen einer Long-Position ist.exchange.SetDirection("closesell")wird in Verbindung mitexchange.Buy, bedeutet dies, dass die aufgeteilte Bestellung eine Bestellung zur Schließung einer Shortposition ist. Anfänger verwenden normalerweiseexchange.SetDirection("sell")in Verbindung mitexchange.Buy, oder andere falsche Kombinationen. Dann wird ein Fehler gemeldet (Backtesting kann keinen Fehler melden, aber dies ist offensichtlich ein logischer Fehler, Zwangsstörungen können nicht toleriert werden...). Ein weiterer häufiger Fehler von Anfängern

        function main() {
            exchange.SetContractType("quarter")   // Set the current contract as a quarterly contract
            exchange.SetDirection("sell")
            var id = exchange.Sell(-1, 1)    
            Log("See my market order is placed and the transaction is completed, there is a position", exchange.GetPosition())    
            exchange.SetDirection("closebuy")   // closebuy is used in conjunction with Sell, yes~
            exchange.Sell(-1, 1)
        }
        

        img
        Hier könnte man fragen: Warum habe ich eine Position und closebuy und Sell werden auch zusammen verwendet, warum bekomme ich einen Fehler und kann die Position nicht schließen? Ich würde antworten: Sie haben die falsche Richtung geschlossen! Eine der möglichen Situationen im oben genannten Fehlerbericht ist: Die Schließrichtung ist korrekt eingestellt, die Orderfunktion wird korrekt verwendet und die Position in dieser Richtung wird ebenfalls gehalten, aber der Fehler wird trotzdem gemeldet. Der Grund dafür ist, dass Ihr Programm möglicherweise mehrere Aufträge platziert hat, aber die ursprüngliche Bestellung nicht ausgeführt wurde und die Schließbestellung auf dem Markt aussteht.

      • Log-Ausgabe, Anzeige von Transaktionsinformationen Das Design von programmierten und quantitativen Handelsstrategien ist untrennbar mit dem Design von Mensch-Computer-Interaktion, wie Datenanzeige und Operationslog-Ausgabe verbunden. Zum Beispiel: Verwendung von pythonprint- Ich weiß. Verwendung von JavaScriptconsole.log- Ich weiß. Verwendung von Golangfmt.Println()- Ich weiß. Verwendung von C++cout

        Lassen Sie uns über die Informationsanzeige auf der FMZ-Plattform sprechen, auf der FMZ Quant Trading Platform gibt es zwei Hauptorte, an denen die Informationen angezeigt werden.

        • Status-Spalte Nachdem der echte Bot ausgeführt wurde, ist die echte Bot-Seite wie in der Abbildung gezeigt:

          img

          Der Anzeigeteil ist die Statusspalte-Informationen. Die Statusspalte wird hauptsächlich verwendet, um einige in Echtzeit veränderte Daten anzuzeigen (weil Echtzeitveränderungen in Echtzeit beobachtet werden müssen und nicht jedes Mal als Protokoll gedruckt werden können, diese Art von Daten kann in der Statusspalte angezeigt werden. Das Protokoll wird viele doppelte und bedeutungslose Daten wiederholen, was die Abfrage beeinflusst, wenn jedes Protokoll gedruckt wird). Die in der Statusspalte angezeigten Daten verwenden dieLogStatusDetails finden Sie in der FMZ-API-Dokumentation.

        • Log-Spalte Auch auf der echten Bot-Seite, wie in der Abbildung gezeigt:

          img

          Der Anzeigeteil ist die Log-Spalte. Die Log-Spalte wird hauptsächlich verwendet, um bestimmte Daten zu einem bestimmten Zeitpunkt dauerhaft aufzuzeichnen oder eine Operation einer bestimmten Strategie zu einem bestimmten Zeitpunkt aufzuzeichnen. Es gibt verschiedene Arten von Baumstämmen:

          1. Gemeinsames Protokoll, Strategien auf FMZ übernehmen die Log-Funktion zur Ausgabe und zum Drucken im Strategieprotokoll.

            img

          2. Bestellprotokoll, Verwendungexchange.Sell/exchange.Buyin FMZs Strategie automatisch in den Log-Output aufgenommen wird.

            img

          3. Stornierungsprotokollexchange.CancelOrderwird in der Strategie des FMZ verwendet, die das Stornierungsprotokoll automatisch im Protokoll ausgibt.

            img

          4. Fehlerprotokoll, wenn die Strategie auf der FMZ ausgeführt wird, ein Anruffehler auftritt auf der Schnittstelle, die eine Netzwerkanfrage ausführt, eine Ausnahme wird geworfen (z. B. eine Aussage über den Wurf), das Fehlerprotokoll wird automatisch im Protokoll ausgeführt.

            img

        API-Funktionen auf FMZ, Funktionen, die Log-Ausgabe generieren können, wie Log ((...), exchange.Buy ((Preis, Betrag), exchange.CancelOrder ((Id), etc., können alle von einigen zusätzlichen Ausgabeparametern nach den notwendigen Parametern, wie zum Beispiel: exchange. CancelOrder ((Orders[j].Id, Orders[j]) gefolgt werden, um die Auftragsinformationen auszugeben, wenn die Auftragsreihenfolge [j] storniert wird.

        function main() {
            Log("data1", "data2", "data3", "...")
            var data2 = 200
            var id = exchange.Sell(100000, 0.1, "Attached data1", data2, "...")
            exchange.CancelOrder(id, "Attached data1", data2, "...")
            LogProfit(100, "Attached data1", data2, "...")
        }
        
      • Verwendung von Indikatorfunktionen Bevor wir über die Indikatorfunktion sprechen, verstehen wir zuerst, was ein Indikator ist. Einfach gesagt, es ist eine Linie, wie beispielsweise gleitender Durchschnitt, MACD und ATR. F: Woher stammen diese Indikatoren? A: Natürlich ist es berechnet. F: Auf welcher Grundlage erfolgt die Berechnung? A: Berechnung auf der Grundlage von K-Liniendaten. F: Nehmen wir ein Beispiel? A: Nehmen wir den einfachsten Indikator gleitenden Durchschnitt als Beispiel, wenn wir die täglichen K-Linie (d. h. eine positive oder negative Linie stellt einen Tag dar) Daten als Datenquelle für die Indikatorberechnung verwenden. F: Kann der gleitende Durchschnittsindikator berechnet werden, wenn die Anzahl der K-Linien-BARs kleiner als 10 ist? A: Nicht nur der gleitende Durchschnittsindikator kann nicht berechnet werden, sondern jeder Indikator kann den effektiven Indexwert 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.JavaScriptSprache Strategie wird angezeigtnullbeim Drucken der berechneten Indikatordaten.

        Es kommt vor, dass es ein Tutorial-Beispiel im Strategiefeld gibt:https://www.fmz.com/strategy/125770Backtest die Tutorial Beispielstrategie, können wir das Diagramm durch das Backtesting-System und den 10-Perioden gleitenden Durchschnitt erzeugt sehen:

        img

        Strategie-Anpassung, gezeichnete K-Linie sowie gleitende Durchschnittsdiagramme.

        img

        F: Was ist, wenn ich einen gleitenden 10-Stunden-Durchschnitt will? A: Die Verwendung von K-Liniendaten mit den K-Liniendaten für die Stundenzeit ist in Ordnung.

        In einfachen Worten, die K-Linie, die wir sehen, ist ein Array, nachdem wir es digitalisiert haben (Sie können Baidu fragen, wenn Sie das Konzept des Arrays nicht verstehen), wobei jedes Element eine K-Linie-Spalte ist, die in der Reihenfolge angeordnet ist, das erste Element im Array ist am weitesten von der aktuellen Zeit entfernt, und das letzte Element des Arrays ist am nächsten zur aktuellen Zeit. Normalerweise ist der letzte Balken der K-Liniendaten der Balken des aktuellen Zeitraums, der sich in Echtzeit ändert und unvollständig ist (Sie können die Änderungen beobachten, indem Sie sich in eine Austauschseite einloggen und die K-Line beobachten). Die berechneten Indikatoren entsprechen auch den K-Linienbalken. Im obigen Beispiel können wir sehen, dass ein Indikatorwert einer K-Linienbalke entspricht. Beachten Sie, dass sich der letzte K-Linienbalken in Echtzeit ändert, und der berechnete Indikator wird sich auch mit der Änderung der K-Linienbalke ändern.

        Auf der FMZ Quant Trading Plattform können wir die TA-Bibliothek (die von der FMZ-Plattform implementierte Bibliothek, integriert in den Docker und verschiedene Sprachen können direkt verwendet werden) oder die talib-Bibliothek (die alte talib-Indikatorbibliothek, JS, C++-Integration, Python muss selbst installiert werden) verwenden. Um beispielsweise den gleitenden Durchschnitt im obigen Beispiel zu berechnen: Die TA-Bibliothek verwenden:

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

        Verwenden Sie die Talib-Bibliothek:

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

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

        Das gleiche gilt für andere komplexe Indikatoren, und wir müssen auf Indikatoren wie den MACD achten.

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

        In diesem Moment ist die Variable macd ein zweidimensionales Array (Sie können Baidu fragen, wenn Sie das Konzept nicht verstehen). Ein zweidimensionales Array ist einfach ein Array und jedes Element davon ist auch ein Array. F: Warum sind die MACD-Indikatordaten ein zweidimensionales Array? A: Weil der MACD-Indikator aus zwei Linien (Diff-Linie, DEA-Linie) und einer Reihe von Volumenbalken besteht (MacD-Volumenbalken, in der Tat können diese Volumenbalkendaten auch als Linie betrachtet werden).

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

        Hier ist auch ein vorgefertigtes Tutorial-Beispiel, wenn Sie interessiert sind, können Sie unter:https://www.fmz.com/strategy/151972

        img


Verwandt

Mehr