Cepat menerapkan alat perdagangan kuantitatif semi otomatis
Dalam perdagangan berjangka komoditas, arbitrage intertemporary adalah metode perdagangan yang umum. Jenis arbitrage ini tidak bebas risiko. Ketika arah satu sisi spread terus berkembang, posisi arbitrage akan berada dalam keadaan kehilangan terapung. Namun, selama posisi arbitrage dikendalikan dengan benar, itu masih sangat operasional dan layak.
Dalam artikel ini, kami mencoba beralih ke strategi perdagangan lain, alih-alih membangun strategi perdagangan otomatis sepenuhnya, kami menyadari alat perdagangan kuantitatif semi-otomatis interaktif untuk memudahkan arbitrase intertemporary dalam perdagangan berjangka komoditas.
Platform pengembangan kami akan menggunakan platform FMZ Quant. Fokus artikel ini adalah bagaimana membangun strategi semi otomatis dengan fungsi interaktif.
Arbitrage intertemporal adalah konsep yang sangat sederhana.
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.
Kerangka strategi adalah sebagai berikut:
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.
}
}
}
Jika protokol CTP terhubung dengan benar, maka kita perlu mengatur kontrak perdagangan dan kemudian mendapatkan penawaran pasar. Setelah mendapatkan penawaran, kita dapat menggunakan perpustakaan
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.
}
}
}
Dapatkan data pasar, menghitung perbedaan, dan menggambar grafik untuk merekam. biarkan itu hanya mencerminkan fluktuasi baru-baru ini dalam perbedaan harga.
Gunakan fungsi $.PlotLine
Pada halaman pengeditan strategi, Anda dapat menambahkan kontrol interaktif langsung ke strategi:
Gunakan fungsiGetCommand
dalam kode strategi untuk menangkap perintah yang dikirim ke robot setelah kontrol strategi di atas dipicu.
Setelah perintah ditangkap, perintah yang berbeda dapat diproses secara berbeda.
Bagian perdagangan kode dapat dikemas menggunakan var q = $.NewTaskQueue()
untuk menghasilkan objek kontrol transaksiq
(diisyaratkan sebagai variabel 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()