Perdagangan manual dengan plugin terminal transaksi

Penulis:Rumput, Dibuat: 2020-02-29 21:04:52, Diperbarui: 2023-10-12 21:21:40

[TOC]img

Daftar

FMZ adalah platform perdagangan kuantitatif, terutama untuk melayani pedagang terprogram. Namun, FMZ juga menyediakan terminal perdagangan dasar, yang meskipun memiliki fungsi yang sederhana, kadang-kadang juga dapat berguna, seperti pertukaran yang sibuk tidak dapat dibuka, sementara API masih dapat bekerja, saat ini dapat ditarik melalui terminal, memesan, melihat rekening transaksi, dll. Untuk menyempurnakan pengalaman terminal perdagangan, sekarang telah ditambahkan fungsi plugin. Kadang-kadang kita membutuhkan fungsi kecil untuk membantu perdagangan, seperti mengayunkan tangga, menugaskan gunung es tunggal, pengendalian satu tombol, penghapusan satu tombol, dan lain-lain.

img

Prinsip Plugin

Plugin ini berjalan dalam dua mode, langsung berjalan dan berjalan di latar belakang. Operasi di latar belakang sama dengan membuat robot (biaya normal). Prinsip operasi langsung dan alat debugging sama: mengirim kode ke halaman terminal transaksi yang dijalankan oleh administrator, dan mendukung grafik dan tabel yang dikembalikan (alat debugging sekarang juga didukung), yang sama hanya dapat dijalankan selama 5 menit, tanpa biaya, tanpa batasan bahasa.

Dalam menulis kebijakan, Anda perlu memilih jenis kebijakan sebagai plugin.Hasil dari fungsi main return dari plugin akan muncul di terminal setelah selesai berjalan, mendukung string, diagram, dan tabel. Karena plugin tidak dapat melihat log pelaksanaan, hasil pelaksanaan plugin dapat dikembalikan.

Cara Menggunakannya

  • 1.添加策略

Jika Anda langsung menelusuri kotak pencarian, Anda akan menemukan banyak situs web yang berbeda.Perhatikan bahwa hanya kebijakan jenis plugin transaksi yang dapat dijalankanSetelah itu, klik Add. Public Plugin yang dapat ditemukan di Strategy Square:https://www.fmz.com/square/21/1

img img

  • 2.运行插件

Jika tidak ada parameter, kebijakan klik akan langsung berjalan, dan administrator, pasangan transaksi, dan siklus K yang dipilih oleh terminal transaksi adalah parameter yang sesuai secara default.

img

  • 3.停止插件

Mengklik lokasi gambar akan menghentikan plugin, karena semua plugin dijalankan dalam proses alat debugging.

img

Contoh penggunaan plugin

Plugin dapat mengeksekusi kode untuk waktu yang lama, dapat melakukan beberapa operasi sederhana, seringkali operasi manual yang perlu diulang dapat dieksekusi dengan plugin, mudah diperdagangkan. Di bawah ini akan disajikan contoh-contoh tertentu, sumber yang diberikan dapat digunakan sebagai referensi untuk menyesuaikan strategi Anda sendiri.

Bantuan berjangka manual

Futures cross-period hedging adalah strategi yang sangat umum, karena frekuensi tidak terlalu tinggi, banyak orang akan mengoperasikan secara manual, membutuhkan satu kontrak untuk melakukan lebih banyak, satu kontrak untuk kosong, dan juga menganalisis pergerakan perbedaan harga. Menggunakan plugin di terminal perdagangan akan menghemat energi Anda.

Di sini, Anda akan menemukan beberapa fitur menarik yang dapat Anda gunakan.

var chart = { 
   __isStock: true,    
   title : { text : '差价分析图'},                     
   xAxis: { type: 'datetime'},                 
   yAxis : {                                        
       title: {text: '差价'},                   
       opposite: false,                             
   },
   series : [                    
       {name : "diff", data : []}, 

   ]
}
function main() {
   exchange.SetContractType('quarter')
   var recordsA = exchange.GetRecords(PERIOD_M5) //周期可以自行定制
   exchange.SetContractType('this_week')
   var recordsB = exchange.GetRecords(PERIOD_M5)
   
   for(var i=0;i<Math.min(recordsA.length,recordsB.length);i++){
       var diff = recordsA[recordsA.length-Math.min(recordsA.length,recordsB.length)+i].Close - recordsB[recordsB.length-Math.min(recordsA.length,recordsB.length)+i].Close
       chart.series[0].data.push([recordsA[recordsA.length-Math.min(recordsA.length,recordsB.length)+i].Time, diff])
   }
   return chart
}

Klik untuk melihat perbedaan jangka pendek baru-baru ini dan alamat salinan kode sumber plugin:https://www.fmz.com/strategy/187755 img

