FMZ Mengukur Platform Strategi Menulis tutorial pemula (mesti lihat)

Penulis:Rumput, Dicipta: 2019-08-13 17:47:27, Dikemas kini: 2021-08-06 10:29:46

[TOC] Tutorial ini mengandungi pengetahuan awal mengenai penulisan dasar, termasuk pengenalan, pengulangan, grafik dan lain-lain. Setelah mempelajari tutorial asas ini, pengguna akan dapat menggunakan API asas dengan cekap untuk menulis strategi rakit yang stabil. Sebelum mempelajari tutorial ini, anda perlu belajar terlebih dahulu.FMZ inventor menggunakan platform kuantiti untuk memulakan 。

Tutorial versi lama:Pencipta Kuantitization (FMZ.COM) Strategi yang ditulis sepenuhnya menggunakan manual 2.0 (tutorial)Dalam tutorial ini, anda boleh melihat senarai banyak post yang telah diindeks.

Panduan awal untuk menyusun strategi

Pengenalan API

Perdagangan berprogram adalah perisian yang disambungkan melalui API dan bursa untuk membolehkan pembelian, penjualan atau fungsi lain dilakukan secara automatik seperti yang dirancang. API dikenali sebagai Application Programming Interface.

Pada masa ini, pertukaran mata wang digital mempunyai dua protokol antara muka utama: REST dan Websocket. Protokol REST memerlukan akses satu kali untuk setiap data yang diambil. Sebagai contoh, dengan menggunakan API pertukaran analog wex.app, buka https://api.wex.app/api/v1/public/ticker?market=BTC_USDT secara langsung di penyemak imbas anda, 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 dapat melihat pasaran terkini yang diperdagangkan dengan pasangan BTC_USDT, yang akan berubah setiap kali diperbaharui.market=Seterusnya terdapat parameter transaksi tertentu yang boleh diubah untuk mendapatkan data transaksi lain. Untuk antara muka awam, seperti pasaran, semua orang boleh mengaksesnya, jadi tidak perlu disahkan, sementara beberapa antara muka seperti pesanan di bawah dan mendapatkan akaun memerlukan pengesahan pengguna, di mana tanda tangan diperlukan menggunakan API-KEY. Websocket adalah mod langganan, setelah menghantar kandungan yang memerlukan langganan, bursa akan menghantar data yang diperbaharui kepada program, tidak perlu dikunjungi semula setiap kali, jadi lebih cekap.

FMZ Quantitative Trading Platform merangkumi antara muka REST untuk setiap bursa, menggunakan cara yang seragam untuk memanggil dan format data, untuk membuat strategi yang ditulis lebih mudah dan umum. Dalam platform FMZ, sokongan Websocket boleh digunakan dengan mudah, yang akan dijelaskan secara terperinci dalam tutorial berikut.

Bahasa pengaturcaraan yang berbeza

FMZ platform API dokumentasi 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 akan ada pengenalan khusus kemudian. Oleh kerana Js agak mudah dan tidak mempunyai masalah keserasian, pengguna pemula disyorkan untuk digunakan. FMZ platform kuantitatif menyokong penuh Python, boleh bebas memasang pelbagai pakej, disyorkan untuk mempunyai asas pemrograman tertentu penggunaan.

Oleh kerana terdapat versi Python yang berbeza, program boleh ditetapkan pada permulaan, seperti#!Python2,#!Python3Perhatikan bahawa JavaScript baru-baru ini menaik taraf tatabahasa ES6, yang menarik untuk difahami. Di bawah ini menunjukkan kod Python dan Javascript yang mempunyai fungsi yang sama, hanya terdapat perbezaan tatabahasa, oleh itu dokumentasi API hanya memberikan contoh Javascript, dan tutorial ini juga akan mengambil kira contoh 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)
    }
}

Rekomendasi sumber

Alat penyesuaian

FMZ Quantum Platform menyediakan alat debugging untuk meng-debug antara muka API.https://www.fmz.com/m/debug. Alat debugging hanya menyokong JavaScript, hanya boleh dijalankan untuk sementara waktu, tanpa membuat cakera nyata, anda boleh melakukan debugging antara muka pertukaran. Data yang dikembalikan akan dikembalikan sebagai hasil, kod alat debugging tidak disimpan. Dalam tutorial ini, anda boleh mencuba menggunakan alat debugging pada masa yang sama.img

Senibina prosedur strategik

Program dasar seperti program biasa, dijalankan mengikut urutan kod, dengan keistimewaan bahawa mesti ada fungsi utama. Oleh kerana dasar perlu berjalan tanpa henti, biasanya memerlukan satu pusingan ditambah masa tidur. Oleh kerana frekuensi akses semua API transaksi adalah terhad, masa tidur perlu disesuaikan. Arkitektur ini adalah pelaksanaan interval tetap yang khas, dan websockt juga boleh digunakan untuk menulis dasar yang didorong peristiwa, seperti pelaksanaan segera apabila terdapat perubahan mendalam, yang akan diperkenalkan dalam tutorial lanjutan.

Fungsi lain yang mempunyai peranan khusus adalah sebagai berikut:

  • onexit ((() untuk keluar normal fungsi sweep tail, masa pelaksanaan maksimum adalah 5 minit, boleh tidak dinyatakan, jika masa berlalu akan melaporkan kesalahan interrupt; boleh digunakan untuk menyimpan beberapa hasil semasa keluar prosedur.
  • onerror ((() untuk fungsi keluar pengecualian, masa pelaksanaan maksimum 5 minit, boleh tidak dinyatakan.
  • Ini adalah fungsi yang tidak boleh diisytiharkan.
function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //在这里写策略逻辑,将会每6s调用一次
}
function main(){
    while(true){
        onTick()
        Sleep(6000)
    }
}

Contoh di atas jika kesalahan akses rangkaian boleh menyebabkan dasar berhenti secara langsung, jika anda mahu dasar yang serupa dengan auto restart tidak akan berhenti, anda boleh menggunakan semula dasar cakera padat dengan cuba menangkap loop error master. Sudah tentu hanya apabila dasar stabil yang disyorkan untuk melakukan tindakan ini, jika tidak, semua kesilapan tidak akan dikembalikan dan sukar untuk menyusun masalah dasar.

function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //在这里写策略逻辑,将会每6s调用一次
}
function main(){
    try{
        while(true){
           onTick()
           Sleep(6000)
       }
    }catch(err){
        Log(err)
    }
}

Perkenalkan API Bursa

Pertukaran dan pasang perdagangan

Apabila memanggil API yang berkaitan dengan mana-mana pertukaran, pertukaran dan pasangan dagangan perlu dinyatakan.exchangeJadi, kita boleh menggunakan satu kata untuk mewakili objek ini, sepertiexchange.GetTicker()Yang akan diperoleh ialah ticker pasaran bagi pertukaran ini - pasangan dagangan.

Platform FMZ menyokong penambahan beberapa pasangan pertukaran-dagang pada masa yang sama, seperti BTC dan ETH yang boleh dioperasikan pada masa yang sama di akaun pertukaran yang sama, dan juga BTC dan ETH yang boleh dioperasikan pada masa yang sama di satu pertukaran. Perhatikan bahawa akaun yang berbeza dari satu pertukaran juga boleh ditambahkan pada masa yang sama, yang berbeza berdasarkan label yang ditambahkan ke laman web FMZ.exchangesArray menunjukkan bahawa mengikut urutan penambahan cakera sebenar yang dibuat,exchanges[0]exchanges[1]...dan sebagainya. Format pasangan perdagangan adalah sepertiBTC_USDTYang pertama adalah BTC sebagai mata wang dagangan, USDT sebagai mata wang harga.

img

Jelasnya, ini akan menjadi masalah jika kita mengendalikan banyak pasangan perdagangan, di mana kita boleh menukar pasangan dengan SetCurrency, seperti SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurrency, SetCurexchange.SetCurrency("BTC_USDT")Pada masa ini,exchangePasangan transaksi yang terikat akan berubah untukBTC_USDT, akan kekal berkuatkuasa sehingga panggilan seterusnya untuk menukar pasangan dagangan.Ambil perhatian untuk mengulangi ujian terkini yang menyokong pasangan pertukaran.Di bawah ini adalah satu contoh konkrit.

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)
  }
}

