La programmation visuelle a toujours été un objectif recherché par les développeurs d’outils logiciels, même dans le domaine du trading quantitatif. Parce que l’approche de visualisation « ce que vous voyez est ce que vous obtenez » réduit considérablement le seuil technique pour le développement de la programmation. Les utilisateurs n’ont plus besoin de s’occuper d’un tas de codage ennuyeux. Il leur suffit d’utiliser leur cerveau, leur imagination et leur raisonnement logique, et de se concentrer sur l’entreprise elle-même. Vous pouvez réaliser le programme que vous souhaitez, n’est-ce pas incroyable !
Alors entrons ensemble dans le domaine de la programmation visuelle des stratégies de trading quantitatif !
Après vous être connecté à https://www.fmz.com, enregistrez un compte (si vous êtes déjà inscrit, connectez-vous directement) et cliquez sur : Centre de contrôle->Bibliothèque de politiques->Nouvelle politique.
Nous pouvons voir une stratégie de visualisation initiale. Il génère uniquement les informations sur les actifs du compte de l’échange configuré par défaut (le premier objet d’échange ajouté dans le backtest ou le robot). (Comme indiqué ci-dessous)
## Avant de commencer à apprendre à utiliser la visualisation, nous pouvons d’abord comprendre certains concepts de conception de la visualisation.
Une observation attentive révèle que les modules possèdent tous des tenons (concaves) et des mortaises (convexes), ce qui signifie que les modules peuvent être « connectés » et « reliés ». Si les codes fonctionnels représentés par deux modules peuvent être connectés, ils seront alors emboîtés ensemble lorsque vous rapprocherez la mortaise et le tenon des deux modules.
Certains modules ont des paramètres spéciaux, par exemple :
Vous pouvez faire glisser le module « Projet » de gauche vers le module « Joindre », afin de pouvoir ajouter une position de tenon et mortaise, ajoutant ainsi une position pour l’épissure du texte. De cette façon, vous pouvez effectuer certains ajustements et réglages du module en cliquant sur le petit engrenage.
Certains modules nécessitent des paramètres d’entrée, qui peuvent être des valeurs, des chaînes, etc. Si vous n’ajoutez pas de variables comme paramètres d’entrée du module, le module sera exécuté selon les paramètres d’entrée par défaut.
Un module de calcul comme celui-ci pour trouver des racines carrées génère les résultats de calcul de ce module.
Comme vous pouvez le voir, si le paramètre d’entrée est manquant, la valeur par défaut 9 est utilisée comme paramètre d’entrée pour calculer la racine carrée de 9.
Bien entendu, si vous souhaitez utiliser un module variable comme paramètre d’entrée, vous pouvez connecter directement le module variable à la position tenon et mortaise (évidement).
Le module peut être cliqué et déplacé avec le bouton gauche de la souris. Les modules peuvent être copiés à l’aide de ctrl + c et collés à l’aide de ctrl + v, aussi facilement que de copier et coller du code ou du texte. La zone d’opération peut être agrandie ou réduite à l’aide de la molette de la souris, et tous les modules seront agrandis ou réduits. Cliquez et maintenez une zone vide dans la zone d’opération et faites-la glisser pour déplacer la zone d’opération. La corbeille à droite enregistre les modules qui ont été récemment supprimés. Surtout, après avoir assemblé la stratégie du module, n’oubliez pas de cliquer sur « Enregistrer ».
Vous pouvez voir qu’il existe de nombreuses catégories de modules sur le côté gauche de la zone d’édition visuelle, et qu’il existe de nombreux modules visuels disponibles dans chaque catégorie.
Il y a 11 catégories au total.
Ce module est généralement utilisé en combinaison avec des modules de texte, comme indiqué ci-dessous :
Vous pouvez saisir une chaîne dans le module de classe de texte, de sorte que lorsque vous exécutez le module « Informations de sortie », le contenu de la chaîne dans le module de texte soit imprimé.
Backtesting :
Comme le code du langage JavaScript :
function main(){
Log("你好,可视化编程!")
}
Ce module ressemble à « Informations de sortie », sauf qu’il génère des informations et les envoie au compte WeChat lié au compte actuel.
Comme le code du langage JavaScript :
function main () {
Log("微信推送!@")
}
Le module throw exception permet au programme de générer une erreur puis d’arrêter l’exécution du programme (sans écrire de code de gestion des exceptions).
Ceci est similaire à la stratégie JavaScript où la fonction throw « chaîne à générer » est directement exécutée dans la fonction principale.
function main () {
throw "第一句就抛出异常,让程序停止!"
}
Résultats des backtests :
Il est généralement utilisé plus fréquemment lors du débogage, par exemple, lorsque vous souhaitez que le programme s’arrête dans une certaine condition et imprime certaines données à ce moment-là pour une observation facile.
Vous pouvez également placer un module de génération d’exceptions dans le flux de code où des problèmes peuvent survenir, afin que le programme puisse signaler des erreurs et en découvrir certaines.
Module d’hibernation
Comme dans la stratégie JavaScript :
function main () {
Sleep(1000 * 5)
}
Tester le module d’hibernation :
Résultats des backtests :
Ce module est similaire à la fonction LogProfit de l’API de la plateforme de trading quantitative Inventor, imprimant le journal des bénéfices et dessinant automatiquement la courbe de profit en fonction des paramètres d’entrée.
Par exemple:
L’exécution du backtest est illustrée ci-dessous :
Le code de politique JavaScript correspondant est le suivant :
function main () {
LogProfit(1)
Sleep(1000 * 5)
LogProfit(2)
Sleep(1000 * 5)
LogProfit(3)
Sleep(1000 * 5)
LogProfit(2)
Sleep(1000 * 5)
LogProfit(5)
}
Il peut être épissé à n’importe quel endroit où vous souhaitez générer des informations sur les revenus.
Le module de boucle peut envelopper une série de combinaisons de modules épissés et laisser cette combinaison de modules s’exécuter dans une boucle.
test:
Résultats des backtests :
On peut voir qu’une fois que le module de boucle a enveloppé la combinaison de modules composée de Print Profit et Sleep, la combinaison de modules sera exécutée en continu.
L’utilisation de ce module est fondamentalement la même que celle du module de boucle, la seule différence est que ce module dispose d’une fonction de veille intégrée.
Ce module peut être utilisé lorsque des modules variables ou des valeurs numériques doivent contrôler la précision. La valeur numérique de la partie paramètre d’entrée sera sortie sous forme de valeur numérique des décimales spécifiées en fonction des paramètres.
Par exemple, le nombre 3,1415926535897 est traité avec précision.
Les backtests montrent :
Permet d’effacer les journaux. Selon les paramètres d’entrée, une partie des journaux peut être conservée. Comme dans la documentation de l’API :
LogReset()
Permet d’effacer le journal des revenus. Selon les paramètres d’entrée, une partie du journal peut être conservée. Comme dans la documentation de l’API :
LogProfitReset()
Ce module d’outil doit être utilisé conjointement avec le module de marché dans « Type de module de trading », comme indiqué dans la figure :
Utilisez le module d’informations de sortie pour générer le dernier prix de transaction du dernier marché boursier :
Les backtests montrent :
Comme le code de la stratégie JavaScript :
function main () {
Log(exchange.GetTicker().Last)
}
Ce module doit également être utilisé avec le module d’acquisition de données K-line dans le « Type de module de trading ».
Créez d’abord un module variable et nommez-le : K-line.
Ensuite, récupérez les données de la ligne K, utilisez le module de données de la ligne K pour les obtenir et attribuez-les au module variable : « K-line ».
Utilisez ensuite le module de longueur de liste dans le « Type de module de liste » pour obtenir la longueur du module variable de la ligne K, qui est utilisé pour spécifier à partir de quelle barre de la ligne K obtenir les données.
Cousez ensemble, comme indiqué :
Lorsque le backtest est exécuté, l’horodatage de la dernière barre K-line est imprimé.
Il doit également être utilisé avec le module Obtenir les données de profondeur dans le « Type de module de transaction ».
Définissez l’index sur 0, définissez un ordre de vente et obtenez les informations de l’ordre de vente.
Comme le code de la stratégie JavaScript :
function main () {
Log(exchange.GetDepth().Asks[0])
}
Ce module doit être utilisé avec le module Obtenir des informations sur les actifs.
Par exemple : imprimer le nombre de pièces disponibles sur le compte courant
Les backtests montrent :
Comme dans la stratégie JavaScript :
function main () {
Log(exchange.GetAccount().Stocks)
}
Ce module permet d’obtenir la valeur d’un certain attribut dans les données de commande, comme le prix ou la quantité de la première vente dans le carnet de commandes (exemple numéro 13).
Résultats des backtests :
Comme dans la stratégie JavaScript :
function main () {
Log(exchange.GetDepth().Asks[0].Price)
}
Il peut également être utilisé pour obtenir un certain attribut dans les informations de commande renvoyées par le module « Requête sur les détails de la commande » (qui sera expliqué dans la section avancée).
De même, il doit être utilisé avec le module « Get Futures Position ». Il convient de noter que les données de position renvoyées par le module Get Futures Position sont un tableau (liste), qui est une structure de données contenant les positions de différents contrats et directions . Vous devez donc spécifier l’index lors de son utilisation.
Après avoir appris tant de choses, combinons une opération de couverture, c’est-à-dire couvrons à la fois les contrats à court terme et à terme. Nous faisons une couverture d’arbitrage positive, c’est-à-dire que nous ouvrons un contrat à terme court, 1 contrat, et ouvrons un contrat long à court terme.
Résultats des backtests :
Exemple de stratégie de visualisation :
D’autres stratégies sont disponibles sur : https://www.fmz.com/square
Autres articles de cette série