Type/to search
3
Follow
1504
Followers
FMZ: Grundlegendes Tutorial zum Schreiben quantitativer Plattformstrategien (unbedingt lesen)
Tutorials
Created 2019-08-13 17:47:27  Updated 2026-01-27 17:22:09
 33
 71696

Dieses Tutorial enthält die Grundkenntnisse zum Schreiben von Strategien, einschließlich API-Einführung, Rückmeldung, Diagramm usw. Nach Abschluss dieses Grundkurses wird der Benutzer in der Lage sein, die grundlegenden APIs zu benutzen und stabile Festplattenstrategien zu schreiben.Einführung in die FMZ-Erfinder-Quantifizierungsplattform 。

Das ist eine alte Version des Tutorials:Inventor Quantify (FMZ.COM) Strategien zur Erstellung eines vollständig verwendbaren Handbuchs 2.0 (Tutorial)In diesem Tutorial finden Sie eine Vielzahl von Inhalten, die Sie sich auch ansehen sollten.

Vorläufige Erläuterungen zur Strategie

Über die API

Programmierte Transaktionen sind solche, bei denen Programme über eine API mit einer Börse verbunden sind, um automatische Kauf- und Verkaufsprozesse oder andere Funktionen zu realisieren. Die API ist eine Application Programming Interface.

Derzeit gibt es zwei Hauptinterface-Protokolle für Digitalwährungsbörsen: REST und Websocket. Die REST-Protokolle benötigt einen Zugriff für jeden Dateneintrag. Zum Beispiel die API der Simulationsbörse wex.app, die https://api.wex.app/api/v1/public/ticker?market=BTC_USDT direkt im Browser öffnet, erhält folgende Ergebnisse:

