Configuration de l'échange de la stratégie de négociation quantitative de crypto-monnaie

Auteur:La bonté, Créé: 2019-09-16 14:55:26, Mis à jour: 2023-11-07 20:50:11

img

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.

Conception d'une stratégie multi-crypto

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:

img

img

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: Je n'aime pas changer de paire de trading, cela me semble un peu gênant, et la logique de la stratégie n'est pas claire.

Il existe en effet d'autres options de conception, que nous présenterons ci-dessous.

Configuration de plusieurs objets d'échange pour le robot dans le même compte d'échange

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.

img

Le nom est OKEX Spot V3 Test objet d'échange, sur la page Dashboard, la page de configuration d'échange:

img

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:

img

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?

Stratégie d'utilisation de plusieurs comptes de change

Certaines stratégies telles que la couverture transfrontalière de plusieurs bourses, les stratégies de plusieurs comptes au sein d'une seule bourse.

  • Configuration de plusieurs bornes avec différentes bornes

img

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.

img

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.

  • Configuration de plusieurs bornes avec le même borne.

Par exemple, on ajoute un autre compte pour Huobi Futures.

img

Comme vous pouvez le voir, cela configure les comptes des deux bourses Huobi Futures.

img

Lorsque la stratégie est créée, un objet Huobi Futures Exchange apparaît dans l'option Modifier la configuration du Robot pour sélection.

img

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 Configurer plusieurs objets d'échange pour le même compte d'échange pour le robot:

Cet exemple frappant et mentionné ci-dessus de Le même compte de change a plusieurs objets d'échange pour le robot est quelque peu similaire, mais il y a des différences.

La différence est que l'exemple ci-dessus est une configuration d'échange, c'est-à-dire:

img

Lorsque le robot configure l'objet d'échange, il utilise toujours:

img

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:

img

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.

  • L'utilisation de la configuration d'échange facilite la conception d'une stratégie de contrats à terme de crypto-monnaie.

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.Gola 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 Configurer plusieurs objets d'échange pour le robot dans le même compte d'échange.

img

Ensuite, utilisez cette configuration d'échange pour ajouter un autre objet d'échange.

Une boîte d'avertissement va apparaître!

img

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.

img

Cliquez sur Enregistrer une fois configuré.

img

De cette façon, nous avons deux configurations d'échange, mais les mêmes informations de configuration de la clé API sont utilisées.

img

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é:

img

Comme vous pouvez le voir, il faut seulement environ 50 millisecondes pour obtenir le prix de deux contrats à chaque fois.


Relationnée

Plus de