Tutorial ini berisi pengetahuan dasar tentang penulisan strategi, termasuk pengantar API, pengembalian, dan grafik. Setelah mempelajari tutorial dasar ini, pengguna akan dapat menggunakan API dasar dan menulis strategi yang stabil. Sebelum mempelajari tutorial ini, Anda perlu mempelajariPendahuluan dari FMZ Inventors Quantification Platform 。
Tutorial sebelumnya:Inventor Menghitung Strategi untuk Menulis Manual Penggunaan Lengkap 2.0 TutorialTutorial ini mengindeks banyak posting, dan saya sarankan untuk melihat-lihat.
Rencana awal yang disusun
Pengantar API
Programmatic trading adalah program yang terhubung melalui API dan pertukaran, untuk melakukan pembelian dan penjualan secara otomatis sesuai dengan niat yang dirancang atau untuk melakukan fungsi lain. API disebut Application Programming Interface.
Saat ini ada dua jenis protokol antarmuka utama untuk pertukaran mata uang digital: REST dan Websocket. Protokol REST memerlukan satu akses untuk setiap data yang diperoleh. Sebagai contoh, API untuk pertukaran simulasi wex.app, buka https://api.wex.app/api/v1/public/ticker?market=BTC_USDT langsung di browser dan hasilnya adalah:
{"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"}}
Ini akan menunjukkan transaksi terbaru dengan pasangan BTC_USDT, yang akan berubah setiap kali diperbarui.market=Selanjutnya adalah parameter pasangan transaksi tertentu, yang dapat dimodifikasi untuk mendapatkan data pasangan transaksi lainnya. Untuk antarmuka publik, seperti pasar, semua orang dapat mengaksesnya, sehingga tidak perlu verifikasi, sementara beberapa antarmuka seperti pesanan dan akun yang diperoleh hanya perlu mengidentifikasi pengguna, yang pada saat itu perlu ditandatangani menggunakan API-KEY. Websocket adalah mode berlangganan, setelah mengirimkan konten yang memerlukan langganan, bursa akan mengirim data yang diperbarui ke program, tidak perlu mengunjungi kembali setiap kali, sehingga lebih efisien.
Platform perdagangan kuantitatif FMZ terbungkus antarmuka REST dari masing-masing bursa, menggunakan panggilan dan format data yang seragam, membuat penulisan kebijakan lebih sederhana dan umum. Platform FMZ dapat dengan mudah mendukung Websocket, yang akan dijelaskan secara rinci dalam tutorial berikutnya.
Bahasa pemrograman
Dokumen API platform FMZ sebagian besar menggunakan JavaScript sebagai contoh, tetapi karena kemasan, hampir tidak ada perbedaan antara bahasa yang berbeda, hanya perlu memperhatikan masalah tata bahasa. C ++ sedikit khusus, tutorial selanjutnya akan memiliki pengantar khusus. Karena Js relatif sederhana dan tidak ada masalah kompatibilitas, disarankan bagi pemula untuk menggunakannya.
Python memiliki versi yang berbeda, yang dapat ditentukan pada awal program, seperti#!Python2,#!Python3Perhatikan bahwa JavaScript baru-baru ini meng-upgrade bahasa ES6, yang tertarik dapat mengetahui. Di bawah ini menunjukkan kode Python dan Javascript yang berfungsi sama, hanya terlihat perbedaan gramatikal, sehingga dokumen API hanya memberikan contoh Javascript, tutorial ini juga akan mengakomodasi kasus penggunaan khusus Python.
#python代码
def main():
while True:
Log(exchange.GetAccount().Balance)
Sleep(2000)
#相应的Js代码
function main(){
while(true){
Log(exchange.GetAccount().Balance)
Sleep(2000)
}
}
Rekomendasi sumber
- Dokumentasi API FMZ Platform, tutorial ini tidak akan membahas setiap antarmuka secara rinci, dapat dilihat di dokumentasi ini: https://www.fmz.com/api
- Jika Anda ingin menerima sinyal tradingview, Anda dapat melakukan transaksi di FMZ melalui artikel ini: https://www.fmz.com/digest-topic/5533
- Javascript, Python cepat masuk, menulis strategi sederhana tidak memerlukan tata bahasa yang rumit, hanya perlu menguasai beberapa konsep dasar saja, Anda dapat belajar pemrograman sambil belajar tutorial ini: https://www.fmz.com/bbs-topic/382 https://www.fmz.com/bbs-topic/417
- Dokumen bahasa Mac, untuk strategi trending, bahasa Mac sangat berguna.
- Sebuah contoh panggilan C++ yang bisa dilihat oleh mereka yang tertarik dengan C++, tetapi karena bukan bahasa interpretasi, debugnya sulit dan tidak disarankan untuk digunakan: https://www.fmz.com/strategy/61533
- Pelajaran Menghitung Mata Uang Digital, FMZ resmi, hanya membutuhkan 20 yuan, berisi detail yang kaya, dan cocok untuk pemula.Tautan ke kursus
- Beberapa strategi pengajaran, cocok untuk tahap awal, dan strategi markup dasar saat belajar:https://www.fmz.com/square/s:tag:教学/1
- Kode sumber menjelaskan strategi secara rinci: https://www.fmz.com/bbs/s:tag:源码解析/1
Alat Debugging
FMZ Quantum Platform menyediakan debug tool untuk debug API, https://www.fmz.com/m/debug 。 Debug tool hanya mendukung JavaScript, hanya dapat dijalankan untuk sementara waktu, tanpa perlu membuat hard disk untuk debug interface bursa。 data yang dikembalikan akan dikembalikan sebagai hasil, kode dari debug tool tidak akan disimpan。 Dalam pembelajaran tutorial ini, Anda dapat melakukan pengujian menggunakan debug tool secara bersamaan。

