[TOC] Tutorial ini mengandungi pengetahuan asas tentang penulisan strategi, termasuk pengenalan API, tinjauan semula, dan grafik. Setelah mempelajari tutorial asas ini, pengguna akan dapat menggunakan API asas dengan mahir, menulis strategi cakera yang stabil. Sebelum mempelajari tutorial ini, anda perlu belajar terlebih dahuluFMZ Inventor Quantify Platform 。
Tutorial lama:Pencipta Mengkuantifikasi Strategi FMZ.COM Menulis Manual Penggunaan Lengkap 2.0 (Tutorial)Tutorial ini menyenaraikan banyak post yang telah diindeks dan disyorkan untuk dilihat.
Perdagangan berprogram adalah menggunakan aplikasi yang disambungkan melalui API dan bursa, untuk melakukan pembelian dan penjualan secara automatik atau melaksanakan fungsi lain mengikut niat reka bentuk. API penuh dipanggil Application Programming Interface, iaitu antara muka pengaturcaraan aplikasi.
Pada masa ini, pertukaran mata wang digital mempunyai dua protokol antara muka utama: REST dan Websocket. Protokol REST memerlukan satu lawatan 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 secara langsung di penyemak imbas, dan hasilnya:
{"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 menunjukkan pergerakan terkini dalam pasangan BTC_USDT, yang akan berubah setiap kali ia diperbaharui.market=Kemudian diikuti dengan parameter pasangan dagangan tertentu, yang boleh diubah untuk mendapatkan data pasangan dagangan lain. Untuk antara muka terbuka, seperti pasaran, semua orang boleh mengaksesnya, jadi tidak memerlukan pengesahan, sementara beberapa antara muka seperti pesanan dan mendapatkan akaun memerlukan pengesahan identiti pengguna, ketika ini anda perlu menggunakan tanda tangan API-KEY. Websocket adalah mod langganan, setelah menghantar kandungan yang memerlukan langganan, bursa akan menghantar data yang dikemas kini ke program, dan tidak perlu dikunjungi semula setiap kali, jadi lebih cekap.
Platform perdagangan kuantitatif FMZ merangkumi REST antara muka setiap bursa, menggunakan panggilan dan format data yang seragam, menjadikan pengaturcaraan strategi lebih mudah dan umum. Platform FMZ dapat dengan mudah menyokong Websocket, yang akan dibincangkan secara terperinci dalam tutorial berikut.
Dokumen API platform FMZ sebahagian besarnya menggunakan JavaScript sebagai contoh, tetapi kerana pembungkusan, bahasa yang berbeza hampir tidak ada perbezaan, hanya perlu memberi perhatian kepada masalah tatabahasa. C ++ sedikit istimewa, tutorial kemudian akan mempunyai pengenalan khusus. Oleh kerana Js lebih mudah dan tidak ada masalah keserasian, disyorkan untuk pemula. Platform kuantitatif FMZ menyokong Python lengkap, boleh dipasang secara bebas pelbagai pakej, disyorkan untuk menggunakan asas pengaturcaraan tertentu.
Python mempunyai versi yang berbeza, yang boleh ditentukan pada permulaan program, seperti#!Python2,#!Python3Perhatikan bahawa JavaScript baru-baru ini telah menaik taraf bahasa ES6, yang berminat boleh memahaminya. Di bawah ini menunjukkan kod Python dan Javascript yang berfungsi sama, hanya terdapat perbezaan gramatikal, oleh itu dokumentasi API hanya memberikan contoh Javascript, tutorial ini juga akan mengimbangi kes penggunaan khas Python.
#python代码
def main():
while True:
Log(exchange.GetAccount().Balance)
Sleep(2000)
#相应的Js代码
function main(){
while(true){
Log(exchange.GetAccount().Balance)
Sleep(2000)
}
}
Platform kuantitatif FMZ menyediakan alat debug untuk debug API, https://www.fmz.com/m/debug 。 Alat debug hanya menyokong JavaScript, hanya boleh dijalankan untuk seketika, dan anda boleh melakukan debug pada antara muka bursa tanpa membuat cakera keras。 Data yang dikembalikan akan dikembalikan sebagai hasil, dan kod alat debug tidak akan disimpan。 Dalam pembelajaran tutorial ini, anda boleh menggunakan alat debug untuk melakukan percubaan pada masa yang sama。

Seperti prosedur biasa, prosedur strategi dijalankan mengikut urutan kod, tetapi ia mesti mempunyai fungsi utama. Oleh kerana strategi perlu berjalan tanpa gangguan, biasanya satu putaran ditambah masa tidur diperlukan. Oleh kerana semua API perdagangan mempunyai had akses, masa tidur perlu disesuaikan.
Fungsi lain yang mempunyai fungsi khas adalah:
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//在这里写策略逻辑,将会每6s调用一次
}
function main(){
while(true){
onTick()
Sleep(6000)
}
}
Contoh di atas jika salah akses rangkaian mungkin menyebabkan strategi berhenti secara langsung, jika anda ingin strategi yang serupa dengan restart automatik yang tidak berhenti, anda boleh menggunakan kitaran utama yang sabar dengan strategi try catch (jangan gunakan percubaan semula). Sudah tentu, hanya disarankan apabila strategi stabil, jika tidak, semua kesalahan tidak akan dilaporkan, sukar untuk menyemak masalah strategi.
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//在这里写策略逻辑,将会每6s调用一次
}
function main(){
try{
while(true){
onTick()
Sleep(6000)
}
}catch(err){
Log(err)
}
}
Apabila memanggil apa-apa API yang berkaitan dengan bursa, anda perlu menentukan bursa dan pasangan transaksi. Jika anda hanya menambah satu bursa-pasangan transaksi semasa membuat cakera, anda tidak akan dapat membuat satu lagi.exchangeSebagai contoh,exchange.GetTicker()Hasilnya ialah ticker perdagangan pasangan-pertukaran ini.
Platform FMZ menyokong penambahan berbilang pasangan pertukaran-perdagangan pada masa yang sama, seperti BTC dan ETH yang boleh dikendalikan pada masa yang sama dari akaun pertukaran yang sama. Perhatikan bahawa akaun yang berbeza dari pertukaran yang sama juga boleh ditambah pada masa yang sama, berdasarkan label yang ditambahkan ke laman web FMZ. Apabila terdapat beberapa pasangan pertukaran-perdagangan, digunakanexchangesArray yang dilambangkan mengikut susunan penambahan cakera kerasexchanges[0]、exchanges[1]…dan sebagainya. Format pasangan dagangan adalah seperti berikut:BTC_USDTBTC adalah mata wang perdagangan dan USDT adalah mata wang harga.