Mendapatkan antara muka terbuka seperti pasaran

Sebagai contoh di atas, antara muka pasaran biasanya adalah antara muka terbuka dan boleh diakses oleh semua orang. Antara muka pasaran biasa adalah: mendapatkan ticker pasaran, mendapatkan kedalaman mendalam, mendapatkan rekod K-line, mendapatkan rekod urus niaga. Pasar adalah asas untuk membuat keputusan perdagangan, yang akan diperkenalkan secara terperinci di bawah, yang terbaik untuk mencuba sendiri dalam alat debugging, untuk penjelasan terperinci boleh melihat dokumentasi API.

Perkhidmatan ini mempunyai pelbagai jenis.InfoBidang, menunjukkan strings data asal yang dikembalikan oleh bursa, boleh digunakan untuk menambah maklumat tambahan, perlu diselesaikan sebelum, penggunaan JavaScriptJSON.parse()Python menggunakan perpustakaan json.TimeBidang ini menunjukkan tanda masa permintaan, yang boleh digunakan untuk menentukan penundaan.

Penggunaan antara muka API pada cakera fizikal juga boleh menyebabkan akses gagal dan kembalinullPython KembaliNoneOleh itu, pembebasan kesalahan sangat penting. Tutorial ini akan membincangkannya secara berasingan.

GetTicker

Mendapatkan pasaran semasa, yang mungkin antara muka yang paling biasa digunakan, boleh mencari harga dagangan terakhir, beli satu jual harga, jumlah dagangan baru-baru ini, dan lain-lain maklumat.{"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

Mendapatkan maklumat mendalam mengenai order. Walaupun GetTicker mengandungi pembelian dan jual satu, tetapi jika anda ingin menyiasat order yang lebih dalam, anda boleh menggunakan antara muka ini untuk mencari 200 order yang paling bawah. Anda boleh menggunakan antara muka ini untuk mengira harga kejutan. Di bawah ini adalah hasil pulangan 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 pembelian dan jualan menggunakan akses mendalam:

function main() {
    var depth = exchange.GetDepth()
    Log('买一价个: ', depth.Bids[0].Price, '卖一价格: ', depth.Asks[0].Price)
}

GetRecords

Dapatkan K-line, salah satu antara muka yang paling biasa digunakan, yang boleh mengembalikan maklumat harga yang lebih lama pada satu masa, untuk mengira asas pelbagai indikator. K-line cycle jika tidak ditentukan menunjukkan tempoh lalai yang akan digunakan apabila ditambahkan cakera sebenar. K-line length cannot be specified, it will continue to increase over time accumulation, up to a maximum of 2000 bits, the first call is about 200 bits (di mana pertukaran yang berbeza kembali); K-line terakhir adalah K-line terbaru, jadi data akan terus berubah dengan keadaan, K-line pertama adalah data tertua.

exchange.SetMaxBarLen(Len)Bilangan baris K yang diambil untuk pertama kalinya (sebahagian pertukaran disokong) boleh ditetapkan dan jumlah baris K maksimum ditetapkan.Contohnya:exchange.SetMaxBarLen(500)

GetRecords boleh menentukan 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 pengurus terkini, akan menyokong kitaran tersuai, dengan menghantar kitaran detik secara langsung sebagai parameter, kesesuaian peringkat minit akan disintesis berdasarkan garis K 1 minit, dan garis K kurang dari 1 minit akan disintesis melalui GetTrades (), dan niaga hadapan komoditi akan disintesis berdasarkan tik,Berhati-hati, anda akan menemui perkara yang sama dalam tutorial ini.PERIOD_M1Variabel yang ditulis besar ini, yang merupakan variabel global FMZ secara lalai, yang berminat boleh log sendiri nilai tertentu mereka, biasanya 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 garis 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
}

GetTrades

Mendapatkan data urus niaga dalam jangka masa tertentu (bukan data urus niaga sendiri) tidak disokong oleh beberapa bursa.

Memperoleh akaun untuk berdagang

Antara muka ini tidak boleh diakses secara langsung kerana berkaitan dengan akaun dan memerlukan tandatangan API-KEY. Platform FMZ telah memproses persatuan secara automatik di latar belakang, yang boleh digunakan secara langsung.

GetAccount Dapatkan akaun

Mendapatkan maklumat akaun. Salah satu antara muka yang paling biasa digunakan, perlu dipanggil sebelum membuat pesanan untuk mengelakkan baki yang tidak mencukupi. Kembali hasil seperti:{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}... di mana stok adalah baki mata wang yang tersedia untuk diperdagangkan dalam pasangan dagangan, stok beku adalah baki beku untuk pesanan yang belum selesai, baki adalah baki yang tersedia untuk mata wang harga, dan baki beku adalah baki beku jika dagangan adalah benar.BTC_USDTDalam bahasa Inggeris, Stocks merujuk kepada BTC dan Balance merujuk kepada USDT.

Perhatikan bahawa hasil yang dikembalikan adalah hasil pasangan transaksi yang ditentukan, maklumat mata wang lain dalam akaun dagangan berada di medan Info, untuk mengendalikan beberapa pasangan dagangan dan tidak perlu memanggil beberapa kali.

Satu papan yang terus menerus mencetak nilai dagangan semasa terhadap nilai keseluruhan:

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
    }
}

Bayar di bawah Buy

