
Apprenez la stratégie de trading de la construction de modules visuels - le chapitre d’introduction, et ayez une compréhension conceptuelle de la construction et de l’épissage des modules visuels. Il est alors facile d’apprendre à utiliser d’autres modules. Certaines fonctions plus complexes peuvent être combinées.
Dans des études et des tests précédents, nous avons été en contact avec plusieurs modules de « catégorie de transaction ». Par exemple: Module « Échange de cotations » Module « Échanger pour obtenir la ligne K » …
Je n’entrerai pas dans les détails de ceux qui ont déjà été utilisés.

Lorsque vous écrivez une stratégie de trading avec un robot, vous pouvez ajouter plusieurs objets d’échange, par exemple une stratégie de couverture. Ou bien vous devez parcourir (parcourir signifie visiter un par un) les objets d’échange pour accéder aux conditions du marché. À ce stade, vous devez utiliser un module pour obtenir le nombre d’échanges.
Nous pouvons d’abord utiliser une structure simple pour imprimer le nombre d’échanges actuellement configurés :

En fait, c’est comme appeler le code de politique JavaScript suivant :
function main () {
Log(exchanges.length)
}
Regardons les résultats de l’exécution de ce module combiné :

Vous pouvez voir que nous avons ajouté 3 objets d’échange, représentant trois comptes d’échange différents, et le résultat de sortie du journal de backtest est 3.

Lors de l’ajout de trois objets d’échange, la liste déroulante affichera trois options.
Apprenez un module de boucle à l’avance, dans le type de boucle.

Apprenons à l’avance un module de jugement conditionnel :
La condition de jugement peut s’écrire comme :

Nous utilisons le module de boucle pour parcourir les noms d’échange ajoutés Utilisez le module de jugement conditionnel pour déterminer si le nombre de boucles actuel correspond au nom d’échange à imprimer.

Résultats de l’exécution du backtest :

Comme le code de la stratégie JavaScript :
function main () {
for (var i = 1 ; i <= exchanges.length ; i++) {
if (i == 1) {
Log(exchanges[0].GetName())
} else if (i == 2) {
Log(exchanges[1].GetName())
} else {
Log(exchanges[2].GetName())
}
}
}

Un exemple simple récupère la paire de négociation du premier objet d’échange actuellement défini et l’affecte à la variable texte (créée dans la catégorie de variable à l’avance).
Résultats des backtests :

Si vous appelez le code de politique JavaScript :
function main () {
var text = exchange.GetCurrency()
Log(text)
}
Ce module est très important et est utilisé pour les opérations de commande. La variable prix est intégrée dans la première position du tenon (rainure) pour spécifier le prix de la commande. Vous pouvez également saisir directement une valeur fixe.
La deuxième position du tenon (point) intègre la variable de quantité commandée, qui est utilisée pour spécifier la quantité commandée.
Par exemple, nous allons créer un exemple de passation d’un ordre d’achat basé sur le dernier prix des données actuelles du marché des ticks, avec un glissement de 10 yuans, en définissant la quantité de commande à 0,1 pièce et en imprimant l’ID de commande.

Résultats de l’exécution du backtest :

Comme le code de politique JavaScript suivant :
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last + 10, 0.1)
Log(id)
}

Ce module renvoie tous les ordres non terminés pour la paire de trading actuelle. La structure renvoyée est une liste (tableau), qui peut être traitée par des modules de type liste (opérations de parcours, etc.). Par exemple : nous modifions légèrement l’exemple de module de commande [4] ci-dessus et changeons le prix de 10 yuans ajouté lors de la passation d’une commande en une soustraction de prix de 10 yuans. L’ordre ne sera pas exécuté immédiatement, mais sera en attente dans la profondeur d’achat et de vente (c’est-à-dire à un certain niveau entre Acheter 1, Acheter 2 et Acheter N), de sorte que l’ordre est dans un ordre en attente d’exécution. Nous utilisons ensuite le module « Obtenir l’ordre de confiance de la paire de trading actuelle » pour obtenir une liste des ordres dans l’état PENDING (en attente d’exécution). Afin d’éviter l’exécution des ordres dans les conditions de marché ultérieures et d’affecter l’observation finale du backtest, après l’exécution du module « Obtenir l’ordre de confiance de la paire de trading actuelle » et l’impression de la liste des ordres, nous utilisons immédiatement l’exception « Lancer “ module pour arrêter le programme.

Les backtests montrent :

Le prix de l’ordre d’achat est inférieur de 10 yuans au dernier prix à ce moment-là, donc la transaction ne sera pas finalisée immédiatement. Récupérez ensuite les commandes en attente d’exécution et imprimez-les. Enfin, une exception est levée pour arrêter le programme.
L’ensemble du module assemblé revient à appeler une stratégie JavaScript :
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last - 10, 0.1)
Log(id)
Log(exchange.GetOrders())
throw "stop"
}