Dengan analisis perbedaan, menemukan bahwa perbedaan sedang menyatu, adalah kesempatan untuk melakukan kontrak kuartal kosong, melakukan beberapa hari minggu, ini dapat digunakan dengan plugin hedging satu tombol, klik, otomatis membantu Anda kuartal kosong beberapa hari minggu, lebih cepat dari operasi manual. Prinsip implementasi strategi adalah geser harga untuk membuka jumlah posisi yang sama, dapat dijalankan beberapa kali, perlahan mencapai posisi yang Anda butuhkan, menghindari dampak pasar, Anda dapat mengubah parameter default, mencapai kecepatan yang lebih cepat.https://www.fmz.com/strategy/191348

function main(){
    exchange.SetContractType(Reverse ? Contract_B : Contract_A)
    var ticker_A = exchange.GetTicker()
    if(!ticker_A){return 'Unable to get quotes'}
    exchange.SetDirection('buy')
    var id_A = exchange.Buy(ticker_A.Sell+Slip, Amount)
    exchange.SetContractType(Reverse ? Contract_B : Contract_A)
    var ticker_B = exchange.GetTicker()
    if(!ticker_B){return 'Unable to get quotes'}
    exchange.SetDirection('sell')
    var id_B = exchange.Sell(ticker_B.Buy-Slip, Amount)
    if(id_A){
        exchange.SetContractType(Reverse ? Contract_B : Contract_A)
        exchange.CancelOrder(id_A)
    }
    if(id_B){
        exchange.SetContractType(Reverse ? Contract_B : Contract_A)
        exchange.CancelOrder(id_B)
    }
    return 'Position: ' + JSON.stringify(exchange.GetPosition())
}

Menunggu perbedaan untuk menyatu, perlu penyebaran, dapat menjalankan plugin penyebaran satu tombol, penyebaran kecepatan tercepat.


function main(){
    while(ture){
        var pos = exchange.GetPosition()
        var ticker = exchange.GetTicekr()
        if(!ticker){return '无法获取ticker'}
        if(!pos || pos.length == 0 ){return '已无持仓'}
        for(var i=0;i<pos.length;i++){
            if(pos[i].Type == PD_LONG){
                exchange.SetContractType(pos[i].ContractType)
                exchange.SetDirection('closebuy')
                exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount)
            }
            if(pos[i].Type == PD_SHORT){
                exchange.SetContractType(pos[i].ContractType)
                exchange.SetDirection('closesell')
                exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount)
            }
        }
        var orders = exchange.Getorders()
        Sleep(500)
        for(var j=0;j<orders.length;j++){
            if(orders[i].Status == ORDER_STATE_PENDING){
                exchange.CancelOrder(orders[i].Id)
            }
        }
    }
}

Bantuan transaksi langsung

Hal yang paling umum adalah Ice Mountain, untuk memecah buku besar menjadi buku kecil, meskipun dapat dijalankan sebagai robot, tetapi 5 menit plugin sebenarnya juga cukup. Ice Mountain memiliki dua jenis, satu adalah makan buku, satu adalah daftar gantung, jika ada penawaran biaya, Anda dapat memilih daftar gantung, atau waktu pelaksanaan lebih lama.

Kode di bawah ini adalah kode untuk membeli plugin Iceberg:https://www.fmz.com/strategy/191771◦ Menjual kode sumber:https://www.fmz.com/strategy/191772

function main(){
    var initAccount = _C(exchange.GetAccount)
    while(true){
        var account = _C(exchange.GetAccount)
        var dealAmount = account.Stocks - initAccount.Stocks
        var ticker = _C(exchange.GetTicker)
        if(BUYAMOUNT - dealAmount >= BUYSIZE){
            var id = exchange.Buy(ticker.Sell, BUYSIZE)
            Sleep(INTERVAL*1000)
            if(id){
                exchange.CancelOrder(id) // May cause error log when the order is completed, which is all right.
            }else{
                throw 'buy error'
            }
        }else{
            account = _C(exchange.GetAccount)
            var avgCost = (initAccount.Balance - account.Balance)/(account.Stocks - initAccount.Stocks)
            return 'Iceberg order to buy is done, avg cost is '+avgCost
        }
        
    }
}

Mengambil posisi membeli atau menjual adalah cara pengiriman yang lambat, dengan dampak yang lebih kecil pada pasar. Strategi ini juga memiliki beberapa perbaikan, yang dapat diubah secara manual dengan volume transaksi minimum atau presisi. Saya tidak tahu apa yang terjadi.https://www.fmz.com/strategy/191582Dijual:https://www.fmz.com/strategy/191730

function GetPrecision(){
    var precision = {price:0, amount:0}
    var depth = exchange.GetDepth()
    for(var i=0;i<exchange.GetDepth().Asks.length;i++){
        var amountPrecision = exchange.GetDepth().Asks[i].Amount.toString().indexOf('.') > -1 ? exchange.GetDepth().Asks[i].Amount.toString().split('.')[1].length : 0
        precision.amount = Math.max(precision.amount,amountPrecision)
        var pricePrecision = exchange.GetDepth().Asks[i].Price.toString().indexOf('.') > -1 ? exchange.GetDepth().Asks[i].Price.toString().split('.')[1].length : 0
        precision.price = Math.max(precision.price,pricePrecision)
    }
    return precision
}

