Perdagangan mudah dilakukan secara manual dengan menggunakan plugin terminal urus niaga

Penulis:Rumput, Dicipta: 2020-02-29 21:04:52, Dikemas kini: 2023-10-12 21:21:40

[TOC]img

Keterangan

FMZ adalah platform dagangan kuantitatif, terutamanya untuk melayani peniaga berprogram. Tetapi juga menyediakan terminal dagangan asas, walaupun mempunyai fungsi yang mudah, kadang-kadang juga berguna, seperti pertukaran sibuk tidak dapat dibuka, sementara API masih berfungsi, di mana anda boleh mengeluarkan wang melalui terminal, membuat pesanan, melihat akaun dagangan, dan lain-lain. Untuk menyempurnakan pengalaman terminal dagangan, fungsi pemalam kini ditambahkan.

img

Prinsip pemalam

Plugin ini mempunyai dua mod operasi, berjalan secara segera dan berjalan di latar belakang. Berjalan di latar belakang adalah sama dengan membuat bot (bayar biasa). Prinsip operasi segera adalah sama dengan alat penyusunan yang dijalankan oleh hos yang menghantar satu petikan kod ke halaman terminal urus niaga, dan menyokong grafik dan jadual kembali (alat penyusunan yang kini juga disokong), yang sama hanya dapat dijalankan selama 5 minit, tanpa bayaran, tanpa batasan bahasa.

Apabila menulis dasar, anda perlu memilih jenis dasar sebagai pemalam.Hasil dari fungsi utama plugin akan muncul di terminal selepas selesai berjalan, menyokong strings, diagram, dan jadual. Oleh kerana pelaksanaan plugin tidak dapat dilihat di log, hasil pelaksanaan plugin dapat dikembalikan.

Penggunaan

  • 1.添加策略

Jika anda mencari secara langsung di kotak carian, anda boleh melihat gambar di bawah.Perhatikan hanya boleh menjalankan dasar jenis plugin transaksi, kemudian klik Tambah. Plugin terbuka boleh didapati di Strategy Square:https://www.fmz.com/square/21/1

img img

  • 2.运行插件

Memetik dasar akan memasuki antara muka tetapan parameter, jika tidak ada parameter akan berjalan terus, pemegang simpanan, pasangan transaksi, kitaran K yang dipilih oleh terminal urus niaga adalah parameter yang sesuai secara lalai. Memetik dasar pelaksanaan akan mula dilaksanakan, dengan memilih mode pemasangan segera ("ingat operasi lalai"). Plugin tidak akan menunjukkan log.

img

  • 3.停止插件

Mengklik lokasi menunjukkan untuk menghentikan pemalam, kerana semua pemalam dijalankan dalam satu proses alat debugging, semua pemalam akan berhenti.

img

Contoh kegunaan plugin

Plugin boleh melaksanakan kod untuk masa yang lama, boleh melaksanakan beberapa operasi mudah, banyak kali operasi manual yang memerlukan pelaksanaan berulang boleh dilaksanakan dengan plugin, mudah berdagang. Berikut akan diperkenalkan dengan contoh konkrit, kod sumber yang diberikan untuk rujukan untuk menyesuaikan strategi anda sendiri.

Perlindungan jangka panjang masa hadapan manual

Hedging jangka masa hadapan adalah strategi yang biasa, kerana frekuensi tidak tinggi, banyak orang akan mengendalikan secara manual, memerlukan satu kontrak untuk melakukan lebih banyak, satu kontrak untuk kosongkan, dan menganalisis pergerakan perbezaan harga. Menggunakan pemalam di terminal perdagangan akan menjimatkan tenaga anda.

Di sini, kami akan mulakan dengan perisian penyampaian harga yang berbeza:

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 perbezaan jangka masa terkini dan alamat salinan kod sumber pemalam:https://www.fmz.com/strategy/187755 img

Dengan analisis perbezaannya, perbezaannya telah disimpulkan, ini adalah peluang untuk melakukan kontrak suku kosong, melakukan banyak hari minggu, ini boleh digunakan dengan pemalam lindung nilai satu butang, klik, dan membantu anda secara automatik untuk melakukan banyak hari minggu suku kosong, lebih cepat daripada operasi manual. Prinsip pelaksanaan strategi adalah untuk meluncurkan harga untuk membuka jumlah kedudukan yang sama, anda boleh menjalankan beberapa kali, perlahan-lahan mencapai kedudukan yang anda perlukan, mengelakkan kejutan pasaran, anda boleh mengubah parameter lalai, untuk mencapai kelajuan 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 perbezaannya menyatu, perlu menyeimbangkan, boleh menjalankan pemalam penyeimbangan satu butang, penyeimbangan kelajuan terpantas.


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)
            }
        }
    }
}

Perdagangan langsung

Yang paling biasa ialah Ice Mountain Commitment, untuk memecah buku besar menjadi lembaran kecil, walaupun boleh dijalankan sebagai robot, tetapi 5 minit plugin sebenarnya cukup. Ice Mountain Commitment ada dua jenis, satu adalah makan buku, satu adalah pendirian buku, jika ada tawaran bayaran, anda boleh memilih pendirian buku, iaitu masa pelaksanaan yang lebih lama.

Di bawah ini adalah kod untuk membeli kod sumber plugin Iceberg:https://www.fmz.com/strategy/191771◎ Jual kod 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 alih satu membeli atau menjual satu juga merupakan cara untuk menghantar secara perlahan, dengan kesan yang lebih kecil terhadap pasaran. Strategi ini juga mempunyai beberapa penambahbaikan, dengan mengubah jumlah perdagangan minimum atau ketepatan secara manual. Beli: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 penghantaran yang lebih baik atau menunggu pesanan yang terhad, anda boleh menggantung beberapa pesanan mengikut selang waktu tertentu. Plugin ini juga boleh digunakan untuk pesanan 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 niaga hadapan komoditi

Perisian dagangan niaga hadapan yang biasa digunakan sering mempunyai banyak ciri pendahuluan yang canggih, seperti pendahuluan rugi, pendahuluan syarat dan sebagainya, yang boleh ditulis dengan mudah sebagai pemalam.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)
    }
}

Ringkasan

Dengan melihat banyak ciri kecil, anda mungkin mempunyai idea sendiri, mungkin menulis plugin untuk memudahkan transaksi manual anda sendiri.


Berkaitan

Lebih lanjut

SyahidApa yang menyebabkan laporan silap? 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"}

RumputPeriksa dokumen bursa atau hubungi perkhidmatan pelanggan bursa