Permohonan pembayaran.exchange.Buy(Price, Amount)atauexchange.Buy(Price, Amount, Msg),Price adalah harga,Amount adalah kuantiti,Msg adalah satu senar tambahan yang boleh dipaparkan dalam log cakera sebenar, bukan wajib. Cara ini adalah untuk mendedahkan pesanan, jika tidak dapat diproses sepenuhnya dengan segera, ia akan menghasilkan pesanan yang tidak diproses, pesanan berjaya kembali hasil sebagai order id, kegagalan sebagainull, digunakan untuk mendapatkan status pesanan.

Jika anda ingin membayar dengan harga pasaran, harga adalah -1, jumlah adalah nilai pesanan, sepertiexchange.Buy(-1, 0.5)Perdagangan betul.ETH_BTCDalam beberapa pasaran tidak menyokong senarai harga pasaran dan tidak menyokong penyesuaian masa hadapan.

Syarat ketepatan semua harga dan kuantiti yang boleh didapati untuk sebahagian transaksi_N()Fungsi ketepatan untuk mengawal. Untuk dagangan niaga hadapan Beli dan Jual mempunyai makna lain, akan diperkenalkan secara berasingan.

Contoh pembelian dengan harga yang sesuai:

function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var price = ticker.Sell
        if(price >= 7000){
            exchange.Buy(_N(price+5,2), 1, 'BTC-USDT')
            break
        }
        Sleep(3000)//Sleep 3000ms
    }
    Log('done')
}

Jual Beli

Perintah jual bawah. Parameternya sama dengan Perintah Beli. Parameter Perintah Harga Pasar mempunyai makna yang berbeza, seperti Perintah Jual Harga Pasar.exchange.Sell(-1, 0.2)Di samping itu, para pelabur juga telah menjual 0.2 ETH untuk harga pasaran.

GetOrder untuk mendapatkan pesanan

Mendapatkan maklumat pesanan berdasarkan id pesanan; antara muka biasa, cara panggilanexchange.GetOrder(OrderId),OrderId adalah id pesanan, yang akan dikembalikan apabila anda membuat pesanan.Perhatikan jenis pesananTypeBidang dan status pesananStatusNilai sebenar adalah nombor yang mewakili makna yang berbeza, tetapi tidak baik untuk ingatan, FMZ menggunakan pemalar global untuk mewakili nilai-nilai ini, seperti pesanan yang belum selesai.StatusNilai ini ialah 0.ORDER_STATE_PENDING, semua konstanta global ini boleh dilihat di dalam dokumentasi.◄ Kembali hasil:

{
    "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 tertentu:

function main(){
    while(true){
        var amount = exchange.GetAccount().Stocks
        var ticker = exchange.GetTicker()
        var id = null
        if(5-amount>0.01){
            id = exchange.Buy(ticker.Sell, Math.min(5-amount,0.2))
        }else{
            Log('Job completed')
            return //return the main function, bot will stop
        }
        Sleep(3000) //Sleep 3000ms
        if(id){
            var status = exchange.GetOrder(id).Status
            if(status == 0){ //这里也可以用 status == ORDER_STATE_PENDING 来判断。
                exchange.CancelOrder(id)
            }
        }
    }
}

GetOrders Perintah yang belum selesai

Mendapatkan senarai transaksi semasa untuk semua pesanan yang belum selesai. Jika tiada pesanan yang belum selesai, kembalikan array kosong. Hasil tertentu 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)
    }
}

Batalkan Perintah

Perintah dibatalkan berdasarkan id pesanan.exchange.CancelOrder(OrderId)▽ Undur berjaya mengembalikan true, jika tidak kembali false. ▽ Perhatikan bahawa pesanan telah selesai dan akan ditarik balik gagal.

Kontrak niaga hadapan dan kekal

Perdagangan niaga hadapan mata wang digital berbeza dengan perdagangan tunai, fungsi dagangan tunai di atas juga berlaku untuk niaga hadapan, perdagangan niaga hadapan tunggal mempunyai fungsi tersendiri. Sebelum melakukan dagangan berjangka berprogram mata wang digital, anda perlu membiasakan diri dengan operasi manual di laman web ini, memahami konsep asas, seperti pembukaan, pemisahan, pemisahan penuh, pemisahan, leverage, kerugian, keuntungan terapung, wang jaminan dan formula pengiraan yang sesuai, anda boleh mencari tutorial yang berkaitan di setiap bursa niaga hadapan dan perlu belajar sendiri.

Kontrak kekal dan kontrak niaga hadapan adalah sama, tetapi berbeza dengan konsep tidak memegang banyak ruang pada masa yang sama.

Jika bursa menyokong masa depan yang sama-sama seperti OKEX dan Huobi, pilihan untuk menambahkan OKEX dan Huobi secara berasingan dalam antara muka bursa diperlukan, yang dianggap sebagai bursa yang berbeza dari FMZ.

SetContractType Tetapkan kontrak

Langkah pertama perdagangan niaga hadapan ialah menetapkan kontrak yang akan diperdagangkan, contohnya niaga hadapan OKEX, memilih pasangan perdagangan BTC semasa membuat rak atau mengulang, dan juga perlu menetapkan dalam kod sebagai kontrak minggu ini, minggu depan atau suku. Jika tidak ditetapkan, akan diminta.invalid contract typeBerbeza dengan dagangan langsung, kontrak niaga hadapan seringkali diperdagangkan dengan mata wang dagangan seperti BTC sebagai jaminan, pasangan dagangan yang ditambahkan BTC biasanya mewakili pasangan dagangan BTC_USD yang ditandatangani dengan BTC sebagai jaminan, jika ada masa depan yang ditandatangani dengan USDT, perlu membuat pasangan dagangan BTC_USDT yang ditambahkan dengan sebenar.Setelah pasangan dagangan ditetapkan, jenis kontrak tertentu juga ditetapkan, seperti kekal, minggu yang sama, minggu berikutnya, dan sebagainya. Selepas kontrak ditetapkan, operasi pembelian, penjualan dan lain-lain boleh dilakukan.

Kontrak yang ada pada bit mata wang dan bit USDT, seperti Binance, OKEX, HuobiDM, perlu dibezakan ketika menambahkan kontrak tetapan sebenar. 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官网。

GetPosition Simpan