function main(){
    var initAccount = exchange.GetAccount()
    if(!initAccount){return '无法获取账户信息'}
    var precision = GetPrecision()
    var buyPrice = 0
    var lastId = 0
    var done = false
    while(true){
        var account = _C(exchange.GetAccount)
        var dealAmount = account.Stocks - initAccount.Stocks
        var ticker = _C(exchange.GetTicker)
        if(BuyAmount - dealAmount > 1/Math.pow(10,precision.amount) && ticker.Buy > buyPrice){
            if(lastId){exchange.CancelOrder(lastId)}
            var id = exchange.Buy(ticker.Buy, _N(BuyAmount - dealAmount,precision.amount))
            if(id){
                lastId = id
            }else{
                done = true
            }
        }
        if(BuyAmount - dealAmount <= 1/Math.pow(10,precision.amount)){done = true}
        if(done){
            var avgCost = (initAccount.Balance - account.Balance)/dealAmount
            return 'order is done, avg cost is ' + avgCost  // including fee cost
        }
        Sleep(Intervel*1000)
    }
}

Kadang-kadang, untuk menjual harga pengiriman yang lebih baik atau untuk menunggu order yang bocor, Anda dapat menggantung beberapa order pada interval tertentu. Plugin ini juga dapat digunakan untuk order berjangka.https://www.fmz.com/strategy/190017


function main() {
    var ticker = exchange.GetTicker()
    if(!ticker){
        return  'Unable to get price'
    }
    for(var i=0;i<N;i++){
        if(Type == 0){
            if(exchange.GetName().startsWith('Futures')){
                exchange.SetDirection('buy')
            }
            exchange.Buy(Start_Price-i*Spread,Amount+i*Amount_Step)
        }else if(Type == 1){
            if(exchange.GetName().startsWith('Futures')){
                exchange.SetDirection('sell')
            }
            exchange.Sell(Start_Price+i*Spread,Amount+i*Amount_Step)
        }else if(Type == 2){
            exchange.SetDirection('closesell')
            exchange.Buy(Start_Price-i*Spread,Amount+i*Amount_Step)
        }
        else if(Type == 3){
            exchange.SetDirection('closebuy')
            exchange.Sell(Start_Price+i*Spread,Amount+i*Amount_Step)
        }
        Sleep(500)
    }
    return 'order complete'
}

Perdagangan Komoditas Futures

Perangkat lunak perdagangan berjangka yang umum digunakan seringkali memiliki banyak fitur yang lebih canggih, seperti daftar stop loss, daftar syarat dan lain-lain, yang dapat ditulis dengan mudah sebagai plugin.https://www.fmz.com/strategy/187736

var buy = false
var trade_amount = 0
function main(){
    while(true){
        if(exchange.IO("status")){
            exchange.SetContractType(Contract)
            if(!buy){
                buy = true
                if(Direction == 0){
                    exchange.SetDirection('buy')
                    exchange.Buy(Open_Price, Amount)
                }else{
                    exchange.SetDirection('sell')
                    exchange.Sell(Open_Price, Amount)
                }
            }
            var pos = exchange.GetPosition()
            if(pos && pos.length > 0){
                for(var i=0;i<pos.length;i++){
                    if(pos[i].ContractType == Contract && pos[i].Type == Direction && pos[i].Amount-pos[i].FrozenAmount>0){
                        var cover_amount = math.min(Amount-trade_amount, pos[i].Amount-pos[i].FrozenAmount)
                        if(cover_amount >= 1){
                            trade_amount += cover_amount
                            if(Direction == 0){
                                exchange.SetDirection('closebuy_today')
                                exchange.Sell(Close_Price, cover_amount)
                            }else{
                                exchange.SetDirection('closesell_today')
                                exchange.Buy(Close_Price, cover_amount)
                            }
                        }
                    }
                }
            }
        } else {
            LogStatus(_D(), "未连接CTP !")
            Sleep(10000)
        }
        if(trade_amount >= Amount){
            Log('任务完成')
            return
        }
        Sleep(1000)
    }
}

Pengamatan

Setelah melihat begitu banyak fitur kecil, Anda harus memiliki ide sendiri, mungkin menulis plugin untuk memudahkan transaksi manual Anda sendiri.


Berkaitan

Lebih banyak

Syi'imApa penyebabnya? Error: Futures_OP 0: 400: {"error_message":"Open orders exist","code":35017,"error_code":"35017","message":"Open orders exist"} Buy ((5000, 0.1): 400: {"error_message":"order_size error","result":"true","error_code":"35063","order_id":"-1"}

RumputMemeriksa dokumen atau layanan pelanggan