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é).
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
Interfaces qui ne nécessitent pas de vérification
Généralement, ils sont appelés API KEY
Ce 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.IO
fonction 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
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)?
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; that
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 deticker
estnull
; lorsque j' accède auLast
Le 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'unnull
La 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 leGetTicker
l'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...
Parce que la fonction de commande n'a queBuy
etSell
Cependant, 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 exchange.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.Sell
l'ordre de mise en marché est un ordre d'ouverture de positions courtes.
Utilisationexchange.SetDirection("closebuy")
etexchange.Sell
l'ordre de clôture des positions longues est un ordre de clôture des positions longues.
Utilisationexchange.SetDirection("closesell")
etexchange.Buy
l'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.Buy
Ensuite, 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)
}
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:
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 leLogStatus
Pour 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:
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:
exchange.Sell
/exchange.Buy
Dans une stratégie FMZ, l'enregistrement dans le journal sera automatiquement produit.exchange.CancelOrder
est utilisé dans une stratégie FMZ, et le journal des annulations sera automatiquement affiché dans le journal.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 quenull
est affichée lorsque leJavaScript
La 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:
Selon la stratégie, le dessin personnalisé, la ligne K dessinée et le graphique des moyennes mobiles:
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
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