Ce module permet d’annuler une commande.
Il existe de nombreux scénarios dans lesquels cela est nécessaire lors de la rédaction de politiques :
Annuler toutes les commandes actuellement en attente.
Il est certain que cela nécessitera l’utilisation du « module d’annulation d’ordre ». Lors de l’apprentissage du module d’annulation d’ordre, nous pouvons utiliser [5] pour obtenir le module de l’ordre de confiance de la paire de négociation actuelle et les combiner pour réaliser cette fonction.
Tout d’abord, pour tester l’annulation de toutes les commandes, passer une commande n’est pas très évident, on commence par passer deux commandes avec des prix et des quantités différents pour distinguer les deux commandes.

Utilisez le module « Parcourir chaque élément de la liste » dans le module de type boucle pour parcourir les commandes de la liste des commandes en attente en cours.
Lors du parcours, chaque commande récupérée est affectée à la variable module order (créée dans le type de module variable, comme indiqué ci-dessous :)
Utiliser le module de type d’outil :
Retirez l’ID de commande et transmettez-le à la position tenon (concave) du module d’annulation de commande, et le module d’annulation de commande exécute l’ordre d’annulation.
Exécution du backtest :

Utilisation de la description de la politique JavaScript :
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last - 10, 0.1)
Log(id)
var id2 = exchange.Buy(_C(exchange.GetTicker).Last - 12, 0.2)
Log(id2)
var orders = exchange.GetOrders()
Log(orders)
for (var i in orders) {
var order = orders[i]
Log(exchange.CancelOrder(order.Id))
}
}

Ce module peut renvoyer des informations de commande détaillées en connectant un module variable d’ID de commande à la position du tenon et de la mortaise.

Faites attention à l’ordre renvoyé après l’exécution :

Comparé aux résultats d’exécution dans l’exemple [5], on peut constater que la commande imprimée est une information de commande distincte.[] Enveloppé entre crochets.
Étant donné que l’exemple [5] renvoie une liste, cet exemple renvoie une seule information de commande (obtenue en fonction de la variable d’identification du module à la position du tenon transmise par le module).
L’exemple ci-dessus équivaut à l’exécution d’une politique JavaScript :
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last - 10, 0.1)
Log(exchange.GetOrder(id))
}
Nous étudierons les modules ci-dessus un par un et définirons l’échange de test sur les contrats à terme sur matières premières.
Paramètres de backtesting :
L’exemple suivant teste rétrospectivement cette configuration.

Les contrats à terme sur matières premières ont des heures d’ouverture et de fermeture. Lorsque le marché est fermé, vous ne pouvez pas vous connecter.

Lorsque l’objet d’échange est configuré comme un échange à terme, si vous ne définissez pas le contrat et n’obtenez pas directement les informations du marché, une erreur sera signalée :

Nous avons fixé le contrat à MA909, qui est le contrat principal actuel pour le méthanol.
De cette manière, la dernière valeur de prix sur le marché actuel des ticks du contrat MA909 est obtenue.
Dans le module d’ordre d’exécution

Le sens de l’ordre doit être précisé car les contrats à terme ont :
acheter : ouvrir une position longue
vendre : ouvrir une position courte
closebuy : clôturer une position longue
closesell : clôturer une position courte
Quatre directions (les contrats à terme sur matières premières ont deux directions supplémentaires : closebuy_today ferme les positions longues aujourd’hui, closesell_today ferme les positions courtes aujourd’hui).
Par exemple, si le module de commande est configuré pour acheter, il y a alors deux significations : ouvrir une position longue et fermer une position courte, ce qui crée une ambiguïté. Par conséquent, le module « Définir la direction de l’ordre de négociation à terme » est nécessaire pour définir une direction d’ordre claire.

Les backtests montrent :

Comme le code de la stratégie JavaScript :
function main () {
while (true) {
if (exchange.IO("status")) {
exchange.SetContractType("MA909")
Log(exchange.GetTicker().Last)
exchange.SetDirection("buy")
Log(exchange.Buy(1000, 1))
throw "stop"
} else {
Log("未连接商品期货前置机")
}
Sleep(1000)
}
}
L’utilisation des contrats à terme sur devises numériques est fondamentalement la même que l’utilisation des contrats à terme sur matières premières dans [8] ci-dessus.
En prenant OKEX comme exemple, le code du contrat peut être :
BitMEX :
Configuration du module de levier

Utilisé pour définir l’effet de levier pour les contrats à terme sur devises numériques.
# 注意 : 回测不支持。
Comme dans la stratégie JavaScript :
function main () {
exchange.SetMarginLevel(10)
}
Exemple de stratégie de visualisation :
D’autres stratégies sont disponibles sur : https://www.fmz.com/square
Autres articles de cette série