[TOC]

Sebagai platform perdagangan kuantitatif, FMZ terutama dirancang untuk melayani pedagang terprogram. Namun, ia juga menyediakan terminal perdagangan dasar. Meskipun fungsinya sederhana, terkadang ia bisa sangat berguna. Misalnya, jika bursa sedang sibuk dan tidak dapat dibuka, tetapi API masih dapat berfungsi, Anda dapat menggunakan terminal untuk membatalkan pesanan. , melakukan pemesanan, dan melihat akun Kutipan, dll. Untuk meningkatkan pengalaman terminal perdagangan, fungsionalitas plug-in telah ditambahkan. Terkadang, kita memerlukan fungsi kecil untuk membantu dalam trading, seperti pending order ladder, iceberg order, one-click hedging, one-click closing, dll. Kita tidak perlu melihat execution log. Agak merepotkan untuk membuat robot baru. Cukup klik plug-in di terminal. , Anda dapat segera menjalankan fungsi terkait, yang dapat sangat memudahkan perdagangan manual. Lokasi plugin adalah sebagai berikut:

Ada dua mode untuk operasi plug-in: operasi langsung dan operasi latar belakang. Berjalan di latar belakang setara dengan membuat robot (dikenakan biaya normal). Prinsip operasi langsung sama dengan alat debugging: kirim sepotong kode ke kustodian halaman terminal perdagangan untuk dieksekusi, dan dukung pengembalian grafik dan tabel (alat debugging saat ini juga ditingkatkan untuk mendukung ini ). Demikian pula, itu hanya dapat dijalankan selama 5 menit, gratis, dan bahasa tidak terbatas. Plugin dengan waktu eksekusi yang sangat singkat dapat menggunakan mode lari langsung, sementara strategi rumit yang memerlukan waktu lama untuk dijalankan tetap memerlukan robot yang berjalan.
Saat menulis kebijakan, Anda perlu memilih jenis kebijakan sebagai plug-in. Hasil pengembalian fungsi utama plugin akan muncul di terminal setelah dijalankan, mendukung string, gambar, dan tabel. Karena log tidak dapat dilihat selama eksekusi plugin, hasil eksekusi plugin dapat dikembalikan.
Cari langsung di kotak pencarian seperti yang ditunjukkan.Perlu diketahui bahwa hanya strategi jenis plugin perdagangan yang dapat dijalankan, lalu klik Tambahkan. Plugin publik dapat ditemukan di Strategy Square: https://www.fmz.com/square/21/1

Klik strategi untuk masuk ke antarmuka pengaturan parameter. Jika tidak ada parameter, maka akan langsung berjalan. Kustodian, pasangan perdagangan, dan periode K-line yang dipilih oleh terminal perdagangan adalah parameter bawaan yang sesuai. Klik pada kebijakan eksekusi untuk memulai eksekusi, dan pilih mode “Eksekusi Sekarang” (Anda dapat mengingat mode berjalan default). Plugin tidak akan menampilkan log.

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

Plugin dapat mengeksekusi kode untuk jangka waktu tertentu dan dapat melakukan beberapa operasi sederhana. Sering kali, operasi yang perlu diulang secara manual dapat diimplementasikan menggunakan plugin, sehingga transaksi menjadi lebih mudah. Berikut ini akan memperkenalkannya dengan contoh spesifik, dan kode sumber yang disediakan dapat digunakan sebagai referensi untuk menyesuaikan strategi Anda sendiri.
Lindung nilai lintas periode pada kontrak berjangka merupakan strategi yang sangat umum. Karena frekuensinya tidak terlalu tinggi, banyak orang akan mengoperasikannya secara manual, mengharuskan satu kontrak untuk posisi beli dan satu kontrak untuk posisi jual, dan mereka dapat menganalisis tren perbedaan harga. Menggunakan plugin pada terminal perdagangan Anda akan menghemat energi.
Hal pertama yang ingin saya perkenalkan adalah plug-in perbedaan harga lintas periode:
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
}
Dengan satu klik, Anda dapat melihat sebaran antarperiode terkini secara sekilas. Alamat salinan kode sumber plugin: https://www.fmz.com/strategy/187755

Dengan analisis spread, Anda menemukan bahwa spread tersebut konvergen, yang merupakan peluang untuk melakukan short kontrak triwulanan dan long minggu ini. Saat ini, Anda dapat menggunakan plug-in hedging sekali klik. Dengan sekali klik, ini akan secara otomatis membantu Anda mempersingkat kontrak triwulanan dan memperpanjang kontrak minggu ini, yang lebih cepat daripada operasi manual. Cukup banyak. Prinsip penerapan strategi ini adalah membuka sejumlah posisi yang sama dengan slippage. Anda dapat menjalankannya beberapa kali untuk mencapai posisi yang dibutuhkan secara perlahan dan menghindari dampak pada pasar. Anda dapat mengubah parameter default untuk menempatkan order lebih cepat. Alamat salinan strategi: 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())
}
Sambil menunggu perbedaan harga menyatu, jika Anda perlu menutup posisi, Anda dapat menjalankan plug-in penutupan satu klik untuk menutup posisi dengan 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)
}
}
}
}
Yang paling umum adalah iceberg order, yang membagi pesanan besar menjadi pesanan kecil. Meskipun dapat dijalankan sebagai robot, plug-in 5 menit sebenarnya sudah cukup. Ada dua jenis iceberg order, yaitu menerima pesanan dan melakukan pemesanan. Jika ada potongan biaya penanganan, Anda dapat memilih untuk melakukan pemesanan, yang berarti waktu pelaksanaan akan lebih lama.
Kode berikut adalah kode sumber dari Plug-in Iceberg Order Buying: https://www.fmz.com/strategy/191771. Jual 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
}
}
}
Selalu menempati harga beli satu atau jual satu juga merupakan cara untuk mengirim barang secara perlahan, yang berdampak relatif kecil pada pasar. Masih ada beberapa hal yang perlu ditingkatkan dalam strategi ini. Anda dapat mengubah volume transaksi minimum atau akurasi secara manual. Beli: https://www.fmz.com/strategy/191582 Jual: 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 dengan harga lebih baik atau menunggu tawaran menarik, Anda dapat menempatkan beberapa pesanan dalam interval tertentu. Plugin ini juga dapat digunakan untuk order berjangka yang tertunda. Alamat salinan kode sumber: 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'
}
Perangkat lunak perdagangan berjangka yang umum digunakan sering kali memiliki banyak fungsi penempatan pesanan tingkat lanjut, seperti menempatkan pesanan stop-loss, menempatkan pesanan bersyarat, dan sebagainya, yang dapat dengan mudah ditulis ke dalam plug-in. Berikut adalah plug-in yang memungkinkan Anda untuk menutup order yang tertunda segera setelah dieksekusi. Salin alamat: 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)
}
}
Setelah melihat begitu banyak fungsi kecil, Anda seharusnya memiliki ide sendiri. Anda mungkin juga menuliskannya ke dalam plug-in untuk memudahkan perdagangan manual Anda.