FMZ.COM, sebagai platform perdagangan kuantitatif, adalah terutamanya untuk melayani peniaga berprogram. Tetapi ia juga menyediakan terminal perdagangan asas. Walaupun fungsinya mudah, kadang-kadang ia boleh berguna. Sebagai contoh, jika bursa sibuk dan tidak dapat dikendalikan, tetapi API masih berfungsi. Pada masa ini, anda boleh menarik balik pesanan, meletakkan pesanan, dan melihatnya melalui terminal. Untuk meningkatkan pengalaman terminal perdagangan, pemalam kini ditambah. Kadang-kadang, kita memerlukan fungsi kecil untuk membantu urus niaga, seperti perintah menunggu tangga, pesanan aisberg, lindung nilai satu klik, kedudukan penutupan satu klik dan operasi lain. Tidak perlu melihat log pelaksanaan robot. Ia agak rumit untuk membuat log baru. Hanya klik pemalam di terminal, Fungsi pemalam yang sesuai dapat diwujudkan dengan serta-merta, yang dapat memudahkan transaksi manual. Lokasi pemalam adalah seperti berikut:
Terdapat dua mod operasi pemalam, operasi segera dan operasi latar belakang. Berjalan di latar belakang adalah bersamaan dengan membuat robot (tugas biasa). Prinsip operasi segera adalah sama dengan alat pecahannya: menghantar sekeping kod ke docker halaman terminal perdagangan untuk pelaksanaan, dan sokongan untuk mengembalikan carta dan jadual (alat pecahannya kini juga dinaik taraf untuk menyokong), yang sama hanya boleh dijalankan selama 5 minit, tidak ada yuran, tidak ada sekatan Bahasa. Pemalam dengan masa pelaksanaan yang singkat boleh menggunakan mod pelaksanaan segera, sementara strategi yang rumit dan lama masih perlu menjalankan robot.
Apabila menulis strategi, anda perlu memilih jenis strategi sebagai pemalam.main
fungsireturn
kerana pelaksanaan pemalam tidak dapat melihat log, anda bolehreturn
hasil pelaksanaan pemalam.
Cari terus dalam kotak carian seperti yang ditunjukkan dalam gambar. Perhatikan bahawa hanya strategi jenis plugin perdagangan yang boleh dijalankan, dan kemudian klik Tambah. Plugin awam boleh didapati di Strategy Square:https://www.fmz.com/square/21/1
Klik pada strategi untuk memasuki antara muka tetapan parameter. Jika tidak ada parameter, ia akan berjalan terus. Docker, pasangan dagangan, dan tempoh K-line yang dipilih oleh terminal dagangan adalah parameter yang sepadan secara lalai. Klik strategi pelaksanaan untuk memulakan pelaksanaan, dan pilih mod
Klik kedudukan ikon untuk menghentikan pemalam. Oleh kerana semua pemalam dijalankan dalam proses alat debugging, semua pemalam akan dihentikan.
Plug-in boleh menjalankan kod untuk tempoh masa dan melakukan beberapa operasi mudah. Dalam banyak kes, operasi manual yang memerlukan operasi berulang boleh dilaksanakan dengan plugin untuk memudahkan transaksi. Berikut akan memperkenalkan contoh khusus, dan kod sumber yang diberikan boleh digunakan sebagai rujukan untuk menyesuaikan strategi anda sendiri.
Perdagangan lindung nilai intertemporal niaga hadapan adalah strategi yang sangat biasa. Kerana kekerapan tidak sangat tinggi, ramai orang akan mengendalikannya secara manual. Adalah perlu untuk membuat satu kontrak panjang dan satu kontrak pendek, jadi lebih baik untuk menganalisis trend penyebaran. Menggunakan pemalam di terminal perdagangan akan menjimatkan tenaga anda.
Pengenalan pertama adalah untuk melukis pemalam perbezaan harga antara tempoh:
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, perbezaan harga antara tempoh baru-baru ini jelas pada sekilas, alamat salinan kod sumber pemalam:https://www.fmz.com/strategy/187755
Dengan analisis penyebaran, didapati bahawa penyebaran sedang konvergen. Ini adalah peluang untuk pendek kontrak suku tahunan dan pergi panjang untuk minggu semasa. Ini adalah peluang untuk menggunakan pemalam lindung nilai satu klik, satu klik akan membantu anda secara automatik pendek suku tahunan dan panjang mingguan, yang lebih cepat daripada operasi manual. Prinsip pelaksanaan strategi adalah untuk membuka jumlah kedudukan yang sama dengan harga bergerak. Anda boleh menjalankan beberapa kali lagi untuk perlahan-lahan mencapai kedudukan yang anda inginkan untuk mengelakkan memberi kesan kepada pasaran. Anda boleh mengubah parameter lalai untuk meletakkan pesanan 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())
}
Menunggu perbezaan harga untuk berkumpul dan anda perlu menutup kedudukan, anda boleh menjalankan satu klik penutupan pemalam untuk menutup kedudukan 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 biasa adalah komisen aisberg, yang membahagikan pesanan besar menjadi pesanan kecil. Walaupun ia boleh dijalankan sebagai robot, plug-in 5 minit sebenarnya mencukupi. Terdapat dua jenis pesanan aisberg, satu mengambil pesanan dan yang lain menunggu pesanan. Jika ada yuran istimewa, anda boleh memilih pesanan menunggu, yang bermaksud masa pelaksanaan lebih lama.
Kod berikut adalah kod sumber plug-in yang ditugaskan oleh aisberg: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
}
}
}
Ia juga merupakan cara untuk perlahan-lahan
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 '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'
}
Perisian dagangan niaga hadapan yang biasa digunakan sering mempunyai banyak fungsi pesanan menunggu yang maju, seperti pesanan stop-loss yang menunggu, pesanan keadaan yang menunggu, dan lain-lain, yang boleh dengan mudah ditulis 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 is not connected!")
Sleep(10000)
}
if(trade_amount >= Amount){
Log('mission completed')
return
}
Sleep(1000)
}
}
Selepas membaca begitu banyak fungsi kecil, anda juga harus mempunyai idea anda sendiri.