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:
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.main
fungsireturn
dari plug-in akan muncul di terminal setelah operasi selesai, mendukung string, gambar dan tabel Karena pelaksanaan plug-in tidak dapat melihat log, Anda dapatreturn
Hasil pelaksanaan plug-in.
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
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
Klik posisi ikon untuk menghentikan plug-in. Karena semua plug-in dijalankan dalam proses alat debugging, semua plug-in akan dihentikan.
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.
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
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)
}
}
}
}
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
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
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'
}
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)
}
}
Setelah membaca begitu banyak fungsi kecil, Anda juga harus memiliki ide Anda sendiri. Anda mungkin ingin menulis plugin untuk memfasilitasi perdagangan manual Anda.