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

La transaction quantifiée du cercle de monnaie est une nouveauté - qui vous rapproche de la quantification du cercle de monnaie.

Auteur:L'inventeur de la quantification - un petit rêve, Créé: 2021-04-19 14:16:21, Mis à jour: 2023-09-24 19:30:05

img

La quantité de transaction dans le cercle monétaire est nouvelle et vous rapproche de la quantité de transaction dans le cercle monétaire.

Dans l'article précédent, nous avons parlé de scripts de transactions programmées. En fait, les stratégies de transaction sont des scripts de transaction. L'article parle principalement des scripts de transaction qui nécessitent un support matériel (l'endroit où le programme s'exécute) et qui peuvent être écrits dans le langage de programmation informatique utilisé par l'inventeur.

Scénario de transaction programmée

  • Types de stratégies de négociation Les débutants dans le trading programmatique et le trading quantitatif peuvent être déconcertés par les termes stratégies de tendance, stratégies d'options, stratégies de haute fréquence, stratégies de grille, etc. En fait, le trading programmatique et le trading quantitatif sont des types de stratégies courantes dans plusieurs directions.

    • Stratégie de couverture des intérêts En termes simples, les stratégies telles que la détention d'une position à la fois positive et négative peuvent être classées comme des stratégies d'effet de levier. Il existe de nombreuses catégories spécifiques, telles que les options sur le marché, les options sur les contrats à terme, les options sur le marché, les options sur les variétés, etc.
    • Stratégie de tendance En termes simples, il s'agit d'une stratégie consistant à suivre la tendance, à suivre les ordres, à suivre les lignes binaires, à suivre le MACD, etc.
    • Stratégie de retour Par exemple, les stratégies de grille pour tirer parti des fluctuations des prix dans les marchés instables.
    • Stratégie de haute fréquence En termes simples, il s'agit d'une stratégie de négociation à haute fréquence qui consiste à exploiter des algorithmes pour détecter les structures microscopiques, les lois et les opportunités du marché.

    Ce qui précède est divisé en termes de stratégie de transaction, et en termes de conception de stratégie sur les plateformes de négociation quantitative des inventeurs, les stratégies peuvent être divisées en:

    • Stratégie de la seule variété C'est-à-dire que cette stratégie ne fonctionne que sur une seule variété, comme faire des transactions en BTC ou en ETH.
    • Une stratégie multiculturelle En termes simples, il s'agit de manipuler plusieurs variétés selon une logique stratégique.
    • Politique de plusieurs comptes En termes simples, il s'agit d'une configuration de plusieurs objets d'échange sur le disque dur (le concept d'échange a été présenté dans l'article précédent, configurer les objets d'échange de l'API KEY pour représenter un compte d'échange). Par exemple, certaines stratégies de suivi, plusieurs comptes suivent des opérations ensemble (peut être le même échange, peut-être différents échanges), en un mot, gérer plusieurs objets d'échange sur le disque dur (les comptes).
    • Une stratégie multi-logique Une stratégie MACD, une stratégie de ligne droite, une stratégie de grille, etc. ont été conçues simultanément sur un disque (bien sûr, il s'agit d'opérer sur différents objets d'échange, d'opérer sur les mêmes objets d'échange pour voir si les stratégies spécifiques sont en conflit logique).
  • Interface de l'API de l'échange Comment les scripts de négociation programmatiques fonctionnent-ils sur les comptes d'échange? La réponse est l'API ouverte par l'échange. Dans l'article précédent, nous avons parlé de l'interface REST et Websocket dans la section "Exchanges". Ici, nous avons ajouté un peu de concept au niveau du programme stratégique.

    • Interfaces qui ne nécessitent aucune vérification Généralement appelées puces d'interfaces publiques, ces types d'interfaces ne nécessitent pas de vérification.API KEYCes interfaces sont généralement des interfaces de marché, telles que la recherche de profondeur de marché, la recherche de données de ligne K, la recherche de taux de fonds, la recherche d'informations sur la variété de transactions, la recherche de temps de serveur d'échange, etc. En termes simples, une interface qui n'a pratiquement rien à voir avec votre compte peut être considérée comme une interface publique (pas besoin d'authentification).
      Sur les plateformes de négociation quantifiées par les inventeurs, les données renvoyées par les interfaces peuvent être récupérées normalement lorsque des fonctions API non vérifiées sont appelées (interfaces non vérifiées, interfaces publiques) même si les API KEY sont configurées de manière incorrecte.

    • Interfaces à vérifier En termes simples, il s'agit d'interfaces qui nécessitent une authentification (authentification par API KEY), appelées interfaces privées. Ces interfaces sont généralement liées à certaines opérations ou informations de votre compte, telles que la recherche d'actifs, la recherche de stocks, la mise en attente de requêtes, le transfert de requêtes, le transfert, la modification de l'effet de levier, la configuration du mode de détention, etc. Ces opérations doivent être vérifiées. Sur les plateformes de négociation quantifiées par les inventeurs, les fonctions d'API qui nécessitent une vérification sont appelées (interfaces qui nécessitent une vérification, interfaces privées pour les échanges enveloppés), et si l'API KEY est mal configurée, une erreur est signalée lors de l'appel de l'interface et renvoie une valeur nulle.

    Alors, comment ces interfaces sont-elles utilisées sur les plateformes de trading quantifiées par les inventeurs?

    La plateforme de trading quantifié par les inventeurs enveloppe les comportements de l'échange et définit des interfaces cohérentes (par exemple, l'interface K-line, l'interface de marché en profondeur, l'interface de demande d'actifs actuels, l'interface de simple demande, l'interface de retrait de commande, etc.), qui sont appelées fonctions API de la plateforme de trading quantifié par les inventeurs et peuvent être consultées en consultant la documentation de l'API.https://www.fmz.com/api )。

    Alors, comment utiliser des interfaces d'échange comportementales et non unifiées sur les plateformes de négociation quantitative des inventeurs?

    Ces interfaces peuvent être utilisées par exemple pour les transferts d'actifs, les mandats conditionnels, les commandes en vrac, les retraités en vrac, les modifications d'ordres, etc. Certaines interfaces sont disponibles et d'autres non, et les fonctionnalités et les détails d'utilisation peuvent être très différents.exchange.IOPour accéder à cette fonction, vous pouvez consulter les documents de l'API de la plateforme de trading quantitative de l'inventeur:https://www.fmz.com/api#exchange.io..Il y a aussi des exemples de stratégies d'IO utiles sur le marché des plateformes de trading quantitatives d'inventeurs.

    Est-ce que toutes les fonctions API dans la documentation de l'API de la plateforme de négociation quantitative des inventeurs génèrent des requêtes réseau?

    Si l'interface API de l'échange est limitée en fréquence d'accès (par exemple, 5 fois par seconde), l'accès ne peut pas être trop fréquent, sinon l'erreur HTTP 429 est signalée et l'accès est refusé (la plupart des échanges signalent 429). Toutes les fonctions d'API des plateformes de négociation quantifiées par les inventeurs ne génèrent pas de requêtes de réseau. Certaines fonctions d'API des inventeurs modifient simplement certains paramètres locaux, tels que la configuration des paires de transactions en cours, la configuration du code de contrat, la fonction de calcul des indicateurs, l'obtention du nom de l'objet de l'échange, etc. En gros, l'utilisation des fonctions permet de déterminer si une demande réseau a été effectuée, tant que des requêtes réseau ont été générées pour obtenir des données d'échange, des opérations sur des comptes d'échange, etc. Ces interfaces doivent être attentives à la fréquence d'appel.

    • Voici quelques questions et expériences fréquentes des inventeurs qui utilisent des API pour leurs plateformes de trading quantitative.

      • Il faut se tromper. C'est l'erreur la plus commune, qui dérange tant de personnes, et souvent la stratégie est de vérifier que tout va bien, pourquoi le disque fonctionne-t-il pendant un certain temps (peut être déclenché à tout moment) et le disque est suspendu ~

        img

        Nous avons besoin de vérifier toutes les données renvoyées par l'interface lors de la rédaction de la stratégie, par exemple pour obtenir la ligne de code suivante sur la plate-forme de négociation quantitative de l'inventeur (c'est la même chose que d'écrire votre propre programme pour accéder directement à l'interface de l'échange):var ticker = exchange.GetTicker()Si nous avons besoin d'utiliser cela,tickerLes variables (voir la structure renvoyée par la fonction GetTicker)LastNous devons utiliser ces données pour évaluer les prix actuels.var newPrice = ticker.LastCela permet d'obtenir des données ((newPrice est???new: le plus récent,Price: prix, oui! combiné!)GetTicker()La fonction renvoie les données normales, mais si des temps d'arrêt de requête, des erreurs de réseau, des déconnexions d'échange, des câbles coupés, des bébés qui tirent des bougies, etc. se produisent, cela provoque des problèmes.GetTicker()Retour de la fonctionnullÀ ce moment-là.tickerC'est la même chose.nullJe vais y retourner.LastUne erreur de procédure peut entraîner l'arrêt du processus stratégique. Il semble donc que l'échec de l'appel d'interface (l'échec de l'appel GetTicker renvoie null) n'est pas la cause directe de l'arrêt du disque dur de la stratégie (la cause directe est l'accès à unnullL'erreur d'appel d'interface qui ne provoque pas l'arrêt du disque réel (points de soulignement). Alors, que pouvons-nous faire pour éviter que le disque ne s'arrête? La réponse est de faire des erreurs sur les données retournées par l'interface, et c'est très simple de juger si les données retournées sont correctes ou pas.null(Exemple du langage JavaScript, les autres sont à peu près les mêmes) Écrivez un petit extrait de code pour expliquer (c'est juste une explication, l'exécution directe est une erreur!)

        var ticker = exchange.GetTicker()
        if (ticker) {
            var newPrice = ticker.Last
            Log("打印最新价格:", newPrice)
        } else {
            // 数据为null,不做操作就不会出问题
        }
        

        Ce n'est pas seulementGetTickerL'interface doit accepter les erreurs, et toutes les interfaces qui ont une requête réseau doivent accepter les erreurs sur la valeur de retour (si vous utilisez la valeur de retour d'une fonction) Il y a beaucoup de façons d'accepter les erreurs._C()Les fonctions (voir la documentation de l'API FMZ), écrivent elles-mêmes des fonctions d'erreur, conçoivent elles-mêmes des mécanismes d'erreur et de logique. À propos_C()L'utilisation des fonctions, beaucoup de nouveaux élèves sont probablement mal, attention._C()Les paramètres des fonctions sont des références de fonctions, pas des appels de fonctions._C(funcName, param1, param2), appelé correctement, funcName sans parenthèses, param1, param2 est le paramètre à transmettre à la fonction funcName._C(funcName(param1, param2))Il y a une erreur d'appel, qui est généralement écrite de cette façon dans les documents de l'API FMZ.

      • Compte de la commande à prix du marché Le volume des commandes de billets de marché à la vente au détail est également très facile à tromper. Dans l'article précédent, nous avons parlé du volume des commandes de billets de marché à la vente au détail, qui est généralement un montant (des échanges très différents peuvent être configurés différemment, généralement sur FMZ, ces paramètres spécifiques sont indiqués dans la documentation de l'API FMZ). La paire de transactions est définie comme suit:LTC_USDT

        function main() {
            exchange.IO("simulate", true)   // 切换为OKEX交易所的模拟盘
            exchange.Buy(-1, 1)             // 价格是-1,表示下的订单为市价单,数量为1表示下单量是1USDT
        }
        

        Comme les échanges ont généralement des limites sur le montant de la commande, les commandes inférieures à cette limite ne sont pas pré-commandées (par exemple, le Binance Cash exige que chaque commande supérieure à 5 USDT soit réussie).

        错误	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 de la souscription du futur La direction la plus négative dans la stratégie des contrats à terme est aussi celle où les débutants font souvent des erreurs qui entraînent des problèmes, par exemple en écrivant des stratégies sur des plateformes de négociation quantitatives. Nous allons d'abord examiner la description dans la documentation de l'API:https://www.fmz.com/api#exchange.setdirection...

        img

        C'est parce qu'il y a une fonction de sous-ordre.Buy,SellCependant, si les futures (s'il n'y a pas de problème, il n'y a que des achats et des ventes au comptant) sont ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes, ouvertes,exchange.SetDirection()Je ne sais pas. Sur FMZexchange.SetDirection("buy")(orientation prédéfinie) etexchange.BuyL'utilisation conjointe indique que la liste ci-dessous est une commande à plus de positions. Il y a aussi une autre version:exchange.SetDirection("sell")etexchange.SellSi l'on utilise le terme en combinaison, on indique que la liste ci-dessous est une commande d'un stock vide.exchange.SetDirection("closebuy")etexchange.SellL'utilisation conjointe indique que la liste ci-dessous est une commande à prix réduit.exchange.SetDirection("closesell")etexchange.BuySi l'on utilise les deux, on indique que la liste ci-dessous est une commande de stockage vide. Les rencontres habituellesexchange.SetDirection("sell")etexchange.BuyIl y a des erreurs dans la syntaxe de l'utilisation, ou dans d'autres combinaisons d'erreurs. Une autre erreur fréquente de Liu Xiaobo

        function main() {
            exchange.SetContractType("quarter")   // 设置当前合约为季度合约
            exchange.SetDirection("sell")
            var id = exchange.Sell(-1, 1)    
            Log("看我市价单下单了,成交了,就有持仓了", exchange.GetPosition())    
            exchange.SetDirection("closebuy")   // closebuy 和Sell 搭配使用,嗯没错~
            exchange.Sell(-1, 1)
        }
        

        img
        Si vous regardez ici, vous vous demandez: pourquoi est-ce que j'ai un stock et que closebuy et sell sont également utilisés en même temps, comment se fait-il que je ne puisse pas gérer? Je réponds: gérer dans la mauvaise direction! gérer est gérer plusieurs positions. Une autre situation dans laquelle cette erreur peut se produire est la suivante: l'orientation de l'étalonnage est correcte, l'utilisation de la fonction de sous-titrage est correcte, la position est maintenue dans cette direction, mais l'erreur est toujours signalée. La raison en est que votre programme peut avoir reçu plusieurs commandes, que les commandes initiales n'ont pas été exécutées, que les commandes de mise en place sont en attente d'exécution sur le comptoir, et que le programme continue à se mettre en place, ce qui indique une erreur au-delà des positions de mise en place.

      • Export de journaux, affichage des informations sur les transactions La conception de l'écriture de programmation, de la quantification des stratégies de transaction, de la conception d'interactions entre les machines pour afficher des fenêtres, des journaux d'opérations, des sorties de fenêtres, etc. Les scripts de disque dur et les stratégies sont généralement écrits en langage natif. Les fonctions de sortie sont directement utilisées en langage courant. Par exemple: avec pythonprintJe ne sais pas. JavaScript est utiliséconsole.logJe ne sais pas. Utilisation par Golangfmt.Println()Je ne sais pas. C++ est utilisécout

        En outre, les informations sur la plate-forme FMZ montrent que, sur la plate-forme de négociation quantitative de l'inventeur, il y a deux emplacements principaux où les informations sont affichées.

        • Panneau de statut Une fois que le disque virtuel est en marche, la page du disque virtuel est la suivante:

          img

          L'affichage est en partie des informations de la barre d'état, la barre d'état est principalement destinée à afficher des données de changement en temps réel (parce que les changements en temps réel nécessitent une observation en temps réel et ne peuvent pas être imprimés en journal à chaque fois, ces données peuvent être affichées dans la barre d'état, si chaque barre d'état est imprimée dans le journal, il y aura beaucoup de données répétitives et inutiles, ce qui affectera les requêtes). Afficher l'utilisation des données sur la barre d'étatLogStatusPour plus de détails, voir la documentation de l'API de FMZ.

        • Le journal de bord Il y a aussi une page sur le disque dur, comme le montre le graphique:

          img

          L'affichage est partiellement effectué par une barre de journaux, qui est principalement destinée à enregistrer en permanence certaines données à un moment donné ou à enregistrer une opération à un moment donné. Les journaux sont de plusieurs types: 1, Logs ordinaires, l'utilisation de la fonction Log dans la stratégie de FMZ, l'extraction, l'impression dans la stratégie de logs.

          img

          2°, le journal suivant, utilisé dans la stratégie de FMZexchange.Sell/exchange.BuyLes données sont automatiquement publiées dans les journaux.

          img

          3°) Le journal de retrait, utilisé dans la stratégie de la FMZexchange.CancelOrderLe logiciel de dépôt de la facture est un logiciel de dépôt de la facture qui permet de télécharger automatiquement le logiciel de dépôt.

          img

          4, journal d'erreur, la politique FMZ est en cours d'exécution, lorsque l'interface qui effectue la demande de réseau est appelée par erreur, lorsque des exceptions (comme des phrases comme throw) sont lancées, une journal d'erreur est automatiquement produite dans le journal.

          img

        Les fonctions API de FMZ, qui peuvent générer des fonctions de sortie de journal telles que Log (...), exchange.Buy ((Price, Amount), exchange.CancelOrder ((Id) etc., peuvent être ajoutées à des paramètres de sortie complémentaires après les paramètres nécessaires, tels que: exchange.CancelOrder ((orders[j].Id, orders[j]) c'est ainsi que l'ordre peut être annulé avec les informations de sortie de l'ordre.

        function main() {
            Log("数据1", "数据2", "数据3", "...")
            var data2 = 200
            var id = exchange.Sell(100000, 0.1, "附带数据1", data2, "...")
            exchange.CancelOrder(id, "附带数据1", data2, "...")
            LogProfit(100, "附带数据1", data2, "...")
        }
        
      • Utilisation des fonctions d'indicateur Avant de parler des fonctions d'indicateur, nous devons d'abord comprendre ce qu'est un indicateur, en termes simples, une ligne moyenne, MACD, ATR, etc. Q: D'où viennent ces indicateurs? A: Bien sûr, il est calculé. Q: Sur quelle base est-ce calculé? R: Selon les données de la ligne K. Q: Donnez-moi un exemple. A: Dans l'exemple de l'indicateur de ligne moyenne de l'indicateur le plus simple, si nous utilisons la ligne de jour K (c'est-à-dire une ligne solaire ou une ligne cinétique représentant un jour) comme source de données pour le calcul de l'indicateur. Le paramètre de l'indicateur de la ligne moyenne est 10, alors l'indicateur de la ligne moyenne calculé est la ligne moyenne de 10 jours. Q: Si le nombre de BAR de la ligne K est inférieur à 10 bits, peut-on calculer l'indicateur de la ligne moyenne? R: Non seulement les indicateurs de ligne moyenne ne peuvent pas être calculés, mais aucun indicateur ne peut être calculé avec une valeur d'indicateur valide lorsque le nombre de données BAR de la ligne K ne satisfait pas aux paramètres de cycle de l'indicateur.JavaScriptLa stratégie linguistique affiche les données des indicateurs calculés lors de l'impression.null

        Il y a un exemple d'enseignement sur la place des bonnes stratégies:https://www.fmz.com/strategy/125770En repassant cette stratégie d'exemple d'enseignement, vous pouvez voir le graphique généré par le système de repassage ainsi que les moyennes de 10 cycles:

        img

        La stratégie consiste à personnaliser les graphiques, les K-lines et les graphiques homogènes:

        img

        Q: Et si je voulais une moyenne de 10 heures? A: Les données K-line sont bonnes pour les cycles horaires.

        On dit couramment que la ligne K que nous voyons, que nous numérons, est une matrice dont chaque élément est une colonne de ligne K, classée dans l'ordre suivant: le premier élément est le plus éloigné du temps actuel, et le dernier élément est le plus proche du temps actuel. Habituellement, la dernière colonne de données de la ligne K est la colonne de ligne du cycle en cours, qui est variable en temps réel et qui n'est pas terminée. L'indicateur calculé correspond également à la colonne de ligne K. L'exemple ci-dessus montre qu'une valeur d'indicateur correspond à une colonne de ligne K. Notez que la dernière colonne de ligne K est variable en temps réel et que l'indicateur calculé change également avec la variation de la colonne de ligne K.

        Sur la plateforme de trading quantifié par les inventeurs, vous pouvez utiliser le TA library (le library mis en œuvre par la plateforme FMZ, intégré dans l'hôte et accessible directement dans toutes sortes de langues) ou utiliser le talib library (le talib index library, JS, C++ intégré, Python nécessite une auto-installation). Par exemple, dans l'exemple ci-dessus, la ligne moyenne est calculée: Utilisation de la bibliothèque TA:

        function main() {
            var records = exchange.GetRecords()
            var ma = TA.MA(records, 10)
            Log(ma)       // 打印均线
        }
        

        L'utilisation de la bibliothèque talib:

        function main() {
            var records = exchange.GetRecords()
            var ma = talib.MA(records, 10)
            Log(ma)       // 打印均线
        }      
        

        L'indicateur calculé ma est une matrice dont chaque élément correspond à une matrice de lignes K (records), c'est-à-direma[ma.length -1]Correspondancerecords[records.length - 1]Il y a aussi des gens qui ont été tués.

        D'autres indicateurs plus complexes sont également synonymes, et il faut faire attention à des indicateurs comme le MACD.

        var macd = TA.MACD(records)   // 这样只传入K线数据,不传入指标参数,指标参数采用的就是默认值,其它指标函数也是同理
        

        À ce stade, la variable macd est une matrice bidimensionnelle (je ne comprends pas le concept), une matrice bidimensionnelle est simplement une matrice dont chaque élément est également une matrice. Q: Pourquoi les données MACD sont-elles une arithmétique en deux dimensions? R: Puisque l'indicateur macd est composé de deux lignes (ligne dif, ligne deea) et d'un ensemble de colonnes de quantité (ligne macd, qui peut être considérée comme une ligne), la variable macd peut être divisée en:

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

        Voici un exemple d'enseignement prêt à l'emploi et d'une étude intéressante:https://www.fmz.com/strategy/151972

        img


Relationnée

Plus de