Sumber daya yang dimuat... Pemuatan...

Gunakan plug-in terminal perdagangan untuk memfasilitasi perdagangan manual

Penulis:Kebaikan, Dibuat: 2020-07-30 11:39:54, Diperbarui: 2023-10-25 19:56:42

img

Pengantar

FMZ.COM, sebagai platform perdagangan kuantitatif, terutama untuk melayani pedagang programatik. Tapi juga menyediakan terminal perdagangan dasar. Meskipun fungsinya sederhana, kadang-kadang dapat berguna. Misalnya, jika bursa sibuk dan tidak dapat dioperasikan, tetapi API masih berfungsi. Pada saat ini, Anda dapat menarik pesanan, menempatkan pesanan, dan melihat mereka melalui terminal. Untuk meningkatkan pengalaman terminal perdagangan, plug-in sekarang ditambahkan. Kadang-kadang, kita membutuhkan fungsi kecil untuk membantu transaksi, seperti order menunggu tangga, order gunung es, hedging satu klik, posisi penutupan satu klik dan operasi lainnya. Tidak perlu melihat log eksekusi robot. Cukup klik plugin di terminal, Fungsi yang sesuai dapat direalisasikan segera, yang dapat sangat memfasilitasi transaksi manual. Lokasi plug-in adalah sebagai berikut:

img

Prinsip plug-in

Ada dua mode operasi plug-in, operasi langsung dan operasi latar belakang. Berjalan di latar belakang setara dengan membuat robot (tugas normal). Prinsip operasi segera sama dengan alat debugging: mengirim sepotong kode ke docker halaman terminal perdagangan untuk eksekusi, dan mendukung untuk mengembalikan grafik dan tabel (alat debugging saat ini juga ditingkatkan untuk mendukung), yang sama hanya dapat dijalankan selama 5 menit, tidak ada biaya, tidak ada batasan Bahasa. Plug-in dengan waktu eksekusi singkat dapat menggunakan mode eksekusi segera, sementara strategi yang rumit dan berjalan lama masih perlu menjalankan robot.

Ketika menulis strategi, Anda perlu memilih jenis strategi sebagai plug-in.mainfungsireturndari plug-in akan muncul di terminal setelah operasi selesai, mendukung string, gambar dan tabel Karena pelaksanaan plug-in tidak dapat melihat log, Anda dapatreturnHasil pelaksanaan plug-in.

Cara menggunakan

  • Tambahkan strategi

Cari langsung di kotak pencarian seperti yang ditunjukkan pada gambar. Perhatikan bahwa hanya strategi jenis trading plugin yang dapat dijalankan, dan kemudian klik Tambahkan. Plugin publik dapat ditemukan di Strategy Square:https://www.fmz.com/square/21/1

img img

  • Jalankan plugin

Klik pada strategi untuk memasukkan antarmuka pengaturan parameter. Jika tidak ada parameter, itu akan berjalan langsung. Docker, pasangan perdagangan, dan periode K-line yang dipilih oleh terminal perdagangan adalah parameter yang sesuai secara default. Klik pada strategi eksekusi untuk memulai eksekusi, dan pilih mode Execute Now (Anda dapat mengingat mode operasi default). Plugin tidak akan menampilkan log.

img

  • Hentikan plugin

Klik posisi ikon untuk menghentikan plug-in. Karena semua plug-in dijalankan dalam proses alat debugging, semua plug-in akan dihentikan.

img

Contoh penggunaan plug-in

Plug-in dapat mengeksekusi kode untuk jangka waktu tertentu dan melakukan beberapa operasi sederhana. Dalam banyak kasus, operasi manual yang membutuhkan operasi berulang dapat diimplementasikan dengan plug-in untuk memfasilitasi transaksi. Berikut ini akan memperkenalkan contoh spesifik, dan kode sumber yang diberikan dapat digunakan sebagai referensi untuk menyesuaikan strategi Anda sendiri.

Membantu perdagangan lindung nilai intertemporal berjangka manual

