Wenn ein Anfänger eine quantitative Kryptowährungs-Handelsstrategie entwirft, gibt es oft verschiedene Funktionsanforderungen. Unabhängig von den Programmiersprachen und Plattformen werden sie alle auf verschiedene Designanforderungen stoßen. Zum Beispiel sind manchmal mehrere Handelsvarietäten der Rotation erforderlich, manchmal ist Multi-Plattform-Hedging erforderlich, und manchmal müssen verschiedene Handelsvarietäten gleichzeitig sein. Lassen Sie uns einige der Entwurferfahrungen bei der Implementierung der Strategie-Wirbelanforderungen teilen.
Die Lernplattform nutzt weiterhin die FMZ Quant Handelsplattform (https://www.fmz.comDer Markt wird als Kryptowährungsmarkt ausgewählt.
Die meisten dieser Nachfrage-Situationen sind auf Multi-Kryptowährungs-Trend- und Gitterstrategien vorbereitet, die mit verschiedenen Handelsiterationsmethoden auf dem Markt ausgeführt werden müssen.
Normalerweise so konzipiert:
function Process (symbol) {
exchange.IO("currency", symbol)
var ticker = _C(exchange.GetTicker)
Log("has switched trading pairs, processing trading pairs according to strategy logic:", symbol, "quotes: ", ticker)
// ...
// ..
// .
}
function main(){
var symbols = ["BTC_USDT", "LTC_USDT", "ETH_USDT"]
while (true) {
for (var i = 0 ; i < symbols.length; i++) {
Process(symbols[i])
Sleep(500)
}
}
}
Wir konfigurieren den Roboter:
Es kann gesehen werden, dass dies erkennt, dass ein Austauschobjekt auf dem Roboter konfiguriert wird, und das Handelspaar wird gewechselt; der Markt verschiedener Handelspaare wird erhalten, und der Multi-Trading-Variety-Markt wird ausgeführt; und es wird unter einer Strategie-Logik ausgeführt.
Es kann gesehen werden, dass die drei Handelspare, die wir definieren: BTC_USDT, LTC_USDT, ETH_USDT, in der Schleife, iterativ die Marktquote erhalten, und nachdem sie die Informationen erhalten haben, kann sie den Markt speziell erkennen und die von der Strategie entworfene Handelslogik auslösen.
Einige Leser mögen fragen:
Es gibt in der Tat andere Gestaltungsmöglichkeiten, die wir im Folgenden vorstellen werden.
Die Marktdaten verschiedener Handelspare werden über mehrere Austauschobjekte ermittelt und in der Iterativstrategie-Logik ausgeführt.
Zum Beispiel konfigurieren Sie den Roboter, indem Sie drei Tauschobjekte für den Roboter konfigurieren. Die Handelspare sind auf BTC_USDT, LTC_USDT und ETH_USDT festgelegt.
Der Name ist
Alles ist erledigt.
Wir haben diesen Code ein wenig verändert, denn dieses Mal haben wir dem Roboter mehrere Austauschobjekte hinzugefügt, die die Austauschobjekte des Handelspares BTC_USDT, LTC_USDT, ETH_USDT sind.
function Process (e) {
var ticker = _C(e.GetTicker)
Log("exchange", e.GetName(), "Process trading pairs according to strategy logic:", e.GetCurrency(), "Quotes:", ticker)
// ...
// ..
// .
}
function main(){
while (true) {
for (var i = 0 ; i < exchanges.length; i++) {
Process(exchanges[i])
Sleep(500)
}
}
}
Führen Sie den Roboter an:
Das Beispiel, das wir oben beschrieben haben, ob das Wechseln von Handelsparen oder das Hinzufügen eines Handelsobjekts für mehrere verschiedene Handelspare eines Konfigurationskontos.
Also, wie benutzt man mehrere Börsenkonten in einer Strategie?
Einige Strategien, wie beispielsweise die marktübergreifende Sicherung von mehreren Börsen, Strategien für mehrere Konten innerhalb einer einzigen Börse.
Zum Beispiel haben wir auf der Dashboard -> Exchange -> Hinzufügen von Exchange-Seite 2 Börsen konfiguriert.
Wir können auf die Vermögensinformationen der Konten zugreifen, die von diesen beiden Börsen in der Strategie konfiguriert wurden.
function main(){
Log(exchanges[0].GetAccount()) // Print the account asset information of the first exchange object.
Log(exchanges[1].GetAccount()) // ... Print the asset information of the Bit-Z exchange
}
Natürlich kann ich auch eine zweite und dritte Konto-Austausch-Konfiguration zu einem Austausch hinzufügen.
Zum Beispiel fügen wir ein weiteres Konto für Huobi Futures hinzu.
Wie Sie sehen können, konfiguriert dies die Konten der beiden
Wenn die Strategie erstellt wird, erscheint ein Huobi Futures Exchange-Objekt in der Option Modifizieren der Konfiguration des Robot
So können beispielsweise zwei Konten zuerst verkaufen und dann mit der typischen Netzstrategie kaufen (nach oben) oder zuerst kaufen und dann verkaufen (nach unten).
Durch die beiden obigen Beispiele
Hier ist der Unterschied zwischen der Konfiguration mehrerer Austauschobjekte auf dem Roboter und der Konfiguration mehrerer Austauschobjekte für das gleiche Austauschkonto für den Roboter:
Dieses überwältigende und oben erwähnte Beispiel von
Der Unterschied besteht darin, dass das obige Beispiel eine Austauschkonfiguration ist, d. h.:
Wenn der Roboter das Austauschobjekt konfiguriert, verwendet er immer:
Diese Konfiguration.
Es ist nur, dass, wenn Sie ein Austauschobjekt hinzufügen, die Handelspaar-Einstellungen anders sind.
Wenn die Funktion GetAccount aufgerufen wird, wird immer auf die Anlageninformationen desselben Kontos zugegriffen.
jedoch:
Die beiden so konfigurierten Huobi-Futures-Austauschobjekte stellen zwar alle Huobi-Futures dar, stellen jedoch unterschiedliche Austauschkonten dar.
Manchmal müssen in der Strategie der Kryptowährungskontraktsicherung, um die flüchtigen Handelsmöglichkeiten zu nutzen, viele Szenarien gleichzeitig platziert werden.exchange.Go
Es gibt ein Problem mit der Synchronisation, nicht sehr schnell. und das Design des Switch-Vertrags macht auch die Logik nicht so einfach. gibt es einen besseren Weg?
Natürlich gibt es, wir können zwei Austauschobjekte zum Roboter hinzufügen, indem wir die
Verwenden Sie dann diese Austauschkonfiguration, um ein anderes Austauschobjekt hinzuzufügen.
Es wird eine Anforderung angezeigt!
Bei einer Austauschkontokonfiguration können keine Austauschobjekte derselben Währung oder desselben Handelspaares hinzugefügt werden.
Was soll ich tun? Es scheint, als könne der Strategie-Roboter nicht zwei Austauschobjekte verwenden, und das Austauschobjekt ist an eine Austauschkontonummer gebunden?
Es gibt noch einen Weg!
Gehen wir zu
Klicken Sie auf Speichern.
Auf diese Weise haben wir zwei Austauschkonfigurationen, aber die gleiche API KEY Konfigurationsinformationen verwendet werden.
Welche Vorteile hat das?
Wenn Sie eine Strategie schreiben, wird das Design sehr einfach sein!
function main(){
exchanges[0].SetContractType("quarter") // Set the first added exchange object. The current contract is a quarterly contract.
exchanges[1].SetContractType("this_week") // Set the second added exchange object, the current contract is the current week contract
while (true) {
var beginTime = new Date().getTime() // Record the timestamp from which this time the market quote was taken.
var rA = exchanges[0].Go("GetTicker") // Create a concurrent thread to get the first exchange object, which is the market data for the quarterly contract.
var rB = exchanges[1].Go("GetTicker") // Create a concurrent thread to get the second exchange object, which is the market data for the weekly contract.
var tickerA = rA.wait() // The two threads executing each other perform their own tasks, waiting to get the data. When A waits, the B task is also executing.
var tickerB = rB.wait() // So it seems to be sequential execution, actually at the bottom of the concurrency. Only when you get the order is to get A first, and get B.
var endTime = new Date().getTime() // Record the timestamp at the end of the two contract quotes.
if (tickerA && tickerB) { // If there is no problem with the data obtained, execute the following logic.
var diff = tickerA.Last - tickerB.Last // calculate the difference
$.PlotLine("diff", diff) // Use the line drawing library to plot the difference on the chart.
if (diff > 500) { // If the spread is greater than 500, hedge arbitrage (of course, the difference of 500 is relatively large, rarely seen.)
// Hedging
rA = exchanges[0].Go("Sell", tickerA.Buy, 1) // Concurrent threads create a selling order under the quarterly contract
rB = exchanges[1].Go("Buy", tickerB.Sell, 1) // Concurrent thread create a buying order under the weekly contract
var idA = rA.wait() // Waiting for the return of placing order results, returning the order ID
var idB = rB.wait() // ...
}
// ...
}
LogStatus(_D(), "Concurrently get two contract quotes taking time:", endTime - beginTime, "millisecond.") // Shows the time on the status bar to know that the program is executing.
Sleep(500)
}
Ist diese Konstruktionsstrategie viel einfacher und klarer?
Wirkliche Marktoperation:
Wie Sie sehen können, dauert es nur etwa 50 Millisekunden, um den Preis von zwei Verträgen jedes Mal zu erhalten.