Arsitektur program kebijakan
Seperti halnya program-program normal, program-program kebijakan harus dieksekusi secara berurutan, tetapi harus memiliki fungsi utama. Karena kebijakan harus berjalan tanpa henti, biasanya diperlukan satu putaran ditambah waktu tidur. Karena semua akses API transaksi dibatasi, waktu tidur yang disesuaikan perlu disesuaikan. Arsitektur ini adalah eksekusi interupsi tetap yang khas.
Fungsi lain yang memiliki fungsi khusus adalah sebagai berikut:
- onexit() Untuk fungsi exit normal, waktu eksekusi maksimum adalah 5 menit, dapat tidak dinyatakan, dan akan melaporkan kesalahan interrupt jika melebihi waktu. Beberapa hasil dapat disimpan untuk digunakan saat keluar dari program.
- onerror() Fungsi keluar sebagai pengecualian, waktu eksekusi maksimal 5 menit, dapat tidak dinyatakan。
- init() Sebagai fungsi inisialisasi, program kebijakan akan dipanggil secara otomatis pada saat mulai berjalan, tetapi tidak dapat dinyatakan.
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//在这里写策略逻辑,将会每6s调用一次
}
function main(){
while(true){
onTick()
Sleep(6000)
}
}
Contoh di atas jika kesalahan akses jaringan dapat menyebabkan kebijakan langsung berhenti, jika Anda ingin sebuah kebijakan yang mirip dengan otomatis restart tidak berhenti, Anda dapat menggunakan kembali real-time kebijakan dengan mencoba tangkap loop toleransi kesalahan utama ((mengembalikan tidak menggunakan mencoba). Tentu saja, hanya ketika kebijakan stabil yang menyarankan operasi seperti ini, jika tidak, semua kesalahan tidak akan melaporkan, sulit untuk menyortir masalah kebijakan.
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//在这里写策略逻辑,将会每6s调用一次
}
function main(){
try{
while(true){
onTick()
Sleep(6000)
}
}catch(err){
Log(err)
}
}
Pengantar API
Pertukaran dan pengaturan pasangan
Setiap API yang berhubungan dengan sebuah bursa harus memiliki bursa dan pasangan transaksi yang jelas. Jika Anda hanya menambahkan satu bursa-pasangan transaksi pada saat membuat disk, maka Anda tidak akan memiliki akses ke semua API yang berhubungan dengan bursa.exchangeSebagai representasi dari objek, misalnyaexchange.GetTicker()Yang akan diperoleh adalah ticker perdagangan dari pasangan-pertukaran ini.
Platform FMZ mendukung penambahan beberapa pertukaran-pasangan pada saat yang sama, seperti BTC dan ETH yang dapat dioperasikan pada saat yang sama dari satu akun pertukaran, atau BTC dan ETH dari satu akun pertukaran lain. Perhatikan bahwa akun berbeda dari satu pertukaran juga dapat ditambahkan pada saat yang sama, yang didasarkan pada label yang ditambahkan ke situs web FMZ.exchangesArray yang ditambahkan sesuai dengan urutan penciptaan disk adalahexchanges[0]、exchanges[1]...dan sebagainya. Format transaksi adalah sebagai berikut:BTC_USDTBitcoin (BTC) adalah mata uang yang diperdagangkan, sedangkan USDT adalah mata uang yang diperdagangkan.
Jelas, jika kita memiliki banyak pasangan transaksi, cara ini akan sangat merepotkan, dan kita dapat menggunakan SetCurrency untuk menukar pasangan transaksi, sepertiexchange.SetCurrency("BTC_USDT")Saat ini,exchangePasangan transaksi yang terikat akan menjadiBTC_USDTPada tanggal 1 Juli, para pedagang akan menerima surat dari bank yang akan ditukarkan kepada mereka.Perhatikan pengetesan terbaru yang mendukung pertukaran pasangan transaksiDi bawah ini adalah contohnya.
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)
}
}
Akses ke antarmuka publik
Seperti contoh di atas, antarmuka perdagangan umumnya adalah antarmuka publik, yang dapat diakses oleh semua orang. Antarmuka perdagangan biasa memiliki: mendapatkan ticker perdagangan, mendapatkan kedalaman kedalaman, mendapatkan K line records, mendapatkan catatan transaksi trades.
Setiap antarmuka biasanya memilikiInfoBidang, yang mewakili string data asli yang dikembalikan oleh bursa, dapat digunakan untuk melengkapi informasi tambahan yang sebelumnya perlu diuraikan, menggunakan JavaScriptJSON.parse()Python menggunakan json.TimeBidang ini menunjukkan waktu yang dibutuhkan untuk membuat permintaan, yang dapat digunakan untuk menilai keterlambatan.
Akses yang gagal dan kembali menggunakan antarmuka API di hard disknullPython KembaliNone, yang menggunakan data tersebut akan membuat kesalahan dan menyebabkan disk berhenti, sehingga toleransi kesalahan sangat penting.
GetTicker
Dapatkan tren pasar saat ini, mungkin adalah antarmuka yang paling umum digunakan, Anda dapat melihat harga transaksi terakhir, harga jual beli, volume transaksi terbaru, dan lain-lain. Anda dapat menentukan harga transaksi berdasarkan informasi ticker sebelum melakukan pemesanan.{"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 。可以看到具体的结果。
Log('上次成交价: ',ticker.Last, '买一价: ', ticker.Buy)
}
GetDepth
Dapatkan informasi kedalaman daftar gantung. Meskipun GetTicker berisi daftar beli dan jual, tetapi jika ingin menelusuri lebih dalam, Anda dapat menggunakan antarmuka ini, biasanya dapat melihat ke 200 daftar gantung berikutnya. Anda dapat menggunakan antarmuka ini untuk menghitung harga dampak. Berikut adalah hasil yang benar.
{
"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 Deep Access untuk pembelian dan penjualan:
function main() {
var depth = exchange.GetDepth()
Log('买一价个: ', depth.Bids[0].Price, '卖一价格: ', depth.Asks[0].Price)
}
GetRecords
Dapatkan K-line, salah satu antarmuka yang paling umum digunakan, yang dapat mengembalikan informasi harga yang lebih lama sekaligus, untuk menghitung berbagai indikator dasar. Periode K-line tidak dapat ditentukan jika tidak ditentukan menunjukkan siklus default yang akan digunakan saat menambahkan disk.
**exchange.SetMaxBarLen(Len)Anda dapat mengatur jumlah pertama kali Anda akan mendapatkan K-line (disokong oleh beberapa bursa) dan Anda dapat mengatur jumlah maksimum K-line (disokong oleh beberapa bursa).**Misalnya:exchange.SetMaxBarLen(500)
GetRecords dapat menentukan periode: PERIOD_M1:1 menit, PERIOD_M5:5 menit, PERIOD_M15:15 menit, PERIOD_M30:30 menit, PERIOD_H1:1 jam, PERIOD_D1:1 hari.exchange.GetRecords(PERIOD_M1)Setelah meng-upgrade host terbaru, akan mendukung siklus kustom, siklus detik langsung ditransmisikan sebagai parameter, kustom tingkat menit akan disintesis berdasarkan 1 menit K-line, K-line di bawah 1 menit disintesis melalui GetTrades (), komoditas berjangka akan disintesis berdasarkan tick,Perhatikan bahwa dalam tutorial ini kita akan menemukan hal serupa.PERIOD_M1Variabel ini adalah variabel global default FMZ, dan pengguna yang tertarik dapat log sendiri nilai spesifiknya.
Contoh data yang dikembalikan:
[
{"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 garis K iterasi:
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
Untuk mendapatkan data transaksi dalam jangka waktu tertentu (bukan data transaksi Anda sendiri), beberapa bursa tidak mendukung. Lebih jarang digunakan, Anda dapat menelusuri dokumen API untuk informasi lebih lanjut.
Mendapatkan Akun untuk Berdagang
Karena interface ini terkait dengan akun, dan tidak dapat diakses secara langsung, Anda perlu menggunakan tanda tangan API-KEY. Platform FMZ telah diintegrasikan secara otomatis di belakang dan dapat digunakan secara langsung.
Dapatkan akun
Mendapatkan informasi akun. Salah satu antarmuka yang paling umum digunakan, dan harus dipanggil sebelum melakukan pemesanan, untuk menghindari saldo yang tidak mencukupi. Hasil yang dikembalikan adalah:{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}Stok adalah saldo yang tersedia dalam mata uang yang diperdagangkan, stok beku adalah saldo yang dibekukan untuk pesanan yang belum terlaksana, saldo adalah saldo yang tersedia dalam mata uang yang diperdagangkan, dan saldo beku adalah saldo yang dibekukan. Jika pasangan diperdagangkanBTC_USDTStok adalah BTC, dan saldo adalah USDT.
Perhatikan bahwa hasil yang dikembalikan adalah hasil dari pasangan transaksi yang ditentukan, informasi dari mata uang lain dalam akun transaksi berada di bidang Info, dan operasi beberapa pasangan transaksi tidak perlu dipanggil berkali-kali.
Sebuah disk yang terus menerus mencetak nilai total transaksi pasangan 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
}
}
Buy, beli di bawah
Berikut ini adalah cara untuk melakukan panggilan:exchange.Buy(Price, Amount)atauexchange.Buy(Price, Amount, Msg)Price adalah harga, Amount adalah jumlah, dan Msg adalah string tambahan yang dapat ditampilkan dalam log disk, tetapi tidak wajib. Cara ini adalah pending order. Jika tidak dapat segera diselesaikan, maka akan menghasilkan order yang belum diselesaikan.null, untuk memeriksa status pesanan.
Jika Anda ingin membeli harga di bawah harga pasar, harga adalah 1, dan jumlah adalah nilai pesanan, sepertiexchange.Buy(-1, 0.5)Transaksi adalah benar.ETH_BTC, yang mewakili harga pasar untuk membeli ETH sebesar 0.5BTC. Beberapa bursa tidak mendukung harga pasar, dan juga tidak mendukung pengembalian berjangka.
Semua harga dan kuantitas untuk transaksi parsial yang tersedia_N()Fungsi presisi untuk mengendalikan. Untuk perdagangan berjangka, Buy dan Sell memiliki makna tambahan, yang akan dibahas secara terpisah.
Contoh dari pembelian dengan harga yang sama:
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')
}
Jual dan jual
Daftar harga jual ◦ Parameter sama dengan Buy ◦ Daftar harga pasar memiliki makna parameter yang berbeda, Daftar harga pasar sepertiexchange.Sell(-1, 0.2), mewakili harga pasar untuk dijual 0,2 ETH.
GetOrder untuk mendapatkan pesanan
Dapatkan informasi pesanan berdasarkan order id. Antarmuka umum, cara memanggilexchange.GetOrder(OrderId),OrderId adalah id pesanan, yang akan dikembalikan saat pesanan dibuat.**Perhatikan tipe pesananTypeBidang dan status pesananStatusNilai sebenarnya adalah angka, yang mewakili makna yang berbeda, tetapi tidak menguntungkan memori, FMZ mewakili nilai-nilai ini dengan konstanta global, seperti yang terjadi pada pesanan yang belum selesai.StatusJadi, jika saya katakan bahwa nilai dari x adalah 0, itu sama denganORDER_STATE_PENDINGSemua konstanta global ini dapat dilihat di dokumentasi.**◦ Mengembalikan hasil:
{
"Id":125723661, //订单id
"Amount":0.01, //订单数量
"Price":7000, //订单价格
"DealAmount":0, //已成交数量
"AvgPrice":0, //成交均价
"Status":0, // 0:未完全成交, 1:已成交, 2:已撤单
"Type":1,// 订单类型,0:买单, 1:卖单
"ContractType":"",//合约类型,用于期货交易
"Info":{} //交易所返回原始信息
}
}
Strategi untuk membeli sejumlah koin:
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){ //这里也可以用 status == ORDER_STATE_PENDING 来判断。
exchange.CancelOrder(id)
}
}
}
}
GetOrders belum menerima pesanan
Dapatkan transaksi saat ini untuk semua daftar pesanan yang belum terjual. Jika tidak ada pesanan yang belum terjual, kembalikan array kosong. Hasil dari daftar pesanan tertentu seperti GetOrder.
Contoh untuk membatalkan transaksi saat ini untuk semua pesanan:
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)
}
}
CancelOrder (Menghapus Pesanan)
Pembatalan berdasarkan pesanan idexchange.CancelOrder(OrderId)❚ Undo berhasil mengembalikan true, jika tidak, mengembalikan false。 Perhatikan bahwa pesanan telah selesai akan membatalkan kegagalan。
Kontrak berjangka dan abadi
Perdagangan berjangka mata uang digital dan perdagangan tunai sedikit berbeda, fungsi perdagangan berjangka di atas juga berlaku untuk perdagangan berjangka, perdagangan berjangka tunggal memiliki fungsi eksklusif. Sebelum melakukan perdagangan berjangka mata uang digital berjangka, Anda harus terbiasa dengan operasi manual di situs web, memahami konsep dasar, seperti konsep open position, low position, full position, low position, leverage, low position loss, floating income, dan margin, serta rumus perhitungan yang sesuai.
Kontrak berjangka (permanent contract) mirip dengan kontrak berjangka (future contract), tetapi tidak memiliki konsep kepemilikan kosong pada saat yang sama.
Jika sebuah bursa mendukung futures dan spot, seperti OKEX dan Huobi futures, perlu untuk memilih secara terpisah di antarmuka bursa untuk menambahkan OKEX futures dan Huobi futures, yang dianggap sebagai bursa yang berbeda di FMZ.
SetContractType Mengatur kontrak
Langkah pertama dalam perdagangan berjangka adalah mengatur kontrak yang akan diperdagangkan, dengan OKEX futures sebagai contoh, pilih pasangan perdagangan BTC saat membuat cakram atau retrospeksi, juga perlu disetel dalam kode kontrak mingguan, mingguan atau kuartal. Jika tidak disetel akan dimintainvalid contract type。**Berbeda dengan pasangan mata uang, kontrak berjangka sering kali dijamin dengan mata uang yang diperdagangkan seperti BTC. Pasangan yang ditambahkan BTC biasanya mewakili pasangan BTC_USD yang dijamin dengan BTC. Jika ada futures yang dijamin dengan USDT, Anda perlu membuat pasangan BTC_USDT yang ditambahkan secara fisik.**Setelah mengatur pasangan transaksi, Anda juga harus mengatur jenis kontrak tertentu, seperti permanen, mingguan, mingguan, dan lain-lain. Setelah mengatur kontrak, Anda dapat melakukan operasi seperti membeli dan menjual.
Kontrak yang ada di Coinbase dan USDT, seperti Binance, OKEX, HuobiDM, dan lain-lain, perlu dibedakan saat menambahkan kontrak pengaturan hard disk. Pengaturan spesifiknya adalah sebagai berikut.
//OKEX期货
exchange.SetContractType("swap") // 设置为永续合约
exchange.SetContractType("this_week") // 设置为当周合约
exchange.SetContractType("next_week") // 设置为次周合约
exchange.SetContractType("quarter") // 设置为季度合约
//HuobiDM
exchange.SetContractType("this_week") // 设置为当周合约
exchange.SetContractType("next_week") // 设置为次周合约
exchange.SetContractType("quarter") // 设置为季度合约
exchange.SetContractType("swap") // 设置为永续合约
//币安期货
exchange.SetContractType("swap") // 设置为永续合约,注意币本位和USDT本位都存在永续
exchange.SetContractType("quarter") // 设置为当季合约
exchange.SetContractType("next_quarter") // 设置为次季合约
//BitMEX
exchange.SetContractType("XBTUSD") // 设置为永续合约
exchange.SetContractType("XBTM19") // 具体某个时间结算的合约,详情登录BitMEX查询各个合约代码
//GateIO
exchange.SetContractType("swap") // 设置为永续合约,不设置默认为swap永续合约。
//Deribit
exchange.SetContractType("BTC-27APR18") // 具体某个时间结算的合约,详情参看Deribit官网。
GetPosition memegang posisi
Dapatkan daftar informasi kepemilikan saat ini, OKEX(OKCOIN) berjangka dapat ditransfer ke parameter yang menentukan jenis kontrak yang ingin diperoleh. Jika tidak ada kepemilikan, kembali ke daftar kosong[]Informasi yang dikembalikan adalah sebagai berikut, banyak informasi spesifik yang perlu digabungkan dengan analisis spesifik transaksi.
| Jenis data | Nama variabel | menjelaskan |
|---|
"Object HDI Info HDI Exchange" dikembalikan oleh struktur asli
"Number", "Margin Level", "Bar Size", "OKCoin", "10" atau "20", "OK Futures", "Fixed 10" karena tidak didukung oleh API asli.
"Amount" adalah jumlah yang dimiliki, dan "OKCoin" adalah jumlah kontrak yang dimiliki.
"Jumlah yang dibekukan"
"Nomer dan Harga dan Harga Rata-rata".
"Nomer Margin Margin" "Membekukan jaminan"
[number]Profit[/number] Futures: Holding loss, digital currency: ((unit mata uang digital: BTC/LTC, unit futures tradisional: RMB, catatan: OKCoin futures menunjukkan kelangsungan dalam keadaan penuh, bukan kehilangan, penurunan posisi menunjukkan kerugian)
"const" type "PD_LONG" untuk posisi teratas, "closesell" untuk posisi teratas, "PD_SHORT" untuk posisi teratas, "closesell" untuk posisi teratas, "PD_LONG_YD" untuk posisi teratas, "closebuy" untuk posisi teratas, "PD_SHORT_YD" untuk posisi teratas, "closesell" untuk posisi teratas, dan "PD_SHORT_YD" untuk posisi teratas, "closesell" untuk posisi teratas.
String arrayContractTypeString arrayFutures adalah kode kontrak, saham adalah kode bursa _ saham kode kolom, parameter spesifik SetContractType
function main(){
exchange.SetContractType("this_week");
var position = exchange.GetPosition();
if(position.length>0){ //特别要注意引用前要先判断position长度再引用,否则会出错
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)
}
}
Futures open and close position (Pembukaan dan penutupan posisi berjangka)
Pertama, Anda harus mengatur ukuran lever dan cara memanggilnya:exchange.SetMarginLevel(10)10 adalah 10 kali lipat dari leverage, dan ukuran leverage yang didukung secara spesifik dapat dilihat di bursa yang sesuai.Perhatikan bahwa leverage harus diatur di bursa, dan kode harus sesuai dengan pengaturan bursa, jika tidak, akan terjadi kesalahan│ atau tidak diatur, menggunakan tuas default│
Kemudian, setel arah transaksi dan cara memanggilnya:exchange.SetDirection(Direction) "Saya tidak tahu apa-apa tentang itu", katanya.**Berbeda dengan futures, jika kontrak perpetual tidak memiliki konsep simultaneous holding, yaitu tidak memungkinkan untuk memegang posisi tunggal, melakukan open-out akan secara otomatis melonggarkan posisi, semua hanya perlu diaturbuyDansellTersedia. Dibutuhkan pengaturan jika mendukung posisi dua arahclosebuy,closebuy。**Hubungan khusus:
| Operasi | SetDirection parameter | Fungsi perintah bawah |
|---|---|---|
| Memulai Posisi | exchange.SetDirection("buy") | exchange.Buy() |
| Pengadaan barang | exchange.SetDirection("closebuy") | exchange.Sell() |
| Posisi kosong | exchange.SetDirection("sell") | exchange.Sell() |
| Posisi kosong | exchange.SetDirection("closesell") | exchange.Buy() |
Terakhir adalah kode open position dan close position yang spesifik, jumlah pesanan yang berbeda dari satu bursa ke bursa lainnya, seperti huobi futures adalah berdasarkan jumlah transaksi, satu transaksi $ 100. Perhatikan bahwa pengembalian opsi berjangka tidak mendukung harga pasar.
function main(){
exchange.SetContractType("this_week") // 举例设置 为OKEX期货 当周合约
price = exchange.GetTicker().Last
exchange.SetMarginLevel(10) //设置杠杆为10倍
exchange.SetDirection("buy") //设置下单类型为做多
exchange.Buy(price+10, 20) // 合约数量为20下单
pos = exchange.GetPosition()
Log(pos)
Log(exchange.GetOrders()) //查看是否有未成交订单
exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")
exchange.Sell(price-10, 20)
}
Berikut ini adalah contoh dari strategi yang spesifik untuk posisi kosong penuh.
function main(){
while(true){
var pos = exchange.GetPosition()
var ticker = exchange.GetTicekr()
if(!ticker){
Log('无法获取ticker')
return
}
if(!pos || pos.length == 0 ){
Log('已无持仓')
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)
}
}
}
}
Leverage trading dalam mata uang digital
Pertukaran ke akun leverage harus dilakukan dalam kode, yang lainnya sama dengan transaksi tunai.
Menggunakan exchange.IO (("trade_margin") untuk beralih ke mode akun sidik jari, untuk memesan dan mendapatkan aset akun akan mengakses antarmuka leverage di bursa.
Menggunakan exchange.IO (("trade_normal") untuk beralih kembali ke mode akun biasa.
Bursa yang didukung:
- OKEX V3: Model akun leverage berbeda dari yang biasa, beberapa pasangan mungkin tidak.
- Bitcoin: Model akun leverage berbeda dengan pasangan normal, beberapa pasangan mungkin tidak.
- ZB: Dana hanya dapat ditransfer sebagai QC, platform perdagangan leverage, independen dana antara pasangan yang berbeda, yaitu jumlah koin QC di bawah pasangan perdagangan ETH_QC, tidak terlihat di BTC_QC
- FCoin
- Binance (Binance)
Komoditas berjangka
Perdagangan berjangka komoditas dan perdagangan berjangka mata uang digital memiliki perbedaan besar. Pertama-tama, waktu perdagangan berjangka komoditas sangat singkat, perdagangan mata uang digital 24 jam; protokol berjangka komoditas juga bukan REST API yang umum digunakan; frekuensi perdagangan berjangka komoditas dan pembatasan jumlah pesanan, sedangkan mata uang digital sangat longgar, dll.
FMZ Quantitative Platform sebagai penyedia perdagangan program yang telah mengajukan lisensi perangkat lunak ke berbagai layanan berjangka, pengguna dapat menggunakan tanpa mengajukan permohonan langsung, dan dapat melihat daftar aplikasi yang telah diajukan oleh FMZ dalam penelusuran berjangka yang ditambahkan. Referensi khusus: https://www.fmz.com/bbs-topic/3860 ❚ Jika pedagang berjangka Anda tidak lagi terdaftar, hanya dapat mengajukan diri, atau kembali mendukung pembuka perdagangan, biasanya membutuhkan 2 hari.
Karena keunggulan arsitektur platform FMZ, pengguna juga dapat menambahkan beberapa akun pedagang berjangka, dan mencapai beberapa fungsi yang tidak dapat dilakukan oleh perangkat lunak perdagangan berjangka komoditas lainnya, seperti sintesis tick frekuensi tinggi, lihat: https://www.fmz.com/bbs-topic/1184
Kerangka Kebijakan
Pertama, karena tidak ada transaksi 24 jam dan memerlukan operasi login, status tautan perlu dinilai sebelum melakukan transaksi.exchange.IO("status")untuktrueJika tidak berhasil login, tidak diminta 'not login'. Anda dapat tidur setelah strategi dimulai, memberikan waktu tertentu untuk login. Anda juga dapat mencoba ulang langganan._C(exchange.SetContractType,"MA888")Ini adalah salah satu cara untuk memastikan pendaratan yang sukses.
Kode untuk mendapatkan dan melakukan transaksi untuk komoditas berjangka adalah sama dengan untuk mata uang digital berjangka. Di sini kami akan menjelaskan perbedaan dan perlu diperhatikan.
function main(){
_C(exchange.SetContractType,"MA888") //没登陆成功是无法订阅合约的,最好重试一下
while(true){
if(exchange.IO("status")){
var ticker = exchange.GetTicker()
Log("MA888 ticker:", ticker)
LogStatus(_D(), "已经连接CTP !")//_D获取事件
} else {
LogStatus(_D(), "未连接CTP !")
Sleep(1000)
}
}
}
Disarankan untuk menggunakan perdagangan berjangka komoditas (dijelaskan di bawah), karena kode akan sangat sederhana dan tidak perlu menangani detail yang rumit.
function main() {
// 使用了商品期货类库的CTA策略框架
$.CTA(Symbols, function(st) {
var r = st.records
var mp = st.position.amount
var symbol = st.symbol
/*
r为K线, mp为当前品种持仓数量, 正数指多仓, 负数指空仓, 0则不持仓, symbol指品种名称
返回值如为n:
n = 0 : 指全部平仓(不管当前持多持空)
n > 0 : 如果当前持多仓,则加n个多仓, 如果当前为空仓则平n个空仓,如果n大于当前持仓, 则反手开多仓
n < 0 : 如果当前持空仓,则加n个空仓, 如果当前为多仓则平n个多仓,如果-n大于当前持仓, 则反手开空仓
无返回值表示什么也不做
*/
if (r.length < SlowPeriod) {
return
}
var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
if (mp <= 0 && cross > ConfirmPeriod) {
Log(symbol, "金叉周期", cross, "当前持仓", mp);
return Lots * (mp < 0 ? 2 : 1)
} else if (mp >= 0 && cross < -ConfirmPeriod) {
Log(symbol, "死叉周期", cross, "当前持仓", mp);
return -Lots * (mp > 0 ? 2 : 1)
}
});
}
Modus pengambilan data CTP
Komoditas berjangka menggunakan protokol CTP, semua perdagangan dan transaksi pesanan hanya akan diberitahu setelah ada perubahan, sedangkan permintaan pesanan, akun, dan posisi adalah permintaan aktif. Oleh karena itu, cocok untuk menulis strategi frekuensi tinggi yang didorong oleh peristiwa.GetTicker、GetDepth、GetRecordsSemua data yang disimpan dalam cache untuk mendapatkan data terbaru, jika tidak ada data akan terus menunggu data yang ada, sehingga strategi dapat tidak menggunakan tidur. Ketika ada perubahan situasi, ticker, kedalaman, catatan akan diperbarui, pada saat ini memanggil salah satu antarmuka yang arbitrer akan segera kembali, yang dipanggil antarmuka status yang telah dipanggil ditempatkan dalam mode menunggu pembaruan, berikutnya memanggil antarmuka yang sama, akan menunggu data baru kembali. Beberapa kasus penghentian pintu dingin atau jatuhnya kontrak akan terjadi untuk waktu yang lama tidak ada transaksi, ini adalah strategi yang ditandai untuk waktu yang lama juga normal.
Jika Anda ingin mendapatkan data setiap kali Anda mengambil sesuatu, bahkan data lama, Anda dapat beralih ke mode update langsung.exchange.IO("mode", 0)Strategi tidak dapat ditulis sebagai event-driven, dan perlu ditambahkan sebuah SLeep event, untuk menghindari quick dead cycle. Beberapa strategi dengan frekuensi rendah dapat menggunakan mode ini, dan strategi ini dirancang sederhana.exchange.IO("mode", 1)Anda dapat memutar kembali mode cache default.
Dalam mengoperasikan kontrak tunggal, menggunakan mode default adalah mungkin. Tetapi jika beberapa kontrak, mungkin satu kontrak tidak diperbarui, menyebabkan mendapatkan pemblokiran antarmuka transaksi, dan pembaruan transaksi kontrak lainnya tidak dapat diperoleh. Untuk mengatasi masalah ini, Anda dapat menggunakan mode pembaruan segera, tetapi tanpa menulis strategi frekuensi tinggi.exchange.IO("wait")Jika Anda menambahkan lebih dari satu objek bursa, yang jarang terjadi dalam komoditas berjangka, Anda dapat menggunakanexchange.IO("wait_any")Pada saat ini, indeks yang dikembalikan akan menunjukkan indeks yang dikembalikan.
Tick yang diupload oleh:{Event:"tick", Index:交易所索引(按实盘上交易所添加顺序), Nano:事件纳秒级时间, Symbol:合约名称}
Pesanan dikirim: {Event:"order", Index:交易所索引, Nano:事件纳秒级时间, Order:订单信息(与GetOrder获取一致)}
Pada titik 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")){ //判断链接状态
exchange.IO("mode", 0)
_C(exchange.SetContractType, "MA888")//订阅MA,只有第一次是真正的发出订阅请求,接下来都是程序切换,不耗时间。
_C(exchange.SetContractType, "rb888")//订阅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)
}
}
}
Perbedaan antara komoditas berjangka dengan mata uang digital
Selain itu, perhatikan perbedaan antara komoditas berjangka dengan bursa mata uang digital. Misalnya, GetDepth sebenarnya hanya memiliki satu tingkat kedalaman (biaya 5 tingkat kedalaman mahal), dan GetTrades tidak dapat memperoleh riwayat transaksi (semua didasarkan pada simulasi perubahan kepemilikan, tidak ada catatan transaksi nyata).
Menetapkan kontrak
exchange.IO (("instruments"): mengembalikan daftar semua kontrak di exchange (nama kontrak: detail) dalam bentuk kamus, hanya mendukung hard disk.
exchange.IO (("products"): mengembalikan semua daftar produk di exchange dalam bentuk kamus, hanya mendukung hard disk.
exchange.IO (("subscribed"): mengembalikan kontrak yang telah berlangganan, dalam format yang sama, hanya mendukung hard disk.
Tradisional CTP futuresContractTypeIni adalah kontrak ID, yang dibedakan dengan huruf besar dan kecil.exchange.SetContractType("au1506")❚ Konfigurasi kontrak berhasil dan kembali ke kontrak detail, seperti jumlah minimum pembelian, biaya, waktu pengiriman, dll. ❚ Ketika berlangganan beberapa kontrak, hanya yang pertama adalah benar-benar mengirim permintaan berlangganan, dan kemudian hanya beralih pasangan transaksi di tingkat kode, tidak memakan waktu. Kontrak berturut-turut utama adalah kode 888 seperti MA888, kontrak indeks berturut-turut adalah 000 seperti MA000, 888 dan 000 hanya mendukung pengembalian untuk perdagangan kontrak virtual, disk fisik hanya mendukung pengambilan.Namun bahasa Mac dapat mengoperasikan kontrak dominan, program akan secara otomatis mengganti posisi, yaitu menghapuskan posisi yang tidak dominan, dan membuka posisi baru di posisi dominan.
Tidak berhasil login tidak dapat mengatur kontrak, tetapi juga akan segera kembali, jadi Anda dapat mencoba lagi dengan _C, mengetahui bahwa login CTP selesai. Setelah login berhasil, mengatur kembali kontrak tidak memakan waktu dan tidak akan menghasilkan akses jaringan yang sebenarnya.
Peningkatan posisi
SetDirectionAnda bisa mendapatkanbuy, closebuy, sell, closesellEmpat parameter, lebih banyak komoditas berjangkaclosebuy_todayDanclosesell_today"Saya tidak tahu apa-apa tentang itu.closebuy/closesellUntuk setara kemarin, hanya varietas di masa lalu yang dibedakan menjadi setara sekarang dan kemarin, yang dapat mempengaruhi biaya proses, sehingga perlu prioritas setara kemarin. Untuk CTP berjangka tradisional, Anda dapat mengatur parameter kedua 1 atau 2 atau 3, yang masing-masing menunjuk pada spekulasi, keuntungan, dan tidak mengatur spekulasi default.Operasi tertentu seperti membeli dan menjual, mendapatkan posisi, mendapatkan pesanan, menarik tagihan, dan mendapatkan akun sama dengan transaksi futures mata uang digital, lihat bab sebelumnya.
| Operasi | SetDirection parameter | Fungsi perintah bawah |
|---|---|---|
| Memulai Posisi | exchange.SetDirection("buy") | exchange.Buy() |
| Pengadaan barang | exchange.SetDirection("closebuy") | exchange.Sell() |
| Posisi kosong | exchange.SetDirection("sell") | exchange.Sell() |
| Posisi kosong | exchange.SetDirection("closesell") | exchange.Buy() |
Contoh di bawah ini adalah fungsi posisi kosong yang spesifik, perhatikan bahwa contoh ini terlalu sederhana, juga perlu mempertimbangkan apakah dalam waktu perdagangan, belum sepenuhnya bertransaksi bagaimana melakukan tes berat, berapa jumlah pesanan maksimum, apakah frekuensi terlalu tinggi, khususnya harga laba atau shorting dan lain-lain.**Untuk membuka gudang disk disarankan untuk menggunakan platform yang terbungkus dengan perpustakaan kelas, https://www.fmz.com/strategy/12961**。 Pada bagian perpustakaan kelas akan dijelaskan secara lebih rinci, dan juga disarankan untuk mempelajari kode sumber perpustakaan kelas。
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 ? "平今" : "平昨", '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 ? "平今" : "平昨", 'Ask', depth.Asks[0]);
}
}
}
Komoditas berjangka mendukung tipe pesanan kustom (mendukung solid disk, retrospektif tidak didukung), kemudian ditentukan dengan cara penangkapan, ditambahkan dalam penangkapan_Bagian belakang seperti ini
exchange.SetDirection("buy_ioc");
exchange.SetDirection("sell_gtd-20170111")
Pengucapan dari kata <unk> <unk> <unk> dalam bahasa Indonesia
- ioc selesai segera, atau membatalkan THOST_FTDC_TC_IOC
- gfs Bagian ini valid THOST_FTDC_TC_GFS
- gfd berlaku pada hari itu THOST_FTDC_TC_GFD
- gtd berlaku sebelum tanggal yang ditentukan THOST_FTDC_TC_GTD
- gtc berlaku sebelum dicabut THOST_FTDC_TC_GTC
- gfa Set bid valid THOST_FTDC_TC_GFA
Antarmuka yang mudah
Secara default, yang terbuka di CTP adalah antarmuka CTP, yang dapat diubah menjadi antarmuka ETF jika diminta. Dengan paket FMZ, cara memanggilnya sama. Perbedaannya adalah bahwa akun, pesanan, dan penyimpanan adalah mode push, sehingga administrator akan memelihara data ini secara lokal, yang akan segera dikembalikan saat memanggil antarmuka yang sesuai, dan tidak akan benar-benar mengirim permintaan.
Jenis pesanan yang disesuaikan dengan protokol IFSC adalah sebagai berikut:
- gfd berlaku saat ini TAPI_ORDER_TIMEINFORCE_GFD
- TAPI_ORDER_TIMEINFORCE_GTC valid sebelum dibatalkan
- TAPI_ORDER_TIMEINFORCE_GTD valid sebelum tanggal yang ditentukan
- Fak sebagian terjual, sisa dibatalkan TAPI_ORDER_TIMEINFORCE_FAK
- ioc segera selesai, atau membatalkan TAPI_ORDER_TIMEINFORCE_FAK
- Fok gagal melakukan transaksi penuh, semuanya dibatalkan TAPI_ORDER_TIMEINFORCE_FOK
Fungsi global umum
Log Log dan Pemasaran WeChat
Log sebuah log pada antarmuka disk solid, setelah string ditambah @ karakter, maka pesan akan masuk ke antrean push, dan akan langsung push setelah mengikat WeChat atau telegram.Log('推送到微信@')
Warna log juga bisa disesuaikanLog('这是一个红色字体的日志 #ff0000') 。#ff000016 digit untuk warna RGB
Semua file log ada di dalam database sqlit yang tersimpan di direktori host, dapat diunduh dan dibuka dengan perangkat lunak database, atau dapat digunakan untuk menyalin pemulihan cadangan (nama database dan id disk yang sama).
LogProfit mencetak pendapatan
Catat keuntungan, dan gambarkan keuntungan pada layar disk, yang dapat disimpan setelah disk restart.LogProfit(1000)Perhatikan.LogProfitParameter yang tidak harus menjadi keuntungan, bisa berupa angka apa pun, perlu diisi sendiri.
LogStatus menampilkan tab status (termasuk tabel)
Status hard disk, karena log akan disimpan terlebih dahulu dan terus diperbarui, dapat digunakan jika hanya perlu menampilkan informasi yang tidak disimpanLogStatusfungsi.LogStatusParameter adalah string, yang juga dapat digunakan untuk mewakili informasi tabel.
Contoh tabel yang menunjukkan status disk lokal:
var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]};
LogStatus('`' + JSON.stringify(table) + '`'); // JSON序列化后两边加上`字符, 视为一个复杂消息格式(当前支持表格)
LogStatus('第一行消息\n`' + JSON.stringify(table) + '`\n第三行消息'); // 表格信息也可以在多行中出现
LogStatus('`' + JSON.stringify([table, table]) + '`'); // 支持多个表格同时显示, 将以TAB显示到一组里
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // 上下排列显示多个表
Tidur
Parameter adalah milidetik, sepertiSleep(1000)Satu detik untuk beristirahat. Karena semua transaksi dibatasi pada frekuensi akses, strategi umum adalah untuk memasukkan waktu beristirahat dalam lingkaran mati.
_G Menyimpan data
Setelah hard disk restart, program akan dimulai lagi, dan jika Anda ingin menyimpan informasi yang bersifat permanen, Anda dapat mengklik tombol "Save"._GIni sangat praktis dan mudah digunakan untuk menyimpan konten JSON._GFungsi ditulis dalamonexit()Dalam hal ini, setiap kali Anda menghentikan strategi, Anda akan secara otomatis menyimpan informasi yang Anda butuhkan.
Jika Anda ingin menyimpan lebih banyak data dalam format yang lebih baik, Anda bisa menggunakan aplikasi ini._Fungsi G tidak terlalu banyak digunakan, tetapi dapat ditulis langsung ke database menggunakan Python.
function onexit(){
_G('profit', profit)
}
function main(){
_G("num", 1); // 设置一个全局变量num, 值为1 s
_G("num", "ok"); // 更改一个全局变量num, 值为字符串ok
_G("num", null); // 删除全局变量 num
_G("num"); // 返回全局变量num的值,如果不存在返回null
var profit = 0
if(_G('profit')){
profit = _G('profit')
}
}
_Fungsi presisi N
Saat melakukan pemesanan, seringkali untuk mengontrol harga dan akurasi kuantitas, FMZ memiliki fungsi built-in N untuk menentukan digit titik kecil yang disimpan, seperti_N(4.253,2)Hasilnya adalah 4,25.
_C Uji ulang otomatis
Aplikasi ini memiliki beberapa fitur yang dapat Anda gunakan untuk mengakses aplikasi ini._C adalah sebuah fungsi yang mencoba ulang secara otomatis. Akan terus memanggil fungsi yang ditentukan sampai berhasil kembali (jika fungsi yang dikembalikan null atau false akan mencoba ulang), misalnya_C(exchange.GetTicker)Untuk mengontrol interval ulangan, Anda dapat menggunakan fungsi_CDelay, misalnya_CDelay(1000), yang berarti mengubah interval ulangan fungsi_C menjadi 1 detik.GetTicker(),exchange.GetDepth,GetTrade,GetRecords,GetAccount,GetOrders, GetOrderSemua menggunakan C_error tolerance, untuk mencegah kegagalan akses yang menyebabkan program terganggu.
CancelOrderTidak dapat menggunakan fungsi_C, karena kegagalan penarikan ada berbagai alasan, jika satu unit telah bertransaksi, maka penarikan akan kembali gagal, menggunakan fungsi_C akan menyebabkan terus mencoba kembali.
_Fungsi C juga dapat dipasangkan ke dalam argumen, juga digunakan dalam fungsi kustom.
function main(){
var ticker = _C(exchange.GetTicker)
var depth = _C(exchange.GetDepth)
var records = _C(exchange.GetRecords, PERIOD_D1) //传入参数
}
_D fungsi tanggal
Panggilan langsung_D()Mengembalikan string waktu saat ini, seperti:2019-08-15 03:46:14。 Jika dipanggil dalam pengembalian, waktu pengembalian akan dikembalikan. 。 Anda dapat menggunakan fungsi _D untuk menentukan waktu, seperti: _D().slice(11) > '09:00:00':
_D(timestamp,fmt), maka akan mengubah ms ke string waktu, seperti_D(1565855310002)Fmt adalah format waktu, defaultyyyy-MM-dd hh:mm:ss
Fungsi indikator TA
Untuk beberapa fungsi indikator yang umum digunakan, seperti MA\MACD\KDJ\BOLL dan indikator yang umum digunakan, platform FMZ dibangun secara langsung, indikator yang didukung secara spesifik dapat dilihat dalam dokumentasi API.
Sebelum menggunakan fungsi indikator, sebaiknya dinilai panjang garis K. Apabila panjang garis K sebelumnya tidak memenuhi siklus yang dibutuhkan untuk perhitungan, hasilnya adalahnull。 Jika panjang K input adalah 100 dan perhitungan periodik MA adalah 10, maka 9 nilai pertama adalah nol, kemudian dihitung secara normal。
JavaScript juga mendukung talib lengkap, sebagai dukungan dari perpustakaan pihak ketiga, sepertitalib.CCI(records)。 Referensi http://ta-lib.org/function.html 。 Untuk Python dapat menginstal sendiri perpustakaan talib, karena perlu dikompilasi, tidak dapat dengan mudah menggunakan pipa untuk menginstal, dapat mencari sendiri cara penginstalan。
Fungsi Pointer dapat ditransfer ke dalam Array Arbitrary selain K-Line data
function main(){
var records = exchange.GetRecords(PERIOD_M30)
if (records && records.length > 9) {
var ma = TA.MA(records, 14)
Log(ma)
}
}
Fungsi umum JavaScript
Berikut ini adalah beberapa fungsi JavaScript yang sering digunakan di desktop.
Date.now()Kembali ke tanda waktu saat iniparseFloat()Mengubah string menjadi angka, sepertiparseFloat("123.21")parseInt()Ubah string menjadi bilangan bulatnum.toString()Mengubah angka menjadi string, num menjadi variabel angkaJSON.parse()Format string Json, sepertiJSON.parse(exchange.GetRawJSON())- Fungsi Math library JavaScript seperti berikut:
Math.max(),Math.abs()Operasi matematika yang umum digunakan, referensi: https://www.w3school.com.cn/jsref/jsref_obj_math.asp - Perpustakaan matematika pihak ketiga JavaScript yang dikutip FMZ, referensi: https://mathjs.org/
- FMZ mengacu pada JavaScript 3rd-party underscore library, yang disarankan untuk dipelajari, memudahkan banyak operasi Js yang rumit, lihat: https://underscorejs.org/
Perpustakaan Template
Ada banyak hal yang perlu dipertimbangkan untuk menulis sebuah fitur strategi desktop, seperti membeli 5 koin untuk sebuah fitur sederhana, kita harus mempertimbangkan: apakah saldo saat ini cukup? berapa harga pesanan? berapa akurasi? tidak perlu untuk membagi pesanan untuk menghindari kejutan pasar? bagaimana menangani pesanan yang belum selesai? dan lain-lain.
Kelas-kelas perdagangan mata uang digital dan perdagangan komoditas berjangka JavaScript dibangun secara default dan tidak perlu disalin. Kelas-kelas template lainnya dapat ditemukan di Strategy Square di https://www.fmz.com/square/20/1 . Anda dapat menyalin dan menyimpan kelas-kelas template, dan memilih yang ingin Anda gunakan saat membuat strategi Anda sendiri.
Fungsi templat JavaScript adalah$Pada awalnya, Python menggunakanextAwalnya.
Perpustakaan transaksi mata uang digital
Alamat kode sumber: https://www.fmz.com/strategy/10989 , sudah built-in, tidak perlu disalin.
Mendapatkan Akun:
$.GetAccount(e)
Log($.GetAccount()); // 获取账户信息, 带容错功能
Log($.GetAcccount(exchanges[1]));
Pengunduran diri:
$.Buy/Sell(e, amount)
$.Buy(0.3); // 主交易所买入0.3个币
$.Sell(0.2); // 主交易所卖出0.2个币
$.Sell(exchanges[1], 0.1); // 次交易所卖出0.1个币
$.CancelPendingOrders(e, orderType)
$.CancelPendingOrders(); // 取消主交易所所有委托单
$.CancelPendingOrders(ORDER_TYPE_BUY); // 取消主交易所所有的买单
$.CancelPendingOrders(exchanges[1]); // 取消第二个交易所所有订单
$.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // 取消第二个交易所所有的卖单
Pengadilan menyeberang:
$.Cross(periodA, periodB) / $.Cross(arr1, arr2);
var n = $.Cross(15, 30);
var m = $.Cross([1,2,3,2.8,3.5], [3,1.9,2,5,0.6])
如果 n 等于 0, 指刚好15周期的EMA与30周期的EMA当前价格相等
如果 n 大于 0, 比如 5, 指15周期的EMA上穿了30周期的EMA 5个周期(Bar)
如果 n 小于 0, 比如 -12, 指15周期的EMA下穿了30周期的EMA 12个周期(Bar)
如果传给Cross不是数组, 则函数自动获取K线进行均线计算
如果传给Cross的是数组, 则直接进行比较
$.withdraw(e, currency, address, amount, fee, password) Fungsi penarikan:
$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")
Komoditas berjangka
Kode sumber: https://www.fmz.com/strategy/12961 。 sudah built-in, tidak perlu disalin。
Perpustakaan CTA
- Disk akan secara otomatis memetakan indeks ke dalam rangkaian utama
- Mengatur penarikan otomatis
- Retesting dapat menentukan pemetaan seperti rb000/rb888 yaitu memetakan rb indeks transaksi ke dalam kontinuitas utama
- Anda juga dapat memetakan kontrak lain, misalnya rb000/MA888 adalah melihat rb indeks K untuk perdagangan MA utama kontinu
function main() {
$.CTA("rb000,M000", function(r, mp) {
if (r.length < 20) {
return
}
var emaSlow = TA.EMA(r, 20)
var emaFast = TA.EMA(r, 5)
var cross = $.Cross(emaFast, emaSlow);
if (mp <= 0 && cross > 2) {
Log("金叉周期", cross, "当前持仓", mp);
return 1
} else if (mp >= 0 && cross < -2) {
Log("死叉周期", cross, "当前持仓", mp);
return -1
}
});
}
Contoh Panggilan Kelas
function main() {
var p = $.NewPositionManager();
p.OpenShort("MA609", 1);
p.OpenShort("MA701", 1);
Log(p.GetPosition("MA609", PD_SHORT));
Log(p.GetAccount());
Log(p.Account());
Sleep(60000 * 10);
p.CoverAll("MA609");
LogProfit(p.Profit());
Log($.IsTrading("MA609"));
// 多品种时使用交易队列来完成非阻塞的交易任务
var q = $.NewTaskQueue();
q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) {
Log(task.desc, ret)
})
while (true) {
// 在空闲时调用poll来完成未完成的任务
q.poll()
Sleep(1000)
}
}
Galeri gambar
Karena fungsi gambar asli yang lebih rumit, yang akan diperkenalkan dalam tutorial berikutnya, pemula disarankan untuk langsung menggunakan galeri gambar, sangat sederhana, diagram linear, K-linear, dll. FMZ built-in yang sederhana, dapat dilihat di halaman edit kebijakan, jika tidak ada built-in, pengguna perlu menyalin sendiri dan disimpan untuk memilih referensi dalam kebijakan.
Javascript Graphics Classics Replica: http://www.fmz.com/strategy/27293
Python Printing Line Class Reproduce: http://www.fmz.com/strategy/39066
Contoh:
function main() {
while (true) {
var ticker = exchange.GetTicker()
if (ticker) {
$.PlotLine('Last', ticker.Last) //可以同时画两条线,Last是这条线的名字
$.PlotLine('Buy', ticker.Buy)
}
Sleep(6000)
}
}
Pengaturan parameter kebijakan
Di bawah penyuntingan kebijakan ada pengaturan parameter kebijakan, yang setara dengan variabel global kebijakan, yang dapat diakses di lokasi kode mana pun. Parameter kebijakan dapat diubah di antarmuka hard disk, berlaku setelah restart. Oleh karena itu, beberapa variabel dapat diatur sebagai parameter, dan parameter dapat diubah tanpa mengubah kebijakan.

