3
fokus pada
1444
Pengikut

Tutorial dasar penulisan strategi platform kuantitatif FMZ (harus dibaca)

Dibuat di: 2019-08-13 17:47:27, diperbarui pada: 2021-08-06 10:29:46
comments   33
hits   69033

[TOC] 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

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。 Tutorial dasar penulisan strategi platform kuantitatif FMZ (harus dibaca)

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.

Tutorial dasar penulisan strategi platform kuantitatif FMZ (harus dibaca)

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 typeBerbeda 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,closebuyHubungan 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.GetTickerGetDepthGetRecordsSemua 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 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 ini
  • parseFloat()Mengubah string menjadi angka, sepertiparseFloat("123.21")
  • parseInt()Ubah string menjadi bilangan bulat
  • num.toString()Mengubah angka menjadi string, num menjadi variabel angka
  • JSON.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])); `