{"data:{"buy":"11351.73","high":"11595.77","last":"11351.85","low":"11118.45","open":"11358.74","quoteVol":"95995607137.00903936","sell":"11356.02","time":1565593489318,"vol":"3552.5153"}}

Dies zeigt den aktuellen Stand der Transaktionen mit dem BTC_USDT-Trading-Paar, der sich bei jeder Aktualisierung ändert.market=Anschließend folgen die spezifischen Parameter für die Paare, die geändert werden können, um Daten für andere Paare zu erhalten. Für öffentliche Schnittstellen, wie z. B. die Marktbewegung, ist jeder zugänglich, so dass keine Verifizierung erforderlich ist, während einige Schnittstellen wie Bestell- und Acquire-Konten die Benutzeridentität feststellen müssen, wobei der API-KEY verwendet werden muss. Websocket ist ein Subskriptionsmodus, nach dem die erforderlichen Inhalte gesendet werden, senden die Börsen die aktualisierten Daten an das Programm und müssen nicht jedes Mal erneut aufgerufen werden.

Die FMZ-Quantitative Trading-Plattform enthält die REST-Schnittstelle für die einzelnen Börsen und verwendet einheitliche Aufrufe und Datenformate, um die Programmierung von Strategien zu vereinfachen und zu verbreiten. Die FMZ-Plattform unterstützt Websocket, das im nächsten Tutorial detailliert beschrieben wird.

Verschiedene Programmiersprachen

Die API-Dokumentation der FMZ-Plattform basiert zum größten Teil auf JavaScript, jedoch gibt es kaum Unterschiede zwischen den verschiedenen Sprachen aufgrund der Verpackung. Es ist nur auf Grammatik zu achten. C++ ist etwas spezifisch und wird in späteren Tutorials speziell vorgestellt.

Da es verschiedene Versionen von Python gibt, können sie zu Beginn des Programms angegeben werden, z. B.#!Python2,#!Python3Es ist wichtig zu beachten, dass JavaScript kürzlich auf die ES6-Grammatik aufgerüstet wurde. Im Folgenden werden Python- und Javascript-Codes gezeigt, die dieselben Funktionen bieten, nur die Grammatik unterscheidet sich, so dass die API-Dokumentation nur Beispiele für Javascript enthält. Dieses Tutorial berücksichtigt auch spezielle Anwendungsfälle für Python.

#python代码 def main(): while True: Log(exchange.GetAccount().Balance) Sleep(2000) #相应的Js代码 function main(){ while(true){ Log(exchange.GetAccount().Balance) Sleep(2000) } }

Empfehlungen für Ressourcen

  • Die FMZ-Plattform API-Dokumentation, die in diesem Tutorial nicht im Detail auf jede Schnittstelle beschrieben wird, ist in dieser Dokumentation zu finden: https://www.fmz.com/api
  • Wenn Sie die Signale von tradingview erhalten möchten, können Sie auf FMZ handeln.
  • Javascript, Python, schnelle Einführung, einfache Strategien ohne komplexe Grammatik, nur einige grundlegende Konzepte zu beherrschen, können Sie während der Programmierung lernen, während Sie dieses Tutorial lernen: https://www.fmz.com/bbs-topic/382 https://www.fmz.com/bbs-topic/417
  • Mac-Dokumentation, die für Trendstrategien sehr hilfreich ist.
  • Ein Beispiel für einen C++-Aufruf, der für Interessenten von C++ zur Verfügung steht, aber nicht empfohlen wird, da er nicht interpretierbar ist und schwer zu deaktivieren ist: https://www.fmz.com/strategy/61533
  • NetEase Cloud Classroom, FMZ-Offizielles Produkt, nur 20 Yuan, detaillierte Inhalte, von oberflächlich bis tief, geeignet für AnfängerLinks zu den Kursen
  • Einige Unterrichtsstrategien, die für die frühe Einstiegsphase geeignet sind, während Sie die grundlegenden Marginalstrategien lernen: https://www.fmz.com/square/s:tag:教学/1
  • Die Strategie wurde von der US-Regierung in einer Erklärung veröffentlicht, in der es hieß, dass die US-Regierung die Strategie nicht akzeptieren würde.

Debugging-Tools

Die Debug-Tool für die Debug-API-Schnittstelle wird von der FMZ-Quantitative Plattform bereitgestellt. Die Debug-Tool unterstützt nur JavaScript und kann nur für eine gewisse Zeit ausgeführt werden. Die Debug-Tool kann ohne die Erstellung einer Festplatte ausgeführt werden.
img

Architektur der Strategieprogramme

Das besondere an der Strategie ist, dass, wie bei normalen Programmen, sie in der Codefolge ausgeführt werden muss. Da die Strategie ununterbrochen ausgeführt werden muss, ist in der Regel ein Loop plus eine Ruhezeit erforderlich. Da die Häufigkeit der Zugriffe auf alle Handels-APIs begrenzt ist, ist eine entsprechende Schlafzeit erforderlich. Diese Architektur ist typisch für die Festintervall-Ausführung.

Weitere spezielle Funktionen sind:

  • onexit ((() Die maximale Laufzeit von 5 Minuten für die normale Ausstiegs-Schweiffunktion ist nicht angegeben, und wenn die Zeit überschritten wird, wird ein Interrupt-Fehler gemeldet. Einige Ergebnisse können beim Ausstiegsprogramm gespeichert werden.
  • onerror() Funktion, die als Ausnahme ausgeführt wird, mit einer Laufzeit von maximal 5 Minuten, kann nicht deklariert werden。
  • init (() ist eine Initiierungsfunktion, die automatisch aufgerufen wird, wenn die Strategie läuft. Sie kann nicht deklariert werden.
function onTick(){ var ticker = exchange.GetTicker() var account = exchange.GetAccount() //在这里写策略逻辑,将会每6s调用一次 } function main(){ while(true){ onTick() Sleep(6000) } }

Wenn ein Fehler beim Zugriff auf das Netzwerk dazu führen kann, dass die Strategie direkt gestoppt wird, kann die Festplattenstrategie mit dem try catch-fehlerbewussten Hauptzyklus (nicht mit dem try-retrieve) wiederhergestellt werden, wenn eine ähnliche Strategie wie der automatische Neustart nicht gestoppt wird. Natürlich wird diese Handlung nur empfohlen, wenn die Strategie stabil ist, da sonst alle Fehler nicht gemeldet werden und es schwierig ist, die Probleme der Strategie zu überprüfen.

function onTick(){ var ticker = exchange.GetTicker() var account = exchange.GetAccount() //在这里写策略逻辑,将会每6s调用一次 } function main(){ try{ while(true){ onTick() Sleep(6000) } }catch(err){ Log(err) } }

Die Börsen-API

Börsen- und Handelsparierung

Bei Anrufen einer beliebigen Exchange-bezogenen API müssen die Exchanges und die Paare festgelegt werden.exchangeDas ist ein Beispiel dafür, wieexchange.GetTicker()Das Ergebnis ist der Ticker für den Handel mit diesem Handelspartner.

Die FMZ-Plattform unterstützt das gleichzeitige Hinzufügen von mehreren Exchange-Trading-Pairs, z. B. BTC und ETH, die gleichzeitig auf demselben Exchange-Konto gehandhabt werden können. Es ist zu beachten, dass verschiedene Accounts auf demselben Exchange gleichzeitig hinzugefügt werden können, die sich an den Label-Distinguishments auf der FMZ-Website orientieren.exchangesDie Arrays werden in der Reihenfolge der Erstellung der Festplatte alsexchanges[0]exchanges[1]...und so weiter. Das Format der Paare ist:BTC_USDTBTC ist die Handelswährung und USDT die Kurswährung.

img

Offensichtlich ist diese Methode problematisch, wenn wir mit vielen Paaren handeln, und wir können SetCurrency verwenden, um Paare zu wechseln, wieexchange.SetCurrency("BTC_USDT")Zu diesem ZeitpunktexchangeDie gebundenen Paare werden zuBTC_USDTDie Anrufe werden bis zum nächsten Aufruf der Wechselpaare gültig sein.**Die neueste Unterstützung für Wechselpaare ist die Rückmessung.**Hier ist ein konkretes Beispiel:

var symbols = ["BTC_USDT", "LTC_USDT", "EOS_USDT", "ETH_USDT"] var buyValue = 1000 function main(){ for(var i=0;i<symbols.length;i++){ exchange.SetCurrency(symbols[i]) var ticker = exchange.GetTicker() var amount = _N(buyValue/ticker.Sell, 3) exchange.Buy(ticker.Sell, amount) Sleep(1000) } }

Öffentliche Schnittstellen, wie z.B. Zugriff auf Geschäftsinformationen

Wie bereits erwähnt, sind die Handelsschnittstellen im Allgemeinen öffentliche Schnittstellen, die für alle zugänglich sind. Die üblichen Handelsschnittstellen sind: Erhalten von Handelsticker, Erhalten von Tiefentiefe, Erhalten von K-Linie-Aufzeichnungen, Erhalten von Transaktions-Aufzeichnungen.

Die Schnittstellen sind in der RegelInfoFeld, das die ursprüngliche Datenstring, die von der Börse zurückgegeben wird, anzeigt, kann verwendet werden, um zusätzliche Informationen zu ergänzen, die zuvor analysiert werden mussten, JavaScript verwendetJSON.parse()Die json-bibliothek wird in python verwendet.TimeDas Feld zeigt die Zeitspanne der Anfrage an, die zur Beurteilung der Verzögerung verwendet werden kann.

Es ist möglich, dass der Zugriff auf die API-Schnittstelle auf der Festplatte fehlschlägt und zurückkehrt.nullPython ist zurück.NoneEs ist sehr wichtig, dass die Daten fehlerfrei sind, da diese Daten fehlerhaft sind und die Festplatte zum Stillstand bringen.

GetTicker

Die aktuelle Marktlage ist wahrscheinlich die am häufigsten verwendete Schnittstelle, die Informationen über den letzten Handelspreis, den Kauf- und Verkaufspreis, den jüngsten Handelsvolumen usw. enthält. Der Handelspreis kann anhand von Ticker-Informationen vor dem Auftrag festgelegt werden.{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}

function main() { var ticker = exchange.GetTicker() Log(ticker) //在调试工具中 return ticker 。可以看到具体的结果。 Log('上次成交价: ',ticker.Last, '买一价: ', ticker.Buy) }

GetDepth

Obwohl GetTicker eine Kauf- und Verkaufsplattform enthält, können Sie diese Schnittstelle verwenden, um die nächsten 200 Anleihen zu finden. Sie können diese Schnittstelle verwenden, um den Stoßpreis zu berechnen.

{ "Info":null, "Asks":[ {"Price":5866.38,"Amount":0.068644}, {"Price":5866.39,"Amount":0.263985}, ...... ] "Bids":[ {"Price":5865.13,"Amount":0.001898}, {"Price":5865,"Amount":0.085575}, ...... ], "Time":1530241857399 }

Beispiele für die Verwendung von Deep Access für Kauf- und Verkaufsscheine:

function main() { var depth = exchange.GetDepth() Log('买一价个: ', depth.Bids[0].Price, '卖一价格: ', depth.Asks[0].Price) }

GetRecords

K-Linien, eine der am häufigsten verwendeten Schnittstellen, die langfristige Preisinformationen zur Berechnung der Basis für verschiedene Indikatoren auf einmal zurückgeben. K-Linien-Zyklen können nicht angegeben werden, wenn nicht die Standard-Zyklen angegeben sind, die zum Hinzufügen von Festplatten verwendet werden. Die K-Linien-Länge kann nicht angegeben werden, sie erhöht sich mit der Zeit, bis zu 2000 Wurzeln, wobei die ersten Anrufe von etwa 200 Wurzeln (andere Börsen) zurückgegeben werden.

**exchange.SetMaxBarLen(Len)Die Anzahl der K-Linien, die zum ersten Mal erworben werden können (unterstützt von einigen Börsen) und die maximale Anzahl der K-Linien werden festgelegt.**Zum Beispiel:exchange.SetMaxBarLen(500)

GetRecords kann Perioden angeben: PERIOD_M1:1 Minuten, PERIOD_M5:5 Minuten, PERIOD_M15:15 Minuten, PERIOD_M30:30 Minuten, PERIOD_H1:1 Stunden, PERIOD_D1:1 Tage.exchange.GetRecords(PERIOD_M1)。 Nach dem Upgrade auf den neuesten Host wird die Unterstützung von Custom Cycles unterstützt, die Sekundenzahl der Zyklen wird als Parameter verwendet, die Minuteneinstellung wird auf der Grundlage von 1-minütigen K-Linien synthetisiert, die K-Linien unter 1 Minute werden über GetTrades () synthetisiert, und die Wareneinheiten werden auf der Grundlage von tick synthetisiert.。Das ist eine sehr schwierige Aufgabe.PERIOD_M1Diese globalen Variablen sind die Standard-Variablen der FMZ, die von Interessenten selbst registriert werden können.

Rückgabe von Daten:

[ {"Time":1526616000000,"Open":7995,"High":8067.65,"Low":7986.6,"Close":8027.22,"Volume":9444676.27669432}, {"Time":1526619600000,"Open":8019.03,"High":8049.99,"Low":7982.78,"Close":8027,"Volume":5354251.80804935}, {"Time":1526623200000,"Open":8027.01,"High":8036.41,"Low":7955.24,"Close":7955.39,"Volume":6659842.42025361}, ...... ]

Ein Beispiel für eine iterative K-Linie:

function main(){ var close = [] var records = exchange.GetRecords(PERIOD_H1) Log('total bars: ', records.length) for(var i=0;i<records.length;i++){ close.push(records[i].Close) } return close }

GetTrades

Die Anwendbarkeit der Daten erfolgt über einen bestimmten Zeitrahmen (nicht über eigene Transaktionen).

Eröffnung eines Kontos

Da diese Schnittstellen mit den Accounts verbunden sind und nicht direkt zugänglich sind, müssen sie mit API-KEY-Signaturen versehen werden. Die FMZ-Plattform hat die automatische Verarbeitung im Hintergrund vereinheitlicht und kann direkt verwendet werden.

GetAccount für das Konto

Erhalten Sie die Kontoinformationen. Eine der am häufigsten verwendeten Schnittstellen, die vor der Bestellung aufgerufen werden muss, um zu vermeiden, dass der Kontostand nicht ausreicht.{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}❚ wobei Stocks die verfügbare Währung des Handelspares sind, FrozenStocks die eingefrorene Währung des Auftrags, der noch nicht ausgeführt wurde, Balance die verfügbare Währung des Kurses und FrozenBalance die eingefrorene Währung.BTC_USDTWenn Sie Bitcoin (BTC) als Wertpapier bezeichnen, dann ist das Wertpapier BTC, wenn Sie Bitcoin (BTC) als Wertpapier bezeichnen, dann ist es USDT.

Es wird darauf hingewiesen, dass die zurückgegebenen Ergebnisse die Ergebnisse der angegebenen Paare sind. Die Informationen zu anderen Währungen in den Handelskonten werden in den Info-Feldern angezeigt.

Eine Festplatte, auf der der Gesamtwert der aktuellen Paare gedruckt wird:

function main(){ while(true){ var ticker = exchange.GetTicker() var account = exchange.GetAccount() var price = ticker.Buy var stocks = account.Stocks + account.FrozenStocks var balance = account.Balance + account.FrozenBalance var value = stocks*price + balance Log('Account value is: ', value) LogProfit(value) Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed //when run in debug tool, add a break here } }

Kaufen unter

Hier sind die Gebühren.exchange.Buy(Price, Amount)oderexchange.Buy(Price, Amount, Msg)Der Name "Price" steht für "Preis", "Amount" für "Menge", "Msg" ist eine zusätzliche Zeichenfolge, die in der Festplattenlogik angezeigt werden kann, aber nicht notwendig ist.null, um den Zustand der Bestellung zu überprüfen.

Wenn man einen Preis nach dem Marktpreis kaufen will, dann ist der Preis -1, der Betrag der Auftragswert, wieexchange.Buy(-1, 0.5)Der Handel ist korrekt.ETH_BTCDie Börsen unterstützen keine Marktpreisliste und keine Futures-Retracing.

Alle Preise und Mengen für Teiltransaktionen sind verfügbar_N()Die Präzisionsfunktion ist die Steuerung. Für den Futures-Handel Buy und Sell gibt es weitere Bedeutungen, die separat dargestellt werden.

Ein Beispiel für einen Kauf, der den entsprechenden Preis erreicht:

function main(){ while(true){ var ticker = exchange.GetTicker() var price = ticker.Sell if(price >= 7000){ exchange.Buy(_N(price+5,2), 1, 'BTC-USDT') break } Sleep(3000)//Sleep 3000ms } Log('done') }

Verkaufspreis

Die Parameter der Preisliste sind unterschiedlich, und die Preisliste ist wie folgt:exchange.Sell(-1, 0.2), die den Marktpreis von 0,2 ETH darstellt.

GetOrder, um Bestellungen abzurufen

Auf der Grundlage der Bestell-id erhalten Sie die Bestellinformationen.exchange.GetOrder(OrderId),OrderId ist die Bestell-ID, die bei der Bestellung zurückgegeben wird.**Beachtung der AuftragsartTypeFelder und BestellstatusStatusDie tatsächlichen Werte sind Zahlen, die verschiedene Bedeutungen repräsentieren, aber nicht für das Gedächtnis geeignet sind. Die FMZ repräsentiert diese Werte mit globalen Konstanten, wie z. B. bei unerledigten Aufträgen.StatusDas ist der Wert von 0.ORDER_STATE_PENDINGAlle diese globalen Konstanten sind in der Dokumentation zu finden.**◦ Rückgabe von Ergebnissen:

{ "Id":125723661, //订单id "Amount":0.01, //订单数量 "Price":7000, //订单价格 "DealAmount":0, //已成交数量 "AvgPrice":0, //成交均价 "Status":0, // 0:未完全成交, 1:已成交, 2:已撤单 "Type":1,// 订单类型,0:买单, 1:卖单 "ContractType":"",//合约类型,用于期货交易 "Info":{} //交易所返回原始信息 } }

Eine Strategie zum Kauf einer bestimmten Anzahl von Coins:

function main(){ while(true){ var amount = exchange.GetAccount().Stocks var ticker = exchange.GetTicker() var id = null if(5-amount>0.01){ id = exchange.Buy(ticker.Sell, Math.min(5-amount,0.2)) }else{ Log('Job completed') return //return the main function, bot will stop } Sleep(3000) //Sleep 3000ms if(id){ var status = exchange.GetOrder(id).Status if(status == 0){ //这里也可以用 status == ORDER_STATE_PENDING 来判断。 exchange.CancelOrder(id) } } } }

GetOrders hat noch keine Bestellung abgegeben

Erhalten Sie eine Liste aller unerledigten Bestellungen für den aktuellen Handel. Wenn keine unerledigten Bestellungen zurückgegeben werden, wird ein leeres Array zurückgegeben. Die Bestellliste enthält spezifische Ergebnisse wie GetOrder.

Beispiele für den Widerruf eines laufenden Geschäfts für alle Bestellungen:

function CancelAll(){ var orders = exchange.GetOrders() for(var i=0;i<orders.length;i++){ exchange.CancelOrder(orders[i].Id) // cancel order by orderID } } function main(){ CancelAll() while(true){ //do something Sleep(10000) } }

CancelOrder Rücktritt

Rücktritt der Bestellung gemäß der Bestellung.exchange.CancelOrder(OrderId)。 Rücktritt erfolgreich zurückgibt true, andernfalls zurückgibt false。 Bitte beachten Sie, dass ein vollständig ausgelieferter Auftrag zurückgezogen wird.

Terminkontrakte und unbefristete Verträge

Die oben beschriebene Funktion für den Bargeldhandel ist für den Handel mit Futures und Einfachfutures etwas anders. Bevor Sie mit der Programmierung von Futures handeln, müssen Sie sich mit den grundlegenden Konzepten wie Positionseröffnung, Niedrigstellung, Volllagerung, Niederlagerung, Leverage, Niedriglagerung, Verlust, Floating Profit, Garantiegeld und den entsprechenden Berechnungsformeln vertraut machen.

Der Terminkontrakt ist ähnlich wie der Futures-Kontrakt, nur dass es keine gleichzeitige Besitzung von mehreren Leerpositionen gibt.

Wenn die Börse gleichzeitig Futures-Cash wie OKEX und Huobi-Futures unterstützt, müssen Sie die OKEX-Futures- und die Huobi-Futures-Felder separat in der Börsen-Oberfläche auswählen, um sie als andere Börsen als Cash in der FMZ zu betrachten.

SetContractType Einrichtung des Vertrags

Der erste Schritt beim Futures-Handel besteht darin, den zu handelnden Kontrakt einzurichten, beispielsweise bei OKEX-Futures, um ein BTC-Handelspaar zu erstellen, das bei der Erstellung von Festplatten oder Retrospektiven ausgewählt wird. Außerdem muss der Code als Kontrakt für die aktuelle Woche, die nächste Woche oder den Quartal eingestellt werden.invalid contract type。**Im Gegensatz zu Cash-Trading-Paaren werden Futures-Kontrakte oft mit Handelstransaktionswährungen wie BTC als Sicherung gedeckt. Die BTC_USD-Trading-Paare, die BTC als Sicherung hinzufügen, werden in der Regel als BTC_USD-Trading-Paare dargestellt. Wenn es Futures gibt, die USDT als Sicherung hinzufügen, muss eine virtuelle BTC_USDT-Trading-Paare erstellt werden.**Nach der Einrichtung des Handelspares müssen auch bestimmte Vertragstypen wie dauerhaft, wöchentlich, wöchentlich und wöchentlich eingerichtet werden. Nach der Einrichtung des Vertrages können Handlungen wie Kauf und Verkauf vorgenommen werden.

Es gibt Kontrakte wie Coinbase, OKEX, HuobiDM und andere, bei denen es sich um Coinbase und USDT handelt. Es ist erforderlich, bei der Hinzufügung von Festplattenkontrakten zu unterscheiden. Die spezifischen Einstellungen sind wie folgt.

//OKEX期货 exchange.SetContractType("swap") // 设置为永续合约 exchange.SetContractType("this_week") // 设置为当周合约 exchange.SetContractType("next_week") // 设置为次周合约 exchange.SetContractType("quarter") // 设置为季度合约 //HuobiDM exchange.SetContractType("this_week") // 设置为当周合约 exchange.SetContractType("next_week") // 设置为次周合约 exchange.SetContractType("quarter") // 设置为季度合约 exchange.SetContractType("swap") // 设置为永续合约 //币安期货 exchange.SetContractType("swap") // 设置为永续合约,注意币本位和USDT本位都存在永续 exchange.SetContractType("quarter") // 设置为当季合约 exchange.SetContractType("next_quarter") // 设置为次季合约 //BitMEX exchange.SetContractType("XBTUSD") // 设置为永续合约 exchange.SetContractType("XBTM19") // 具体某个时间结算的合约,详情登录BitMEX查询各个合约代码 //GateIO exchange.SetContractType("swap") // 设置为永续合约,不设置默认为swap永续合约。 //Deribit exchange.SetContractType("BTC-27APR18") // 具体某个时间结算的合约,详情参看Deribit官网。

GetPosition hält Positionen

Eine Liste mit aktuellen Positionsinformationen, OKEX(OKCOIN) -Futures, die in ein Parameter eingegeben werden können, das den gewünschten Vertragstyp angibt. Wenn keine Positionen vorhanden sind, wird die leere Liste zurückgegeben[]Die Rückgabe von Haltungsdaten ist wie folgt: Es gibt viele konkrete Informationen, die in Verbindung mit der Analyse von Transaktionen benötigt werden.

DatentypVariablen-Namenveranschaulichen

Die ursprüngliche Struktur, die von der Object HDID Info HDID Exchange zurückgegeben wurde
Die Margin-Level-Schaufel-Größe, OKCoin ist 10 oder 20, OK-Futures-Volllagermodus gibt eine feste 10 zurück, da die native API dies nicht unterstützt
"Amount" ist die Anzahl der Aktien, die OKCoin hält. "Amount" ist die Anzahl der Aktien, die OKCoin hält.
"FrozenAmount" und "FrozenAmount"
"Nummer und Preis und Lagerpreis"
"Die Anzahl der Margin-Garantie ist eingefroren".
[number] [Profit] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number] [number]
Die Konst-Typologie enthält PD_LONG für die mehrfache Position (in CTP mit closebuy_today), PD_SHORT für die offene Position (in CTP mit closesell_today), PD_LONG_YD für die mehrfache Position (in CTP mit closebuy) und PD_SHORT_YD für die offene Position (in CTP mit closesell_today).
String oder ContractType oder Futures als Vertragskodex oder Aktien als Börsenkodex.

function main(){ exchange.SetContractType("this_week"); var position = exchange.GetPosition(); if(position.length>0){ //特别要注意引用前要先判断position长度再引用,否则会出错 Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:", position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,"ContractType:", position[0].ContractType) } }

Futures-Plating-Position

Es ist wichtig zu wissen, wie man die Lever-Größe und die Aufrufart einstellt:exchange.SetMarginLevel(10)Wenn Sie die Anzahl der Aktien, die Sie an der Börse anbieten möchten, mit 10 multiplizieren möchten, können Sie die Größe der unterstützten Leverage an der entsprechenden Börse anzeigen.Beachten Sie, dass der Leverage bei der Börse eingestellt werden muss, und der Code muss mit der Börse übereinstimmen, sonst wird ein Fehler gemacht│ oder auch nicht eingestellt, und benutzt die Standardhebel│
Es gibt eine Reihe von Möglichkeiten, wie Sie den Handel ausführen können:exchange.SetDirection(Direction) Das ist eine sehr schwierige Aufgabe.**Im Gegensatz zu Futures, wenn ein Perpetual-Kontrakt nicht gleichzeitig mit dem Konzept der Leerstellung gehalten wird, d.h. keine Positionen für einzelne Positionen erlaubt sind, wird die Leerstellung von Leerpositionen automatisch gelöscht, und alle müssen nur eingestellt werdenbuyUndsellVerfügbar. Sollte eine Zwei-Wege-Position unterstützt werden, ist eine Einstellung erforderlich.closebuy,closebuy。**Spezifische Beziehungen

BedienungParameter für SetDirectionAuftragsfunktion
Eröffnung von Positionenexchange.SetDirection("buy")exchange.Buy()
Pinto-Positionenexchange.SetDirection("closebuy")exchange.Sell()
Leerstandexchange.SetDirection("sell")exchange.Sell()
Leerlaufexchange.SetDirection("closesell")exchange.Buy()

Schließlich gibt es einen spezifischen Code für die Eröffnung und Schließung von Positionen. Die Auftragsmenge variiert je nach Börse, z. B. Huobi-Futures sind nach Anzahl der Positionen, eine 100 US-Dollar.

function main(){ exchange.SetContractType("this_week") // 举例设置 为OKEX期货 当周合约 price = exchange.GetTicker().Last exchange.SetMarginLevel(10) //设置杠杆为10倍 exchange.SetDirection("buy") //设置下单类型为做多 exchange.Buy(price+10, 20) // 合约数量为20下单 pos = exchange.GetPosition() Log(pos) Log(exchange.GetOrders()) //查看是否有未成交订单 exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell") exchange.Sell(price-10, 20) }

Im Folgenden finden Sie ein Beispiel für eine konkrete Strategie für eine vollständige Niederlage.

function main(){ while(true){ var pos = exchange.GetPosition() var ticker = exchange.GetTicekr() if(!ticker){ Log('无法获取ticker') return } if(!pos || pos.length == 0 ){ Log('已无持仓') return } for(var i=0;i<pos.length;i++){ if(pos[i].Type == PD_LONG){ exchange.SetContractType(pos[i].ContractType) exchange.SetDirection('closebuy') exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount) } if(pos[i].Type == PD_SHORT){ exchange.SetContractType(pos[i].ContractType) exchange.SetDirection('closesell') exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount) } } var orders = exchange.Getorders() Sleep(500) for(var j=0;j<orders.length;j++){ if(orders[i].Status == ORDER_STATE_PENDING){ exchange.CancelOrder(orders[i].Id) } } } }

Leveraging von digitalen Währungen

Die Einzahlung erfolgt auf der Grundlage der in der Code enthaltenen Anweisungen.

Um in den Margin-Konto-Modus zu wechseln, werden die Konto-Assets über die Leverage-Schnittstelle der Börse aufgerufen.
Wechseln Sie mit exchange.IO ("trade_normal") zurück in den Standard-Account-Modus.

Unterstützte Börsen:

  • OKEX V3: Leverage-Account-Modell-Trading-Paar unterscheidet sich von der normalen, einige Trading-Paar kann nicht.
  • Bitcoin: Das Leverage-Account-Modell unterscheidet sich von den üblichen Paaren, einige Paare sind möglicherweise nicht vorhanden.
  • ZB: Geld kann nur als QC übertragen werden, Leverage-Trading-Platform, Kapitalunabhängigkeit zwischen den verschiedenen Paaren, d.h. die Anzahl der QC-Coins unter den ETH_QC-Trading-Paaren, die in BTC_QC nicht zu sehen sind
  • FCoin
  • Binance ist ein Unternehmen, das sich mit der Entwicklung von Binance beschäftigt.

Futures für Waren

Es gibt einen großen Unterschied zwischen Commodity Futures Trading und Digital Currency Futures Trading. Zunächst ist die Handelszeit für Commodity Futures sehr kurz, die Digital Currency 24h-Handel; die Vereinbarung für Commodity Futures ist auch keine übliche REST API; die Handelsfrequenz und die Begrenzung der Anzahl der Bestellungen für Commodity Futures sind sehr locker, die Digital Currencies sind sehr locker usw. Daher gibt es viele Bereiche, an denen der Handel mit Commodity Futures besondere Aufmerksamkeit erfordert.

FMZ Quantitative Plattform als programmierter Handel Anbieter an die einzelnen Futures-Server Software-Lizenz, die Benutzer können ohne Antrags direkt verwenden, in der Add-Futures-Forex-Suchschrauber ist die Liste der FMZ bereits beantragt zu sehen. Spezifische Referenz-Post: https://www.fmz.com/bbs-topic/3860 ❚ Wenn Ihr Terminlieferant nicht mehr in der Liste, kann nur selbst beantragen, oder wieder in unterstützten Handel Öffner, in der Regel 2 Tage.

Aufgrund der Vorteile der FMZ-Plattform-Architektur können Benutzer auch mehrere Futures-Händler-Konten hinzufügen und einige Funktionen, die andere Commodity-Futures-Programmierungshandelssoftware nicht kann, wie die Synthese von Hochfrequenzticks, Referenz: https://www.fmz.com/bbs-topic/1184

Politischer Rahmen

Zunächst einmal, da es sich nicht um einen 24-Stunden-Transaktionsprozess handelt und ein Login erforderlich ist, muss der Linkstatus beurteilt werden, bevor ein Transaktionsprozess durchgeführt wird.exchange.IO("status")fürtrueWenn die Anmeldung nicht erfolgreich ist, wird die API aufgerufen, und es wird nicht gefragt, 'not login'. Sie können nach dem Beginn der Strategie schlafen ((2000), eine bestimmte Zeit für die Anmeldung geben. Sie können auch erneut mit dem Abonnement versuchen._C(exchange.SetContractType,"MA888")Die Landung wurde von einem Flugzeug aus dem Vereinigten Königreich durchgeführt.

Die Codes für den Erwerb und den Handel von Commodity-Futures sind identisch mit denen von Digital-Currency-Futures. Hier werden die Unterschiede und die Notwendigen Punkte beschrieben.

function main(){ _C(exchange.SetContractType,"MA888") //没登陆成功是无法订阅合约的,最好重试一下 while(true){ if(exchange.IO("status")){ var ticker = exchange.GetTicker() Log("MA888 ticker:", ticker) LogStatus(_D(), "已经连接CTP !")//_D获取事件 } else { LogStatus(_D(), "未连接CTP !") Sleep(1000) } } }

Es wird empfohlen, Commodity Futures Trading zu verwenden (siehe unten), da der Code sehr einfach ist und keine aufwendigen Details zu verarbeiten.

function main() { // 使用了商品期货类库的CTA策略框架 $.CTA(Symbols, function(st) { var r = st.records var mp = st.position.amount var symbol = st.symbol /* r为K线, mp为当前品种持仓数量, 正数指多仓, 负数指空仓, 0则不持仓, symbol指品种名称 返回值如为n: n = 0 : 指全部平仓(不管当前持多持空) n > 0 : 如果当前持多仓,则加n个多仓, 如果当前为空仓则平n个空仓,如果n大于当前持仓, 则反手开多仓 n < 0 : 如果当前持空仓,则加n个空仓, 如果当前为多仓则平n个多仓,如果-n大于当前持仓, 则反手开空仓 无返回值表示什么也不做 */ if (r.length < SlowPeriod) { return } var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod)); if (mp <= 0 && cross > ConfirmPeriod) { Log(symbol, "金叉周期", cross, "当前持仓", mp); return Lots * (mp < 0 ? 2 : 1) } else if (mp >= 0 && cross < -ConfirmPeriod) { Log(symbol, "死叉周期", cross, "当前持仓", mp); return -Lots * (mp > 0 ? 2 : 1) } }); }

CTP-Datenerfassungsmodus

Die Commodity Futures verwenden das CTP-Protokoll, bei dem alle Trades und Auftragsgeschäfte nur mit Änderungen benachrichtigt werden, während die Abfrage von Orders, Konten und Positionen eine aktive Abfrage ist. Daher ist die Hochfrequenz-Strategie für das schreiben von Ereignissen geeignet. Die Standardmodus-Schnittstelle für den Zugriff auf Trades wieGetTickerGetDepthGetRecordsDie Strategie kann also ohne Schlaf verwendet werden. Wenn sich die Situation ändert, werden Tickers, Tiefen und Aufzeichnungen aktualisiert. Der Aufruf einer beliebigen Schnittstelle wird sofort zurückgegeben. Der Aufruf der Schnittstelle wird in den Wartemodus gesetzt.

Wenn Sie immer wieder Daten abrufen wollen, auch wenn es sich um alte Daten handelt, können Sie in den Modus der sofortigen Aktualisierung umschalten.exchange.IO("mode", 0)❚ Die Strategie kann dann nicht als ereignisgesteuert geschrieben werden, sondern muss mit einem SLeep-Ereignis versehen werden, um eine schnelle Todesspirale zu vermeiden. ❚ Einige nicht hochfrequente Strategien können dieses Modell verwenden, die Strategie ist einfach zu entwerfen.exchange.IO("mode", 1)Die Cache-Modus-Default kann zurückgeschaltet werden.

Bei der Bedienung einzelner Verträge kann der Standardmodus verwendet werden. Bei mehreren Verträgen besteht jedoch die Möglichkeit, dass ein Vertrag nicht aktualisiert wird, was dazu führt, dass die Benutzeroberfläche blockiert wird und die Benutzeroberfläche anderer Verträge nicht aktualisiert wird. Um dieses Problem zu lösen, kann der Sofort-Aktualisierungsmodus verwendet werden, ohne jedoch eine Hochfrequenzstrategie zu schreiben.exchange.IO("wait")Wenn mehrere Exchange-Objekte hinzugefügt werden, was bei Commodity-Futures selten ist, könnenexchange.IO("wait_any")Der Index, der dann zurückgegeben wird, zeigt den zurückgegebenen Börsenindex an.

Die Aktion tick ändert sich weiter{Event:"tick", Index:交易所索引(按实盘上交易所添加顺序), Nano:事件纳秒级时间, Symbol:合约名称}
Bestellungen weitergeleitet:{Event:"order", Index:交易所索引, Nano:事件纳秒级时间, Order:订单信息(与GetOrder获取一致)}

An diesem Punkt kann die Strategiestruktur wie folgt geschrieben werden:

function on_tick(symbol){ Log("symbol update") exchange.SetContractType(symbol) Log(exchange.GetTicker()) } function on_order(order){ Log("order update", order) } function main(){ while(true){ if(exchange.IO("status")){ //判断链接状态 exchange.IO("mode", 0) _C(exchange.SetContractType, "MA888")//订阅MA,只有第一次是真正的发出订阅请求,接下来都是程序切换,不耗时间。 _C(exchange.SetContractType, "rb888")//订阅rb while(true){ var e = exchange.IO("wait") if(e){ if(e.event == "tick"){ on_tick(e.Symbol) }else if(e.event == "order"){ on_order(e.Order) } } } }else{ Sleep(10*1000) } } }

Unterschiede zwischen Commodity Futures und digitalen Währungen

Es ist auch zu beachten, dass die Commodity-Futures von den digitalen Währungsbörsen unterschiedlich sind. Wie GetDepth gibt es tatsächlich nur eine Tiefe ((5 Tiefen sind teuer), und GetTrades erhält keine Transaktionsgeschichte ((sie basieren auf simulierten Positionsänderungen, keine echten Transaktionsunterlagen)).

Einrichten eines Vertrages

exchange.IO (("instruments"): Gibt die Liste aller Verträge der Börse in Wörterbuchform zurück, nur für die Festplatte.
exchange.IO (("products"): Gibt die Liste aller Produkte der Börse im Wörterbuchformat zurück. Nur Festplatten werden unterstützt.
exchange.IO (("subscribed"): Rückgabe eines abonnierten Vertrags im gleichen Format, nur für die Festplatte.

Traditionelle CTP-FuturesContractTypeDas bedeutet, dass die Kontrakt-ID, groß- und kleingeschrieben unterschieden werden soll.exchange.SetContractType("au1506")❚ Die erfolgreiche Einstellung des Vertrags enthält Details über den zurückgegebenen Vertrag, wie zum Beispiel die Mindestkaufmenge, die Handhabungskosten, die Lieferzeit usw. ❚ Bei der Abonnementsbuchung von mehreren Verträgen wird nur das erste Mal eine echte Abonnementsanfrage gesendet, danach wird nur auf der Code-Ebene umgeschaltet, ohne Zeit zu verbrauchen. Die primären Kontinuitätsverträge werden mit einem Code wie 888 wie MA888 und den Kontinuitätsindexverträgen wie 000 wie MA000 nur für den Handel mit virtuellen Verträgen unterstützt.Die Mac-Sprache kann jedoch den Mainstream-Vertrag bearbeiten, und die Programmierung wechselt automatisch die Position, d.h. sie löscht die nicht-mainstream-Position und eröffnet eine neue Position auf der Mainstream-Position.

Ein erfolgreiches Anmelden kann den Vertrag nicht einrichten, aber es wird auch sofort zurückgegeben, so dass man mit _C erneut versuchen kann, in dem Wissen, dass der CTP-Anmelden abgeschlossen ist. Nach erfolgreicher Anmeldung ist das erneute Einrichten des Vertrages nicht zeitaufwendig und erzeugt keinen echten Netzwerkzugriff.

Ein- und Auslagerung

SetDirectionDie Richtungen sind verfügbarbuy, closebuy, sell, closesellVier Parameter, mehr Futuresclosebuy_todayUndclosesell_todayDas ist eine sehr schwierige Aufgabe.closebuy/closesellFür die Ausgleichsposition werden nur die Varianten der letzten Periode unterteilt, was die Gebühren beeinflussen kann. Für die CTP-Klassiker kann ein zweiter Parameter mit 1 Ton oder 2 Ton oder 3 Ton eingestellt werden, der jeweils auf die Spekulationen, die Gewinne und die Sicherheiten bezieht. Es gibt keine Default-Spekulation.Spezifische Operationen wie Kauf und Verkauf, Positionsgewinnung, Ordergewinnung, Rücknahme, Kontogewinnung sind identisch mit dem Handel mit digitalen Währungen.

BedienungParameter für SetDirectionAuftragsfunktion
Eröffnung von Positionenexchange.SetDirection("buy")exchange.Buy()
Pinto-Positionenexchange.SetDirection("closebuy")exchange.Sell()
Leerstandexchange.SetDirection("sell")exchange.Sell()
Leerlaufexchange.SetDirection("closesell")exchange.Buy()

Das folgende Beispiel ist eine spezifische Playoff-Funktion, beachten Sie, dass dieses Beispiel zu einfach ist, aber auch eine Reihe von Fragen zu berücksichtigen, ob Sie sich in der Handelszeit befinden, wie Sie die Order nicht vollständig abschließen, wie Sie die Order aufheben, wie hoch die maximale Auftragsmenge ist, ob die Häufigkeit zu hoch ist, insbesondere der Kursverlust oder die Börsenöffnung. Nur als Referenz.**Für die Festplatte empfiehlt sich die Verwendung einer plattformgebundenen Sammlung, http://www.fmz.com/strategy/12961**。 Im Abschnitt Bibliotheken gibt es eine detaillierte Beschreibung und es wird empfohlen, den Quellcode der Bibliotheken zu lernen。

function Cover(contractType, amount, slide) { for (var i = 0; i < positions.length; i++) { if (positions[i].ContractType != contractType) { continue; } var depth = _C(e.GetDepth); if (positions[i].Type == PD_LONG || positions[i].Type == PD_LONG_YD) { exchange.SetDirection(positions[i].Type == PD_LONG ? "closebuy_today" : "closebuy"); exchange.Sell(depth.Bids[0]-slide, amount, contractType, positions[i].Type == PD_LONG ? "平今" : "平昨", 'Bid', depth.Bids[0]); } else { exchange.SetDirection(positions[i].Type == PD_SHORT ? "closesell_today" : "closesell"); exchange.Buy(depth.Asks[0]+slide, amount, contractType, positions[i].Type == PD_SHORT ? "平今" : "平昨", 'Ask', depth.Asks[0]); } } }

Commodity Futures unterstützt benutzerdefinierte Auftragstypen (Festplatte unterstützt, Rückmessung nicht unterstützt), nachträglich die Form des Ladens angeben, die in der Ladung angehängt wird_Die Rückseite der Flasche ist wie

exchange.SetDirection("buy_ioc"); exchange.SetDirection("sell_gtd-20170111")

Die spezifischen Suffixe sind:

  • ioc sofort abgeschlossen oder THOST_FTDC_TC_IOC rückgängig gemacht
  • gfs Dieser Abschnitt ist gültig THOST_FTDC_TC_GFS
  • gfd ist an diesem Tag gültig THOST_FTDC_TC_GFD
  • gtd Gültig bis zum angegebenen Datum THOST_FTDC_TC_GTD
  • gtc gültig bis zum Widerruf THOST_FTDC_TC_GTC
  • gfa-Sammlung ist gültig THOST_FTDC_TC_GFA

Schnittstelle

Die CTP-Schnittstelle ist bei Commodity Futures Traders standardmäßig geöffnet und kann auf Wunsch umgewandelt werden. Durch die FMZ-Verpackung ist die Aufforderung identisch. Der Unterschied ist, dass Konten, Bestellungen und Lagerhalte im Push-Modus sind, so dass die Treuhänder diese Daten lokal pflegen und sofort zurückkehren, wenn die entsprechende Schnittstelle aufgerufen wird, ohne tatsächlich eine Anfrage zu stellen.

Die EOS-Vereinbarung definiert die folgenden Bestelltypen:

  • gfd ist aktuell TAPI_ORDER_TIMEINFORCE_GFD
  • TAPI_ORDER_TIMEINFORCE_GTC, gültig bis zur Rücknahme
  • gtd Gültig bis zum angegebenen Datum TAPI_ORDER_TIMEINFORCE_GTD
  • FAK-Teil abgeschlossen, Rest zurückgezogen
  • ioc sofort abgeschlossen oder TAPI_ORDER_TIMEINFORCE_FAK rückgängig gemacht
  • TAPI_ORDER_TIMEINFORCE_FOK wurde vollständig widerrufen

Häufig verwendete globale Funktionen

Log-Tagebuch und WeChat-Versendung

In der Festplatten-Oberfläche wird ein Log, ein @-Zeichen und eine Nachricht in die Push-Queue eingegeben, die direkt nach der Bindung von WeChat oder Telegram verschickt wird.Log('推送到微信@')

Die Farbe des Logs kann auch angepasst werdenLog('这是一个红色字体的日志 #ff0000')#ff0000Die 16-Zahlen der RGB-Farben

Alle Logfiles befinden sich in der sqlit-Datenbank auf der Festplatte im Verzeichnis des Verwalters. Sie können mit der Datenbanksoftware heruntergeladen und geöffnet werden. Sie können auch zur Wiederherstellung von Kopien der Backup-Datenbank verwendet werden (der Name der Datenbank und die Festplatte sind identisch).

LogProfit druckt die Gewinne

Erträge werden erfasst und auf der Festplatte-Interface eine Ertragskurve gezeichnet, die auch nach dem Neustart der Festplatte beibehalten werden kann.LogProfit(1000)AchtungLogProfitDie Parameter für die Zahlen sind nicht unbedingt Erträge, sondern beliebige Zahlen, die Sie selbst ausfüllen müssen.

LogStatus-Statuszeile angezeigt (mit Tabellen)

Die Festplatten-Status, da die Log-Log-Dateien gespeichert werden und ständig aktualisiert werden, kann verwendet werden, wenn nur Informationen angezeigt werden müssen, die nicht gespeichert wurden.LogStatusFunktion.LogStatusDie Parameter sind Strings und können auch als Tabelleninformationen verwendet werden.

Ein Beispiel für eine Tabelle, die den Status der Festplatte anzeigt:

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显示到一组里 LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // 上下排列显示多个表

Schlafen

Die Parameter werden in Millisekunden angegeben, z. B.Sleep(1000)Eine Sekunde für die Ruhezeit. Da die Frequenz der Zugriffe auf alle Transaktionen begrenzt ist, wird in der Regel in der Strategie die Ruhezeit in den Todeszyklus aufgenommen.

_G Speichern der Daten

Wenn die Festplatte neu gestartet wird, wird das Programm neu gestartet._GEs ist sehr praktisch und kann JSON-sequenzierte Inhalte speichern._GDie Funktion wird inonexit()Das bedeutet, dass jedes Mal, wenn die Strategie beendet wird, die benötigten Informationen automatisch gespeichert werden.
Wenn Sie mehr formatierte Daten speichern möchten, dann können Sie diese auf Ihrem Computer speichern._Die G-Funktion ist nicht sehr nützlich, da sie mit Python direkt in die Datenbank geschrieben werden kann.

function onexit(){ _G('profit', profit) } function main(){ _G("num", 1); // 设置一个全局变量num, 值为1 s _G("num", "ok"); // 更改一个全局变量num, 值为字符串ok _G("num", null); // 删除全局变量 num _G("num"); // 返回全局变量num的值,如果不存在返回null var profit = 0 if(_G('profit')){ profit = _G('profit') } }

_N-Präzisionsfunktion

Bei Bestellungen, bei denen oftmals Preise und Mengen genau kontrolliert werden müssen, verwendet die FMZ die Funktion _N, um die Speicherung kleiner Ziffern zu bestimmen, z. B._N(4.253,2)Das Ergebnis ist 4,25.

_C automatische Wiederholung

Es gibt keine Garantie, dass jeder Zugriff erfolgreich ist, und es gibt keine Garantie, dass jeder Zugriff erfolgreich ist._C ist eine Funktion, die automatisch erneut versucht wird. Es wird die angegebene Funktion aufgerufen, bis sie erfolgreich zurückgegeben wird (die Funktion, die null oder false zurückgibt, wird erneut versucht), z. B._C(exchange.GetTicker)Die _CDelay-Funktion kann eingesetzt werden, um die Wiederholungsintervalle zu steuern, z. B. _CDelay(1000), und die Änderung der _C-Funktion wird empfohlen, die Wiederholungsintervalle auf 1 Sekunde festzulegen.GetTicker(),exchange.GetDepth,GetTrade,GetRecords,GetAccount,GetOrders, GetOrderDie C-Fehler sind in C++ erlaubt, um zu verhindern, dass ein fehlgeschlagener Zugriff zu einer Unterbrechung des Programms führt.

CancelOrderDie _C-Funktion kann nicht verwendet werden, da ein Rücktritt aus verschiedenen Gründen fehlschlägt. Wenn eine einzelne Einheit bereits abgeschlossen ist, wird der Rücktritt als Fehlschlag zurückgegeben.

_C-Funktionen können auch in Parameter übertragen werden und werden auch für benutzerdefinierte Funktionen verwendet.

function main(){ var ticker = _C(exchange.GetTicker) var depth = _C(exchange.GetDepth) var records = _C(exchange.GetRecords, PERIOD_D1) //传入参数 }

_D-Datum-Funktion

Direktanruf_D()Gibt die aktuelle Zeitstring zurück, z. B.:2019-08-15 03:46:14。 Wenn es sich um einen Aufruf in der Rückmessung handelt, wird die Rückmesszeit zurückgegeben。 Die _D-Funktion kann verwendet werden, um die Zeit zu beurteilen, z. B.: _D().slice(11) > '09:00:00':

_D(timestamp,fmt)Die Zeitmenge wird in einer Zeitstring umgewandelt, wie z.B._D(1565855310002)Das fmt-Parameter ist ein Zeitformat, der Standardformat.yyyy-MM-dd hh:mm:ss

TA-Indexfunktion

Für einige gängige Kennziffern wie MA\MACD\KDJ\BOLL sind die FMZ-Plattform direkt integriert. Die spezifischen unterstützten Kennziffern finden Sie in der API-Dokumentation.

Bevor Sie die Kennzahl verwenden, sollten Sie die Länge der K-Linien bestimmen. Wenn die vorherige Länge der K-Linien nicht die erforderliche Periode für die Berechnung erfüllt, ist die FolgenullWenn die Länge der eingegebenen K-Strecke 100 ist und die Periode der berechneten MA 10 ist, sind die ersten 9 Werte null und die folgenden werden normal berechnet.

JavaScript unterstützt auch die vollständige Talib, die als eine von Drittanbietern unterstützte Bibliothek bezeichnet wird.talib.CCI(records)❚ Referenz: http://ta-lib.org/function.html ❚ Für Python kann die talib-Bibliothek selbstständig installiert werden, da die Kompilierung erforderlich ist und die einfache Pip-Installation nicht möglich ist.

Die Pointer-Funktion kann in beliebige Arrays übertragen werden, zusätzlich zu den Daten der K-Linie.

function main(){ var records = exchange.GetRecords(PERIOD_M30) if (records && records.length > 9) { var ma = TA.MA(records, 14) Log(ma) } }

Funktionen, die häufig in JavaScript verwendet werden

Hier sind einige der häufigsten JavaScript-Funktionen auf der Festplatte:

  • Date.now()Zurück zur aktuellen Zeitspanne
  • parseFloat()Umwandlung einer Zeichenkette in eine Zahl, z. B.parseFloat("123.21")
  • parseInt()Umwandlung der Zeichenfolge in eine ganze Zahl
  • num.toString()Umsetzen von Zahlen in Strings und von num in Zahlen.
  • JSON.parse()Json-String formatiert, wieJSON.parse(exchange.GetRawJSON())
  • Die JavaScript-basierte Math-Library-Funktion ist wie folgt:Math.max(),Math.abs()Das ist eine sehr einfache Aufgabe, die man sich selbst überlegen kann.
  • Die FMZ bezieht sich auf die JavaScript-basierte Third-Party-Math-Bibliothek von https://mathjs.org/
  • FMZ bezieht sich auf die JavaScript-Unterscore-Bibliothek von Drittanbietern, die viele JS-Belastungen erleichtert.

Vorlagenbibliothek

Es gibt viele Situationen, in denen eine Strategie-Funktion für die Festplatte zu schreiben ist, zum Beispiel eine einfache Funktion wie den Kauf von 5 Münzen, die wir berücksichtigen müssen: Ist der aktuelle Saldo ausreichend? Was ist der Auftragspreis? Wie hoch ist die Genauigkeit?

Die JavaScript-Klassenbibliotheken für den Handel mit digitalen Währungen und Warenfutures sind standardmäßig eingebaut und müssen nicht kopiert werden. Die anderen Template-Klassenbibliotheken finden Sie auf der Strategie-Platz unter https://www.fmz.com/square/20/1 . Kopieren und speichern Sie die Template-Klassenbibliotheken und wählen Sie aus, welche Sie verwenden möchten, wenn Sie Ihre eigene Strategie erstellen.

JavaScript-Template-Funktionen werden in$Python wird vonextAnfang

Bibliothek für digitale Währungen

Der Source Code befindet sich unter https://www.fmz.com/strategy/10989 und ist integriert. Es ist nicht notwendig, ihn zu kopieren.

Zugang zum Konto:

$.GetAccount(e) Log($.GetAccount()); // 获取账户信息, 带容错功能 Log($.GetAcccount(exchanges[1]));

Die Rücknahme der Bestellung:

$.Buy/Sell(e, amount) $.Buy(0.3); // 主交易所买入0.3个币 $.Sell(0.2); // 主交易所卖出0.2个币 $.Sell(exchanges[1], 0.1); // 次交易所卖出0.1个币 $.CancelPendingOrders(e, orderType) $.CancelPendingOrders(); // 取消主交易所所有委托单 $.CancelPendingOrders(ORDER_TYPE_BUY); // 取消主交易所所有的买单 $.CancelPendingOrders(exchanges[1]); // 取消第二个交易所所有订单 $.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // 取消第二个交易所所有的卖单

Das ist eine Frage der Überschneidung.

$.Cross(periodA, periodB) / $.Cross(arr1, arr2); var n = $.Cross(15, 30); var m = $.Cross([1,2,3,2.8,3.5], [3,1.9,2,5,0.6]) 如果 n 等于 0, 指刚好15周期的EMA与30周期的EMA当前价格相等 如果 n 大于 0, 比如 5, 指15周期的EMA上穿了30周期的EMA 5个周期(Bar) 如果 n 小于 0, 比如 -12, 指15周期的EMA下穿了30周期的EMA 12个周期(Bar) 如果传给Cross不是数组, 则函数自动获取K线进行均线计算 如果传给Cross的是数组, 则直接进行比较

$.withdraw ((e, currency, address, amount, fee, password) Rückzahlungsfunktion:

$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")

Waren-Futures-Kategorie

Die Commodity Futures Trading Classroom ist stabil und empfohlen. Der Quellcode befindet sich unter: https://www.fmz.com/strategy/12961 。 Es ist integriert und muss nicht kopiert werden。

CTA-Bibliothek

  • Die Festplatte wird automatisch den Index auf die Hauptströmung übertragen.
  • Die Übertragung erfolgt automatisch.
  • Die Rückführung kann eine spezifische Kartierung geben, z. B. rb000/rb888, d. h. die Kartierung der rb-Index-Transaktionen auf die Hauptstrom-Kontinuität.
  • Es kann auch auf andere Kontrakte abgebildet werden, z.B. rb000/MA888, also auf die K-Linie des rb-Index, um die MA-Hauptreife fortlaufend zu handeln
function main() { $.CTA("rb000,M000", function(r, mp) { if (r.length < 20) { return } var emaSlow = TA.EMA(r, 20) var emaFast = TA.EMA(r, 5) var cross = $.Cross(emaFast, emaSlow); if (mp <= 0 && cross > 2) { Log("金叉周期", cross, "当前持仓", mp); return 1 } else if (mp >= 0 && cross < -2) { Log("死叉周期", cross, "当前持仓", mp); return -1 } }); }

Beispiel für die Anrufung einer Klassenbibliothek

function main() { var p = $.NewPositionManager(); p.OpenShort("MA609", 1); p.OpenShort("MA701", 1); Log(p.GetPosition("MA609", PD_SHORT)); Log(p.GetAccount()); Log(p.Account()); Sleep(60000 * 10); p.CoverAll("MA609"); LogProfit(p.Profit()); Log($.IsTrading("MA609")); // 多品种时使用交易队列来完成非阻塞的交易任务 var q = $.NewTaskQueue(); q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) { Log(task.desc, ret) }) while (true) { // 在空闲时调用poll来完成未完成的任务 q.poll() Sleep(1000) } }

Zeichnen von Kategorien

Da die ursprüngliche Grafik-Funktion relativ komplex ist, empfiehlt es sich für Anfänger, die Grafik-Klassenbibliothek direkt zu verwenden, sehr einfache Grafik-Flicken- und K-Linien-Diagramme usw. Die FMZ enthält eine einfache Klassenbibliothek, die auf der Strategie-Edit-Seite angezeigt werden kann. Wenn diese nicht integriert ist, muss der Benutzer sie selbst kopieren und speichern, um die Referenzen in der Strategie auswählen zu können.

img

Die Graphik-Kategorie wurde in JavaScript vervielfältigt.
Die Python-Designs-Klasse-Bibliothek wurde übertragen.

Ein Beispiel:

function main() { while (true) { var ticker = exchange.GetTicker() if (ticker) { $.PlotLine('Last', ticker.Last) //可以同时画两条线,Last是这条线的名字 $.PlotLine('Buy', ticker.Buy) } Sleep(6000) } }

Einstellungen für die Strategieparameter

Unter der Strategie-Edition befinden sich die Einstellungen für die Strategieparameter, die den globalen Variablen der Strategie entsprechen und an beliebiger Stelle im Code zugänglich sind. Die Strategieparameter können in der Festplatte-Oberfläche geändert und nach dem Neustart wirksam werden. Daher können einige Variablen als Parameter eingestellt werden, die auch ohne Änderung der Strategie geändert werden können.
img

  • Variablen-NamenDas sind die Zahlen, Strings, Comboxes usw., die direkt in der Strategiegruppe verwendet werden können.
  • beschreiben: Name der Parameter in der Strategie-Oberfläche, um die Bedeutung der Parameter zu verstehen.
  • AnmerkungDie Beschreibung wird angezeigt, wenn die Maus auf dem Parameter bleibt.
  • TypDer Typ des Parameters wird im Folgenden beschrieben.
  • StandardwerteDer Standardwert für dieses Parameter ist:

Die String- und die Zifferntypen sind leicht verständlich und die am häufigsten verwendeten Typen. Die Abziehungsleiste zeigt die Optionen in der Parameter-Oberfläche an, wie Sie die SYMBOL-Parameterwerte der Abziehungsleiste so einstellen können:BTC|USDT|ETHWenn Sie USDT in der Parameterseite nach unten ziehen, wird der Wert von SYMBOL in der Strategie als Index 1 für USDT ausgewählt. Die Markierung ist ein wählbares Feld, das als wahr markiert wird, andernfalls als falsch.

Die Parameter können in einer Vielzahl von Einstellungen eingestellt werden.

Strategie-Backtesting

Nach der Quantifizierung einer Strategie können Sie Ihre Strategie mit historischen Daten testen, um zu sehen, wie Ihre Strategie in den historischen Daten profitiert. Die Rückmeldungsergebnisse sind natürlich nur als Referenz gedacht. Die FMZ-Quantifizierungsplattform unterstützt die Rückmeldung von digitalen Währungen Cash, Futures, BitMEX-Permanent Contracts und Commodity Futures, von denen digitale Währungen hauptsächlich die Mainstreamvarianten unterstützen.
Javascript wird im Browser getestet, Python wird von einem Administrator getestet, der von der Plattform bereitgestellt wird. Mac-Sprachgetest erfordert weitere Parameter, die in der Mac-Sprachdokumentation enthalten sind.

Rückmeldung

Die Onbar-Rückmessung basiert auf K-Linien, d.h. jeder K-Line erzeugt einen Rückmesszeitpunkt, an dem Informationen über die aktuellen K-Linien, wie z. B. den Preis für den Hoch- und Tiefststand, den Handelsvolumen und historische K-Line-Informationen vor diesem Zeitpunkt, abgerufen werden können. Der Nachteil dieses Mechanismus ist klar: Auf einer K-Line kann nur ein Kauf und Verkauf erzeugt werden, der Preis ist in der Regel der Abschlusspreis der K-Line.

Die FMZ-Plattform erzeugt zwei Arten von Rückmeldungen: Analog- und Festplatten-Rückmeldungen. Die Analog-Rückmeldung erzeugt 14 Rückmeldungspunkte pro K-Linien-Periode, die auf der Basis der K-Linien-Periode simulierte Tick erzeugen.**Die Festplatten-Stufe ist die reale Sammlung von Tickets, die sich etwa alle Sekunden wiederholen, und unterstützt derzeit teilweise die reale Tiefe (sie enthält 20 Dateien), die tatsächliche Ein-zu-Eins-Transaktion.**Die Rücklaufgeschwindigkeit ist langsam, da die Datenmenge sehr groß ist, so dass eine besonders lange Zeit nicht zurückverfolgt werden kann. Die Rücklaufmechanik von FMZ ermöglicht eine Strategie, mehrere Geschäfte auf einer K-Linie zu tätigen, um zu vermeiden, dass nur die Schließung der Schließung der Schließung möglich ist.

Die Strategie-Rahmen für die Wiederholung sind die gleichen wie für die Festplatte und sind ein toter Kreislauf. Da die Wiederholung an verschiedenen Wiederholungspunkten gesprungen wird, kann die Wiederholung ohne Schlaf durchgeführt werden, und am Ende einer Wiederholung wird automatisch zum nächsten Zeitpunkt gesprungen.Sleep(10)Es gibt keine anderen Möglichkeiten, wie wir das tun können.

Aufnahmen der Rückmeldung

Die Rückprüfungs-Engine erstellt eine Schnittstelle zwischen dem Preis, den der Benutzer gebucht hat, und dem Angebotspreis, der zum Zeitpunkt der Rückprüfungszeit angegeben ist. Wenn der Kaufpreis höher ist als der Verkaufspreis, wird ein Handel getätigt. Wenn der Handel nicht getätigt werden kann, wird ein Aufschlag erzeugt.

Seiteneinstellungen zurückspüren

img

    1. Die Optionen für die Rückmeldeseite, links die Strategie-Edit-Seite.
    1. Beginn und Ende der Rückmeldung, da die Daten nicht vollständig sind, kann die Rückmeldung direkt mit der Zeit beginnen, zu der die Daten vorliegen.
    1. RückmeldungGetRecords()Die Standardphase der Funktion kann auch im Code als Perioden-Parameter angegeben werden.
    1. Wahl der Rückmeldungsmechanismen
    1. Anzeigen oder Verbergen der Multimeter-Einstellungen.
    1. Die maximale Anzahl von Logs, Ertragsdaten und Diagrammdaten, um zu verhindern, dass zu viele Daten zu einem Browserstopp führen.
    1. Tick-Generation auf Basis der K-Linien-Periode.
    1. Der Handel rutscht.
    1. Fehlerfreundlichkeit, um API-Anfragen zu simulieren und die Fehlerfreundlichkeit von Strategien zu überprüfen.
    1. Ob ein Trend-Icon erstellt wurde, wird in der Rückmessung selbst auf dem Icon angezeigt, wenn die TA-Indikator-Funktion verwendet wird, und der Kauf wird auch markiert.
    1. Einrichtung der Gebühr
    1. Hinzufügen von Börsen - Paare und Vermögenswerte.
    1. Rückmessparameter-Einstellung, die eine Optimierungsparameter-Key-Unterstützung bietet, wenn die Parameter numerisch sind, um die Rückmessung der Parameter automatisch über einen bestimmten Bereich zu durchlaufen.

Unterschiede zwischen Reflexion und Festplatte

    1. GetTicker und GetRecords sind die einzigen effektiven Methoden zur Rückmessung, andere Methoden wie die Erfassung der Tiefe und der Transaktionsgeschichte sind nicht echt ((weil die Datenmenge so groß ist, unterstützt die Festplatten-Rückmessung derzeit diese Daten, aber nur die jüngsten Daten)).
    1. Die hinzugefügten Exchanges sind unabhängige Konten und unterstützen derzeit keine Wechselpaare. Es ist daher nicht möglich, zwei Handelspaare in einem Konto zu betreiben.
    1. Netzwerkabfragen können nicht verwendet werden.
    1. Rückmeldung kann keine IO-Erweiterung verwenden, sondern nur die grundlegendsten APIs.
    1. Die Rückmeldung erhält nur Standarddaten, keine Festplatten-Daten wie Info.
    1. Bei Rückprüfungen kann es zu Fehlverkäufen kommen, beachten Sie die Befreiung von Bestellungen.
    1. Die Futures-Rückmessung von Waren unterstützt keine Marktpreisliste.

Fehlerfreizügigkeit und häufige Fehler

Wie bereits erwähnt, ist es möglich, dass die API-Schnittstelle auf der Festplatte verwendet wird, um zu einer fehlerhaften Rückkehr zu gelangen.nullWenn man die Daten in einem Computer benutzt, kann es zu Fehlern kommen und die Festplatte zum Stillstand bringen, daher ist es wichtig, eine fehlerfreie Strategie zu entwickeln.

Häufige Fehlerfreundlichkeit

Die häufigsten Fehler sind:

  • API-Zugriff Netzwerkfehler, Interface-Zugriff Überschreitung wird null zurückgegeben.
  • Fehler der Börsenbeschränkung, wie IP-Beschränkung, Ordnungsgenauigkeit, Zugriffshäufigkeit, Parameterfehler, Vermögensmangel, Marktunfähigkeit, Widerruf abgeschlossener Aufträge usw. Die API-Dokumentation kann speziell nach dem Fehlercode abgerufen werden.
  • Die Börse gibt Datenfehler zurück, die gelegentlich auftreten, wie z. B. eine leere Tiefe, verzögerte Kontoinformationen, verzögerte Auftragsstatus usw.
  • Programmlogische Fehler.

Bevor die API die Daten zurückgibt, muss man entscheiden, ob sie null sind.

//1.判断为null进行处理 var ticker = exchange.GetTicker(); while(ticker == null){ Log('ticker 获取出错'); ticker = exchange.GetTicker(); } Log(ticker.Last); // 2.判断不为null再进行引用 var ticker = exchange.GetTicker(); if(!ticker){ Log(ticker.Last); } // 3._C()函数重试 var ticker = _C(exchange.GetTicker); Log(ticker.Last); // 4. try catch容错 try{ var ticker = exchange.GetTicker(); Log(ticker.Last); } catch(err){ Log('ticker 获取出错'); }

Wenn Sie falsche Informationen erhalten möchten, können Sie diese mitGetLastError(), wird die letzte Fehlermeldungstring zurückgeben, die für die Differenzbehandlung von Fehlern verwendet werden kann.

FAQ

Es gibt eine Reihe von Fehlern, die häufig in den Foren geschrieben werden: https://www.fmz.com/bbs-topic/1427 。 Hier sind einige der Fehler zusammengefasst.

Wie wird ein Trustee eingesetzt?

Weitere Informationen finden Sie unter "Administratoren hinzufügen"

Kann man eine Strategie finden, um das zu kopieren?

Es gibt Leute auf https://www.fmz.com/markets, die einen Proxy-Service anbieten oder in Gruppen konsultieren, die sich selbst kontaktieren müssen, auf eigene Gefahr.

Zugriff auf alle Schnittstellen mit Warnzeiten

Es handelt sich um die Überlastung der Börsen-Schnittstelle, wenn es nur gelegentlich ein Problem ist, und wenn es immer darauf hinweist, dass das Netzwerk nicht zugänglich ist, muss ein ausländischer Server verwendet werden.

ERR_INVALID_POSITION Fehler

Die Rückmeldung von Systemfehlern, die in der Regel als Strategie erstellt wurden, kann zu einem Fehler führen, wenn der Versuch, eine Position zu platzieren, ohne eine Position zu halten oder eine unzureichende Anzahl von Positionen zu halten.

symbol not set

Futures-Exchange-Rückmeldung, kein Kontrakt im Code, siehe exchange.SetContractType Funktion

BITMEX 429 Fehler, {"error":{"message":"Rate limit exceeded retry in 1 seconds "..."}}

Zu hohe Häufigkeit des Zugriffs auf die Börsen-Schnittstelle.

{"status":6004,"msg":"timestamp is out of range"}

Server-Zeitfenster, die über die Grenze hinausgehen, müssen aktualisiert werden und dürfen nicht zu weit auseinanderfallen

GetOrder(455284455): Error: invalid order id or order cancelled.

Einige Börsen haben ihre Bestellungen storniert, und die Börsen haben keine Informationen über diese Bestellungen und können sie nicht abrufen.

GetOrders: 400: {"code":-1121,"msg":"Invalid symbol."}

Unwirksame Paare, prüfen Sie, ob die Paare falsch eingerichtet wurden.

Secret key decrypt failed

API KEY-Prozess fehlschlägt, wenn das FMZ-Kennwort nach der Konfiguration von APIKEY geändert wurde, versuchen Sie, die Exchange-Seite in FMZ hinzuzufügen und die Exchange APIKEY neu zu konfigurieren.

Signature not valid: Invalid submission time or incorrect time format [Ungültige Einreichzeit oder falsche Zeitformate]

Es wird empfohlen, einen Linux-Server zu verwenden, oder die Software zur Zeitsynchronisierung auf den Windows-Systemen zu installieren, auf denen das Problem auftritt.

Warum wurde ein globaler Proxy eingerichtet, der es den Administratoren unmöglich macht, auf die API zuzugreifen?

Global Agents haben keine Netzwerk-Ports für Agenten-Hosts, die aufgrund von Verzögerungsproblemen am besten mit Offshore-Servern ausgestattet sind.

Wie kann man Strategien lokal und nicht auf einer hochgeladenen FMZ speichern?

Mit Python kann man lokale Dateien importieren, die man normalerweise nach den Richtlinien der API von FMZ als Dateien speichert und unter dem Ausführungsweg auf seinem eigenen Server direkt ausführt.

#!python2.7 def run(runfile): with open(runfile,"r") as f: exec(f.read()) def main(): run('my.py')

Wie man das Testnetz der Börse benutzt oder die API-Basisadresse ändert

Eine direkte Umschaltung auf die entsprechende API-Standortadresse kann mit exchange.SetBase () erfolgen.

exchange.SetBase("https://www.okex.me")
Related Recommendations
Comment
All comments (27)

    api

    3 years ago

    如何在本地实现策略运行呢?我写了一个简单的Log输出语句,并且按照文末的操作。
    第一步,先用一台笔记本作为服务器,运行托管者程序;
    第二步,写一个简单的Log输出信息的test.py程序(FMZ 的API接口函数);
    第三步,按文末那样,写个runfile,通过run.py调用test.py运行。 img

    4 years ago

    我买的网易云量化交易课程怎么没了,现在去哪里看

    5 years ago

    谢谢

    5 years ago

    many

    5 years ago

    hi

    5 years ago

    学习ing

    5 years ago

    有一个小的文字错误,GetAccount 获取账户 介绍中,FrozenStocks应该是冻结余额而不是可用余额吧

    5 years ago

    改了

    5 years ago

    有没有做BTB的实盘教程,

    a year ago

    大佬麻烦问下咱们有官方交流群吗?有时候遇到问题不知道该在哪提问

    5 years ago

    加首页微信,拉你入群

    5 years ago

    加我进群,我的实盘执行不起来

    a year ago

    getorder outtime 获取订单超时,okex的交易所,怎么办

    5 years ago

    再次获取

    5 years ago

    担保资产率获取不到吗,到0%会被强制平仓的担保资产率

    5 years ago

    原始信息里有,可以用GetRawJSON或者查看字段里的info信息

    5 years ago

    我是看1分钟k线图操作的,所以Python死循环的sleep time 可以设置为0.1s,也就是sleep(100)吗,我看你其中写过一个sleep(10),也就是0.1s不会超过huobi HM的API限制吗?

    6 years ago

    exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")

    这儿我试了OKex的永续合约,如果设置成 sell,直接开空了,平不是平多

    6 years ago

    exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")

    这儿我试了OKex的永续合约,如果设置成 sell,直接开空了,平不是平多

    6 years ago

    有些永续合约允许双向持仓的,需要设置平仓。我更新一下,原来只有bitmex

    6 years ago

    不错不错,还有管理回复。。我发现代码里好多拼写错误,哈哈

    6 years ago

    GetOrders 的代码里面有两个拼写错误。。。一个是 function写成了 fuction,另一个是for循环的条件里 ; 打成了 ,

    6 years ago

    嗯嗯,已改正,感谢指出错误

    6 years ago

    是我错了。。。
    exchange.Buy(-1, 0.5),交易对是ETH_BTC,市价单代表买入0.5BTC的ETH
    exchange.Buy(price, 0.5),如果是这种限价单,则代表用price的价格买入 0.5ETH

    6 years ago

    exchange.Buy(-1, 0.5),交易对是ETH_BTC,则代表市价买入0.5BTC的ETH

    这里应该是【代表市价买入0.5ETH】

    6 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)