Cepat menerapkan alat perdagangan kuantitatif semi otomatis

Penulis:Kebaikan, Dibuat: 2020-08-30 10:11:02, Diperbarui: 2023-10-08 19:54:06

img

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.

Konsep arbitrase intertemporal

  • Kutipan dari Wikipedia

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.

Desain Strategi

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 line drawing built-in platform FMZ Quant untuk menggambar perbedaannya.

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 line drawing library$.PlotLine

img

Bagian interaktif

Pada halaman pengeditan strategi, Anda dapat menambahkan kontrol interaktif langsung ke strategi:

img

Gunakan fungsiGetCommanddalam 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 Commodity Futures Trading Class Library fungsi.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()

Berkaitan

Lebih banyak