Mendapatkan senarai maklumat simpanan semasa, OKEX ((OKCOIN) masa hadapan boleh dihantar dengan parameter yang menentukan jenis kontrak yang akan diperoleh. Jika tidak ada simpanan, kembalikan senarai kosong[]⇒ Pengekalan maklumat dikembalikan sebagai berikut, banyak maklumat spesifik, perlu digabungkan dengan analisis khusus transaksi.

Jenis data Nama pembolehubah Pencerahan
objek Maklumat Struktur asal pertukaran kembali
nombor MarginLevel saiz leverage, OKCoin adalah 10 atau 20, OK masa hadapan mode keseluruhan saham kembali kepada tetap 10, kerana API asli tidak menyokong
nombor Jumlah Jumlah simpanan, OKCoin menunjukkan jumlah kontrak (jumlah bulat dan lebih besar daripada 1)
nombor Beku Jumlah Jumlah bekuan kedudukan
nombor Harga Harga simpanan
nombor Margin Pembekuan simpanan
nombor Keuntungan Futures komoditi: Pendapatan pasaran saham, mata wang digital: ((Unit mata wang digital: BTC/LTC, Unit niaga hadapan tradisional: RMB, Nota: OKCoin futures merujuk kepada kelonggaran dalam keadaan saham penuh, bukan keuntungan saham, penurunan saham merujuk kepada keuntungan saham)
const Jenis PD_LONG untuk banyak kedudukan (dengan closebuy_today dalam CTP), PD_SHORT untuk kosong kedudukan (dengan closeesell_today dalam CTP), PD_LONG_YD untuk banyak kedudukan semalam (dengan closebuy), PD_SHORT_YD untuk kosong kedudukan semalam (dengan closeesell dalam CTP)
senar Jenis Kontrak Komoditi berjangka sebagai kod kontrak, Saham sebagai kod bursa _ Saham sebagai kod saham, Jenis input parameter tertentu 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)
    }
}

Masa hadapan dibuka atau ditutup

Pertama, anda perlu menetapkan saiz dan cara panggilan tuas:exchange.SetMarginLevel(10)10 menunjukkan 10 kali levera, saiz levera yang disokong secara khusus melihat bursa yang sesuai.Perhatikan bahawa levera mesti disiapkan di bursa, kod mesti sesuai dengan seting bursa, jika tidak akan berlaku kesalahan.▽ Boleh juga tidak, menggunakan tuas lalai. Kemudian, setkan arah transaksi, cara panggilan:exchange.SetDirection(Direction)Berbeza dengan niaga hadapan, jika kontrak kekal tidak mempunyai konsep banyak ruang pada masa yang sama, iaitu tidak membenarkan pegangan tunggal, melakukan banyak waktu terbuka akan secara automatik banyak posisi, semua hanya perlu ditetapkan.buydansellWalaupun demikian. Jika menyokong pemasangan dua arah, anda perlu menetapkanclosebuy,closebuy◦** Hubungan khusus:

Operasi Parameter SetDirection Fungsi bawah
Kedah pertukaran.SetDirection ((beli) pertukaran.Beli ((()
Pelan-pelan pertukaran.SetDirection ((closebuy) pertukaran.Menjual ((()
Kemudahan kosong pertukaran.SetDirection ((jual) pertukaran.Menjual ((()
Gudang kosong pertukaran.SetDirection ((closesell) pertukaran.Beli ((()

Akhirnya, kod pelaksanaan pelaksanaan yang khusus, jumlah pesanan yang berbeza di bursa yang berbeza, seperti niaga hadapan huobi adalah berdasarkan jumlah kertas, satu kertas $ 100.

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)
}

Di bawah ini adalah contoh strategi yang spesifik untuk semua pendirian.

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 dalam mata wang digital

Walaupun perlu ditukarkan ke akaun leverage dalam kod, ia adalah sama seperti perdagangan langsung.

Penggunaanexchange.IO("trade_margin") beralih ke mod akaun margin, membuat pesanan, mendapatkan aset akaun akan mengakses antara muka levera pertukaran. Penggunaanexchange.IO("trade_normal") beralih semula ke mod akaun biasa.

Pertukaran yang disokong:

  • OKEX V3: Pasangan dagangan dalam model akaun leverage berbeza dengan pasangan dagangan biasa, dan beberapa pasangan dagangan mungkin tidak.
  • Token: Pasangan dagangan dalam model akaun leverage berbeza dengan pasangan dagangan biasa, dan beberapa pasangan dagangan mungkin tidak.
  • ZB: Dana hanya boleh dipindahkan ke QC, sektor dagangan leverage, dana bebas antara pasangan dagangan yang berbeza, iaitu jumlah koin QC di bawah pasangan dagangan ETH_QC, tidak dapat dilihat di BTC_QC
  • FCoin
  • Bitcoin (Binance)

Dagangan niaga hadapan komoditi

Perdagangan niaga hadapan komoditi berbeza dengan perdagangan niaga hadapan mata wang digital. Pertama, masa perdagangan niaga hadapan komoditi adalah singkat, dagangan mata wang digital 24h; protokol niaga hadapan komoditi juga bukan REST API yang biasa digunakan; kekerapan dagangan niaga hadapan komoditi dan had jumlah pesanan yang diikat, mata wang digital adalah longgar, dan sebagainya. Oleh itu, niaga hadapan komoditi mempunyai banyak tempat yang memerlukan perhatian khusus, yang disyorkan untuk mempunyai pengalaman operasi manual yang kaya. FMZ menyokong simnow komoditi niaga hadapan simulator, rujukan:https://www.fmz.com/bbs-topic/325❖ Syarikat niaga hadapan komoditi menambah:https://www.fmz.com/bbs-topic/371

Komoditi niaga hadapan dan Jun 2019 melaksanakan pengawasan pemasangan, individu pemprosesan pengguna peribadi yang diperlukan untuk pemula pemasar permohonan kod kebenaran (templat maklumat yang diperlukan untuk permohonan tertentu boleh di WeChat kumpulan atau QQ kumpulan mesej), biasanya mengambil masa 4-5 hari, langkah-langkah yang lebih rumit. FMZ kuantitatif platform sebagai pembekal perdagangan pemprosesan memohon kod kebenaran perisian kepada setiap perkhidmatan niaga hadapan, pengguna boleh menggunakan secara langsung tanpa permohonan, dalam menambah pemasar hadapan adalah carian yang melihat pemasangan template boleh melihat senarai yang FMZ telah memohon.https://www.fmz.com/bbs-topic/3860◦ Jika broker masa hadapan anda tidak lagi dalam senarai, anda hanya boleh memohon sendiri, atau membuka semula akaun anda di broker yang disokong, biasanya memerlukan masa 2 hari. ◦ FMZ mempunyai hubungan kerjasama yang mendalam dengan beberapa pelayan, seperti Futures Macromolecular, yang membeli versi institusi platform FMZ, yang boleh digunakan oleh pengguna, pembuka secara automatik menjadi VIP, dan kos prosedur adalah minimum. ◦ Rujukan pembuka:https://www.fmz.com/bbs-topic/506

Oleh kerana kelebihan struktur platform FMZ, pengguna juga boleh menambah beberapa akaun broker hadapan dan mencapai beberapa ciri yang tidak dapat dilakukan oleh perisian perdagangan berprograman niaga hadapan komoditi lain, seperti penggabungan tik frekuensi tinggi, lihat:https://www.fmz.com/bbs-topic/1184

Rangka Kerja Strategik

Pertama, kerana ia bukan transaksi 24 jam dan memerlukan operasi pendaratan, keadaan pautan perlu dipertimbangkan sebelum transaksi dilakukan.exchange.IO("status")untuktrueIni menunjukkan bahawa anda telah disambungkan ke bursa tersebut. Jika anda tidak berjaya log masuk, panggil API tanpa mencadangkan butang login. Anda boleh Sleep ((2000) selepas dasar dimulakan dan memberi masa tertentu untuk log masuk._C(exchange.SetContractType,"MA888")Di samping itu, ia juga akan membantu untuk memastikan kejayaan pendaratan.

Pemerolehan dan kod dagangan untuk niaga hadapan komoditi adalah sama dengan niaga hadapan mata wang digital, di mana perbezaan dan perhatian 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)
        }
    }
}

Ia disyorkan untuk menggunakan perbankan komoditi berjangka (dijelaskan di bawah), di mana kod akan menjadi sangat mudah dan tidak perlu menangani butiran yang rumit.https://www.fmz.com/strategy/57029

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)
        }
    });
}

Model pengambilan data CTP

Masa hadapan komoditi menggunakan protokol CTP, semua pasaran dan pesanan yang ditukar hanya diberitahu apabila terdapat perubahan, sementara pesanan, akaun, pemegang permintaan adalah pertanyaan aktif. Oleh itu, ia sesuai untuk menulis strategi frekuensi tinggi yang didorong oleh peristiwa.GetTickerGetDepthGetRecordsSemua data disimpan cache untuk mendapatkan data terkini, apabila tidak ada data akan terus menunggu data, jadi strategi tidak boleh menggunakan tidur. Apabila terdapat perubahan pasaran, ticker, kedalaman, rekod akan dikemas kini, ketika ini panggilan antara muka mana pun akan segera kembali, keadaan antara muka yang dipanggil diletakkan sebagai mode kemas kini menunggu, panggilan seterusnya antara muka yang sama, akan menunggu data baru kembali.

Jika anda ingin mendapatkan data setiap kali anda mengakses pasaran, walaupun data lama, anda boleh beralih ke mod kemas kini pasaran segera.exchange.IO("mode", 0)Pada masa ini, dasar tidak boleh ditulis sebagai acara yang didorong, dan perlu menambah peristiwa Sleep untuk mengelakkan daur mati yang cepat. Beberapa strategi yang tidak kerap boleh menggunakan pola ini, reka bentuk dasar mudah digunakan.exchange.IO("mode", 1)Anda boleh membalikkan mod cache lalai.

Apabila mengendalikan kontrak tunggal, anda boleh menggunakan mod lalai. Tetapi jika terdapat beberapa kontrak, mungkin satu kontrak tidak mengemas kini pasaran, yang menyebabkan kesesakan antarmuka pasaran, dan pembaruan pasaran kontrak lain tidak dapat diakses. Untuk menyelesaikan masalah ini, anda boleh menggunakan mod kemas kini segera, tetapi tidak mudah menulis dasar frekuensi tinggi.exchange.IO("wait")◦ Jika banyak objek pertukaran ditambah, yang jarang berlaku dalam niaga hadapan komoditi, boleh digunakanexchange.IO("wait_any")Pada masa ini, indeks yang dikembalikan menunjukkan indeks bursa yang dikembalikan.

Tambahnya:{Event:"tick", Index:交易所索引(按实盘上交易所添加顺序), Nano:事件纳秒级时间, Symbol:合约名称}Pesan dihantar:{Event:"order", Index:交易所索引, Nano:事件纳秒级时间, Order:订单信息(与GetOrder获取一致)}

Pada masa ini, struktur strategi boleh ditulis sebagai berikut:

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)
        }
    }
}