Perdagangan hedging intertemporal futures adalah strategi yang sangat umum. Karena frekuensi tidak sangat tinggi, banyak orang akan mengoperasikannya secara manual. Adalah perlu untuk membuat satu kontrak panjang dan satu kontrak pendek, jadi lebih baik untuk menganalisis tren spread. Menggunakan plug-in di terminal perdagangan akan menghemat energi Anda.

Pendahuluan pertama adalah untuk menggambar selisih harga antara periode:

var chart = { 
   __isStock: true,    
   title : { text : 'Spread analysis chart'},                     
   xAxis: { type: 'datetime'},                 
   yAxis : {                                        
       title: {text: 'Spread'},                   
       opposite: false,                             
   },
   series : [                    
       {name : "diff", data : []}, 

   ]
}
function main() {
   exchange.SetContractType('quarter')
   var recordsA = exchange.GetRecords(PERIOD_M5) //Cycle can be customized
   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 sekali, perbedaan harga antar periode baru-baru ini jelas sekilas, alamat salinan kode sumber plug-in:https://www.fmz.com/strategy/187755

img

Dengan analisis spread, ditemukan bahwa spread sedang konvergen. Ini adalah kesempatan untuk short kontrak kuartal dan pergi panjang untuk minggu saat ini. Ini adalah kesempatan untuk menggunakan plug-in lindung nilai satu klik, satu klik akan secara otomatis membantu Anda short kuartal dan panjang mingguan, yang lebih cepat daripada operasi manual. Prinsip implementasi strategi adalah membuka jumlah posisi yang sama dengan harga geser. Anda dapat menjalankan beberapa kali lagi untuk perlahan mencapai posisi yang Anda inginkan untuk menghindari dampak pasar. Anda dapat mengubah parameter default untuk menempatkan pesanan 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 untuk perbedaan harga untuk konvergen dan Anda perlu untuk menutup posisi, Anda dapat menjalankan satu klik penutupan plugin untuk menutup posisi secepat mungkin.

function main(){
    while(ture){
        var pos = exchange.GetPosition()
        var ticker = exchange.GetTicekr()
        if(!ticker){return 'Unable to get ticker'}
        if(!pos || pos.length == 0 ){return 'No holding position'}
        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)
            }
        }
    }
}

Plug-in untuk membantu perdagangan spot

Yang paling umum adalah komisi gunung es, yang membagi pesanan besar menjadi pesanan kecil. Meskipun dapat dijalankan sebagai robot, plug-in 5 menit sebenarnya cukup. Ada dua jenis pesanan gunung es, satu menerima pesanan dan yang lainnya menunggu pesanan. Jika ada biaya preferensial, Anda dapat memilih pesanan menunggu, yang berarti waktu eksekusi lebih lama.

Kode berikut adalah kode sumber dari plug-in yang ditugaskan oleh iceberg:https://www.fmz.com/strategy/191771Untuk dijual: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
        }
        
    }
}

Ini juga merupakan cara untuk perlahan-lahan mengirim produk untuk menempati pembelian 1 atau menjual 1 lapisan harga sepanjang waktu, dan dampak pada pasar relatif kecil.

Beli:https://www.fmz.com/strategy/191582

Menjual: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 'Unable to get account information'}
    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 menunggu perintah yang belum terkirim, beberapa pesanan dapat ditempatkan pada interval tertentu.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'
}

Plug-in untuk membantu perdagangan berjangka komoditas

Perangkat lunak perdagangan berjangka yang umum digunakan sering memiliki banyak fungsi pesanan tertunda lanjutan, seperti pesanan stop-loss yang tertunda, pesanan kondisi yang tertunda, dll, yang dapat dengan mudah ditulis sebagai plug-in.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 is not connected!")
            Sleep(10000)
        }
        if(trade_amount >= Amount){
            Log('mission completed')
            return
        }
        Sleep(1000)
    }
}

Untuk meringkas

Setelah membaca begitu banyak fungsi kecil, Anda juga harus memiliki ide Anda sendiri. Anda mungkin ingin menulis plugin untuk memfasilitasi perdagangan manual Anda.


Berkaitan

Lebih banyak