Implementar rápidamente una herramienta de negociación cuantitativa semiautomática
En el comercio de futuros de materias primas, el arbitraje intertemporal es un método comercial común. Este tipo de arbitraje no está libre de riesgos. Cuando la dirección unilateral del spread continúa expandiéndose, la posición de arbitraje estará en un estado de pérdida flotante. Sin embargo, siempre que la posición de arbitraje esté correctamente controlada, sigue siendo muy operativa y factible.
En este artículo, tratamos de cambiar a otra estrategia de negociación, en lugar de construir una estrategia de negociación totalmente automatizada, nos dimos cuenta de una herramienta de negociación cuantitativa interactiva semiautomática para facilitar el arbitraje intertemporal en el comercio de futuros de productos básicos.
El enfoque de este artículo es cómo construir estrategias semiautomáticas con funciones interactivas.
El arbitraje intertemporal es un concepto muy simple.
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.
El marco estratégico es el siguiente:
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 el protocolo CTP está conectado correctamente, entonces necesitamos configurar el contrato de negociación y luego obtener la cotización del mercado.
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.
}
}
}
Obtener los datos del mercado, calcular la diferencia, y dibujar el gráfico para registrar. que simplemente refleja las fluctuaciones recientes en la diferencia de precios.
Utilice la función de $.PlotLine
En la página de edición de la estrategia, puede agregar controles interactivos directamente a la estrategia:
Utilice la funciónGetCommand
en el código de estrategia para capturar el comando que se envió al robot después de que se activó el control de estrategia anterior.
Después de que el comando es capturado, diferentes comandos pueden ser procesados de manera diferente.
La parte de negociación del código se puede empaquetar utilizando la función var q = $.NewTaskQueue()
para generar el objeto de control de transacciónq
(declarado como una variable global).
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()