Perbezaan antara niaga hadapan komoditi dan mata wang digital

Perlu juga diperhatikan perbezaan antara niaga hadapan komoditi dengan bursa mata wang digital. Seperti GetDepth yang sebenarnya hanya mempunyai satu file depth (biaya yang mahal untuk 5 file depth), GetTrades juga tidak dapat mendapatkan sejarah urus niaga (semuanya disimulasikan berdasarkan perubahan stok, tanpa rekod urus niaga sebenar).

Menetapkan kontrak

exchange.IO("instruments"): Kembalikan senarai semua kontrak di bursa dalam bentuk kamus {nama kontrak: butiran}, hanya menyokong plat sebenar.exchange.IO("products"): Kembalikan senarai semua produk dalam bentuk kamus {nama produk: butiran}, hanya menyokong cakera sebenar.exchange.IO("subscribed"): Kembalikan kontrak yang telah dilabelkan, format sama, hanya menyokong papan nyata.

CTP berjangka tradisionalContractTypeID kontrak yang digunakan ialah ID kontrak, yang berbeza dengan huruf besar dan kecil.exchange.SetContractType("au1506")❖ Kontrak setup berjaya mengembalikan maklumat terperinci kontrak, seperti berapa banyak yang dibeli sekurang-kurangnya sekali, yuran, masa penghantaran, dan lain-lain. ❖ Apabila melanggan beberapa kontrak, hanya kali pertama adalah permintaan langganan sebenar yang dihantar, dan kemudian hanya menukar transaksi pada tahap kod, tidak memakan masa. ❖ Kontrak berturut-turut utama adalah kod 888 seperti MA888, kontrak indeks berturut-turut adalah 000 seperti MA000, 888 dan 000 hanya menyokong ulangan perdagangan kontrak maya, cakera sebenar hanya menyokong mendapatkan transaksi. ❖Walau bagaimanapun, bahasa Mac boleh mengendalikan kontrak utama, dan program akan menukar kedudukan secara automatik, iaitu meratakan kedudukan bukan utama dan membuka kedudukan baru di atas kedudukan utama.

Tidak berjaya log masuk tidak dapat menetapkan kontrak, tetapi juga akan kembali dengan segera, jadi anda boleh mencuba semula dengan _C, mengetahui bahawa pendaratan CTP selesai. Setelah pendaratan berjaya, menetapkan semula kontrak tidak memakan masa dan tidak akan menghasilkan akses rangkaian sebenar.

Peninggalan

SetDirectionDi sini, anda boleh mengambilbuy, closebuy, sell, closesellEmpat parameter, lebih banyak niaga hadapan komoditiclosebuy_todaydenganclosesell_todayPerkataan ini merujuk kepada kedudukan sekarang, yang secara tidak sengaja dianggap sebagaiclosebuy/closesellUntuk masa hadapan yang rata, hanya varieti masa depan yang membezakan antara masa depan dan masa depan, yang mungkin mempengaruhi bayaran prosedur, oleh itu perlu memprioritikan masa depan yang rata. Untuk niaga hadapan tradisional CTP, parameter kedua boleh ditetapkan sebagai 1 atau 2 atau 3 atau, masing-masing, menunjukkan spekulasi spekulasi, keuntungan spekulasi, perlindungan spekulasi, tidak menetapkan spekulasi lalai.Operasi tertentu seperti membeli, mendapatkan kedudukan, mendapatkan pesanan, pengeluaran, mendapatkan akaun dan lain-lain adalah sama dengan dagangan niaga hadapan mata wang digital, boleh dirujuk pada bab sebelumnya.