Jelas sekali, jika kita mempunyai banyak pasangan yang kita gunakan, ia akan menjadi masalah, dan kita boleh menggunakan SetCurrency untuk menukar pasangan, sepertiexchange.SetCurrency("BTC_USDT")Pada masa ini,exchangePasangan yang terikat akan menjadiBTC_USDTIa akan kekal sehingga panggilan seterusnya untuk menukar pasangan.Perhatikan bahawa pengukuran terbaru menyokong pertukaran pasangan perdaganganBerikut 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)
}
}
Seperti contoh di atas, antara muka perdagangan biasanya adalah antara muka terbuka, semua orang boleh mengaksesnya. Antara muka perdagangan biasa adalah: mendapatkan ticker perdagangan, mendapatkan kedalaman kedalaman, mendapatkan rekod baris K, mendapatkan rekod transaksi. Perdagangan adalah asas untuk membuat keputusan perdagangan strategi, yang akan diperkenalkan secara beransur-ansur di bawah, sebaiknya dapat mencuba sendiri dalam alat debug, untuk penjelasan terperinci, lihat dokumentasi API.
Setiap antara muka biasanya mempunyaiInfoBidang, yang menunjukkan senar data asal yang dikembalikan oleh bursa, boleh digunakan untuk menambah maklumat tambahan, yang perlu diuraikan sebelum ini, menggunakan JavaScriptJSON.parse()Python menggunakan perpustakaan json.TimeBidang ini menunjukkan tempoh permintaan yang boleh digunakan untuk menilai kelewatan.
Menggunakan API pada cakera tetap adalah mungkin untuk mengakses dan kembali gagalnullPython KembaliNoneOleh itu, toleransi terhadap kesilapan sangat penting. Tutorial ini akan membincangkannya secara berasingan.
Mendapatkan keadaan pasaran semasa, mungkin antara muka yang paling biasa digunakan, boleh mencari harga transaksi terakhir, harga jual beli, jumlah transaksi baru-baru ini dan sebagainya. Anda boleh menentukan harga transaksi berdasarkan maklumat ticker sebelum membuat pesanan.{"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)
}
Dapatkan maklumat kedalaman gantung. Walaupun GetTicker mengandungi membeli dan menjual satu, tetapi jika anda ingin mencari lebih mendalam gantung, anda boleh menggunakan antara muka ini, biasanya boleh mencari ke atas 200 gantung. Anda boleh menggunakan antara muka ini untuk mengira harga kejutan. Berikut adalah hasil yang benar kembali.
{
"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 pembelian dan penjualan dalaman:
function main() {
var depth = exchange.GetDepth()
Log('买一价个: ', depth.Bids[0].Price, '卖一价格: ', depth.Asks[0].Price)
}
Mendapatkan K-line, salah satu antara muka yang paling biasa digunakan, yang boleh mengembalikan maklumat harga yang lebih lama pada satu-satu masa, untuk mengira asas pelbagai petunjuk. Jadual K tidak dapat ditentukan jika tidak ditetapkan, yang bermaksud bahawa kitaran lalai akan digunakan ketika menambahkan cakera keras.
exchange.SetMaxBarLen(Len)Anda boleh menetapkan jumlah K untuk kali pertama anda mendapatkannya (sebahagian platform menyokongnya), dan anda boleh menetapkan jumlah maksimum K.Contohnya:exchange.SetMaxBarLen(500)
GetRecords boleh menetapkan tempoh: PERIOD_M1:1 minit, PERIOD_M5:5 minit, PERIOD_M15:15 minit, PERIOD_M30:30 minit, PERIOD_H1:1 jam, PERIOD_D1:1 hari.exchange.GetRecords(PERIOD_M1)Selepas menaik taraf hos terkini, akan menyokong kitaran tersuai, kitaran kedua yang dihantar secara langsung digunakan sebagai parameter, tahap minit akan disintesis berdasarkan baris K 1 minit, baris K di bawah 1 minit disintesis melalui GetTrades ((), komoditi berjangka akan disintesis berdasarkan tick,Anda juga boleh melihat perkara yang sama dalam tutorial.PERIOD_M1Variabel ini ditulis secara besar-besaran, mereka adalah global default FMZ, yang berminat boleh Log sendiri nilai-nilai tertentu mereka, biasa digunakan secara langsung.
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 garisan K:
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
}
Mendapatkan data urus niaga untuk jangka masa tertentu (bukan data urus niaga anda sendiri), tidak disokong oleh beberapa bursa. Tidak biasa digunakan, anda boleh mendapatkan maklumat terperinci mengenai dokumen API.
Oleh kerana antara muka ini berkaitan dengan akaun, dan tidak dapat diakses secara langsung, perlu menggunakan tandatangan API-KEY. Platform FMZ telah disatukan secara automatik di belakang dan boleh digunakan secara langsung.
Mendapatkan maklumat akaun. Salah satu antara muka yang paling biasa digunakan, dan perlu dipanggil sebelum pesanan, untuk mengelakkan baki yang tidak mencukupi.{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}Stok adalah baki yang tersedia dalam mata wang yang diperdagangkan untuk pasangan yang diperdagangkan, Stok beku adalah baki beku untuk pesanan yang belum selesai, Saldo adalah baki yang tersedia dalam mata wang yang dinilai, dan Saldo beku adalah baki beku.BTC_USDTStok merujuk kepada BTC dan baki merujuk kepada USDT.
Mengambil perhatian bahawa hasil yang dikembalikan adalah hasil pasangan dagangan yang ditetapkan, maklumat mengenai mata wang lain dalam akaun dagangan berada di medan Info, dan operasi beberapa pasangan dagangan tidak perlu dipanggil berulang kali.
Satu cakera padat yang terus menerus mencetak nilai keseluruhan pasangan dagangan semasa:
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
}
}
Cara untuk memanggilnya ialah:exchange.Buy(Price, Amount)atauexchange.Buy(Price, Amount, Msg)Harga adalah harga, Jumlah adalah kuantiti, Msg adalah senar tambahan yang boleh ditunjukkan dalam jurnal cakera, tidak perlu. Cara ini adalah untuk mencatatkan pesanan, dan jika tidak dapat menyelesaikan pesanan dengan segera, ia akan menghasilkan pesanan yang belum selesai, pesanan yang berjaya dikembalikan sebagai pesanan id, dan yang gagal sebagainull, untuk status pesanan.
Jika anda ingin membeli harga di bawah harga pasaran, harga adalah -1, dan jumlah adalah nilai pesanan, sepertiexchange.Buy(-1, 0.5)Perdagangan betul.ETH_BTC, mewakili harga pasaran untuk membeli ETH sebanyak 0.5BTC. Beberapa bursa tidak menyokong harga pasaran, dan juga tidak menyokong pengembalian masa depan.
Semua harga dan kuantiti yang diperlukan untuk bahagian transaksi yang tepat, tersedia_N()Fungsi ketepatan untuk mengawal. Untuk perdagangan niaga hadapan, Beli dan Jual mempunyai makna lain, yang akan dibincangkan secara berasingan.
Contoh 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')
}
Borang Jual Bawah . Parameter sama dengan Borang Beli . Parameter Borang Harga Pasaran mempunyai makna yang berbeza, Borang Jual Harga Pasaran sepertiexchange.Sell(-1, 0.2), mewakili harga pasaran untuk dijual 0.2 ETH.
Mendapatkan maklumat pesanan berdasarkan id pesanan. Antara muka biasa, cara memanggilexchange.GetOrder(OrderId),OrderId adalah id pesanan, akan dikembalikan apabila pesanan dibuat.Perhatikan jenis pesananTypeBidang dan status pesananStatusNilai sebenar adalah nombor, yang mewakili makna yang berbeza, tetapi tidak sesuai untuk ingatan, FMZ mewakili nilai-nilai ini dengan konstanta global, seperti yang terdapat dalam pesanan yang belum selesaiStatusIa adalah 0 dan ia sama denganORDER_STATE_PENDINGSemua ini boleh dilihat dalam dokumentasi.◦ Hasil yang dikembalikan:
{
"Id":125723661, //订单id
"Amount":0.01, //订单数量
"Price":7000, //订单价格
"DealAmount":0, //已成交数量
"AvgPrice":0, //成交均价
"Status":0, // 0:未完全成交, 1:已成交, 2:已撤单
"Type":1,// 订单类型,0:买单, 1:卖单
"ContractType":"",//合约类型,用于期货交易
"Info":{} //交易所返回原始信息
}
}
Satu strategi untuk membeli sejumlah mata wang:
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)
}
}
}
}
Dapatkan senarai pesanan yang belum selesai untuk semua transaksi semasa. Jika tidak ada pesanan yang belum selesai, pulangkan array kosong. Hasil khusus senarai pesanan seperti GetOrder.
Contoh untuk membatalkan transaksi semasa 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)
}
}
Mengubah pesanan berdasarkan pesanan id.exchange.CancelOrder(OrderId)。 penarikan berjaya mengembalikan true, sebaliknya mengembalikan false。 perhatikan pesanan telah selesai akan membatalkan kegagalan。
Perdagangan niaga hadapan mata wang digital dan perdagangan tunai sedikit berbeza, fungsi perdagangan tunai di atas juga berlaku untuk niaga hadapan, perdagangan niaga hadapan tunggal mempunyai fungsi eksklusif. Sebelum melakukan perdagangan niaga hadapan mata wang digital, anda harus terbiasa dengan operasi manual di laman web, memahami konsep asas, seperti konsep pembukaan, penempatan, penempatan penuh, penempatan, leverage, kerugian, keuntungan, dan jaminan, serta formula pengiraan yang sesuai.
Kontrak kekal serupa dengan kontrak niaga hadapan, tetapi tidak mempunyai konsep memegang banyak ruang pada masa yang sama.
Jika bursa menyokong kedua-dua masa depan dan masa depan, seperti OKEX dan Huobi, anda perlu memilih OKEX dan Huobi secara berasingan dalam antara muka bursa. Tambah masa depan dan Huobi, yang dianggap sebagai bursa yang berbeza di FMZ.
Langkah pertama dalam perdagangan niaga hadapan adalah menetapkan kontrak yang akan diperdagangkan, sebagai contoh dengan niaga hadapan OKEX, pilih pasangan perdagangan BTC ketika membuat cakera mata wang atau pengembalian, dan tetapkan dalam kod kontrak mingguan, minggu depan atau suku tahun. Jika tidak, anda akan dimintainvalid contract type。Berbeza dengan pasangan dagangan tunai, kontrak niaga hadapan sering dijamin dengan mata wang yang diperdagangkan seperti BTC, pasangan dagangan yang menambah BTC biasanya mewakili pasangan dagangan BTC_USD yang dijamin dengan BTC, jika ada masa depan yang dijamin dengan USDT, perlu membuat pasangan dagangan BTC_USDT yang ditambahkan ke dalam simpanan. Seperti mata wang, kontrak niaga hadapan OKEX mempunyai kontrak kekal yang dipanjangkan pada masa yang sama dengan mata wang dan mata wang USDT.Setelah menubuhkan pasangan perdagangan, anda juga perlu menetapkan jenis kontrak tertentu, seperti kekal, mingguan, mingguan, dan lain-lain. Setelah menubuhkan kontrak, anda boleh melakukan operasi untuk mendapatkan perdagangan, membeli dan menjual.
Kontrak yang ada di Bitcoin, OKEX, HuobiDM dan lain-lain perlu dibezakan apabila anda menambah kontrak tetapan cakera keras. Tetapan khusus adalah seperti 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官网。
Dapatkan senarai maklumat pegangan semasa, OKEX(OKCOIN) Futures boleh dihantar ke dalam parameter yang menentukan jenis kontrak yang ingin diperoleh. Jika tiada pegangan, kembalikan senarai kosong[]│ maklumat pegangan dikembalikan seperti berikut, banyak maklumat khusus, yang perlu digabungkan dengan analisis khusus perdagangan│
| Jenis data | Nama pemboleh ubah | menggambarkan |
|---|
“Object HDI Info HDI Exchange” “Number”, “MarginLevel”, “Bar Size”, “OKCoin”, “10” atau “20”, “OK Futures”, “Full Stock Mode”, “Fixed 10”, kerana “native API” tidak menyokong “Fixed 10”. “Amount” adalah jumlah simpanan, dan “OKCoin” adalah jumlah kontrak. “Amount” adalah bilangan bulat dan lebih besar daripada 1. “Number” dan “FrozenAmount” dan “FrozenAmount”. Nombor dan Harga dan Harga Saham “Nombor Margin Margin Margin”. │number │Profit │komoditi berjangka: pegangan pegangan pasaran rugi, mata wang digital: ((unit mata wang digital: BTC/LTC, unit berjangka tradisional: RMB, nota: OKCoin berjangka menunjukkan keuntungan dalam keadaan penuh, bukan pegangan rugi, pegangan bawah menunjukkan kerugian pegangan) const Type PD_LONG untuk kedudukan bermulut (dalam CTP dengan closebuy_today) PD_SHORT untuk kedudukan kosong (dalam CTP dengan closesell_today) PD_LONG_YD untuk kedudukan bermulut semalam (dengan closebuy) PD_SHORT_YD untuk kedudukan kosong semalam (dengan closesell) String arrayContractTypeString arrayContractTypeString arrayContractTypeString arrayContractTypeString arrayContractTypeString arrayContractType
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)
}
}
Pertama, anda perlu menetapkan saiz tuas dan cara memanggilnya:exchange.SetMarginLevel(10)10 menunjukkan 10 kali ganda leverage, dan untuk saiz leverage yang disokong, lihat di bursa yang sama.Perhatian: Leverage harus diset di bursa, dan kodnya mestilah selaras dengan bursa, jika tidak, ia akan menjadi salahAnda boleh menggunakan seting atau tanpa seting, menggunakan tuas lalai.
Kemudian set arah transaksi dan cara memanggilnya:exchange.SetDirection(Direction)“Saya tidak tahu apa-apa mengenai perkara ini, saya tidak tahu apa-apa mengenai perkara ini.Berbeza dengan niaga hadapan, jika kontrak kekal tidak mempunyai konsep kosong pada masa yang sama, iaitu tidak membenarkan memegang kedudukan tunggal, kosong akan secara automatik kosong, semua hanya perlu ditetapkanbuydansellJika anda menyokong pegangan dua hala, anda perlu menetapkannyaclosebuy,closebuy。Hubungan khusus:
| Pengendalian | SetDirection parameter | Fungsi perintah bawah |
|---|---|---|
| Memulakan Posisi | exchange.SetDirection(“buy”) | exchange.Buy() |
| Pindo Posisi | exchange.SetDirection(“closebuy”) | exchange.Sell() |
| Posisi kosong | exchange.SetDirection(“sell”) | exchange.Sell() |
| Posisi kosong | exchange.SetDirection(“closesell”) | exchange.Buy() |
Akhirnya adalah kod pembukaan dan penutupan yang spesifik, jumlah pesanan yang berbeza dari bursa ke bursa, seperti huobi berjangka adalah mengikut jumlah surat, satu kertas $ 100. Perhatikan bahawa pengukuran kembali berjangka tidak menyokong harga pasaran.
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 adalah contoh strategi untuk semua kedudukan kosong.
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)
}
}
}
}
Pertukaran ke akaun Leverage diperlukan dalam kod, yang lain adalah sama seperti transaksi tunai.
Menggunakan exchange.IO ((“trade_margin”) untuk beralih ke mod akaun margin, aset akaun pesanan dan pengambilan akan mengakses antara muka leverage pertukaran. Menggunakan exchange.IO ((“trade_normal”) untuk beralih ke mod akaun biasa.
Bursa yang disokong:
Perdagangan niaga hadapan komoditi dan perdagangan niaga hadapan mata wang digital mempunyai perbezaan yang besar. Pertama, masa perdagangan niaga hadapan komoditi adalah pendek, perdagangan mata wang digital 24 jam; perjanjian niaga hadapan komoditi juga bukan REST API yang biasa digunakan; frekuensi perdagangan niaga hadapan komoditi dan had jumlah pesanan, mata wang digital sangat longgar, dan sebagainya. Oleh itu, perdagangan niaga hadapan komoditi mempunyai banyak tempat yang memerlukan perhatian khusus, dan disarankan untuk mempunyai pengalaman operasi manual yang kaya. FMZ menyokong simnow niaga hadapan komoditi simulasi cakera, rujukan: https://www.fmz.com/bbs-topic/325 ❚ Syarikat niaga hadapan komoditi menambah: https://www.fmz.com/bbs-topic/371
FMZ kuantitatif platform sebagai pembekal perdagangan berprogram telah memohon lesen perisian kepada setiap pembekal perkhidmatan niaga hadapan, pengguna boleh menggunakan tanpa permohonan langsung, dalam menambah niaga hadapan adalah mencari ke dalam pelayar browsing anda boleh melihat senarai permohonan FMZ yang telah dibuat. Pos rujukan khusus: https://www.fmz.com/bbs-topic/3860 ❚ Jika pembekal niaga hadapan anda tidak lagi dalam senarai, hanya boleh memohon sendiri, atau kembali dalam sokongan pembuka perdagangan, biasanya memerlukan 2 hari.
Oleh kerana kelebihan seni bina platform FMZ, pengguna juga boleh menambah beberapa akaun pedagang niaga hadapan, dan mencapai beberapa fungsi yang tidak dapat dilakukan oleh perisian perdagangan berprogram niaga hadapan komoditi lain, seperti sintesis tick frekuensi tinggi, rujukan: https://www.fmz.com/bbs-topic/1184
Pertama, kerana ia bukan urus niaga 24 jam dan memerlukan operasi log masuk, status pautan perlu dinilai sebelum urus niaga dilakukan.exchange.IO("status")untuktrueJika tidak berjaya log masuk, API dipanggil dan ‘not login’ tidak diminta. Anda boleh tidur selepas memulakan strategi ((2000), memberi masa tertentu untuk log masuk. Anda juga boleh mencuba semula langganan_C(exchange.SetContractType,"MA888")“Saya tidak tahu apa-apa tentangnya, tetapi saya tidak tahu apa-apa tentangnya”, katanya.
Kode untuk mendapatkan dan berdagang untuk niaga hadapan komoditi adalah sama dengan niaga hadapan mata wang digital, dan di sini kami akan menerangkan perbezaannya 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)
}
}
}
Saya mencadangkan untuk menggunakan perdagangan komoditi berjangka (diperkenalkan di bawah), kerana kodnya sangat mudah dan tidak perlu menangani perincian 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)
}
});
}
Komoditi berjangka menggunakan protokol CTP, semua perdagangan dan transaksi pesanan hanya akan dimaklumkan apabila terdapat perubahan, dan permintaan pesanan, akaun, dan pegangan adalah permintaan aktif. Oleh itu, sesuai untuk menulis strategi frekuensi tinggi yang didorong oleh peristiwa.GetTicker、GetDepth、GetRecordsSemua mempunyai data yang disimpan untuk mendapatkan data terkini, jika tidak ada data akan menunggu sehingga ada data, jadi strategi boleh tidak menggunakan Tidur. Apabila ada perubahan keadaan, ticker, kedalaman, rekod akan dikemas kini, pada masa ini memanggil antara muka yang mana-mana akan dikembalikan dengan segera, keadaan antara muka yang telah dipanggil akan diletakkan dalam mod menunggu kemas kini, lain kali memanggil antara muka yang sama, akan menunggu data baru kembali.
Jika anda ingin mendapatkan data setiap kali anda mengambil sesuatu, walaupun data lama, anda boleh menukarnya kepada mod kemas kini segera.exchange.IO("mode", 0)❚ Strategi tidak boleh ditulis sebagai event-driven pada masa ini, perlu menambah satu peristiwa SLeep, untuk mengelakkan kitaran kematian yang cepat. ❚ Beberapa strategi dengan frekuensi rendah boleh menggunakan mod ini, dan reka bentuk strategi mudah.exchange.IO("mode", 1)Anda boleh memadamkan cache default anda.
Dalam operasi kontrak tunggal, menggunakan mod lalai adalah mungkin. Tetapi jika ia adalah beberapa kontrak, mungkin satu kontrak tidak mengemas kini keadaan, menyebabkan mendapatkan berhubung keadaan tersumbat, kontrak lain keadaan update tidak dapat diperoleh. Untuk menyelesaikan masalah ini, anda boleh menggunakan mod kemas kini segera, tetapi tidak mudah untuk menulis strategi frekuensi tinggi.exchange.IO("wait")Jika anda menambah beberapa objek bursa, yang jarang berlaku dalam niaga hadapan komoditi, anda boleh menggunakanexchange.IO("wait_any")Index yang dikembalikan akan menunjukkan indeks bursa yang dikembalikan.
Perkembangan tick:{Event:"tick", Index:交易所索引(按实盘上交易所添加顺序), Nano:事件纳秒级时间, Symbol:合约名称}
Penghantaran pesanan:{Event:"order", Index:交易所索引, Nano:事件纳秒级时间, Order:订单信息(与GetOrder获取一致)}
Pada ketika ini struktur strategi boleh 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)
}
}
}
Juga perlu diperhatikan perbezaan antara niaga hadapan komoditi dan bursa mata wang digital. Sebagai contoh, GetDepth sebenarnya hanya mempunyai kedalaman satu baris (biaya 5 baris), GetTrades juga tidak dapat memperoleh sejarah transaksi (semua berdasarkan perubahan pegangan, tanpa rekod transaksi sebenar).
exchange.IO ((“instruments”): mengembalikan senarai semua kontrak di bursa dalam bentuk kamus, hanya menyokong cakera keras. exchange.IO ((“products”): Kembalikan semua senarai produk pertukaran dalam bentuk kamus, hanya menyokong cakera keras. exchange.IO ((“subscribed”): mengembalikan kontrak yang telah ditandatangani, dalam format yang sama, hanya menyokong cakera keras.
CTP berjangka tradisionalContractTypeI.e. kontrak ID, untuk membezakan huruf besar dan huruf kecil.exchange.SetContractType("au1506")❚ Pengaturan kontrak yang berjaya memberikan maklumat terperinci mengenai kontrak yang dikembalikan, seperti jumlah minimum pembelian, bayaran, masa penghantaran, dan sebagainya. Apabila melanggan beberapa kontrak, hanya permintaan langganan yang sebenarnya dihantar pertama kali, dan kemudian hanya menukar pasangan transaksi di peringkat kod, tanpa memakan masa. Kontrak berturut-turut yang kuat adalah dengan kod 888 seperti MA888, kontrak indeks berturut-turut adalah 000 seperti MA000, 888 dan 000 hanya menyokong pengukuran kembali untuk perdagangan kontrak maya, dan hanya menyokong pengambilan dalam keadaan fizikal.Tetapi bahasa Mac boleh mengendalikan kontrak utama, dan program akan menukar kedudukan secara automatik, iaitu menghapuskan kedudukan yang tidak utama, dan membuka kedudukan baru di kedudukan utama.
Kontrak tidak dapat disiapkan tanpa berjaya log masuk, tetapi ia akan dikembalikan dengan segera, jadi anda boleh mencuba semula dengan _C, mengetahui bahawa log masuk CTP selesai. Apabila log masuk berjaya, menyiapkan semula kontrak tidak memakan masa dan tidak akan menghasilkan akses rangkaian yang sebenar.
SetDirectionArahan boleh diambilbuy, closebuy, sell, closesellEmpat parameter, lebih banyak komoditi berjangkaclosebuy_todaydanclosesell_today“Saya tidak tahu apa-apa”, kata beliau.closebuy/closesellUntuk kedudukan yang seimbang, hanya varian yang terakhir yang dibezakan antara kedudukan yang seimbang hari ini dan semalam, yang mungkin mempengaruhi bayaran proses, oleh itu perlu memberi keutamaan kepada kedudukan yang seimbang semalam. Untuk niaga hadapan CTP tradisional, anda boleh menetapkan parameter kedua 1 atau 2 atau 3 yang merujuk kepada spekulasi, keuntungan, dan tidak menetapkan spekulasi lalai.Peranti yang digunakan untuk membeli dan menjual, mendapatkan kedudukan, mendapatkan pesanan, mengeluarkan invois, dan mendapatkan akaun adalah sama dengan perdagangan mata wang digital.
| Pengendalian | SetDirection parameter | Fungsi perintah bawah |
|---|---|---|
| Memulakan Posisi | exchange.SetDirection(“buy”) | exchange.Buy() |
| Pindo Posisi | 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 kedudukan kosong yang spesifik, perhatikan bahawa contoh ini terlalu mudah, juga perlu mempertimbangkan sama ada dalam masa perdagangan, tidak sepenuhnya berdagang bagaimana untuk memasang pesanan berat, berapa jumlah pesanan maksimum, apakah frekuensi terlalu tinggi, khususnya harga tergelincir atau terbuka dan lain-lain.Perpustakaan terbuka untuk cakera disyorkan menggunakan perpustakaan yang terbungkus dengan platform, https://www.fmz.com/strategy/12961。 Terdapat penerangan terperinci di bahagian perpustakaan kelas, dan juga disarankan untuk mempelajari kod 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]);
}
}
}
Komoditi berjangka menyokong jenis pesanan tersuai (mendukung cakera keras, backtesting tidak disokong), cara penyenaraian kemudian, ditambah dalam penyenaraian_Contohnya, di bahagian belakang
exchange.SetDirection("buy_ioc");
exchange.SetDirection("sell_gtd-20170111")
Pengakhiran yang tepat ialah:
Secara lalai, semua antara muka CTP dibuka di peniaga niaga hadapan komoditi, dan jika diminta, ia boleh ditukar kepada antara muka easyJet. Melalui pembungkusan FMZ, cara panggilan sama. Perbezaannya adalah bahawa akaun, pesanan, dan penyimpanan adalah mod push, jadi penjaga akan memelihara data ini secara tempatan, dan ia akan dikembalikan dengan serta-merta apabila memanggil antara muka yang sesuai, dan tidak akan membuat permintaan sebenar.
Jenis pesanan yang disesuaikan dengan perjanjian Isshin adalah seperti berikut:
Log sebuah log dalam antara muka cakera keras, ditambah @ di belakang senar dan mesej akan masuk ke dalam barisan penyemak imbas, dan akan dihantar secara langsung selepas mengikat WeChat atau telegram.Log('推送到微信@')
Warna log juga boleh disesuaikanLog('这是一个红色字体的日志 #ff0000') 。#ff000016 digit untuk warna RGB
Semua fail log wujud dalam pangkalan data sqlit pada cakera dalam direktori tuan rumah, yang boleh dimuat turun dan dibuka menggunakan perisian pangkalan data, atau boleh digunakan untuk menyalin pemulihan sandaran (nama pangkalan data dan id cakera tetap sama).
Mencatat keuntungan, dan melukis garis keuntungan di antara muka cakera keras, yang boleh disimpan selepas cakera keras dihidupkan semula.LogProfit(1000)PerhatianLogProfitParameter tidak semestinya adalah keuntungan, ia boleh menjadi apa-apa nombor dan perlu diisi sendiri.
Status cakera tetap, kerana log disimpan terlebih dahulu dan terus diperbaharui, ia boleh digunakan jika anda hanya perlu menunjukkan maklumat yang tidak disimpanLogStatusfungsi.LogStatusParameter adalah senar, dan juga boleh digunakan untuk mewakili maklumat borang.
Contoh jadual yang menunjukkan kedudukan status cakera tetap:
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'); // 上下排列显示多个表
Parameter adalah bilangan milidetik, sepertiSleep(1000)Satu saat untuk berehat. Oleh kerana semua perdagangan mempunyai had frekuensi akses, strategi umum adalah untuk memasukkan masa berehat dalam lingkaran mati.
Selepas itu, program akan dimulakan semula, dan jika anda ingin menyimpan maklumat yang kekal, anda boleh memindahkannya._GIa sangat mudah digunakan dan boleh menyimpan kandungan JSON._GFungsi ditulis dalamonexit()Dalam, setiap kali anda menghentikan strategi, anda akan menyimpan maklumat yang anda perlukan secara automatik.
Jika anda mahu menyimpan lebih banyak data dalam format yang lebih baik, anda boleh menggunakan aplikasi ini._Fungsi G kurang sesuai, anda boleh menggunakan Python untuk menulis ke dalam pangkalan data secara langsung.
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')
}
}
FMZ mempunyai fungsi _N yang terbina dalam untuk menentukan digit titik kecil yang disimpan, seperti_N(4.253,2)Hasilnya ialah 4.25.
API bursa panggilan tidak menjamin kejayaan setiap kali anda mengaksesnya._C adalah fungsi yang akan cuba semula secara automatik. Ia akan terus memanggil fungsi yang ditetapkan sehingga ia berjaya dikembalikan (fungsi yang dikembalikan adalah null atau false akan cuba semula), seperti_C(exchange.GetTicker), selang percubaan semula default adalah 3 saat, fungsi_CDelay boleh dipanggil untuk mengawal selang percubaan semula, contohnya_CDelay(1000), perubahan fungsi_C interval percubaan semula adalah 1 saat, disyorkanGetTicker(),exchange.GetDepth,GetTrade,GetRecords,GetAccount,GetOrders, GetOrderIa menggunakan _C untuk mengelakkan kegagalan akses yang menyebabkan program terganggu.
CancelOrderTidak boleh menggunakan fungsi_C, kerana kegagalan penarikan balik mempunyai pelbagai sebab, jika satu unit telah bertukar, penarikan balik akan kembali gagal, menggunakan fungsi_C akan menyebabkan terus mencuba semula.
_Fungsi C juga boleh dihantar ke dalam parameter, dan juga digunakan dalam fungsi tersuai.
function main(){
var ticker = _C(exchange.GetTicker)
var depth = _C(exchange.GetDepth)
var records = _C(exchange.GetRecords, PERIOD_D1) //传入参数
}
Panggilan Langsung_D()Mengembalikan senar masa semasa, seperti:2019-08-15 03:46:14。 Jika dipanggil dalam pengembalian, masa pengembalian akan dikembalikan 。 Anda boleh menggunakan fungsi _D untuk menentukan masa, seperti:_D().slice(11) > '09:00:00':
_D(timestamp,fmt).ms akan mengubah timestamp ke string waktu, seperti_D(1565855310002)。fmt Parameter adalah format masa, secara lalaiyyyy-MM-dd hh:mm:ss
Untuk beberapa fungsi penunjuk yang biasa digunakan, seperti MA\MACD\KDJ\BOLL, penunjuk yang biasa digunakan, FMZ platform dibina secara langsung, penunjuk yang disokong khusus boleh dilihat dalam dokumentasi API.
Sebelum menggunakan fungsi penunjuk, lebih baik menilai panjang K. Apabila panjang K sebelumnya tidak memenuhi kitaran yang diperlukan untuk pengiraan, hasilnya adalahnull。 Jika panjang K input adalah 100 dan kitaran MA adalah 10, maka 9 nilai pertama adalah null, kemudian dikira normal。
JavaScript juga menyokong talib lengkap, yang disokong oleh perpustakaan pihak ketiga, sepertitalib.CCI(records)❚ Referensi http://ta-lib.org/function.html ❚ Untuk Python, anda boleh memasang perpustakaan talib sendiri, kerana ia memerlukan pengkompilan, dan tidak boleh dipasang dengan mudah menggunakan pip, anda boleh mencari cara pemasangan sendiri ❚
Fungsi penunjuk boleh dihantar ke dalam arrays selain daripada data K line
function main(){
var records = exchange.GetRecords(PERIOD_M30)
if (records && records.length > 9) {
var ma = TA.MA(records, 14)
Log(ma)
}
}
Berikut adalah beberapa fungsi JavaScript yang biasa digunakan di desktop.
Date.now()Kembali ke tanda masa semasaparseFloat()Menukarkan string ke nombor, sepertiparseFloat("123.21")parseInt()Ubah string ke bilangan bulatnum.toString()Menukar nombor kepada rentetan, num kepada pembolehubah nomborJSON.parse()String Json yang diformat sepertiJSON.parse(exchange.GetRawJSON())Math.max(),Math.abs()Operasi matematik yang biasa digunakan, rujukan: https://www.w3school.com.cn/jsref/jsref_obj_math.aspTerdapat banyak keadaan yang perlu dipertimbangkan untuk menulis fungsi strategi cakera keras, seperti membeli 5 keping sebagai fungsi mudah, kita perlu m