Schnelle Einführung eines halbautomatischen quantitativen Handelstools
Im Rohstoff-Futures-Handel sind Intertemporary Arbitrage eine gängige Handelsmethode. Diese Art von Arbitrage ist nicht risikofrei. Wenn die einseitige Richtung des Spreads weiter expandiert, befindet sich die Arbitrageposition in einem schwimmenden Verlustzustand. Solange die Arbitrageposition jedoch richtig kontrolliert ist, ist sie immer noch sehr funktionsfähig und machbar.
In diesem Artikel versuchen wir, zu einer anderen Handelsstrategie zu wechseln, anstatt eine vollautomatisierte Handelsstrategie zu konstruieren, haben wir ein interaktives halbautomatisches quantitatives Handelswerkzeug realisiert, um die intertemporäre Arbitrage im Rohstoff-Futures-Handel zu erleichtern.
Die Entwicklungsplattform, die wir verwenden werden, ist die FMZ Quant Plattform.
Intertemporales Arbitrage ist ein sehr einfaches Konzept.
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.
Der Rahmen der Strategie ist wie folgt:
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.
}
}
}
Wenn das CTP-Protokoll ordnungsgemäß angeschlossen ist, müssen wir den Handelsvertrag einrichten und dann das Marktangebot erhalten.
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.
}
}
}
Holen Sie sich die Marktdaten, berechnen Sie die Differenz und zeichnen Sie die Grafik auf. lassen Sie es einfach die jüngsten Schwankungen der Preisdifferenz widerspiegeln.
Verwenden Sie die Funktion $.PlotLine
Auf der Strategiebearbeitungsseite können Sie interaktiven Steuerelementen direkt zur Strategie hinzufügen:
Die Funktion verwendenGetCommand
in den Strategie-Code, um den Befehl zu erfassen, der an den Roboter gesendet wurde, nachdem die obige Strategie-Steuerung ausgelöst wurde.
Nachdem der Befehl erfasst wurde, können verschiedene Befehle unterschiedlich verarbeitet werden.
Der Handelsteil des Codes kann mit der Funktion var q = $.NewTaskQueue()
Um das Transaktionskontrollobjekt zu generierenq
(als Gesamtvariable angegeben).
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()