Operasi Parameter SetDirection Fungsi bawah
Kedah pertukaran.SetDirection ((beli) pertukaran.Beli ((()
Pelan-pelan pertukaran.SetDirection ((closebuy) pertukaran.Menjual ((()
Kemudahan kosong pertukaran.SetDirection ((jual) pertukaran.Menjual ((()
Gudang kosong pertukaran.SetDirection ((closesell) pertukaran.Beli ((()

Contoh di bawah adalah fungsi perhentian tertentu, perhatikan bahawa contoh ini terlalu mudah, dan juga mempertimbangkan sebilangan besar soalan seperti apakah pada masa dagangan, bagaimana untuk mengikat semula pesanan yang tidak lengkap, berapa banyak jumlah pesanan maksimum, sama ada frekuensi terlalu tinggi, atau harga bergerak atau diskaun. Hanya untuk rujukan.Di samping itu, platform ini juga menawarkan perkhidmatan untuk mengemas kini dan mengemas kini buku-buku kelas.https://www.fmz.com/strategy/12961... terdapat penerangan khusus dalam bab perpustakaan kelas, dan disyorkan 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 (menyokong cakera sebenar, tidak menyokong retesting) yang ditetapkan dengan cara penanda, yang ditambahkan selepas penanda_penanda seperti

exchange.SetDirection("buy_ioc");
exchange.SetDirection("sell_gtd-20170111")

Di sini, kita akan melihat beberapa kesan yang spesifik:

  • ioc selesai dengan segera, atau THOST_FTDC_TC_IOC dibatalkan
  • gfs Bahagian ini sah THOST_FTDC_TC_GFS
  • gfd sah pada hari itu THOST_FTDC_TC_GFD
  • gtd sah sebelum tarikh yang ditetapkan THOST_FTDC_TC_GTD
  • gtc sah sebelum ditarik balik THOST_FTDC_TC_GTC
  • gfa Bidaan Kumpulan Sah THOST_FTDC_TC_GFA

Antara muka yang mudah

Secara lalai, peniaga niaga hadapan komoditi akan membuka antara muka CTP, yang boleh ditukar kepada antara muka EasyPay jika diperlukan. Dengan FMZ, pembungkusan, cara panggilan adalah sama. Perbezaan adalah bahawa akaun, pesanan, dan simpanan adalah mod push, oleh itu pengurus akan mengekalkan data ini secara tempatan, dan akan segera kembali ketika panggilan ke antara muka yang sesuai, dan tidak benar-benar mengeluarkan permintaan.

Di bawah ini adalah jenis pesanan yang disesuaikan dengan protokol Ease of Doing Business:

  • gfd sah pada hari itu TAPI_ORDER_TIMEINFORCE_GFD
  • gtc sah sebelum ditarik balik TAPI_ORDER_TIMEINFORCE_GTC
  • TAPI_ORDER_TIMEINFORCE_GTD
  • fak sebahagian diselesaikan, membatalkan sebahagian lagi TAPI_ORDER_TIMEINFORCE_FAK
  • ioc selesai dengan segera, atau membatalkan TAPI_ORDER_TIMEINFORCE_FAK
  • fok gagal menyetujui sepenuhnya, semua dibatalkan TAPI_ORDER_TIMEINFORCE_FOK

Fungsi global yang biasa digunakan

Log log dan WeChat

Dalam antara muka sebenar, log log, ditambah dengan @ karakter di belakang baris, mesej akan masuk ke barisan dorongan, dan akan terus didorong selepas mengikat WeChat atau telegram.Log('推送到微信@')

Warna log juga boleh disesuaikanLog('这是一个红色字体的日志 #ff0000')#ff000016 untuk warna RGB

Semua fail log berada di dalam pangkalan data sqlit pada cakera riil dalam direktori di mana hoster berada, boleh dimuat turun dan dibuka dengan perisian pangkalan data, atau boleh digunakan untuk menyalin pemulihan sandaran (nama pangkalan data adalah sama dengan id cakera riil).

LogProfit mencetak pendapatan

Mencatat pendapatan, dan melukis kurva pendapatan di antara antara muka cakera sebenar, yang boleh disimpan apabila cakera sebenar dihidupkan semula.LogProfit(1000)Perhatikan.LogProfitParameter tidak semestinya keuntungan, boleh menjadi mana-mana nombor, yang perlu diisi sendiri.

LogStatus Tanda keadaan (dengan jadual)

Status cakera sebenar, kerana log akan disimpan terlebih dahulu dan sentiasa diperbaharui, boleh digunakan jika anda memerlukan satu maklumat yang hanya dipaparkan tetapi tidak disimpanLogStatusFungsi tersebut.LogStatusParameter yang digunakan ialah string, yang juga boleh digunakan untuk menunjukkan maklumat jadual.

Contoh jadual yang menunjukkan lokasi status cakera sebenar:

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 beberapa mili saat, sepertiSleep(1000)Untuk tidur sejenak. Oleh kerana semua perdagangan mempunyai had frekuensi akses, strategi umum adalah untuk memasukkan waktu tidur dalam kitaran mati.

_G Simpan data

Apabila cakera tetap dihidupkan semula, program akan dihidupkan semula._GIa sangat mudah digunakan dan boleh menyimpan kandungan yang disusun dalam JSON._GFungsi ini ditulis dalamonexit()Apabila anda berhenti, ia akan menyimpan maklumat yang anda perlukan secara automatik. Jika anda ingin menyimpan lebih banyak data pemformatan, fungsi _G tidak begitu berguna dan anda boleh menggunakan Python untuk menulisnya secara langsung ke dalam pangkalan data.

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')
    }
}

_N fungsi ketepatan

FMZ mempunyai fungsi _N yang dibina untuk menentukan digit titik kecil yang disimpan, seperti:_N(4.253,2)Hasilnya ialah 4.25.

_C Cuba semula secara automatik

Untuk memanggil API pertukaran, tidak ada jaminan bahawa setiap lawatan akan berjaya, _C adalah fungsi yang cuba semula secara automatik._C(exchange.GetTicker), dengan selang uji semula lalai 3 saat, fungsi _CDelay boleh dipanggil untuk mengawal selang uji semula, seperti _CDelay ((1000), yang bermaksud mengubah selang uji semula fungsi _C menjadi 1 saat, disyorkanGetTicker(),exchange.GetDepth,GetTrade,GetRecords,GetAccount,GetOrders, GetOrderSemua menggunakan _C untuk memaafkan kesilapan dan mengelakkan kegagalan akses menyebabkan gangguan program.

CancelOrderFungsi _C tidak dapat digunakan kerana kegagalan penolakan boleh disebabkan oleh pelbagai sebab. Jika satu fail telah ditangani, penolakan akan kembali gagal, menggunakan fungsi _C akan menyebabkan percubaan semula terus-menerus.

Fungsi _C juga boleh menghantar parameter dan digunakan untuk fungsi kustom.

function main(){
    var ticker = _C(exchange.GetTicker)
    var depth = _C(exchange.GetDepth)
    var records = _C(exchange.GetRecords, PERIOD_D1) //传入参数
}

Fungsi _Datum

Panggilan langsung_D()Mengembalikan senar masa semasa, seperti:2019-08-15 03:46:14│ jika dipanggil semula, waktu ulangan akan dikembalikan│ boleh digunakan untuk menentukan masa dengan fungsi _D, seperti:_D().slice(11) > '09:00:00':

_D(timestamp,fmt), akan mengubah ms timestamp menjadi senar masa, seperti_D(1565855310002)◎ fmt parameter adalah format masa, secara lalaiyyyy-MM-dd hh:mm:ss

Fungsi penunjuk TA

Untuk beberapa fungsi penunjuk yang biasa digunakan, seperti penunjuk biasa seperti MA\MACD\KDJ\BOLL, platform FMZ dibina secara langsung, dan penunjuk yang disokong secara khusus boleh dilihat dalam dokumentasi API.

Ia adalah lebih baik untuk menentukan panjang garis K sebelum menggunakan fungsi penunjuk. Apabila panjang garis K sebelumnya tidak dapat memenuhi kitaran yang diperlukan, hasilnya adalahnull. Jika panjang K baris input adalah 100 dan kitaran pengiraan MA adalah 10, maka 9 nilai pertama adalah sifar dan yang berikutnya adalah normal.

JavaScript juga menyokong talib penuh, sebagai perpustakaan pihak ketiga yang disokong untuk memanggil sepertitalib.CCI(records)◄ rujukanhttp://ta-lib.org/function.html. Untuk Python, anda boleh memasang sendiri perpustakaan talib, kerana perlu disusun, tidak boleh menggunakan pemasangan pip yang mudah, anda boleh mencari cara pemasangan sendiri.

Fungsi penunjuk boleh dihantar ke pelbagai aritmatika selain data K-line

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    if (records && records.length > 9) {
        var ma = TA.MA(records, 14)
        Log(ma)
    }
}

Fungsi JavaScript yang biasa digunakan

Berikut adalah beberapa fungsi JavaScript yang biasa digunakan di komputer.

  • Date.now()Kembali ke Jadual Masa Sekarang
  • parseFloat()Mengubah strings menjadi nombor, sepertiparseFloat("123.21")
  • parseInt()Mengubah strings menjadi bilangan bulat
  • num.toString()Mengubah nombor ke dalam tali dan num ke dalam pembolehubah nombor
  • JSON.parse()Untuk memformat strings json sepertiJSON.parse(exchange.GetRawJSON())
  • JavaScript sendiri membawa fungsi perpustakaan Math sepertiMath.max(),Math.abs()Antara kaedah yang paling biasa digunakan ialah:https://www.w3school.com.cn/jsref/jsref_obj_math.asp
  • FMZ merujuk kepada perpustakaan matematik pihak ketiga JavaScript, lihat:https://mathjs.org/
  • FMZ merujuk kepada perpustakaan underscore pihak ketiga JavaScript, yang disyorkan untuk mengetahui, yang memudahkan banyak operasi Js yang rumit, lihat:https://underscorejs.org/

Perpustakaan Templat

Menulis fungsi strategi sebenar sangat banyak keadaan yang perlu dipertimbangkan, seperti membeli 5 sen fungsi yang mudah, kita perlu mengambil kira: adakah baki semasa mencukupi? berapa harga pesanan? berapa ketepatan? tidak perlu memisahkan pesanan untuk mengelakkan kejutan pasaran? bagaimana untuk memproses pesanan yang belum selesai? dan lain-lain butiran. Dalam strategi yang berbeza, fungsi ini adalah sama, boleh dibuat sebagai templat.

Perpustakaan perdagangan mata wang digital JavaScript dan perpustakaan perdagangan niaga hadapan komoditi adalah terbina dalam secara lalai, tidak perlu disalin. Perpustakaan template lain boleh didapati di Strategy Squarehttps://www.fmz.com/square/20/1❏ Menyalin dan menyimpan perpustakaan kelas templat, dan dapat memilih perpustakaan kelas yang akan digunakan semasa membuat dasar anda sendiri.

Fungsi templat JavaScript digunakan untuk$Pada mulanya, Python menggunakanextPermulaan.

Perpustakaan Perdagangan Mata Wang Digital

Alamat kod sumber:https://www.fmz.com/strategy/10989, telah terbina dalam, tidak perlu disalin. Cara pelaksanaan fungsi tertentu boleh merujuk langsung kepada kod sumber.

Mendapatkan Akaun:

$.GetAccount(e)

Log($.GetAccount()); // 获取账户信息, 带容错功能
Log($.GetAcccount(exchanges[1]));

Permohonan 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); // 取消第二个交易所所有的卖单

Penghakiman silang:

$.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 pengeluaran:

$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")

Perpustakaan dagangan niaga hadapan komoditi

Perpustakaan dagangan niaga hadapan komoditi adalah stabil dan disyorkan untuk digunakan.https://www.fmz.com/strategy/12961⇒ Sudah terbina dalam, tidak perlu disalin.

Perpustakaan CTA

  • Cakera sebenar akan memetakan indeks secara automatik ke dalam rangkaian utama.
  • Menguruskan pemindahan secara automatik
  • Pemetaan semula boleh menentukan pemetaan seperti rb000/rb888 iaitu memetakan transaksi indeks rb ke rangkaian utama
  • Ia juga boleh dipetakan kepada kontrak lain, contohnya rb000/MA888 iaitu melihat garis K dalam indeks rb untuk berdagang MA secara berterusan.
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 perpustakaan

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)
    }
}

Perpustakaan gambar

Oleh kerana fungsi gambar asli agak rumit, yang akan diperkenalkan dalam tutorial berikut, pemula disyorkan untuk menggunakan perpustakaan grafik gambar secara langsung, grafik garis goresan yang sangat mudah, grafik garis K, dan lain-lain. FMZ mempunyai perpustakaan kelas sederhana yang dibina, yang dapat dilihat di halaman penyuntingan dasar, jika tidak ada yang dibina, pengguna perlu menyalin dan menyimpan sendiri untuk memilih rujukan dalam dasar.

img

Javascript Printed Graphics Library di mana anda boleh menyalin:https://www.fmz.com/strategy/27293Alamat untuk menyalin perpustakaan baris cetak Pythonhttps://www.fmz.com/strategy/39066

Contohnya:

function main() {
    while (true) {
        var ticker = exchange.GetTicker()
        if (ticker) {
            $.PlotLine('Last', ticker.Last) //可以同时画两条线,Last是这条线的名字
            $.PlotLine('Buy', ticker.Buy)
        }
        Sleep(6000)
    }
}

Tetapan parameter dasar

Di bawah penyuntingan dasar terdapat tetapan parameter dasar, yang setara dengan pembolehubah global dasar, yang boleh diakses di mana sahaja di dalam kod. Parameter dasar boleh diubah pada antara muka cakera sebenar, dan berlaku selepas dimulakan semula. Oleh itu, beberapa pembolehubah boleh ditetapkan sebagai parameter, dan parameter boleh diubah tanpa mengubah dasar.img

  • Nama pembolehubah: iaitu number, string, combox dan lain-lain dalam gambar di atas, boleh digunakan secara langsung dalam kumpulan dasar.
  • Penerangan: nama parameter dalam antara muka dasar, untuk memudahkan pemahaman tentang makna parameter.
  • Nota:: penjelasan terperinci parameter, yang akan muncul apabila tetikus tinggal di atas parameter;
  • Jenis: jenis parameter ini, dijelaskan lebih lanjut di bawah.
  • Nilai lalai: nilai lalai parameter ini.

Jenis senar dan nombor adalah mudah difahami dan juga jenis yang paling biasa digunakan. Daftar bawah akan memaparkan pilihan Daftar bawah dalam antara muka parameter, seperti anda boleh menetapkan nilai parameter SYMBOL Daftar bawah sebagaiBTC|USDT|ETHJika anda memilih USDT dalam hantaran turun halaman parameter, nilai SYMBOL dalam dasar adalah indeks 1 untuk USDT. Pilihan tanda kutip adalah kotak pilihan, tanda kutip adalah benar, jika tidak, palsu.

Terdapat banyak lagi parameter yang boleh anda sesuaikan.https://www.fmz.com/bbs-topic/1306

Ujian semula strategi

Setelah menyelesaikan kerja kuantifikasi strategi, anda boleh menguji strategi anda dengan data sejarah untuk melihat bagaimana strategi anda mendapat keuntungan dalam data sejarah. Hasil retargeting tentu saja hanya untuk rujukan. Platform kuantifikasi FMZ menyokong retargeting mata wang digital semasa, niaga hadapan, komoditi kontrak kekal BitMEX, niaga hadapan, di mana mata wang digital menyokong jenis utama. Javascript mengulas semula dalam penyemak imbas, Python mengulas semula perlu pada hos, yang boleh digunakan platform untuk menyediakan hos awam.

Pengujian semula

Mekanisme penyesuaian onbar adalah berdasarkan pada K-line, iaitu setiap K-line menghasilkan satu titik waktu penyesuaian di mana maklumat mengenai harga tinggi, rendah, jumlah dagangan, dan lain-lain boleh diperoleh pada titik masa K-line semasa dan sebelum titik masa ini.


Lebih lanjut

Gaoencheerapi

SainsBagaimana untuk melaksanakan dasar yang dijalankan secara tempatan? Saya menulis output log yang mudah dan mengikuti operasi di akhir ayat. Langkah pertama adalah menggunakan komputer riba sebagai pelayan untuk menjalankan program pengurus. Langkah kedua, tulis program test.py yang menghasilkan maklumat Log yang mudah (fungsi API FMZ); Langkah ketiga, seperti pada akhir teks, menulis runfile yang dijalankan melalui run.py dengan panggilan test.py. /upload/asset/1add39483ef82d45b3ce3.png

Gyp9Saya telah membeli kursus kuantiti perdagangan awan yang mudah, dan saya tidak tahu di mana untuk pergi sekarang.

MonuRajakbanyak

MonuRajakHai

Berjaya.Belajar

wqyTerdapat satu kesalahan teks kecil, GetAccount mendapatkan akaun dalam penerangan, FrozenStocks sepatutnya menjadi baki beku dan bukan baki yang boleh digunakan.

Encik Yang Muliagetorder outtime mendapatkan pesanan terlewat masa, pertukaran okx, bagaimana?

Uji 12 Rukun TinggiApakah kadar aset yang dijamin tidak boleh didapati, sehingga 0% akan dipaksa rata aset yang dijamin

Shifeng2020Saya melihat 1 minit k operasi grafik, jadi masa tidur kitaran mati Python boleh ditetapkan kepada 0.1s, iaitu tidur ((100) Adakah saya melihat anda menulis satu tidur ((10) di dalamnya, iaitu 0.1s tidak akan melebihi had API huobi HM?

Rumah Jiwa Timurexchange.SetDirection (("closebuy"); // Jika kontrak kekal, letakkan langsung exchange.SetDirection (("sell") Di sini saya cuba kontrak kekal OKex, jika anda menetapkannya sebagai jual, ia akan terbuka dengan segera, tidak begitu murah.

Rumah Jiwa Timurexchange.SetDirection (("closebuy"); // Jika kontrak kekal, letakkan langsung exchange.SetDirection (("sell") Di sini saya cuba kontrak kekal OKex, jika anda menetapkannya sebagai jual, ia akan terbuka dengan segera, tidak begitu murah.

Rumah Jiwa TimurTerdapat dua kesalahan ejaan dalam kod GetOrders..............

Rumah Jiwa TimurAdakah saya yang silap? exchange.Buy ((-1, 0.5), pasangan dagangan adalah ETH_BTC, dan senarai harga mewakili pembelian ETH sebanyak 0.5BTC exchange.Buy ((price, 0.5), jika ini adalah senarai harga terhad, mewakili pembelian 0.5ETH dengan harga

Rumah Jiwa Timurexchange.Buy ((-1, 0.5), pasangan dagangan adalah ETH_BTC, yang mewakili pembelian ETH sebanyak 0.5BTC pada harga pasaran Di sini anda akan melihat bahawa anda membeli 0.5 ETH untuk harga pasaran.

Gyp9Terima kasih.

RumputSudah lama di laman web ini https://study.163.com/course/courseMain.htm?share=2&shareId=400000000602076&courseId=1006074239&_trace_c_p_k2_=c3f5d238efc3457d93c8b92c0398d2b2

RumputTambah WeChat di halaman utama, menarik anda ke dalam kumpulan

wqyKadang-kadang saya mengalami masalah dan tidak tahu di mana untuk bertanya.

Rumputdiubah.

RumputDapatkan semula

RumputAnda boleh menggunakan GetRawJSON atau melihat maklumat di dalam medan

Rumah Jiwa TimurSaya mendapati banyak kesalahan ejaan dalam kod, haha.

RumputOh, sudah diperbetulkan, terima kasih kerana menunjukkan kesilapan.

RumputBeberapa kontrak kekal membenarkan pemegang dua hala, perlu menetapkan kedudukan. Saya mengemas kini, pada asalnya hanya bitmex.