Mettre rapidement en œuvre un outil de négociation quantitative semi-automatique
L'arbitrage intertemporel est une méthode de négociation courante dans le commerce à terme de produits de base. Ce type d'arbitrage n'est pas sans risque.
Dans cet article, nous essayons de passer à une autre stratégie de trading, au lieu de construire une stratégie de trading entièrement automatisée, nous avons réalisé un outil de trading quantitatif interactif semi-automatique pour faciliter l'arbitrage intertemporel dans le trading à terme de matières premières.
La plateforme de développement que nous utiliserons est la plateforme FMZ Quant.
L'arbitrage intertemporel est un concept simple.
Conception de l'arbitrage intertemporel
# Strategy Design
The strategy framework is as follows:
Fonction principale
Alors que c'est vrai
If(exchange.IO(status)){ // Détermine l'état de connexion du protocole CTP.
LogStatus(_D(), Désormais connecté à CTP!) // Heure d'ouverture du marché, connexion de connexion est normale.
{ \ pos (192,220) } autre
LogStatus(_D(), CTP non connecté!) // Pas connecté au front-end de négociation.
Je ne sais pas.
Je ne sais pas.
Je ne sais pas.
If the CTP protocol is connected properly, then we need to set up the trading contract and then get the market quote. After obtaining the quotes, we can use the FMZ Quant platform build-in "line drawing" library to draw the difference.
Fonction principale
Alors que c'est vrai
If(exchange.IO(status)){ // Détermine l'état de connexion du protocole CTP.
change.SetContractType ((rb2001) // Définir le contrat du mois le plus éloigné
Var tickerA = exchange.GetTicker() // données de cotation des contrats pour le mois suivant
- Je ne sais pas.
change.SetContractType ((rb1910) // Définir le contrat le plus proche du mois
Var tickerB = exchange.GetTicker() // données de cotation des contrats près du mois
- Je ne sais pas.
Var diff = détecteur A. Dernier - détecteur B. Dernier
$.Ligne graphique (diff, diff)
LogStatus(_D(), Désormais connecté à CTP!) // Heure d'ouverture du marché, connexion de connexion est normale.
{ \ pos (192,220) } autre
LogStatus(_D(), CTP non connecté!) // Pas connecté au front-end de négociation.
Je ne sais pas.
Je ne sais pas.
Je ne sais pas.
Get the market data, calculate the difference, and draw the graph to record. let it simply reflects the recent fluctuations in the price difference.
Use the function of "line drawing" library ```$.PlotLine```
![Quickly implement a semi-automatic quantitative trading tool](/upload/asset/6e286fea238b8266dd13.png)
# Interactive part
On the strategy editing page, you can add interactive controls directly to the strategy:
![Quickly implement a semi-automatic quantitative trading tool](/upload/asset/6e9b91112616d444b964.png)
Use the function ```GetCommand``` in the strategy code to capture the command that was sent to the robot after the above strategy control was triggered.
After the command is captured, different commands can be processed differently.
The trading part of the code can be packaged using the "Commodity Futures Trading Class Library" function. First, use ```var q = $.NewTaskQueue()``` to generate the transaction control object ```q``` (declared as a global variable).
Var cmd = Obtenez le commandement
si (cmd) {
si (cmd == plusHedge) {
Q.PushTask (échange, rb2001, sell, 1, fonction (tâche, ré) {)
Les résultats de l'enquête sont publiés dans les journaux de l'UE.
si (ret) {
Q.pushTask (exchange, rb1910, buy, 1, 123, fonction (tâche, ré) {)
Log ((q, task.desc, ret, task.arg)
Je ne sais pas.
Je ne sais pas.
Je ne sais pas.
} autrement si (cmd == moins Hedge) {
Q.pushTask (exchange, rb2001, buy, 1, fonction (tâche, ré) {)
Les résultats de l'enquête sont publiés dans les journaux de l'UE.
si (ret) {
Q.pushTask (exchange, rb1910, sell, 1, 123, fonction (task, ret) {)
Log ((q, task.desc, ret, task.arg)
Je ne sais pas.
Je ne sais pas.
Je ne sais pas.
} autrement si (cmd == coverPlus) {
Q.pushTask (exchange, rb2001, close-sell, 1, fonction (tâche, ré) {)
Les résultats de l'enquête sont publiés dans les journaux de l'UE.
si (ret) {
Q.pushTask (exchange, rb1910, closebuy, 1, 123, fonction (tâche, ré) {)
Log ((q, task.desc, ret, task.arg)
Je ne sais pas.
Je ne sais pas.
Je ne sais pas.
} sinon si (cmd == coverMinus) {
Q.PushTask (échange, rb2001, closebuy, 1, fonction (tâche, ré) {)
Les résultats de l'enquête sont publiés dans les journaux de l'UE.
si (ret) {
Q.pushTask (exchange, rb1910, close-sell, 1, 123, fonction)
Log ((q, task.desc, ret, task.arg)
Je ne sais pas.
Je ne sais pas.
Je ne sais pas.
Je ne sais pas.
Je ne sais pas.
Q.poll (()
`