Lorsqu'un débutant conçoit une stratégie de trading quantitative de crypto-monnaie, il y a souvent diverses exigences de fonctions. Indépendamment des langages de programmation et des plateformes, ils rencontreront tous diverses exigences de conception. Par exemple, parfois plusieurs variétés de rotation de trading sont requises, parfois une couverture multi-plateforme est requise, et parfois différentes variétés de trading doivent être simultanées.
La plateforme d'apprentissage utilise toujours la plateforme de trading FMZ Quant (https://www.fmz.com), et le marché est sélectionné comme étant le marché des crypto-monnaies.
La plupart de ces situations de demande sont préparées pour des stratégies de tendance et de grille multi-cryptocurrency, qui doivent être exécutées sur le marché avec différentes méthodes d'itération de négociation.
Habituellement conçu comme ceci:
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)
}
}
}
On configure le robot:
On peut voir que cela réalise qu'un objet d'échange est configuré sur le robot, et la paire de négociation est commutée; le marché de différentes paires de négociation est obtenu, et le marché de variété multi-trading est exécuté; et il est exécuté selon une logique de stratégie.
On peut voir que les trois paires de trading que nous définissons: BTC_USDT, LTC_USDT, ETH_USDT, dans la boucle, obtiennent de manière itérative la cotation du marché, et après avoir obtenu l'information, il peut détecter spécifiquement le marché et déclencher la logique de trading conçue par la stratégie.
Certains lecteurs peuvent demander:
Il existe en effet d'autres options de conception, que nous présenterons ci-dessous.
Les données de marché de différentes paires de négociation sont obtenues à travers plusieurs objets d'échange et sont exécutées dans la logique de stratégie itérative.
Par exemple, configurez le robot en configurant trois objets d'échange pour le robot. Les paires de trading sont définies sur BTC_USDT, LTC_USDT et ETH_USDT respectivement.
Le nom est
Tout est fait.
Nous avons modifié un peu ce code, parce que cette fois nous avons ajouté plusieurs objets d'échange au robot, qui sont les objets d'échange de la paire de trading BTC_USDT, LTC_USDT, ETH_USDT.
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)
}
}
}
Faites tourner le robot:
L'exemple que nous avons décrit ci-dessus, que ce soit pour changer de paire de trading ou ajouter un objet de trading pour plusieurs paires de trading différentes d'un compte de configuration.
Alors, comment utiliser plusieurs comptes d'échange dans une stratégie?
Certaines stratégies telles que la couverture transfrontalière de plusieurs bourses, les stratégies de plusieurs comptes au sein d'une seule bourse.
Par exemple, nous avons configuré 2 échanges sur le tableau de bord -> Exchange -> Ajout d'Exchange page.
Nous pouvons accéder aux informations sur les actifs des comptes configurés par ces deux bourses dans la stratégie.
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
}
Bien sûr, je peux aussi ajouter une deuxième et troisième configuration d'échange de compte à un échange.
Par exemple, on ajoute un autre compte pour Huobi Futures.
Comme vous pouvez le voir, cela configure les comptes des deux bourses
Lorsque la stratégie est créée, un objet Huobi Futures Exchange apparaît dans l'option Modifier la configuration du Robot
Par exemple, cela permet à deux comptes de vendre d'abord puis d'acheter avec une stratégie de grille typique (en haut) ou d'acheter d'abord puis de vendre (en bas).
À travers les deux exemples ci-dessus
Voici la différence entre configurer plusieurs objets d'échange sur le robot et
Cet exemple frappant et mentionné ci-dessus de
La différence est que l'exemple ci-dessus est une configuration d'échange, c'est-à-dire:
Lorsque le robot configure l'objet d'échange, il utilise toujours:
Cette configuration.
C'est juste que lorsque vous ajoutez un objet d'échange, les paramètres de la paire de trading sont différents.
Si la fonction GetAccount est appelée, les informations relatives aux actifs du même compte sont toujours consultées.
Toutefois:
Les deux objets d'échange de huobi futures ainsi configurés, bien qu'ils soient tous des futures de huobi, représentent des comptes d'échange différents.
Parfois, dans la stratégie de couverture des contrats de crypto-monnaie, afin de saisir les opportunités de négociation éphémères, de nombreux scénarios doivent être placés simultanément. Cependant, comme le contrat est différent, vous devez passer au contrat correspondant lorsque vous obtenez le devis du marché et passez une commande.exchange.Go
la fonction d'exécuter une fonction de placement d'ordre ou obtenir le devis, il y a un problème avec la synchronisation, pas très rapide. et la conception du contrat de commutation rend également la logique pas si simple.
Bien sûr, il y a, Nous pouvons ajouter deux objets d'échange au robot en suivant le
Ensuite, utilisez cette configuration d'échange pour ajouter un autre objet d'échange.
Une boîte d'avertissement va apparaître!
Une configuration de compte de change, vous ne pouvez pas ajouter des objets de change de la même monnaie ou paire de négociation.
Qu'est-ce que je dois faire? Il semble que le robot de stratégie ne puisse pas utiliser deux objets d'échange, et que l'objet d'échange est lié à un numéro de compte d'échange?
Il y a encore un moyen!
Allons au tableau de bord -> échange, puis ajouter une configuration d'échange de contrats à terme OKEX.
Cliquez sur Enregistrer une fois configuré.
De cette façon, nous avons deux configurations d'échange, mais les mêmes informations de configuration de la clé API sont utilisées.
Quels en sont les avantages?
Quand vous écrivez une stratégie, la conception sera très simple!
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)
}
Cette stratégie de conception est-elle beaucoup plus simple et plus claire?
Opération réelle du marché:
Comme vous pouvez le voir, il faut seulement environ 50 millisecondes pour obtenir le prix de deux contrats à chaque fois.