Mettre rapidement en œuvre un outil de négociation quantitative semi-automatique

Auteur:La bonté, Créé: 2020-08-30 10:11:02, Mis à jour: 2023-10-08 19:54:06

img

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

  • Citation de Wikipédia

In economics and finance, arbitrage is the practice of taking advantage of a price difference between two or more markets: striking a combination of matching deals that capitalize upon the imbalance, the profit being the difference between the market prices at which the unit is traded. When used by academics, an arbitrage is a transaction that involves no negative cash flow at any probabilistic or temporal state and a positive cash flow in at least one state; in simple terms, it is the possibility of a risk-free profit after transaction costs. For example, an arbitrage opportunity is present when there is the opportunity to instantaneously buy something for a low price and sell it for a higher price.

Conception de la stratégie

Le cadre stratégique est le suivant:

Function main(){
     While(true){
         If(exchange.IO("status")){ // Determine the connection status of the CTP protocol.
             LogStatus(_D(), "Already connected to CTP !") // Market Opening time, login connection is normal.
         } else {
             LogStatus(_D(), "CTP not connected!") // Not logged in to the trading front end.
         }
     }
}

Si le protocole CTP est correctement connecté, nous devons configurer le contrat de négociation et ensuite obtenir le devis du marché.

Function main(){
     While(true){
         If(exchange.IO("status")){ // Determine the connection status of the CTP protocol.
             exchange.SetContractType("rb2001") // Set the far month contract
             Var tickerA = exchange.GetTicker() // far-month contract quote data
            
             exchange.SetContractType("rb1910") // Set the near month contract
             Var tickerB = exchange.GetTicker() // near-month contract quote data
            
             Var diff = tickerA.Last - tickerB.Last
             $.PlotLine("diff", diff)

             LogStatus(_D(), "Already connected to CTP !") // Market Opening time, login connection is normal.
         } else {
             LogStatus(_D(), "CTP not connected!") // Not logged in to the trading front end.
         }
     }
}

Obtenez les données du marché, calculez la différence, et dessinez le graphique pour enregistrer. laissez-le simplement refléter les fluctuations récentes de la différence de prix. Utilisez la fonction de la bibliothèque de dessin de ligne$.PlotLine

img

Partie interactive

Sur la page d'édition de stratégie, vous pouvez ajouter des contrôles interactifs directement à la stratégie:

img

Utilisez la fonctionGetCommanddans le code de stratégie pour capturer la commande qui a été envoyée au robot après que la commande de stratégie ci-dessus ait été déclenchée.

Une fois la commande capturée, différentes commandes peuvent être traitées différemment.

La partie du code de négociation peut être regroupée à l'aide de la fonction Commodity Futures Trading Class Library.var q = $.NewTaskQueue()pour générer l'objet de contrôle de transactionq(déclarée comme variable globale).

var cmd = GetCommand()
if (cmd) {
    if (cmd == "plusHedge") {
        q.pushTask(exchange, "rb2001", "sell", 1, function(task, ret) {
            Log(task.desc, ret)
            if (ret) {
                q.pushTask(exchange, "rb1910", "buy", 1, 123, function(task, ret) {
                    Log("q", task.desc, ret, task.arg)
                })
            }
        })
    } else if (cmd == "minusHedge") {
        q.pushTask(exchange, "rb2001", "buy", 1, function(task, ret) {
            Log(task.desc, ret)
            if (ret) {
                q.pushTask(exchange, "rb1910", "sell", 1, 123, function(task, ret) {
                    Log("q", task.desc, ret, task.arg)
                })
            }
        })
    } else if (cmd == "coverPlus") {
        q.pushTask(exchange, "rb2001", "closesell", 1, function(task, ret) {
            Log(task.desc, ret)
            if (ret) {
                q.pushTask(exchange, "rb1910", "closebuy", 1, 123, function(task, ret) {
                    Log("q", task.desc, ret, task.arg)
                })
            }
        })
    } else if (cmd == "coverMinus") {
        q.pushTask(exchange, "rb2001", "closebuy", 1, function(task, ret) {
            Log(task.desc, ret)
            if (ret) {
                q.pushTask(exchange, "rb1910", "closesell", 1, 123, function(task, ret) {
                    Log("q", task.desc, ret, task.arg)
                })
            }
        })
    }
}
q.poll()

Relationnée

Plus de