Pelaksanaan cepat alat perdagangan kuantitatif separa automatik

Penulis:Kebaikan, Dicipta: 2020-08-30 10:11:02, Dikemas kini: 2023-10-08 19:54:06

img

Pelaksanaan cepat alat perdagangan kuantitatif separa automatik

Dalam perdagangan niaga hadapan komoditi, arbitraj intertemporari adalah kaedah perdagangan yang biasa. Jenis arbitraj ini tidak bebas risiko. Apabila arah satu sisi penyebaran terus berkembang, kedudukan arbitraj akan berada dalam keadaan kehilangan terapung. Walau bagaimanapun, selagi kedudukan arbitraj dikawal dengan betul, ia masih sangat operasional dan layak.

Dalam artikel ini, kita cuba beralih ke strategi perdagangan lain, dan bukannya membina strategi perdagangan automatik sepenuhnya, kita menyedari alat perdagangan kuantitatif interaktif separa automatik untuk memudahkan arbitrage intertemporari dalam perdagangan niaga hadapan komoditi.

Platform pembangunan kami akan menggunakan platform FMZ Quant. Tumpuan artikel ini adalah bagaimana untuk membina strategi separa automatik dengan fungsi interaktif.

Arbitraj intertemporal adalah konsep yang sangat mudah.

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.

Reka Bentuk Strategi

Rangka strategi adalah seperti 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 disambungkan dengan betul, maka kita perlu menyediakan kontrak perdagangan dan kemudian mendapatkan sebut harga pasaran.

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 pasaran, mengira perbezaan, dan lukis grafik untuk merekod. biar ia hanya mencerminkan turun naik baru-baru ini dalam perbezaan harga. Gunakan fungsi perpustakaan line drawing$.PlotLine

img

Bahagian interaktif

Pada halaman penyuntingan strategi, anda boleh menambah kawalan interaktif terus ke strategi:

img

Gunakan fungsiGetCommanddalam kod strategi untuk menangkap arahan yang dihantar kepada robot selepas kawalan strategi di atas telah dicetuskan.

Selepas perintah ditangkap, perintah yang berbeza boleh diproses dengan cara yang berbeza.

Bahagian perdagangan kod boleh dibungkus menggunakan Commodity Futures Trading Class Library fungsi.var q = $.NewTaskQueue()untuk menjana objek kawalan urus niagaq(dinyatakan sebagai pembolehubah 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 lanjut