Les ressources ont été chargées... Je charge...

Pour les débutants, vérifiez-le Je vous emmène à la négociation quantitative de crypto-monnaie (2)

Auteur:Je suis désolée., Créé: 2022-04-19 16:46:53, Mis à jour: 2022-04-20 16:56:43

Pour les débutants, vérifiez-le Je vous emmène à la négociation quantitative de crypto-monnaie (2)

Dans l'article précédent, nous avons parlé de scripts de trading programmés. En fait, la stratégie de trading est un programme de script de trading. L'article parle principalement de la nécessité d'un support matériel pour le programme de script de trading (où le programme s'exécute), et le programme de script de trading peut être écrit dans ce langage de programmation informatique (en énumérant les trois langages de programmation utilisés dans la plateforme de trading FMZ Quant; bien sûr, vous pouvez utiliser n'importe quel langage de programmation pour mettre en œuvre des stratégies dans le trading programmé).

Scénario de négociation programmé

  • Type de stratégie de négociation Les débutants qui sont nouveaux dans le trading programmé et le trading quantitatif peuvent être confus par divers termes tels que stratégie de tendance, stratégie d'arbitrage, stratégie à haute fréquence, stratégie de grille, etc. En fait, les types communs de stratégies dans le trading programmé et le trading quantitatif sont simplement dans plusieurs directions.

    • Stratégie d'arbitrage En termes simples, une stratégie qui détient essentiellement des positions longues tout en détenant des positions courtes peut être classée comme une stratégie d'arbitrage.

    • Stratégie de tendance En termes simples, il s'agit de la stratégie consistant à suivre la tendance et à placer une seule position, comme la moyenne mobile double, le MACD et d'autres stratégies.

    • Stratégie de retour Par exemple, la stratégie du réseau, qui consiste à tirer profit des fluctuations des prix sur les marchés volatils.

    • Stratégie de haute fréquence En termes simples, il s'agit d'une stratégie consistant à effectuer des transactions à haute fréquence à l'aide d'algorithmes pour découvrir la microstructure du marché, les règles, les opportunités, etc.

    Les types ci-dessus sont classés du point de vue de la stratégie de négociation; du point de vue de la conception de la stratégie sur FMZ Quant, les stratégies peuvent également être divisées en:

    • stratégie à symbole unique C'est-à-dire que la stratégie ne peut utiliser qu'un seul symbole, comme faire un commerce BTC ou un commerce ETH.

    • stratégie multi-symbole En termes simples, il s'agit d'opérer plusieurs symboles par une seule logique stratégique.

    • stratégie multi-comptes En termes simples, il s'agit de configurer plusieurs objets d'échange sur un bot (le concept de plate-forme a été introduit dans l'article précédent, et un objet d'échange configuré avec une clé API représente un compte de plate-forme).

    • stratégie multi-logique Par exemple, la stratégie MACD, la stratégie de moyenne mobile, la stratégie de grille, etc. sont conçues en même temps sur un bot (bien sûr, il s'agit d'opérer différents objets d'échange, et les objets d'échange avec la même opération dépendent du fait que la stratégie spécifique est logiquement contradictoire)

  • Interface API de plateforme Comment le script de trading programmé fonctionne-t-il sur le compte de la plateforme? Dans l'article précédent, nous avons parlé des plates-formes ayant généralement des interfaces REST et Websocket dans la section Platform. Ici, nous ajoutons quelques concepts du point de vue des procédures de stratégie. Les interfaces de plateforme sont divisées selon qu'elles sont vérifiées (REST et Websocket), à savoir vérifiées et non vérifiées.

    • Interfaces qui ne nécessitent pas de vérification Généralement, ils sont appelés interfaces publiques; ce type d'interfaces ne nécessite pas de vérification de la qualité des données.API KEYCe type d'interface est généralement une interface de marché, telle que la requête de devis de marché en profondeur, les données de la ligne K, les taux de financement, les informations sur les symboles de trading, les horodatages des serveurs de plateforme, etc. En termes simples, l'interface qui n'est pas liée à votre compte peut être approximativement déterminée comme étant une interface publique (pas de vérification requise). Sur la plateforme de trading FMZ Quant, lors de l'appel d'une fonction API non vérifiée (encapsulant l'interface non vérifiée de la plateforme; interface publique), même si la configuration de la clé API est incorrecte, les données renvoyées par l'interface peuvent être obtenues normalement (pas de vérification requise).

    • Interfaces à vérifier En termes simples, ce sont les interfaces qui doivent être vérifiées (par API KEY). Ce type d'interface est appelé une interface privée. Ce type d'interface est généralement lié à certaines opérations ou informations de votre compte, telles que la requête des actifs du compte, les positions du compte, les ordres en attente, les transferts, la conversion de devises, l'ajustement du levier et le réglage du mode de position, etc. Ces opérations doivent être vérifiées.

      Sur FMZ Quant, lors de l'appel des fonctions API qui nécessitent une vérification (les interfaces privées, qui sont encapsulées et nécessitent la vérification de la plateforme). Si la configuration de API KEY est incorrecte, l'appel de ce type de fonction signalera une erreur et renverra null.

    Alors, comment utiliser ces interfaces sur la plateforme de trading quantique FMZ?

    FMZ Quant Trading Platform encapsule les interfaces de plateforme avec des actions et des définitions unifiées (telles que les interfaces K-line, les interfaces de marché en profondeur, les interfaces de requête d'actifs en cours, les interfaces d'ordre, les interfaces d'annulation d'ordre, etc.).https://www.fmz.com/api).

    Alors, comment utiliser certaines interfaces de plateforme sans actions unifiées et définitions sur FMZ Quant?

    Ces interfaces de plateforme comprennent: transfert d'actifs, commande conditionnelle, commande par lots, annulation de commande par lots, modification de commande, etc. Certaines plates-formes ont ces interfaces, d'autres non, et les fonctions et les détails d'utilisation peuvent être très différents, de sorte que ces interfaces peuvent être consultées via leexchange.IOfonction sur la plateforme de négociation FMZ Quant (pour plus de détails, voir la documentation de l'API de la plateforme de négociation FMZ Quant:https://www.fmz.com/api#exchange.io..Il existe également des stratégies d'exemple d'OI pratiques dans le Square de FMZ Quant.

Toutes les fonctions d'API dans la documentation de l'API FMZ peuvent-elles effectuer une demande réseau?

Nous devons dire que les API de la plateforme ont une limite pour la fréquence d'accès (par exemple, 5 fois en 1 seconde). L'accès ne peut pas être trop fréquent, sinon l'erreur http 429 sera signalée et l'accès sera rejeté (la plupart des plateformes signalent 429). Par conséquent, l'appel des interfaces de plateforme encapsulées sur FMZ Quant a également une limite, mais l'appel des fonctions API qui ne font pas de requêtes réseau n'a pas une telle limite.
Toutes les fonctions d'API sur FMZ Quant ne peuvent pas effectuer de requêtes réseau; certaines fonctions d'API sur FMZ ne modifient que certains paramètres locaux, tels que la définition de la paire de négociation en cours, le code de contrat et la fonction de calcul de l'indicateur, ainsi que l'acquisition du nom de l'objet d'échange, etc. Fondamentalement, à partir de l'utilisation de la fonction a, vous pouvez déterminer si une demande de réseau sera effectuée; tant qu'il s'agit d'acquérir les données de la plate-forme ou d'exploiter un compte de plate-forme, une demande de réseau sera effectuée; ces interfaces doivent toutes prêter attention à la fréquence d'invocation.

  • Parlons de plusieurs problèmes courants et de l'expérience de l'utilisation des fonctions API sur FMZ Quant.

    • Tolérance à la défaillance C'est l'erreur la plus courante, qui a troublé d'innombrables débutants. Souvent, le backtest de stratégie est bon et tout est normal. Pourquoi le bot fonctionne-t-il anormalement après que le bot ait fonctionné pendant un certain temps (ce qui peut être déclenché à tout moment)?

      img

      Lors de l'écriture d'une stratégie, les données renvoyées par l'interface doivent être vérifiées.var ticker = exchange.GetTicker()• si nous avons besoin d'utiliser les les donnéesLast(le dernier prix) dans la variableticker(vous pouvez vous référer à la structure de retour de la fonction GetTicker), nous devons obtenir les données (qu'est-ce que newPrice? new: le plus récent; Price: price; thats right, combinez-les!)

      Maintenant, il est bon si la fonctionGetTicker()renvoie les données normales; s'il y a une demande de temps d'arrêt, une erreur de réseau, une plate-forme déconnectant le câble, des câbles cassés par creusement, ou des enfants éteignant l'interrupteur électrique, la fonctionGetTicker()Il reviendra.nullÀ l'heure actuelle, la valeur detickerestnull; lorsque j' accède auLastLe programme stratégique sera arrêté par une exception. De là, il semble que l'échec de l'appel d'interface (l'invocation de GetTicker échoue et renvoie null) n'est pas la cause directe de l'arrêt du bot de stratégie (la cause directe est qu'un attribut d'unnullLa situation où l'échec de l'appel d'interface rapporte une erreur ne provoquera pas l'arrêt du bot (emphase ici).

      Alors, que devons-nous faire pour éviter l'arrêt anormal du bot?
      La réponse est de faire le processus de tolérance aux erreurs aux données renvoyées par les interfaces; il est très simple, et vous avez seulement besoin de juger si les données renvoyées sontnull(ici, prenons JavaScript comme exemple, car les autres langages sont similaires). Écrire un petit segment de code (qui est uniquement à des fins d'instruction et ne peut pas être exécuté directement!)

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

      Non seulement leGetTickerl'interface doit faire le traitement tolérant aux erreurs, mais l'interface avec les demandes réseau doit faire le traitement tolérant aux erreurs pour la valeur de retour (si vous utilisez la valeur de retour de la fonction) Il existe de nombreuses méthodes de tolérance aux défauts._C()fonction (voir la documentation de l'API FMZ) pour écrire votre propre fonction tolérante aux pannes et concevoir votre propre mécanisme et logique tolérant aux pannes.

      En ce qui concerne l'utilisation de la_C()Il est également très probable que de nombreux nouveaux étudiants l'utilisent de façon incorrecte._C()La fonction est une référence de fonction, pas un appel de fonction._C(funcName, param1, param2); l'appel est correct; funcName n'a pas de parenthèses, et param1 et param2 sont les paramètres à importer dans la fonction funcName._C(funcName(param1, param2)); l'appel est erroné; habituellement, si un débutant ne lit pas attentivement la documentation de l'API FMZ, elle sera écrite comme ceci.

    • Montant de l'ordre d'achat sur le marché au comptant

      Comme mentionné dans l'article précédent, le montant de l'ordre de l'ordre d'achat du marché au comptant est généralement le montant de l'argent (seulement quelques plates-formes peuvent avoir d'autres paramètres, et généralement ces paramètres de plate-forme spéciaux seront expliqués dans la documentation de l'API FMZ).

      Définir la paire de négociation comme suit:LTC_USDT

      function main() {
          exchange.IO("simulate", true)   // switch to OKEX simulated bot 
          exchange.Buy(-1, 1)             // the price is -1, representing the placed order is market order; the amount of 1 means the order amount of 1 USDT
      }
      

      Étant donné que les plateformes ont généralement une limite sur le montant des commandes, les commandes d'un montant inférieur à la limite ne seront pas placées (par exemple, Binance Spot exige que seuls les commandes d'un montant supérieur à 5USDT puissent être placées avec succès).

      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:]
      
    • Direction des ordres de contrats à terme

      Lorsque vous faites des stratégies à terme, les débutants font souvent des erreurs dans la direction de l'ordre.https://www.fmz.com/api#exchange.setdirection...

      img

      Parce que la fonction de commande n'a queBuyetSellCependant, les contrats à terme (bien sûr, il n'y a pas de problème pour le spot, pour le spot a seulement acheter et vendre) a les directions de l'ouverture longue, la fermeture longue, l'ouverture courte, et la fermeture courte, donc évidemment Buy et Sell ne peut pas exprimer les opérations dans autant de directions, alors il est nécessaire d'introduire la fonctionexchange.SetDirection()de fixer les orientations de négociation des contrats à terme. À FMZ,exchange.SetDirection("buy")(qui définit d'abord la direction) est utilisé en conjonction avecexchange.Buy, ce qui signifie que l'ordre passé est un ordre d'ouverture de positions longues. Et ainsi de suite:

      Utilisationexchange.SetDirection("sell")etexchange.Selll'ordre de mise en marché est un ordre d'ouverture de positions courtes. Utilisationexchange.SetDirection("closebuy")etexchange.Selll'ordre de clôture des positions longues est un ordre de clôture des positions longues. Utilisationexchange.SetDirection("closesell")etexchange.Buyl'ordre de clôture des positions courtes est un ordre de clôture des positions courtes. Les débutants utilisent généralementexchange.SetDirection("sell")etexchange.BuyEnsuite, une erreur sera signalée (une erreur ne peut pas être signalée dans le backtest, mais c'est évidemment une erreur logique, qui ne peut pas être ignorée par les obsessionnels-compulsifs comme moi). Voici une autre erreur que commettent généralement les débutants.

      function main() {
          exchange.SetContractType("quarter")   // set the current contract to a quarterly contract 
          exchange.SetDirection("sell")
          var id = exchange.Sell(-1, 1)    
          Log("placed market order, executed, get positions", exchange.GetPosition())    
          exchange.SetDirection("closebuy")   // use closebuy and Sell together, yes, no problem 
          exchange.Sell(-1, 1)
      }
      

      img
      Quand il s'agit ici, vous pourriez demander:" J'ai des positions, et utiliser closebuy et vendre ensemble, alors pourquoi une erreur est signalée et je ne peux pas fermer les positions? "Je dirais:" mauvaise direction pour fermer les positions! Vous avez fermé les positions longues. " En outre, l'erreur peut être dans une autre situation: le réglage de la direction de position proche est correct, l'utilisation de la fonction de placement de commande est également correcte, et vous maintenez également les positions dans la direction, mais l'erreur est toujours signalée. La raison pourrait être: votre programme a passé de nombreux ordres, les ordres au début ne sont pas exécutés, et les ordres de positions fermées sont maintenant sur le marché et attendent d'être exécutés.

    • Affichage des informations relatives aux exportations et aux échanges La conception et l'écriture de stratégies de trading programmées et quantitatives sont inséparables de la conception d'interactions homme-ordinateur, telles que l'affichage des données et l'exportation des journaux d'opérations. Par exemple: utilisations de pythonprint- Je ne sais pas. Utilisation de javascriptconsole.log- Je ne sais pas. Utilisations du Golangfmt.Println()- Je ne sais pas. Utilisations en C++cout.

      On parle de l'affichage de l'information sur FMZ.

      • Barre d' état Après le démarrage du bot, la page du bot est affichée comme suit:

        img

        La partie d'affichage est l'information de la barre d'état. La barre d'état est principalement utilisée pour afficher certaines données changeantes en temps réel (parce que les changements en temps réel doivent être observés en temps réel et ne peuvent pas être imprimés en tant que journal à chaque fois, de sorte que ce type de données peut être affiché dans la barre d'état. Si vous imprimez le journal de chacun, il y aura beaucoup de données répétées sans sens, affectant la requête). Les données affichées sur la barre d'état utilisent leLogStatusPour plus de détails, veuillez consulter la documentation de l'API FMZ.

      • Barre de log Il est également sur la page du bot, comme le montre l'image suivante:

        img

        La partie d'affichage est la barre de journal. La barre de journal est principalement utilisée pour enregistrer de manière permanente certaines données à un certain moment, ou pour enregistrer une opération d'une certaine stratégie à un certain moment. Les journaux sont divisés en plusieurs types:

        1. le journal commun; la stratégie FMZ utilise la fonction Log pour la produire et l'imprimer dans le journal de stratégie.

        img

        1. Le journal des commandesexchange.Sell/exchange.BuyDans une stratégie FMZ, l'enregistrement dans le journal sera automatiquement produit.

        img

        1. Le journal des annulations;exchange.CancelOrderest utilisé dans une stratégie FMZ, et le journal des annulations sera automatiquement affiché dans le journal.

        img

        1. Journal d'erreur; lorsque la stratégie FMZ est en cours d'exécution et que l'interface pour la demande réseau présente une erreur d'appel et qu'une exception est lancée (comme une instruction throw), le journal d'erreur sera automatiquement publié dans le journal.

        img

      Parmi les fonctions de l'API FMZ, les fonctions qui peuvent générer une sortie de journal, telles que Log ((...), exchange.Buy ((Price, Amount), exchange.CancelOrder ((Id), etc., peuvent être suivies de certains paramètres de sortie supplémentaires après les paramètres nécessaires, tels que: exchange. CancelOrder ((ordres[j].Id, orders[j]); il s'agit de produire en outre les informations de commande lorsque l'ordre d'ordres[j] est annulé.

      function main() {
          Log("data1", "data2", "data3", "...")
          var data2 = 200
          var id = exchange.Sell(100000, 0.1, "additional data1", data2, "...")
          exchange.CancelOrder(id, "additional data1", data2, "...")
          LogProfit(100, "additional data1", data2, "...")
      }
      
    • Utilisation des fonctions d'indicateur Avant de parler de la fonction d'indicateur, comprenons d'abord ce qu'est un indicateur.

      Q:Comment ces indicateurs sont-ils générés? R: Ils sont certainement générés par des calculs.

      Q: Sur quoi sont-ils calculés? R: Données de la ligne K.

      Q: Pouvez-vous donner un exemple? R: En prenant l'indicateur de moyenne mobile le plus simple à titre d'exemple. Si nous utilisons les données de la ligne K quotidienne (c'est-à-dire une ligne yang ou une ligne yin représente un jour) comme source de données pour le calcul de l'indicateur. Le paramètre de l'indicateur de moyenne mobile est 10, alors l'indicateur de moyenne mobile calculé est la moyenne mobile de 10 jours.

      Q: si le nombre de BAR de la ligne K est inférieur à 10, l'indicateur de moyenne mobile peut-il être calculé? R: Non seulement l'indicateur de moyenne mobile ne peut pas être calculé, mais aucun indicateur ne peut calculer la valeur effective de l'indicateur lorsque le nombre de données BAR de ligne K ne répond pas au paramètre de la période de l'indicateur et que la position correspondante du tableau calculé sera remplie de valeurs vides, telles quenullest affichée lorsque leJavaScriptLa stratégie imprime les données des indicateurs calculés.

      Il y a un exemple d'enseignement sur la place:https://www.fmz.com/strategy/125770Testez cette stratégie d'exemple d'enseignement, et vous pouvez voir le graphique généré par le système de backtest et la moyenne mobile à 10 périodes:

      img

      Selon la stratégie, le dessin personnalisé, la ligne K dessinée et le graphique des moyennes mobiles:

      img

      Q: et si je veux utiliser une moyenne mobile sur 10 heures? R: utiliser les données de la ligne K d'une période horaire.

      En termes simples, la ligne K que nous voyons est un tableau après l'avoir numérisé (si vous ne comprenez pas le concept de tableau, vous pouvez le rechercher sur Baidu), et chaque élément du tableau est une barre de ligne K, qui est disposée par ordre. En général, la dernière barre des données de la ligne K est la barre de la période en cours, qui change en temps réel et n'est pas complétée (vous pouvez observer les changements en vous connectant à une page de plateforme et en observant sa ligne K). Les indicateurs calculés sont également en correspondance un-à-un avec les barres de la ligne K. Dans l'exemple ci-dessus, vous pouvez voir qu'une valeur d'indicateur correspond à une barre de la ligne K. Notez que la dernière barre de la ligne K change en temps réel, et l'indicateur calculé changera également avec le changement de la barre de la ligne K.

      Sur FMZ Quant Trading Platform, vous pouvez utiliser la bibliothèque TA (la bibliothèque mise en œuvre par FMZ, intégrée dans le docker, et peut être utilisée directement dans divers langages) ou talib (l'ancienne célèbre bibliothèque d'indicateurs talib, intégrée dans JS, C ++; Python doit être installée en plus). Par exemple, le calcul de la moyenne dans l'exemple ci-dessus: Utilisez la bibliothèque FMZ TA:

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

      Utilisez le talib:

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

      L'indice de données calculé ma est une matrice, et chaque élément correspond à la matrice de ligne K (enregistrements) un par un, c'est-à-dire,ma[ma.length -1]correspond àrecords[records.length - 1], et ainsi de suite.

      Il en va de même pour d'autres indicateurs plus complexes, et vous devez faire attention à des indicateurs tels que le MACD.

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

      À ce stade, la variable macd est un tableau bidimensionnel (vous pouvez Baidu, si vous ne comprenez pas le concept).

      Q: Pourquoi les données de l'indicateur MACD sont-elles un tableau bidimensionnel? R: Parce que l'indicateur macd est composé de deux lignes (ligne dif et ligne dea) et d'un ensemble de barres de volume (les données de la barre de volume macd, en fait, peuvent également être considérées comme une ligne).

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

      Voici également un exemple d'enseignement prêt à l'emploi; si vous êtes intéressé, vous pouvez l'étudier:https://www.fmz.com/strategy/151972

      img


Plus de