- Nama variabel: yaitu, number, string, combox, dan lain-lain yang ada di gambar di atas, dapat digunakan secara langsung di grup kebijakan.
- menggambarkan: Nama parameter dalam antarmuka kebijakan, untuk memudahkan pemahaman makna parameter.
- Catatan: Penjelasan rinci tentang parameter, yang akan ditampilkan ketika mouse tinggal di atas parameter.
- jenis: Jenis parameter ini dijelaskan di bawah ini.
- Nilai DefaultNilai default untuk parameter ini adalah:
String type dan numeric type mudah dipahami dan merupakan tipe yang paling umum digunakan. Pengelompokan bawah akan menampilkan pengelompokan bawah yang dapat dipilih di antarmuka parameter, seperti pengelompokan bawah SYMBOL parameter yang dapat disetel keBTC|USDT|ETHJika Anda memilih USDT di halaman drag-and-drop, maka nilai SYMBOL dalam kebijakan adalah indeks 1 untuk USDT.
Ada banyak parameter yang dapat disetel, lihat https://www.fmz.com/bbs-topic/1306
Pengujian Ulang Strategi
Setelah menyelesaikan pengukuran strategi, Anda dapat menguji strategi Anda dengan data historis untuk melihat bagaimana strategi Anda menghasilkan dalam data historis. Tentu saja, pengembalian hasil hanya untuk referensi. Platform kuantitatif FMZ mendukung pengembalian mata uang digital tunai, futures, kontrak tetap BitMEX, dan futures komoditas, di mana mata uang digital mendukung varietas utama.
Javascript responsif dilakukan di browser, Python responsif diperlukan pada host, dapat menggunakan platform yang menyediakan host umum. Mac bahasa responsif dan lebih banyak parameter yang perlu diatur, referensi khusus Mac bahasa dokumentasi.
Mekanisme pengembalian
Sistem pengukuran onbar didasarkan pada garis K, yaitu setiap garis K menghasilkan titik waktu pengukuran, di mana informasi tentang harga, volume transaksi, dan lain-lain dapat diperoleh pada garis K saat ini, serta informasi tentang garis K historis sebelum titik waktu tersebut. Kerugian dari mekanisme ini jelas: pada satu garis K, hanya dapat menghasilkan satu pembelian dan penjualan, yang biasanya didasarkan pada harga penutupan garis K. Dan satu garis K hanya dapat memperoleh empat harga pengukuran, sehingga tidak ada informasi tentang bagaimana perubahan harga dalam satu garis K, apakah harga tertinggi terjadi lebih dulu, harga terendah atau lebih dulu.
Pemantauan FMZ dibagi menjadi pemantauan analog dan pemantauan disk. Pemantauan analog menghasilkan tick yang diimulasikan berdasarkan siklus K-line dasar, yang akan menghasilkan 14 titik waktu pemantauan pada setiap siklus K-line dasar.**Tingkat real disk adalah tick yang benar-benar dikumpulkan, sekitar satu kali dalam beberapa detik, yang saat ini sebagian mendukung kedalaman real ((termasuk 20 file), transaksi real per-pen).**Jumlah data yang besar, kecepatan pengembalian lambat, sehingga tidak dapat mengembalikan waktu yang sangat lama. mekanisme pengembalian FMZ dapat membuat strategi berdagang beberapa kali pada satu K-line, menghindari situasi yang hanya dapat menutup perdagangan harga, lebih akurat dan memperhitungkan kecepatan pengembalian.
Kerangka kebijakan yang sama dengan disk, adalah sebuah lingkaran mati. Karena pengulangan melompat pada titik pengembalian yang berbeda, pada saat ini dapat tidak menggunakan tidur, pada akhir satu lingkaran akan secara otomatis melompat ke titik waktu berikutnya.Sleep(10)Untuk menghindari macet.
Pengamatan foto
Mesin pengembalian akan berdasarkan pada harga pesanan pengguna dan titik waktu pengembalian, jika harga pembelian lebih tinggi dari harga jual, untuk menjual satu transaksi. Jika tidak dapat bertransaksi, akan menghasilkan daftar tunggu. Untuk menjamin transaksi perlu menambahkan titik geser. Jika tidak dapat membuka gudang atau tidak dapat merata pada saat pengembalian, periksa apakah ada bekuan posisi yang disebabkan oleh pesanan yang belum terjual.
Pengaturan halaman responsif
-
- Kembali ke halaman pilihan, di sebelah kiri adalah halaman editing kebijakan.
-
- Waktu awal dan akhir pengulangan, karena data tidak lengkap, pengulangan mungkin dimulai langsung dari waktu yang memiliki data.
-
- Pengamatan
GetRecords()Periode default dari fungsi, juga dapat ditentukan dalam kode parameter periode.
- Pengamatan
-
- Pilihan mekanisme pelacakan.
-
- Tampilkan atau menyembunyikan pengaturan multi-retargeting.
-
- Maksimalkan jumlah log, jumlah data hasil, jumlah data grafik, dan lain-lain, untuk mencegah terlalu banyak data yang menyebabkan browser mati.
-
- Tick dasar dihasilkan berdasarkan siklus K line.
-
- Slip point.
-
- Toleransi kesalahan, akan mensimulasikan permintaan API yang gagal, memeriksa kemampuan toleransi kebijakan.
-
- Apakah gambar ikon tren, jika Anda menggunakan fungsi indikator TA dalam pengujian ulang, itu akan muncul di ikon, dan perdagangan akan ditandai.
-
- Pengaturan biaya
-
- Menambahkan bursa - pasangan dan aset.
-
- Pengaturan parameter pengembalian, jika parameter adalah angka juga mendukung parameter optimasi satu tombol, secara otomatis melalui pengembalian parameter sesuai dengan jangkauan tertentu.
Perbedaan antara deteksi dan hard disk
-
- Hanya GetTicker dan GetRecords yang efektif dalam melakukan retesting, yang lain seperti mendapatkan kedalaman dan riwayat transaksi tidak nyata ((karena jumlah data yang terlalu besar, retesting tingkat disk nyata saat ini telah mendukung data ini, tetapi hanya data terbaru).)
- Pertukaran yang ditambahkan adalah akun independen, dan saat ini tidak mendukung pertukaran pasangan transaksi. Oleh karena itu, tidak mungkin untuk mengoperasikan dua pasangan transaksi dalam satu akun.
-
- Tidak dapat menggunakan permintaan jaringan dalam pengetesan ulang.
-
- Retrospektif tidak dapat menggunakan ekstensi IO, hanya dapat mengoperasikan API yang paling dasar.
-
- Retrospektif hanya bisa mendapatkan data standar, tidak ada data dari hard disk seperti Info.
-
- Ada kemungkinan tidak ada transaksi dalam pengukuran ulang, perhatikan pembekuan pesanan.
-
- Futures trading tidak mendukung harga pasar.
Strategi Toleransi dan Kesalahan Umum
Seperti yang telah disebutkan sebelumnya, menggunakan API pada hard disk dapat menyebabkan akses gagal dan kembali.nullJika Anda menggunakan data yang ada di dalamnya, maka akan terjadi kesalahan dan menyebabkan disk berhenti bekerja, jadi ada baiknya untuk bersikap toleran terhadap kesalahan.
Metode toleransi kesalahan yang umum digunakan
Alasan umum yang salah:
- API mengakses jaringan error, interface mengakses overtime akan mengembalikan null, saat ini digunakan akan error.
- Kesalahan pembatasan pertukaran, seperti pembatasan ip, akurasi pesanan, frekuensi akses, kesalahan parameter, kekurangan aset, pasar tidak dapat diperdagangkan, penarikan pesanan yang telah selesai, dll. Dokumen API dapat dicari secara khusus berdasarkan kode kesalahan.
- Kesalahan data yang dikembalikan oleh bursa, kadang-kadang terjadi, seperti kembali kedalaman kosong, informasi akun yang tertunda, status pesanan yang tertunda, dll.
- Kesalahan logis program.
Sebelum menggunakan API untuk mengembalikan data, harus dinilai apakah data tersebut adalah null atau tidak. Berikut ini adalah metode yang umum digunakan:
//1.判断为null进行处理
var ticker = exchange.GetTicker();
while(ticker == null){
Log('ticker 获取出错');
ticker = exchange.GetTicker();
}
Log(ticker.Last);
// 2.判断不为null再进行引用
var ticker = exchange.GetTicker();
if(!ticker){
Log(ticker.Last);
}
// 3._C()函数重试
var ticker = _C(exchange.GetTicker);
Log(ticker.Last);
// 4. try catch容错
try{
var ticker = exchange.GetTicker();
Log(ticker.Last);
}
catch(err){
Log('ticker 获取出错');
}
Jika Anda ingin mendapatkan informasi yang salah, Anda bisa menggunakanGetLastError(), akan mengembalikan string informasi kesalahan terakhir, yang dapat diproses secara diferensial.
FAQ
Ada banyak kesalahan yang sering terjadi dalam posting di forum: https://www.fmz.com/bbs-topic/1427 。 Beberapa di antaranya akan diringkas di sini, dan jika ada pertanyaan, Anda dapat mencari di bawah ini Ctrl+F 。
Bagaimana cara menempatkan seorang wali?
Anda dapat melihat lebih lanjut di bagian Add a Trustee.
Apakah ada strategi untuk menyalin?
Di https://www.fmz.com/markets ada beberapa orang yang menyediakan layanan penyaluran, atau konsultasi dalam kelompok, perlu menghubungi sendiri, menanggung risiko sendiri.
Akses ke semua antarmuka yang memberi tahu Anda akan timeout
Ini berarti akses ke antarmuka bursa overtime, jika terjadi sesekali tidak masalah, jika terus-menerus menunjukkan bahwa jaringan tidak dapat diakses, perlu menggunakan server luar negeri.
ERR_INVALID_POSITION Kesalahan
Sistem pelacakan melaporkan kesalahan, umumnya kesalahan yang ditulis untuk strategi, dan mencoba untuk melonggarkan posisi ketika tidak ada kepemilikan atau jumlah kepemilikan yang tidak mencukupi, dapat menyebabkan kesalahan tersebut.
symbol not set
FUTURE EXCHANGE METACK, tidak ada kontrak dalam kode, lihat exchange.SetContractType
BITMEX 429 error,{"error":{"message":"Rate limit exceeded retry in 1 seconds"...}}
Terlalu sering mengakses antarmuka bursa.
{"status":6004,"msg":"timestamp is out of range"}
Server Timeframe di luar jangkauan perlu memperbarui server timeframe, tidak bisa terlalu menyimpang
GetOrder(455284455): Error: invalid order id or order cancelled.
Jika ada yang membatalkan pesanan, maka informasi pesanan tidak akan tersimpan di bursa dan tidak dapat diakses.
GetOrders: 400: {"code":-1121,"msg":"Invalid symbol."}
Pasangan transaksi yang tidak valid, periksa apakah pasangan transaksi yang ditetapkan salah.
Secret key decrypt failed
API KEY gagal, jika Anda mengkonfigurasi APIKEY dan mengubah kata sandi FMZ, cobalah untuk menambahkan halaman bursa di FMZ dan mengkonfigurasi ulang bursa APIKEY.
Signature not valid: Invalid submission time or incorrect time format [Waktu pengiriman tidak valid, atau format waktu salah]
Disarankan untuk menggunakan server Linux, atau perangkat lunak sinkronisasi waktu instalasi pada sistem windows yang mengalami masalah tersebut.
Mengapa Anda menyiapkan proxy global dan administrator tidak dapat mengakses API Exchange?
Global proxy tidak memiliki port jaringan proxy host, karena masalah latensi, host yang lebih baik untuk mengerahkan server di luar negeri
Bagaimana caranya agar strategi bisa disimpan secara lokal dan tidak diunggah ke FMZ?
Dengan menggunakan Python, Anda dapat mengimpor file lokal, menyimpan kebijakan yang ditulis secara normal berdasarkan API FMZ ke dalam file di bawah jalur eksekusi di server Anda sendiri, dan langsung membaca eksekusi.
#!python2.7
def run(runfile):
with open(runfile,"r") as f:
exec(f.read())
def main():
run('my.py')
Cara menggunakan jaringan uji bursa atau mengubah alamat basis API
Menggunakan exchange.SetBase () untuk beralih langsung ke alamat dasar API yang sesuai.
exchange.SetBase("https://www.okex.me")
我是看1分钟k线图操作的,所以Python死循环的sleep time 可以设置为0.1s,也就是sleep(100)吗,我看你其中写过一个sleep(10),也就是0.1s不会超过huobi HM的API限制吗?
exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")
这儿我试了OKex的永续合约,如果设置成 sell,直接开空了,平不是平多
是我错了。。。
exchange.Buy(-1, 0.5),交易对是ETH_BTC,市价单代表买入0.5BTC的ETH
exchange.Buy(price, 0.5),如果是这种限价单,则代表用price的价格买入 0.5ETH
- 1







