[TOC] Tutorial ini berisi pengetahuan dasar tentang strategi menulis, termasuk pengenalan API, backtest, grafik dan banyak lagi. Setelah mempelajari tutorial dasar ini, pengguna akan dapat menggunakan API dasar dengan ahli dan menulis strategi bot yang stabil. Sebelum mempelajari tutorial, Anda perlu belajar cara menggunakanMemulai FMZ Quant Platform.
Tutorial versi lama:FMZ Quant (FMZ.COM) Manual Penulisan Strategi 2.0 (Tutorial); ada banyak indeks posting di tutorial, yang disarankan untuk dibaca.
Perdagangan program adalah menggunakan program untuk terhubung dengan platform melalui API untuk mencapai pembelian dan penjualan otomatis atau fungsi lain sesuai dengan niat desain.
Saat ini, ada dua protokol antarmuka utama untuk platform cryptocurrency: REST dan Websocket. Setiap kali protokol REST memperoleh data, perlu diakses sekali. Mari kita ambil API platform simulasi
{"data:{"buy":"11351.73","high":"11595.77","last":"11351.85","low":"11118.45","open":"11358.74","quoteVol":"95995607137.00903936","sell":"11356.02","time":1565593489318,"vol":"3552.5153"}}
Dengan cara ini, Anda dapat melihat bahwa perdagangan mengikuti kutipan pasar terbaru dari pasangan perdagangan BTC_USDT, akan berubah setiap kali diperbarui;
Platform perdagangan FMZ Quant mengkapsulkan antarmuka REST dari setiap platform, dan menggunakan cara yang seragam untuk memanggil dan format data seragam, membuat strategi menulis lebih sederhana dan lebih umum.
Sebagian besar bagian dari dokumen API platform FMZ menggunakan JavaScript sebagai contoh, tetapi karena enkapsulasi, hampir tidak ada perbedaan antara bahasa yang berbeda, dan Anda hanya perlu memperhatikan masalah sintaksis.
Karena Python memiliki versi yang berbeda, itu dapat ditentukan di awal program, seperti#!Python2
dan#!Python3
. Perhatikan bahwa JavaScript baru-baru ini telah memperbarui sintaks ES6 nya, dan mereka yang tertarik dapat belajar tentang hal itu. Kode Python dan Javascript dengan fungsi yang sama ditunjukkan di bawah ini.
#python code
def main():
while True:
Log(exchange.GetAccount().Balance)
Sleep(2000)
#the corresponding Js code
function main(){
while(true){
Log(exchange.GetAccount().Balance)
Sleep(2000)
}
}
Platform FMZ Quant menyediakan
Program strategi sama dengan program normal, yang dijalankan dalam perintah kode. Bagian khususnya adalah bahwa harus ada fungsi
Fungsi lain dengan tindakan khusus ditunjukkan sebagai berikut:
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//write the strategy logic here, and it will be called ever 6 seconds
}
function main(){
while(true){
onTick()
Sleep(6000)
}
}
Dalam contoh sebelumnya, jika ada kesalahan dalam akses jaringan, strategi dapat dihentikan secara langsung. Jika Anda ingin strategi yang mirip dengan restart otomatis dan tidak akan berhenti, Anda dapat menggunakan
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//write the strategy logic here, and it will be called ever 6 seconds
}
function main(){
try{
while(true){
onTick()
Sleep(6000)
}
}catch(err){
Log(err)
}
}
Jika hanya satu exchange
untuk mewakili objek ini.exchange.GetTicker()
akan mendapatkan adalah ticker pasar dari
Platform FMZ Quant mendukung penambahan beberapa exchanges
array untuk mewakili mereka, yaituexchanges[0]
danexchanges[1]
...dan seterusnya, sesuai dengan urutan penjumlahan ketika bot dibuat.BTC_USDT
, mantan
Jelas, jika kita mengoperasikan banyak pasangan perdagangan, metode ini akan sangat tidak nyaman.exchange.SetCurrency("BTC_USDT")
Kemudian, pasangan perdagangan yang terikat denganexchange
menjadiBTC_USDT
, yang akan tetap berlaku sampai panggilan berikutnya untuk mengubah pasangan perdagangan.Perhatikan bahwa backtest mendukung beralih pasangan perdagangan baru-baru iniDi bawah ini adalah contoh spesifik:
var symbols = ["BTC_USDT", "LTC_USDT", "EOS_USDT", "ETH_USDT"]
var buyValue = 1000
function main(){
for(var i=0;i<symbols.length;i++){
exchange.SetCurrency(symbols[i])
var ticker = exchange.GetTicker()
var amount = _N(buyValue/ticker.Sell, 3)
exchange.Buy(ticker.Sell, amount)
Sleep(1000)
}
}
Seperti yang disebutkan dalam contoh sebelumnya, antarmuka pasar umumnya adalah antarmuka publik, yang dapat diakses oleh semua orang. Antarmuka pasar yang umum adalah: GetTicker, GetDepth, GetRecords dan GetTrades. Kutipan pasar adalah dasar untuk strategi untuk membuat penilaian perdagangan. Kemudian, saya akan memperkenalkan mereka satu per satu. Lebih baik mencoba mereka di
Setiap antarmuka umumnya memilikiInfo
field, yang mewakili string data asli yang dikembalikan oleh platform, dan yang dapat digunakan untuk melengkapi informasi tambahan.JSON.parse()
, sementara Python menggunakan perpustakaan json.Time
bidang menunjukkan time stamp dari permintaan, yang dapat digunakan untuk menilai keterlambatan.
ketika menggunakan API apa pun di bot, akses mungkin gagal dan kembalinull
, dan Python kembaliNone
Pada saat ini, data yang digunakan akan melaporkan kesalahan dan menyebabkan bot berhenti, sehingga toleransi kesalahan sangat penting. Tutorial ini akan memperkenalkan toleransi kesalahan secara khusus.
GetTicker mungkin adalah antarmuka yang paling umum digunakan. Anda dapat menemukan harga terakhir kali dieksekusi, harga buy1 dan harga sell1, dan volume perdagangan terbaru. Sebelum menempatkan pesanan, harga yang dieksekusi dapat ditentukan sesuai dengan informasi ticker.{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}
.
function main() {
var ticker = exchange.GetTicker()
Log(ticker) //return ticker in the debugging tool, and you can see the specific result
Log('Last time executed price:',ticker.Last, 'Buy1 price:', ticker.Buy)
}
GetDepth untuk mendapatkan informasi mendalam tentang pesanan tertunda. Meskipun GetTicker mencakup harga beli 1 dan jual 1, jika Anda ingin menanyakan pesanan tertunda yang lebih dalam, Anda dapat menggunakan antarmuka ini, untuk secara umum memeriksa 200 pesanan tertunda. Harga kejutan dapat dihitung dengan menggunakan antarmuka ini. Di bawah ini adalah hasil pengembalian yang sebenarnya. Di antara mereka,
{
"Info":null,
"Asks":[
{"Price":5866.38,"Amount":0.068644},
{"Price":5866.39,"Amount":0.263985},
......
]
"Bids":[
{"Price":5865.13,"Amount":0.001898},
{"Price":5865,"Amount":0.085575},
......
],
"Time":1530241857399
}
Contoh penggunaan GetDepth untuk Ask & Bids:
function main() {
var depth = exchange.GetDepth()
Log('Buy 1 price:', depth.Bids[0].Price, 'Sell 1 price:', depth.Asks[0].Price)
}
GetRecords adalah salah satu antarmuka yang paling umum digunakan, dapat mengembalikan informasi harga dalam jangka waktu yang lama pada suatu waktu, yang merupakan dasar untuk menghitung berbagai indikator. Jika periode K-line tidak ditentukan, itu berarti menggunakan periode default ketika menambahkan bot. Panjang K-line tidak dapat ditentukan, dan akan terus meningkat dari waktu ke waktu. Jumlah maksimum adalah 2000, dan dalam panggilan pertama jumlahnya sekitar 200 (platform yang berbeda mengembalikan angka yang berbeda).
exchange.SetMaxBarLen(Len)
dapat mengatur jumlah K-line yang diperoleh untuk pertama kalinya (didukung oleh beberapa platform), dan mengatur jumlah maksimum K-line.Seperti:exchange.SetMaxBarLen(500)
.
GetRecords dapat menentukan periode seperti PERIOD_M1: 1 menit, PERIOD_M5: 5 menit, PERIOD_M15: 15 menit, PERIOD_M30: 30 menit, PERIOD_H1: 1 jam dan PERIOD_D1: 1 hari.exchange.GetRecords(PERIOD_M1)
. Setelah meng-upgrade docker terbaru, itu akan mendukung kustomisasi periode, yang hanya melewati angka kedua periode sebagai parameter. kustomisasi tingkat menit akan disintesis sesuai dengan garis K 1 menit, garis K di bawah 1 menit akan disintesis melalui GetTrades ((), dan komoditas berjangka akan disintesis sesuai dengan tik.Perhatikan bahwa ada juga variabel besar lainnya sepertiPERIOD_M1
di tutorial. Mereka adalah variabel global default FMZ. Jika Anda tertarik, Anda dapat
Contoh data pengembalian:
[
{"Time":1526616000000,"Open":7995,"High":8067.65,"Low":7986.6,"Close":8027.22,"Volume":9444676.27669432},
{"Time":1526619600000,"Open":8019.03,"High":8049.99,"Low":7982.78,"Close":8027,"Volume":5354251.80804935},
{"Time":1526623200000,"Open":8027.01,"High":8036.41,"Low":7955.24,"Close":7955.39,"Volume":6659842.42025361},
......
]
Contoh K-line yang diulang:
function main(){
var close = []
var records = exchange.GetRecords(PERIOD_H1)
Log('total bars: ', records.length)
for(var i=0;i<records.length;i++){
close.push(records[i].Close)
}
return close
}
GetTrades memperoleh data perdagangan dalam rentang waktu tertentu (bukan data perdagangan Anda sendiri), yang tidak didukung oleh beberapa platform.
Antarmuka tersebut terkait dengan akun, sehingga tidak dapat diperoleh secara langsung. Untuk mendapatkannya, Anda perlu menggunakan API-KEY untuk mendaftar. Setelah pemrosesan latar belakang otomatis terpadu dari platform FMZ, Anda dapat menggunakannya secara langsung.
GetAccount untuk mendapatkan informasi akun. Sebagai salah satu antarmuka yang paling umum digunakan, perlu dipanggil sebelum melakukan pesanan, untuk menghindari saldo yang tidak cukup. Hasil pengembalian adalah seperti:{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}
Di mana BTC_USDT
,
Perhatikan bahwa hasil pengembalian adalah hasil dari pasangan perdagangan yang ditentukan, dan informasi mata uang lain dalam akun perdagangan berada di bidang
Bot terus menerus mencetak nilai total dari pasangan perdagangan saat ini:
function main(){
while(true){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
var price = ticker.Buy
var stocks = account.Stocks + account.FrozenStocks
var balance = account.Balance + account.FrozenBalance
var value = stocks*price + balance
Log('Account value is: ', value)
LogProfit(value)
Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed
//when run in debug tool, add a break here
}
}
Membeli order. Metode panggilan termasukexchange.Buy(Price, Amount)
danexchange.Buy(Price, Amount, Msg)
, di mana null
akan dikembalikan jika pesanan tidak berhasil, yang digunakan untuk menanyakan status pesanan.
Jika Anda ingin menempatkan pesanan beli pada harga pasar, exchange.Buy(-1, 0.5)
; jika pasangan perdagangan adalahETH_BTC
Beberapa platform tidak mendukung pesanan pasar, juga tidak melakukan backtest futures.
Beberapa platform memiliki persyaratan presisi untuk harga dan jumlah yang dapat dikendalikan dengan fungsi presisi_N()
Untuk perdagangan berjangka,
Contoh pembelian setelah mencapai harga yang sesuai:
function main(){
while(true){
var ticker = exchange.GetTicker()
var price = ticker.Sell
if(price >= 7000){
exchange.Buy(_N(price+5,2), 1, 'BTC-USDT')
break
}
Sleep(3000)//Sleep 3000ms
}
Log('done')
}
Perintah jual. Parameternya sama dengan exchange.Sell(-1, 0.2)
, berarti menjual 0,2 ETH dengan harga pasar.
GetOrder memperoleh informasi order berdasarkan order id. Ketika antarmuka umum ini memanggil metodeexchange.GetOrder(OrderId)
, Type
dan nilai pesanan yang sebenarnyaStatus
adalah angka, yang mewakili makna yang berbeda, tetapi tidak kondusif untuk memori.Status
nilai pesanan yang belum selesai adalah 0, yang setara denganORDER_STATE_PENDING
. Semua konstanta global ini dapat dilihat dalam dokumen... Hasil pengembalian:
{
"Id":125723661, //Order id
"Amount":0.01, //Order ammount
"Price":7000, //Order price
"DealAmount":0, //Executed amount
"AvgPrice":0, //executed average price
"Status":0, //0: not completely executed; 1: executed; 2: canceled
"Type":1,//Order type; 0: buy order; 1: sell order
"ContractType":"",//contract type, used in futures trading
"Info":{} //the platform returns the raw information
}
}
Strategi untuk membeli sejumlah mata uang tertentu:
function main(){
while(true){
var amount = exchange.GetAccount().Stocks
var ticker = exchange.GetTicker()
var id = null
if(5-amount>0.01){
id = exchange.Buy(ticker.Sell, Math.min(5-amount,0.2))
}else{
Log('Job completed')
return //return the main function, bot will stop
}
Sleep(3000) //Sleep 3000ms
if(id){
var status = exchange.GetOrder(id).Status
if(status == 0){ //Here you can aslo use "status == ORDER_STATE_PENDING" to judge
exchange.CancelOrder(id)
}
}
}
}
GetOrder mendapatkan daftar semua order yang belum selesai dari pasangan perdagangan saat ini. Jika tidak ada order yang belum selesai, kembalikan array kosong. Hasil spesifik dari daftar order, seperti
Contoh pembatalan semua order dari pasangan perdagangan saat ini:
function CancelAll(){
var orders = exchange.GetOrders()
for(var i=0;i<orders.length;i++){
exchange.CancelOrder(orders[i].Id) // cancel order by orderID
}
}
function main(){
CancelAll()
while(true){
//do something
Sleep(10000)
}
}
Menurut ID pesanan, batalkan pesanan.exchange.CancelOrder(OrderId)
. Jika pembatalan berhasil, kembali
Untuk cryptocurrency, perdagangan futures berbeda dari perdagangan spot. Fungsi perdagangan spot di atas juga berlaku untuk perdagangan futures, dan perdagangan futures tunggal memiliki fungsinya sendiri. Sebelum melakukan perdagangan program futures cryptocurrency, Anda harus akrab dengan operasi manual di situs web dan memahami konsep dasar, seperti terbuka, dekat, silang, terisolasi, leverage, dekat keuntungan dan kerugian, pendapatan mengambang, margin dan konsep lainnya, serta rumus perhitungan yang sesuai. Tutorial yang sesuai dapat ditemukan di berbagai platform futures, dan Anda perlu mempelajarinya sendiri.
Kontrak abadi mirip dengan kontrak berjangka, tetapi perbedaannya adalah bahwa tidak ada konsep memegang posisi panjang dan pendek pada saat yang sama.
Jika platform mendukung futures dan spot, seperti futures OKEX dan Huobi, Anda perlu memilih
Langkah pertama dalam perdagangan berjangka adalah mengatur kontrak yang akan diperdagangkan. Mengambil OKEX futures sebagai contoh, pilih pasangan perdagangan BTC saat membuat bot atau backtesting, dan Anda juga perlu mengatur kontrak mingguan, minggu depan atau triwulanan dalam kode. Jika tidak diatur, itu akan memintainvalid contract type
. Berbeda dengan pasangan perdagangan spot, kontrak berjangka sering menggunakan mata uang perdagangan seperti BTC sebagai margin. Menambahkan BTC ke pasangan perdagangan biasanya mewakili pasangan perdagangan BTC_USD yang menggunakan BTC sebagai margin. Jika ada kontrak berjangka dengan USDT sebagai margin, bot perlu dibuat untuk menambahkan pasangan perdagangan BTC_USDT. Misalnya, kontrak abadi seperti Binance OKEX Futures, dengan kontrak bermargin crypto dan USDT.Setelah mengatur pasangan perdagangan, Anda juga harus menetapkan jenis kontrak tertentu, seperti perpetual, mingguan, minggu depan, dll. Setelah mengatur kontrak, Anda dapat melakukan operasi seperti mendapatkan penawaran pasar, membeli dan menjual.
Binance, OKEX, HuobiDM, dll memiliki kontrak dengan margin crypto dan USDT, yang perlu dibedakan saat menambahkan bot dan mengatur kontrak.
//OKEX Futures
exchange.SetContractType("swap") // set to perpetual contract
exchange.SetContractType("this_week") // set to weekly contract
exchange.SetContractType("next_week") // set to next week contract
exchange.SetContractType("quarter") // set to quarterly contract
//HuobiDM
exchange.SetContractType("this_week") // set to weekly contract
exchange.SetContractType("next_week") // set to next week contract
exchange.SetContractType("quarter") // set to quarterly contract
exchange.SetContractType("swap") // set to perpetual contract
//Binance Futures
exchange.SetContractType("swap") // set to perpetual contract, and notice that crypto-margined and USDT-margined contracts are all in the perpetual contract
exchange.SetContractType("quarter") // set to quarterly contract
exchange.SetContractType("next_quarter") // set to next quarter contract
//BitMEX
exchange.SetContractType("XBTUSD") // set to perpetual contract
exchange.SetContractType("XBTM19") // the contract settled at a specific time; for more details, please log in BitMEX to check each contract code
//GateIO
exchange.SetContractType("swap") // set to perpetual contract, and do not set the default as swap perpetual contract
//Deribit
exchange.SetContractType("BTC-27APR18") // the contract settled at a specific time; for more details, please log in Deribit to check out
Untuk mendapatkan daftar informasi posisi saat ini, OKEX (OKCOIN) berjangka dapat lulus dalam parameter untuk menentukan jenis kontrak yang akan diperoleh.[]
, jika tidak ada posisi. Informasi posisi dikembalikan sebagai berikut. Ada banyak informasi spesifik, yang perlu dianalisis dalam kombinasi dengan pasangan perdagangan.
Jenis data | Nama variabel | Deskripsi |
---|---|---|
objek | Informasi | struktur mentah yang dikembalikan platform |
nomor | MarginLevel | ukuran leverage; OKCoin adalah 10 atau 20, dan posisi silang OK berjangka kembali 10 (fixed), untuk API mentah tidak mendukung |
nomor | Jumlah | jumlah posisi; OKCoin menunjukkan jumlah kontrak (bilangan bulat lebih dari 1) |
nomor | Frozen Jumlah | Jumlah posisi beku |
nomor | Harga | harga rata-rata posisi |
nomor | Margin | Margin beku |
nomor | Keuntungan | komoditas berjangka: keuntungan dan kerugian dari posisi tanda ke pasar; cryptocurrency: unit cryptocurrency: BTC / LTC, unit berjangka tradisional: RMB (catatan:Dalam kasus posisi silang berjangka OKCoin, ini mengacu pada keuntungan dan kerugian yang direalisasikan, bukan keuntungan dan kerugian dari posisi. Di bawah posisi terisolasi, ini mengacu pada keuntungan dan kerugian dari posisi.) |
const | Jenis | PD_LONG adalah posisi panjang (CTP menggunakan |
string | Jenis Kontrak | Komoditas berjangka adalah kode kontrak, dan saham adalah |
function main(){
exchange.SetContractType("this_week");
var position = exchange.GetPosition();
if(position.length>0){ //especially pay attention to judging the length of position before call, or an error will occur
Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,"ContractType:", position[0].ContractType)
}
}
Pertama-tama, Anda perlu mengatur ukuran leverage; metode panggilan:exchange.SetMarginLevel(10)
, di mana exchange.SetDirection(Direction)
, yang sesuai dengan posisi terbuka dan tutup.Tidak seperti futures, jika kontrak abadi tidak memegang konsep panjang dan pendek pada saat yang sama, yaitu satu posisi tidak diizinkan.buy
dansell
Jika mendukung posisi dua arah, Anda perlu mengaturclosebuy
, closesell
.Hubungan khusus:
Operasi | SetDirection Parameter | Fungsi Penetapan Perintah |
---|---|---|
Open Long Position (Posisi Panjang Terbuka) | tukar.SetDirection (( |
Bertukar.Beli ((() |
Tutup Posisi Panjang | tukar.SetDirection (( |
Bertukar.Menjual ((() |
Posisi Pendek Terbuka | pertukaran.SetDirection (( |
Bertukar.Menjual ((() |
Tutup Posisi Pendek | exchange.SetDirection (( |
Bertukar.Beli ((() |
Akhirnya, ada kode khusus untuk posisi terbuka dan dekat. Jumlah pesanan yang ditempatkan bervariasi dari platform ke platform. Misalnya, futures Huobi didasarkan pada jumlah jumlah kontrak, dan satu kontrak adalah 100 dolar AS. Perhatikan bahwa backtest futures tidak mendukung pesanan pasar.
function main(){
exchange.SetContractType("this_week") // for example, set OKEX futures to weekly contract
price = exchange.GetTicker().Last
exchange.SetMarginLevel(10) // set to 10 times of leverage
exchange.SetDirection("buy") // set the order type as buy long
exchange.Buy(price+10, 20) // set contract quantity as 20 orders
pos = exchange.GetPosition()
Log(pos)
Log(exchange.GetOrders()) // check out if there is any unfinished order
exchange.SetDirection("closebuy"); // if it is a perpetual contract, directly set exchange.SetDirection("sell")
exchange.Sell(price-10, 20)
}
Berikan contoh strategi spesifik dari posisi tutup penuh sebagai berikut:
function main(){
while(true){
var pos = exchange.GetPosition()
var ticker = exchange.GetTicekr()
if(!ticker){
Log('not able to obtain ticker')
return
}
if(!pos || pos.length == 0 ){
Log('no position')
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 leverage cryptocurrency perlu beralih ke akun leverage dalam kode, dan bagian lainnya sama dengan perdagangan spot.
Penggunaanexchange.IO("trade_margin") untuk beralih ke mode akun leverage; menempatkan pesanan dan memperoleh aset akun akan mengakses antarmuka platform leverage. Penggunaanexchange.IO("trade_normal") untuk beralih kembali ke mode akun biasa.
Platform yang didukung:
Perdagangan berjangka komoditas dan perdagangan berjangka cryptocurrency sangat berbeda. Pertama-tama, waktu perdagangan berjangka komoditas sangat singkat, tetapi cryptocurrency diperdagangkan selama 24 jam; protokol berjangka komoditas bukan REST API yang umum digunakan; frekuensi perdagangan dan jumlah pesanan yang tertunda dari berjangka komoditas terbatas, tetapi yang dari cryptocurrency sangat longgar, dan sebagainya. Oleh karena itu, ada banyak poin yang membutuhkan perhatian khusus saat perdagangan berjangka komoditas, dan direkomendasikan bagi mereka yang memiliki pengalaman yang kaya dalam operasi manual. FMZ sekarang mendukung robot simulasi komoditas berjangka, dan Anda dapat merujuk:https://www.fmz.com/bbs-topic/325Untuk menambahkan perusahaan berjangka komoditas:https://www.fmz.com/bbs-topic/371
Komoditas berjangka telah menerapkan pengawasan tembus pandang pada bulan Juni 2019; untuk program individu, pengguna individu perlu membuka akun untuk mengajukan kode otorisasi untuk pialang berjangka (cithakan informasi aplikasi tertentu dapat dikirim ke grup WeChat atau grup QQ), yang umumnya memakan waktu 4-5 hari; prosedurnya cukup rumit. Sebagai penyedia perdagangan terprogram, platform FMZ telah mengajukan kode otorisasi perangkat lunak dari berbagai penyedia layanan berjangka. Pengguna dapat menggunakannya secara langsung tanpa mendaftar. Saat menambahkan pialang berjangka, cari
Karena kelebihan struktur platform FMZ Quant, pengguna juga dapat menambahkan beberapa akun broker berjangka, dan menerapkan beberapa fungsi yang tidak dapat diselesaikan oleh perangkat lunak perdagangan program berjangka komoditas lainnya, seperti sintesis tik frekuensi tinggi; Anda dapat merujuk pada:https://www.fmz.com/bbs-topic/1184
Pertama-tama, karena ini bukan perdagangan 24 jam dan membutuhkan operasi login, perlu untuk menilai status link sebelum perdagangan.exchange.IO("status")
adalahtrue
, yang mengindikatkan koneksi yang berhasil ke platform. Jika API dipanggil ketika login tidak berhasil, _C(exchange.SetContractType,"MA888")
, yang akan memastikan login yang sukses.
Kode akuisisi dan perdagangan pasar komoditas berjangka adalah sama dengan yang berjangka cryptocurrency.
function main(){
_C(exchange.SetContractType,"MA888") //If you do not log in successfully, you cannot subscribe to the contract, so better to try again
while(true){
if(exchange.IO("status")){
var ticker = exchange.GetTicker()
Log("MA888 ticker:", ticker)
LogStatus(_D(), "Already connected with CTP !")//_D obtain event
} else {
LogStatus(_D(), "Not connected with CTP !")
Sleep(1000)
}
}
}
Disarankan untuk menggunakan perpustakaan berjangka komoditas untuk perdagangan (yang akan dijelaskan nanti), kode akan sangat sederhana pada saat ini, dan tidak perlu berurusan dengan detail yang membosankan.https://www.fmz.com/strategy/57029
function main() {
// Use the CTA strategy framework of commodity futures library
$.CTA(Symbols, function(st) {
var r = st.records
var mp = st.position.amount
var symbol = st.symbol
/*
"r" represents K-line, "mp" indicates the position amount of the current variety; positive number means long position, negative number means short position, and 0 means no position; "symbol" is the variety name
if the return value is n:
n = 0 : full close positions (no matter now they are long or short)
n > 0 : if right now long positions are held, add n long positions; if now they are short positions, close n short posiitons; if n is over the position amount right now, reverse to open long positions
n < 0 : if right now short positions are held, add n short positions; if now they are long positions, close n long posiitons; if -n is over the position amount right now, reverse to open short positions
*/
if (r.length < SlowPeriod) {
return
}
var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
if (mp <= 0 && cross > ConfirmPeriod) {
Log(symbol, "Golden Cross Period", cross, "the moment position", mp);
return Lots * (mp < 0 ? 2 : 1)
} else if (mp >= 0 && cross < -ConfirmPeriod) {
Log(symbol, "Death Cross Period", cross, "the moment position", mp);
return -Lots * (mp > 0 ? 2 : 1)
}
});
}
Komoditas berjangka menggunakan protokol CTP, dan semua kutipan pasar dan eksekusi pesanan hanya akan diberitahu setelah ada perubahan, sementara kueri tentang pesanan, akun, dan posisi adalah kueri aktif.GetTicker
, GetDepth
danGetRecords
, semua perlu memiliki data yang di-cache untuk mendapatkan data terbaru. Jika tidak ada data, itu akan menunggu sampai ada data, jadi tidak perlu bagi strategi untuk menggunakan
Jika Anda ingin mendapatkan data setiap kali Anda mendapatkan kutipan pasar, bahkan jika itu data lama, Anda dapat beralih ke mode pembaruan segera kutipan pasarexchange.IO("mode", 0)
. Pada saat ini, strategi tidak dapat ditulis sebagai event-driven, dan peristiwa exchange.IO("mode", 1)
untuk beralih kembali ke mode cache default.
Ketika mengoperasikan kontrak tunggal, gunakan mode default. Namun, jika ada beberapa kontrak, mungkin salah satu kontrak tidak memperbarui kutipan pasar, yang mengakibatkan blokade antarmuka untuk mendapatkan kutipan pasar, dan pembaruan kutipan kontrak lain tidak dapat diperoleh, juga. Untuk memecahkan masalah ini, mode pembaruan segera dapat digunakan, tetapi tidak nyaman untuk menulis strategi frekuensi tinggi. Pada saat ini Anda dapat menggunakan mode push acara untuk mendapatkan push pesanan dan kutipan.exchange.IO("wait")
Jika beberapa objek pertukaran ditambahkan, yang jarang terjadi dalam komoditas berjangka, Anda dapat menggunakanexchange.IO("wait_any")
, dan kembali
Push dari perubahan tik pasar:{Event:"tick", Index: platform index (in the order of the platforms added in the bot), Nano: event of nanosecond-level time, Symbol: contract name}
Push order:{Event:"order", Index:Exchange index, Nano:Event of nanosecond-level time, Order:Order information (same as GetOrder)}
Pada saat ini, struktur strategi dapat ditulis sebagai:
function on_tick(symbol){
Log("symbol update")
exchange.SetContractType(symbol)
Log(exchange.GetTicker())
}
function on_order(order){
Log("order update", order)
}
function main(){
while(true){
if(exchange.IO("status")){ //Judge the link status
exchange.IO("mode", 0)
_C(exchange.SetContractType, "MA888")//Subscribe to MA; only the subscription request for the first time is ture, and the later ones are program switches, which do not consume time
_C(exchange.SetContractType, "rb888")//Subscribe to rb
while(true){
var e = exchange.IO("wait")
if(e){
if(e.event == "tick"){
on_tick(e.Symbol)
}else if(e.event == "order"){
on_order(e.Order)
}
}
}
}else{
Sleep(10*1000)
}
}
}
Perhatikan juga perbedaan antara komoditas berjangka dan platform cryptocurrency. Misalnya,
exchange.IO("instruments"): mengembalikan daftar semua kontrak di platform {nama kontrak: detail} dalam bentuk kamus, dan hanya mendukung bot.exchange.IO("produk"): mengembalikan daftar semua item di platform {nama kontrak: detail} dalam bentuk kamus, dan hanya mendukung bot.exchange.IO("langganan"): ini mengembalikan penawaran pasar langganan di platform dalam bentuk kamus, dan hanya mendukung bot.
PeraturanContractType
Di dalam kontrak berjangka CTP tradisional, ID kontrak yang bersifat case-sensitive.exchange.SetContractType("au1506")
. Setelah kontrak ditetapkan dengan sukses, itu akan mengembalikan informasi rinci kontrak, seperti jumlah pembelian minimum, biaya layanan, waktu pengiriman, dll. Saat berlangganan beberapa kontrak, hanya pertama kalinya permintaan langganan benar-benar dikirim, dan kemudian pasangan perdagangan hanya beralih pada tingkat kode, yang tidak membutuhkan waktu. Kontrak terus menerus utama adalah kode 888, seperti MA888, kontrak tingkat terus menerus adalah 000, seperti MA000; 888 dan 000 adalah perdagangan kontrak virtual yang hanya mendukung backtest, dan bot nyata hanya mendukung kutipan pasar.Namun, Mylanguage dapat mengoperasikan kontrak utama, dan program akan secara otomatis mengubah posisi, yaitu, menutup posisi non-utama dan membuka posisi baru pada posisi utama.
Login yang gagal tidak dapat mengatur kontrak, tetapi akan segera kembali, jadi Anda dapat mencoba dengan
SetDirection
dapat memperoleh empat parameter:buy, closebuy, sell, closesell
. Komoditas berjangka memiliki lebihclosebuy_today
danclosesell_today
, menunjukkan penutupan posisi saat ini; default adalahclosebuy/ closesell
, yang menunjukkan penutupan posisi kemarin; hanya varietas Bursa Berjangka Shanghai yang dibagi menjadi penutupan hari ini dan penutupan kemarin, yang dapat mempengaruhi biaya layanan, sehingga perlu untuk memberikan prioritas untuk menutup posisi kemarin. Untuk berjangka tradisional CTP, Anda dapat mengatur parameter kedua sebagai
Operasi | SetDirection Parameter | Fungsi Penetapan Perintah |
---|---|---|
Open Long Position (Posisi Panjang Terbuka) | tukar.SetDirection (( |
Bertukar.Beli ((() |
Tutup Posisi Panjang | tukar.SetDirection (( |
Bertukar.Menjual ((() |
Posisi Pendek Terbuka | pertukaran.SetDirection (( |
Bertukar.Menjual ((() |
Tutup Posisi Pendek | exchange.SetDirection (( |
Bertukar.Beli ((() |
Contoh berikut adalah fungsi posisi penutupan tertentu. Perhatikan bahwa contoh ini terlalu sederhana. Anda juga harus mempertimbangkan apakah dalam waktu perdagangan, bagaimana mencoba kembali pesanan yang sedang menunggu jika tidak sepenuhnya diisi, berapa volume pesanan maksimum, apakah frekuensi terlalu tinggi, dan apakah itu harga geser atau harga pasar dan sebagainya. Hanya untuk referensi,ini adalah paket perpustakaan platform yang disarankan untuk membuka dan menutup posisi di bot nyata:https://www.fmz.com/strategy/12961Ada pengantar khusus di bagian perpustakaan, dan juga disarankan untuk mempelajari kode sumber perpustakaan.
function Cover(contractType, amount, slide) {
for (var i = 0; i < positions.length; i++) {
if (positions[i].ContractType != contractType) {
continue;
}
var depth = _C(e.GetDepth);
if (positions[i].Type == PD_LONG || positions[i].Type == PD_LONG_YD) {
exchange.SetDirection(positions[i].Type == PD_LONG ? "closebuy_today" : "closebuy");
exchange.Sell(depth.Bids[0]-slide, amount, contractType, positions[i].Type == PD_LONG ? "Close today" : "Close yesterday", 'Bid', depth.Bids[0]);
} else {
exchange.SetDirection(positions[i].Type == PD_SHORT ? "closesell_today" : "closesell");
exchange.Buy(depth.Asks[0]+slide, amount, contractType, positions[i].Type == PD_SHORT ? "Close today" : "Close yesterday", 'Ask', depth.Asks[0]);
}
}
}
Komoditas berjangka mendukung jenis pesanan khusus (dukungan untuk bot, tetapi tidak untuk backtest), yang ditentukan oleh akhiran, ditambahkan ke
exchange.SetDirection("buy_ioc");
exchange.SetDirection("sell_gtd-20170111")
Pengucapan khusus:
Secara default, antarmuka yang dibuka di broker berjangka komoditas adalah semua antarmuka CTP. Jika diperlukan, mereka dapat diganti dengan antarmuka Esunny. Melalui enkapsulasi FMZ, metode panggilan adalah sama. Perbedaannya adalah bahwa akun, pesanan, dan posisi semuanya berada dalam mode push, sehingga docker akan mempertahankan data ini secara lokal, dan akan segera kembali ketika antarmuka yang sesuai dipanggil, tanpa benar-benar membuat permintaan.
Jenis pesanan khusus adalah:
Ketika log catatan log pada antarmuka bot, dan menambahkan karakter Log('Push to WeChat@')
.
Warna log juga dapat disesuaikan, sepertiLog('this is a log in red font #ff0000')
.
#ff0000
adalah hexadecimal dari warna RGB, menunjukkan bahwa semua file log disimpan dalam database SqLit bot di direktori di mana docker berada, yang dapat diunduh dan dibuka dengan perangkat lunak database, atau dapat digunakan untuk menyalin cadangan dan memulihkan (nama database dan id bot adalah sama).
Ini mencatat keuntungan, dan menggambar kurva keuntungan pada antarmuka bot, yang dapat dipertahankan setelah bot di-restart.LogProfit(1000)
Perhatikan bahwa parameter dariLogProfit
tidak selalu keuntungan, dan itu bisa menjadi nomor apapun dan perlu diisi sendiri.
Jika status bot, karena log akan disimpan terlebih dahulu dan diperbarui terus-menerus, membutuhkan informasi hanya untuk menampilkan tidak untuk menyimpan, Anda dapat menggunakanLogStatus
Parameter dariLogStatus
adalah string, yang juga dapat digunakan untuk mewakili informasi tabel.
Contoh tabel tampilan posisi bot nyata tertentu:
var table = {type: 'table', title: 'position information', cols: ['Column1', 'Column2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]};
LogStatus('`' + JSON.stringify(table) + '`'); // After serialization, JSON will be added the character "'" on both sides, which is regarded as a comlpex messag format (now supporting tables)
LogStatus('The first line information\n`' + JSON.stringify(table) + '`\nthe third line information'); // the table information can be displayed in multiple lines
LogStatus('`' + JSON.stringify([table, table]) + '`'); // Multiple tables are supported to be displayed at the same time, which will be displayed in one group by TAB
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // Multiple tables are displayed up and down by arrangement
Parameternya adalah jumlah milidetik, sepertiSleep(1000)
Karena frekuensi akses terbatas dari semua platform, waktu tidur harus ditambahkan ke loop tak terbatas dalam strategi umum.
Setelah bot di-restart, program akan di-restart._G
sangat nyaman dan praktis, dan dapat menyimpan konten JSON berurutan._G
fungsi ditulis dalamonexit()
, sehingga setiap kali strategi dihentikan, informasi yang diperlukan akan disimpan secara otomatis.
Jika Anda ingin menyimpan data yang lebih diformat, fungsi _G tidak cocok, tetapi