Nous avons appris le module de visualisation pour construire une stratégie de trading - première connaissance, et nous avons une compréhension conceptuelle de la construction de modules visuels et l'épissage, Ensuite, il est facile d'apprendre à utiliser d'autres modules. Il est possible de combiner des fonctions plus complexes.
Dans les précédents cours d'apprentissage et de test, nous avons été exposés à plusieurs modules de la catégorie "trading".
Par exemple:
Elles ont été utilisées et ne seront pas répétées ici.
Lorsque vous écrivez des stratégies pour utiliser des robots de trading, vous pouvez ajouter plus d'un objet d'échange, comme des stratégies de couverture. Ou vous devez traverser (traverser signifie visiter les objets de change un par un) les objets de change pour accéder au marché. C'est là que le module pour obtenir le nombre d'échanges entre en jeu.
Nous pouvons imprimer le nombre d'échanges actuellement configurés dans une structure simple:
En fait, c'est comme appeler un tel code de stratégie JavaScript:
function main () {
Log(exchanges.length)
}
Examinons les résultats de ce module combiné:
Nous pouvons voir que nous avons ajouté trois objets d'échange, représentant trois comptes d'échange différents, et le résultat de sortie du journal de backtest est 3.
Lorsque vous ajoutez trois objets d'échange, la fenêtre déroulante affiche trois options. Apprenez un module de boucle dans le type de boucle à l'avance.
Apprenez un module de jugement de condition à l'avance:
Les conditions de jugement peuvent être écrites comme suit:
Nous utilisons le module de boucle pour traverser les noms d'échange ajoutés. Nous utilisons le module de jugement des conditions pour juger si le nombre de boucles actuel correspond au nom de l'échange à imprimer.
Résultats de l'opération de test antérieur:
Comme le code de 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 est d'obtenir la paire de négociation du premier objet d'échange actuellement défini et de l'assigner à la variable texte (créée à l'avance dans la catégorie de variable).
Résultats des tests antérieurs:
Si vous appelez le code de stratégie JavaScript:
function main () {
var text = exchange.GetCurrency()
Log(text)
}
Ce module est très important pour l'opération de commande. La première position de tenon (concave) est intégrée avec une variable de prix, qui est utilisée pour spécifier le prix de commande. Vous pouvez également entrer une valeur fixe directement. La deuxième position du tenon (concave) est intégrée à la variable quantité de commande, qui est utilisée pour spécifier la quantité de commande.
Par exemple, nous épluchons un exemple de placement d'un ordre d'achat en ajoutant un prix fluctuant de 10 yuans basé sur le dernier prix des données actuelles du marché des ticks, avec la quantité d'ordre définie à 0,1 pièces, et imprimons l'identifiant de l'ordre.
Résultats de l'opération de test antérieur:
Comme le code de stratégie JavaScript:
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last + 10, 0.1)
Log(id)
}
Ce module renvoie tous les ordres en attente dans l'état inachevé de la paire de négociation en cours. Il renvoie une structure de liste (array), qui peut être traitée par le module de type de liste (opération de traversée, etc.).
Par exemple, nous avons légèrement modifié le module d'ordre de l'exemple ci-dessus [4] et changé le prix de 10 yuans ajoutés lors de la passation d'une commande à moins 10 yuans.
Ensuite, nous utilisons le module
Les tests antérieurs montrent que:
Le prix de l'ordre d'achat était 10 yuans inférieur au dernier prix à ce moment-là, il ne sera donc pas rempli immédiatement. Ensuite, obtenez la commande dans le statut de transaction en attente et imprimez-la. Enfin, une exception est lancée pour arrêter le programme.
L'ensemble du module assemblé est comme un appel à la 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 est utilisé pour annuler la commande.
Il existe de nombreux scénarios qui nécessitent de telles opérations lors de l'écriture de stratégies:
Annuler toutes les commandes en cours.
Il ne fait aucun doute que le module
Tout d'abord, afin de tester l'annulation de toutes les commandes, il n'est pas évident de passer une commande. Nous commençons à passer 2 commandes, leurs prix et quantités sont différents pour distinguer les deux commandes.
Utilisez le module
Au cours de la traversée, chaque ordre récupéré est attribué une valeur à l'ordre du module variable (créé dans le type de module variable, comme indiqué ci-dessous:)
Utilisez le module
Retirez l'identifiant de commande, passez-le à la position tenon (concave) du module
Opération de contre-test:
Utilisez la description de stratégie 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))
}
}
La position de tenon (concave) du module est connectée à un module variable d'identification de commande et les détails de commande peuvent être renvoyés.
Notez l'ordre retourné après l'exécution:
En comparaison avec les résultats d'exécution de l'exemple [5], on constate que la commande imprimée est une information de commande distincte sans parenthèses []. Parce que l'exemple [5] renvoie une liste, mais cet exemple renvoie une information d'ordre séparée (obtenue sur la base du module de variable ID sur la position du tenon passée par le module).
L'exemple ci-dessus est similaire à l'exécution de la stratégie JavaScript:
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last - 10, 0.1)
Log(exchange.GetOrder(id))
}
Nous apprendrons les modules ci-dessus un par un et nous définirons l'échange de test comme des contrats à terme sur matières premières.
Paramètres de vérification:
L'exemple suivant effectue un backtest basé sur les paramètres.
Les contrats à terme sur matières premières ont une heure d'ouverture et une heure de fermeture.
Lorsque l'objet de l'échange est configuré comme un échange de contrats à terme, si l'échange n'établit pas de contrat et obtient directement les informations du marché, une erreur sera signalée.
Nous avons défini le contrat comme MA909, le principal contrat de méthanol actuellement.
De cette façon, on obtient la dernière valeur de prix sur le marché actuel du contrat MA909.
Dans le module d'exécution des ordres
La direction de l'ordre doit être spécifiée, car les contrats à terme ont: acheter: ouvrir des positions longues vendre: positions courtes ouvertes closebuy: fermeture de positions longues La valeur de l'échange est la valeur de l'échange de l'échange. Quatre directions (il existe deux autres directions pour les contrats à terme sur matières premières: closebuy_today pour la clôture des positions longues aujourd'hui et closeesell_today pour la clôture des positions courtes aujourd'hui).
Par exemple, si le module d'ordre est défini comme
Affichage des tests arrière:
Comme le code de 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("The commodity futures front-end processor is not connected")
}
Sleep(1000)
}
}
L'utilisation des contrats à terme sur devises numériques est fondamentalement la même que celle des contrats à terme sur matières premières dans [8] ci-dessus.
Il est utilisé pour définir l'effet de levier des contrats à terme sur devises numériques.
#Note: Backtesting is not supported.
Comme une stratégie JavaScript:
function main () {
exchange.SetMarginLevel(10)
}
Exemples de stratégies de visualisation:
https://www.fmz.com/strategy/121404 https://www.fmz.com/strategy/129895 https://www.fmz.com/strategy/123904 https://www.fmz.com/strategy/122318Pour plus de stratégies, veuillez consulter:https://www.fmz.com/square
Autres articles de cette série