FMZ Quantified Platform Strategi Menulis Tutorial Pemula (Must See)

Penulis:Rumput, Dibuat: 2019-08-13 17:47:27, Diperbarui: 2021-08-06 10:29:46

[TOC] Tutorial ini berisi pengetahuan dasar tentang menulis strategi, termasuk pengenalan API, pengulangan, grafik, dan lain-lain. Setelah mempelajari tutorial dasar ini, pengguna akan dapat menggunakan API dasar dengan terampil untuk menulis strategi desktop yang stabil. Sebelum mempelajari tutorial ini, perlu belajar terlebih dahulu.FMZ Inventor Menggunakan Platform Kuantitatif 。

Tutorial versi lama:Penemu Kuantitas (FMZ.COM) Strategi yang ditulis sepenuhnya menggunakan Manual 2.0 (tutorial)Pada artikel ini, saya akan membahas beberapa artikel yang telah saya baca di blog ini.

Penjelasan awal tentang strategi

Perkenalan API

Perdagangan terprogram adalah sebuah program yang terhubung melalui API dan bursa untuk melakukan pembelian atau penjualan secara otomatis sesuai dengan tujuan desain. API dikenal sebagai Application Programming Interface.

Pada saat ini, pertukaran mata uang digital memiliki dua protokol antarmuka utama: REST dan Websocket. Protokol REST hanya membutuhkan satu akses untuk setiap data yang diperoleh. Sebagai contoh, buka langsung di browser https://api.wex.app/api/v1/public/ticker?market=BTC_USDT, dan hasil:

{"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 pasar terbaru yang diperdagangkan dengan pasangan BTC_USDT, yang akan berubah setiap kali diperbarui.market=Selanjutnya adalah parameter transaksi tertentu, yang dapat dimodifikasi untuk mendapatkan data transaksi lain. Untuk antarmuka terbuka, seperti pasar, semua orang dapat mengaksesnya, sehingga tidak perlu verifikasi, sementara beberapa antarmuka seperti daftar di bawah ini dan akses akun memerlukan pengesahan identitas pengguna, di mana ini membutuhkan penandatanganan dengan API-KEY. Websocket adalah mode berlangganan, setelah mengirim konten yang membutuhkan langganan, bursa akan mengirim data yang diperbarui ke program, tidak perlu setiap kali dikunjungi kembali, sehingga lebih efisien.

FMZ Quantitative Trading Platform mengemas antarmuka REST dari berbagai pertukaran, menggunakan cara yang seragam untuk memanggil dan format data, sehingga membuat strategi yang ditulis lebih mudah dan universal. Di FMZ platform dapat mendukung Websocket yang mudah, yang akan dijelaskan secara rinci di tutorial berikutnya.

Bahasa pemrograman yang berbeda

FMZ platform API dokumentasi sebagian besar menggunakan JavaScript sebagai contoh, tetapi karena kemasan, bahasa yang berbeda hampir tidak ada perbedaan, hanya perlu memperhatikan masalah tata bahasa. C ++ sedikit khusus, tutorial selanjutnya akan memiliki pengenalan khusus. Karena Js relatif sederhana dan tidak memiliki masalah kompatibilitas, merekomendasikan pengguna baru. FMZ platform kuantitatif mendukung Python lengkap, dapat bebas memasang berbagai paket, merekomendasikan penggunaan dasar pemrograman tertentu.

Karena Python memiliki versi yang berbeda, program dapat ditentukan di awal, seperti#!Python2,#!Python3Perhatikan bahwa JavaScript baru-baru ini meng-upgrade tata bahasa ES6, yang menarik untuk dipelajari. Di bawah ini menunjukkan kode Python dan Javascript yang memiliki fungsi yang sama, hanya perbedaan tata bahasa yang terlihat, sehingga dokumentasi API hanya memberikan contoh Javascript, dan tutorial ini juga akan memperhitungkan contoh penggunaan khusus Python.

#python代码
def main():
    while True:
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
#相应的Js代码
function main(){
    while(true){
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
    }
}

Rekomendasi sumber daya

  • Untuk lebih jelasnya, Anda dapat melihat dokumentasi API platform FMZ di sini:https://www.fmz.com/api
  • Jika Anda ingin menerima sinyal tradingview untuk memesan perdagangan di FMZ, Anda dapat membaca artikel ini:https://www.fmz.com/digest-topic/5533
  • Javascript, Python, pemula cepat, menulis strategi sederhana tidak memerlukan tata bahasa yang rumit, hanya perlu menguasai beberapa konsep dasar untuk memulai, Anda dapat belajar pemrograman sambil belajar tutorial ini:https://www.fmz.com/bbs-topic/382 https://www.fmz.com/bbs-topic/417
  • Bahasa Melayu sangat berguna untuk strategi tren.https://www.fmz.com/bbs-topic/2569
  • Contoh panggilan C++ yang dapat dilihat oleh mereka yang tertarik dengan C++, tetapi karena bukan bahasa interpretasi, debugging sulit dan tidak disarankan untuk digunakan:https://www.fmz.com/strategy/61533
  • Pelatihan Quantitative Trading Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency Currency CurTautan program
  • Beberapa strategi pengajaran yang cocok untuk awal masuk dan strategi penulisan dasar sambil belajar:https://www.fmz.com/square/s:tag:教学/1
  • Sumber-sumber yang menjelaskan strategi secara rinci:https://www.fmz.com/bbs/s:tag:源码解析/1

Alat debugging

FMZ Quantum Platform menyediakan alat debugging untuk API debugging.https://www.fmz.com/m/debug⇒ Alat debugging hanya mendukung JavaScript, hanya dapat dijalankan untuk sementara waktu, dan dapat debugging antarmuka pertukaran tanpa membuat cakram fisik. ⇒ Data yang dikembalikan akan dikembalikan sebagai hasil, dan kode alat debugging tidak akan disimpan. ⇒ Dalam tutorial ini, Anda dapat melakukan percobaan pada saat yang sama menggunakan alat debugging.img

Arsitektur Program Strategi

Strategi program, seperti halnya program normal, dijalankan dalam urutan kode, dengan keanehan bahwa harus ada fungsi utama. Karena kebijakan harus berjalan tanpa gangguan, biasanya diperlukan sebuah loop ditambah waktu istirahat. Karena frekuensi akses semua transaksi API dibatasi, waktu istirahat yang disesuaikan diperlukan. Arsitektur ini adalah eksekusi interval tetap yang khas, dan websockt juga dapat digunakan untuk menulis kebijakan yang didorong oleh peristiwa, seperti eksekusi segera setiap kali ada perubahan mendalam, yang akan diperkenalkan dalam tutorial lanjutan.

Fungsi lain yang memiliki fungsi khusus adalah sebagai berikut:

  • onexit ((() adalah fungsi yang dapat dieksekusi selama 5 menit untuk keluar dari sweepstake secara normal.
  • onerror ((() Untuk keluar dari fungsi yang tidak normal, waktu pelaksanaan maksimum 5 menit, tidak dapat dinyatakan.
  • Untuk fungsi initialization, program kebijakan akan dipanggil secara otomatis pada saat memulai, tetapi tidak dapat dinyatakan.
function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //在这里写策略逻辑,将会每6s调用一次
}
function main(){
    while(true){
        onTick()
        Sleep(6000)
    }
}

Contoh sebelumnya adalah jika kesalahan akses jaringan dapat menyebabkan kebijakan langsung berhenti, jika Anda ingin kebijakan yang mirip dengan auto restart tidak akan berhenti, Anda dapat menggunakan kebijakan real disk try catch untuk mengizinkan loop error master. Tentu saja hanya ketika kebijakan stabil yang disarankan untuk melakukan ini, jika tidak akan mengembalikan semua kesalahan, sulit untuk menyortir masalah kebijakan.

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

Perkenalan API Bursa

Pertukaran dan pengaturan pasangan perdagangan

Ketika memanggil API yang terkait dengan setiap bursa, perlu untuk menjelaskan bursa dan pasangan transaksi.exchangeJadi, kita bisa membuat sebuah gambar dengan bentuk yang berbeda.exchange.GetTicker()Yang akan didapatkan adalah ticker pasar dari pertukaran ini - pasangan perdagangan.

Platform FMZ mendukung penambahan beberapa pasangan pertukaran pada saat yang sama, seperti BTC dan ETH yang dapat dioperasikan pada saat yang sama di akun pertukaran yang sama, atau BTC dari satu pertukaran dan ETH dari pertukaran lain yang dapat dioperasikan pada saat yang sama. Perhatikan bahwa akun yang berbeda dari pertukaran yang sama juga dapat ditambahkan pada saat yang sama, yang dibedakan berdasarkan label yang ditambahkan ke situs FMZ.exchangesArray menunjukkan bahwa dalam urutan penjumlahan disk dibuat, masing-masingexchanges[0]exchanges[1]...dan sebagainya. Format pasangan transaksi sepertiBTC_USDTYang pertama adalah BTC sebagai mata uang transaksi, yang kedua adalah USDT sebagai mata uang harga.

img

Jelas, ini akan menjadi masalah jika kita mengoperasikan banyak pasangan transaksi, dan saat ini kita dapat menggunakan SetCurrency untuk menukar pasangan transaksi, sepertiexchange.SetCurrency("BTC_USDT")Saat ini,exchangePasangan yang terikat akan berubah menjadiBTC_USDT, akan tetap berlaku sampai panggilan berikutnya untuk mengubah pasangan transaksi.Perhatikan retest terbaru mendukung pertukaran pasanganDi bawah ini adalah contoh spesifik.

var symbols = ["BTC_USDT", "LTC_USDT", "EOS_USDT", "ETH_USDT"]
var buyValue = 1000
function main(){
  for(var i=0;i<symbols.length;i++){
      exchange.SetCurrency(symbols[i])
      var ticker = exchange.GetTicker()
      var amount = _N(buyValue/ticker.Sell, 3)
      exchange.Buy(ticker.Sell, amount)
      Sleep(1000)
  }
}

Akses ke antarmuka publik seperti pasar

Seperti yang disebutkan di atas, antarmuka pasar umumnya merupakan antarmuka terbuka yang dapat diakses oleh semua orang. Antarmuka pasar yang umum adalah: mendapatkan ticker pasar, mendapatkan kedalaman mendalam, mendapatkan K-line records, mendapatkan catatan transaksi. Pasar adalah dasar dari strategi untuk membuat keputusan perdagangan, yang akan diuraikan secara rinci di bawah ini.

Di mana pun Anda berada, Anda akan menemukan beberapa cara.InfoBidang, yang mewakili string data asli yang dikembalikan oleh bursa, dapat digunakan untuk menambah informasi tambahan yang sebelumnya perlu diselesaikan, menggunakan JavaScriptJSON.parse()Python menggunakan json library.TimeBidang ini menunjukkan tanda waktu permintaan, yang dapat digunakan untuk menentukan penundaan.

Penggunaan API pada hard disk juga dapat menyebabkan akses gagal dan kembalinullPython KembaliNoneJika Anda menggunakan data yang ada di dalamnya, maka akan terjadi kesalahan dan menyebabkan disk disk berhenti, jadi toleransi kesalahan sangat penting.

GetTicker

Mendapatkan pasar saat ini, yang mungkin merupakan antarmuka yang paling umum digunakan, dapat melihat harga transaksi terakhir, harga jual beli, volume transaksi terbaru, dan lain-lain.{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}

function main() {
    var ticker = exchange.GetTicker()
    Log(ticker) //在调试工具中 return ticker 。可以看到具体的结果。
    Log('上次成交价: ',ticker.Last, '买一价: ', ticker.Buy)
}

GetDepth

Dapatkan informasi mendalam tentang daftar. Meskipun GetTicker berisi pembelian dan penjualan, jika Anda ingin menelusuri daftar yang lebih dalam, Anda dapat menggunakan antarmuka ini untuk mencari 200 daftar teratas dan terbawah. Anda dapat menggunakan antarmuka ini untuk menghitung harga pukulan. Di bawah ini adalah hasil yang benar-benar dikembalikan.

{
    "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 penjualan menggunakan akses mendalam:

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

GetRecords

Dapatkan K-line, salah satu antarmuka yang paling umum digunakan, yang dapat mengembalikan informasi harga yang lebih lama sekaligus, untuk menghitung dasar dari berbagai indikator. Periode K-line jika tidak ditentukan menunjukkan periode default yang akan digunakan saat menambahkan real disk. Panjang K-line tidak dapat ditentukan, akan terus meningkat seiring waktu akumulasi, hingga 2000 bit, dengan panggilan pertama sekitar 200 bit ((pertukaran yang berbeda kembali berbeda); K-line terakhir adalah K-line terbaru, jadi datanya akan terus berubah seiring berjalannya waktu, K-line pertama adalah data tertua.

exchange.SetMaxBarLen(Len)Anda dapat mengatur jumlah K-line pertama kali (sebagian pertukaran mendukung) dan mengatur jumlah maksimum K-line.Seperti:exchange.SetMaxBarLen(500)

GetRecords dapat menentukan periode: PERIOD_M1:1 menit, PERIOD_M5:5 menit, PERIOD_M15:15 menit, PERIOD_M30:30 menit, PERIOD_H1:1 jam, PERIOD_D1:1 hari.exchange.GetRecords(PERIOD_M1)Setelah meng-upgrade administrator terbaru, akan mendukung siklus kustom, langsung mengirim detik siklus sebagai parameter, kustom tingkat menit akan disintesis berdasarkan garis K 1 menit, dan garis K kurang dari 1 menit akan disintesis melalui GetTrades (), dan komoditas berjangka akan disintesis berdasarkan tik,Perhatikan bahwa Anda akan menemukan hal yang sama dalam tutorial ini.PERIOD_M1Variabel yang dituliskan dengan huruf besar ini adalah variabel global default FMZ, yang dapat digunakan secara langsung oleh mereka yang tertarik untuk melakukan Logging sendiri.

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 transaksi dalam jangka waktu tertentu (bukan data transaksi sendiri) tidak didukung oleh beberapa bursa.

Mendapatkan akun untuk transaksi

Antarmuka ini tidak dapat diakses secara langsung karena terkait dengan akun, dan diperlukan tanda tangan API-KEY. Platform FMZ telah memproses persatuan secara otomatis di latar belakang, yang dapat digunakan secara langsung.

GetAccount Dapatkan akun

Mendapatkan informasi akun ─ salah satu antarmuka yang paling sering digunakan, yang perlu dipanggil sebelum melakukan pemesanan untuk menghindari saldo yang tidak cukup ─ mengembalikan hasil seperti:{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}Sedangkan Stocks adalah saldo yang tersedia dari mata uang yang diperdagangkan, FrozenStocks adalah saldo yang dibekukan dari order yang belum selesai, Balance adalah saldo yang tersedia dari mata uang yang diperdagangkan, dan FrozenBalance adalah saldo yang dibekukan.BTC_USDTJika Anda ingin membeli saham, maka Anda harus menggunakan BTC, jika Anda ingin membeli saham, maka Anda harus menggunakan BTC.

Perhatikan bahwa hasil yang dikembalikan adalah hasil dari pasangan transaksi yang ditentukan, informasi mata uang lain dalam akun transaksi ada di bidang Info, untuk mengoperasikan beberapa pasangan transaksi dan tidak perlu memanggil beberapa kali.

Sebuah tabel yang terus menerus mencetak nilai transaksi saat ini terhadap nilai total:

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

Beli dan bayar

Anda bisa menghubungi kami melalui telepon.exchange.Buy(Price, Amount)Atauexchange.Buy(Price, Amount, Msg),Price adalah harga,Amount adalah jumlah,Msg adalah string tambahan yang dapat ditampilkan di log real disk, bukan wajib. Cara ini adalah untuk daftar tangkapan, jika tidak dapat segera menyelesaikan transaksi secara penuh maka akan menghasilkan pesanan yang belum selesai, orderan sukses kembali hasil sebagai order id, gagal sebagainull, digunakan untuk menelusuri status pesanan.

Jika Anda ingin membayar dengan harga pasar, Price adalah -1, Amount adalah nilai pesanan, sepertiexchange.Buy(-1, 0.5)Perdagangan benar.ETH_BTCETH yang dibeli dengan harga pasar 0.5 BTC. Beberapa bursa tidak mendukung daftar harga pasar dan tidak mendukung revisi futures.

Semua harga dan kuantitas yang diperlukan untuk akurasi sebagian transaksi, tersedia_N()Fungsi presisi untuk mengontrol. Untuk perdagangan futures Buy dan Sell memiliki arti lain, yang akan diperkenalkan secara terpisah.

Salah satu contoh dari membeli 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

Parameter jual beli adalah sama dengan jual beli. Parameter jual beli memiliki arti yang berbeda.exchange.Sell(-1, 0.2)Saat itu, mereka menjual 0.2 ETH untuk pasar.

GetOrder untuk mendapatkan pesanan

Mengakses informasi pesanan berdasarkan id pesanan.exchange.GetOrder(OrderId),OrderId adalah order id, yang akan dikembalikan saat Anda memesan.Perhatikan jenis pesananTypeBidang dan status pesananStatusNilai sebenarnya adalah angka, yang mewakili makna yang berbeda, tetapi tidak menguntungkan untuk memori, FMZ menggunakan konstanta global untuk mewakili nilai-nilai ini, seperti pesanan yang belum selesai.StatusJadi jika nilai ini adalah 0, makaORDER_STATE_PENDINGSemua konstanta global ini dapat dilihat di dokumentasi.Hasilnya adalah:

{
    "Id":125723661, //订单id
    "Amount":0.01, //订单数量
    "Price":7000, //订单价格
    "DealAmount":0, //已成交数量
    "AvgPrice":0, //成交均价
    "Status":0, // 0:未完全成交, 1:已成交, 2:已撤单
    "Type":1,// 订单类型,0:买单, 1:卖单
    "ContractType":"",//合约类型,用于期货交易
    "Info":{} //交易所返回原始信息
    }
}

Salah satu strategi untuk membeli sejumlah mata uang tertentu adalah:

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 Pesenan yang belum selesai

Mendapatkan daftar transaksi saat ini untuk semua pesanan yang belum selesai. Jika tidak ada pesanan yang belum selesai, kembali ke Array kosong. Hasil tertentu dari daftar pesanan seperti GetOrder.

Contoh untuk membatalkan transaksi saat ini untuk semua pesanan:

function CancelAll(){
    var orders = exchange.GetOrders()
    for(var i=0;i<orders.length;i++){
        exchange.CancelOrder(orders[i].Id) // cancel order by orderID
    }
}
function main(){
    CancelAll()
    while(true){
        //do something
        Sleep(10000)
    }
}

CancelOrder Undur pesanan

Perintah yang dibatalkan berdasarkan id pesanan.exchange.CancelOrder(OrderId)▽ Undur berhasil kembali benar, jika tidak kembali salah. ▽ Perhatikan bahwa pesanan telah sepenuhnya ditransfer akan membatalkan kegagalan.

Futures dan kontrak jangka panjang

Perdagangan berjangka mata uang digital berbeda dari perdagangan langsung, fungsi perdagangan langsung di atas juga berlaku untuk futures, perdagangan berjangka tunggal memiliki fungsi khusus. Sebelum melakukan perdagangan berjangka berprogram mata uang digital, Anda harus terbiasa dengan operasi manual di situs web, memahami konsep dasar, seperti posisi terbuka, posisi kosong, posisi penuh, posisi terpisah, leverage, posisi kosong, kerugian, keuntungan yang mengambang, uang jaminan, dan rumus perhitungan yang sesuai.

Kontrak permanen dan kontrak berjangka mirip, berbeda dengan konsep tidak memiliki banyak ruang pada saat yang sama.

Jika sebuah bursa mendukung futures spot, seperti OKEX dan Huobi futures, maka perlu memilih untuk menambahkan OKEX futures and Huobi futures, yang dianggap sebagai bursa yang berbeda dari spot di FMZ, secara terpisah di interface bursa.

SetContractType Mengatur kontrak

Langkah pertama dalam perdagangan berjangka adalah mengatur kontrak yang akan diperdagangkan, misalnya OKEX futures. Saat membuat daftar langsung atau review, pilih pasangan perdagangan BTC, dan juga atur dalam kode sebagai minggu ini, minggu depan atau kontrak kuartal. Jika tidak diatur, akan diminta.invalid contract typeBerbeda dengan perdagangan langsung, kontrak berjangka seringkali diperdagangkan dengan mata uang yang diperdagangkan seperti BTC sebagai jaminan, pasangan perdagangan dengan penambahan BTC biasanya mewakili pasangan perdagangan BTC_USD yang diperdagangkan dengan BTC sebagai jaminan, jika ada futures dengan USDT sebagai jaminan, maka diperlukan untuk membuat pasangan perdagangan BTC_USDT yang ditambahkan ke dalam diri.Setelah pasangan perdagangan ditetapkan, jenis kontrak tertentu juga harus ditetapkan, seperti permanen, minggu ini, minggu berikutnya, dll. Setelah kontrak ditetapkan, operasi pembelian, penjualan, dan lain-lain dapat dilakukan.

Kontrak yang ada pada Bitcoin, OKEX, HuobiDM, dan USDT harus dibedakan saat menambahkan kontrak pengaturan real-time.

//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 yang diperdagangkan

Untuk mendapatkan daftar informasi kepemilikan saat ini, OKEX (OKCOIN) futures dapat diteruskan dengan parameter yang menentukan jenis kontrak yang akan diperoleh. Jika tidak ada kepemilikan, kembali ke daftar kosong[]Informasi yang dikembalikan sebagai berikut, banyak informasi spesifik yang perlu dikombinasikan dengan analisis transaksi spesifik.

Jenis data Nama variabel Penjelasan
objek Informasi Struktur asli kembali
nomor MarginLevel Ukuran leverage, OKCoin adalah 10 atau 20, OK mode full-stock futures kembali ke 10 tetap karena API asli tidak mendukung
nomor Jumlah Jumlah saham, OKCoin menunjukkan jumlah kontrak ((jumlah bulat dan lebih dari 1)
nomor Frozen Jumlah Jumlah bekuan posisi
nomor Harga Harga saham rata-rata
nomor Margin Pembekuan Jaminan
nomor Keuntungan Komoditas berjangka: Peningkatan pasar saham, mata uang digital: ((Unit mata uang digital: BTC/LTC, Unit futures tradisional: RMB, Catatan: OKCoin futures mengacu pada kelangsungan surplus dalam kondisi saham penuh, bukan saham saham, dan saham saham)
const Jenis PD_LONG untuk posisi multi-head (dengan closebuy_today di CTP), PD_SHORT untuk posisi blank (dengan closeesell_today di CTP), PD_LONG_YD untuk posisi multi-head kemarin (dengan closebuy flat), PD_SHORT_YD untuk posisi blank kemarin (dengan closeesell flat)
string Jenis Kontrak Komoditas berjangka sebagai kode kontrak, saham sebagai kode bursa 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)
    }
}

Futures dibuka dan ditutup

Pertama-tama, Anda harus mengatur ukuran dan cara memanggil lever:exchange.SetMarginLevel(10)Jika Anda ingin melihat ukuran leverage yang Anda dukung, Anda bisa melihat di bursa yang sesuai.Perhatikan bahwa leverage harus diatur di bursa, dan kode harus sesuai dengan pengaturan bursa, jika tidak akan terjadi kesalahan.Anda dapat memilih untuk tidak mengaktifkannya, menggunakan tuas default. Setelah itu, atur arah transaksi, cara panggilan:exchange.SetDirection(Direction)Jika kontrak abadi tidak memiliki konsep multi-ruang sekaligus, yaitu tidak mengizinkan memegang satu posisi, melakukan banyak waktu terbuka akan secara otomatis melemahkan banyak posisi, semua hanya perlu diatur.buydansellJika Anda mendukung penyimpanan dua arah, Anda harus mengaturclosebuy,closebuy◦** Hubungan spesifik:

Operasi Parameter SetDirection Fungsi suborder
Keterlibatan tukar.SetDirection ((buy) Bertukar.Beli ((()
Perkebunan tukar.SetDirection ((closebuy) Bertukar.Menjual ((()
Gudang kosong pertukaran.SetDirection ((jual) Bertukar.Menjual ((()
gudang kosong exchange.SetDirection ((closesell) Bertukar.Beli ((()

Terakhir adalah kode perdagangan yang spesifik, jumlah pesanan yang berbeda di berbagai bursa, seperti futures huobi adalah berdasarkan jumlah surat, satu surat $ 100; perhatikan bahwa futures review tidak mendukung surat harga pasar.

function main(){
    exchange.SetContractType("this_week")    // 举例设置 为OKEX期货 当周合约
    price = exchange.GetTicker().Last
    exchange.SetMarginLevel(10) //设置杠杆为10倍 
    exchange.SetDirection("buy") //设置下单类型为做多 
    exchange.Buy(price+10, 20) // 合约数量为20下单 
    pos = exchange.GetPosition()
    Log(pos)
    Log(exchange.GetOrders()) //查看是否有未成交订单
    exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")
    exchange.Sell(price-10, 20)
}

Di bawah ini adalah contoh strategi yang spesifik untuk semua posisi yang diikat.

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 uang digital

Anda harus mengubahnya menjadi akun leverage dalam kode, yang lainnya sama dengan perdagangan langsung.

Penggunaanexchange.IO("trade_margin") beralih ke mode akun margin, melakukan pesanan, mendapatkan aset akun akan mengakses antarmuka leverage pertukaran. Penggunaanexchange.IO("trade_normal") beralih ke mode akun normal.

Pertukaran yang didukung:

  • OKEX V3: Pasangan perdagangan dalam mode akun leverage berbeda dari pasangan biasa, dan beberapa pasangan mungkin tidak.
  • Bitcoin: Pasangan perdagangan dalam mode akun leverage berbeda dari yang biasa, dan beberapa pasangan mungkin tidak ada.
  • ZB: Dana hanya dapat ditransfer ke QC, sektor perdagangan leverage, dana independen antara pasangan perdagangan yang berbeda, yaitu jumlah koin QC di bawah pasangan perdagangan ETH_QC, tidak terlihat di BTC_QC
  • FCoin
  • Bitcoin (Binance)

Perdagangan komoditas berjangka

Perdagangan berjangka komoditas dan perdagangan berjangka mata uang digital sangat berbeda. Pertama, waktu perdagangan komoditas sangat singkat, perdagangan mata uang digital 24 jam; protokol untuk komoditas berjangka juga bukan REST API yang umum digunakan; frekuensi perdagangan komoditas berjangka dan pembatasan jumlah pesanan, sementara mata uang digital sangat longgar, dll. Oleh karena itu, perdagangan komoditas berjangka memiliki banyak tempat yang membutuhkan perhatian khusus, dan dianjurkan untuk memiliki pengalaman operasi manual yang kaya. FMZ mendukung simnow komoditas berjangka simulasi, referensi:https://www.fmz.com/bbs-topic/325❖ Perusahaan komoditas berjangka menambahkan:https://www.fmz.com/bbs-topic/371

Komoditas berjangka dan pada bulan Juni 2019 menerapkan pengawasan performa, individu dimodifikasi pengguna pribadi yang dibutuhkan pembuka pemasok aplikasi kode otorisasi (contoh aplikasi yang diperlukan template informasi dapat dikirim di grup WeChat atau QQ), umumnya membutuhkan 4-5 hari, langkah-langkah yang lebih rumit. FMZ platform kuantitatif sebagai pemasok perdagangan dimodifikasi pemasok aplikasi kode otorisasi perangkat lunak untuk masing-masing pemasok masa depan, pengguna dapat menggunakan secara langsung tanpa harus mengajukan permohonan, pada menambahkan pemasok adalah pencarian untuk melihat performa yang dapat dilihat pada daftar FMZ telah mengajukan permohonan.https://www.fmz.com/bbs-topic/3860Jika broker Anda tidak lagi terdaftar, Anda hanya dapat mendaftar sendiri, atau membuka kembali akun Anda di pedagang yang didukung, biasanya membutuhkan waktu 2 hari. FMZ memiliki hubungan kerja sama yang mendalam dengan beberapa penyedia layanan, seperti Futures Macrosource, yang telah membeli versi institusional dari platform FMZ, yang dapat digunakan oleh pengguna, pembuka otomatis menjadi VIP, dan biaya prosedur minimal.https://www.fmz.com/bbs-topic/506

Karena keunggulan dari arsitektur platform FMZ, pengguna juga dapat menambahkan beberapa akun futures, dan mencapai beberapa fungsi yang tidak dapat dilakukan oleh perangkat lunak perdagangan komoditas futures lainnya, seperti sintesis tick frekuensi tinggi, lihat:https://www.fmz.com/bbs-topic/1184

Kerangka Kerja Strategis

Pertama, karena ini bukan transaksi 24 jam dan memerlukan operasi landing, status link harus dinilai sebelum transaksi dilakukan.exchange.IO("status")UntuktrueJika tidak berhasil login, panggil API, tidak diminta tombol login. Anda dapat Sleep ((2000) setelah kebijakan dimulai, memberi waktu tertentu untuk login. Anda juga dapat mencoba ulang berlangganan._C(exchange.SetContractType,"MA888")"Kami tidak akan melakukan apa pun untuk membantu Anda", kata dia.

Di sini akan dijelaskan perbedaan dan tempat yang 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)
        }
    }
}

Kami merekomendasikan menggunakan perdagangan futures commodity (disarankan di bawah ini), saat ini kode akan sangat sederhana dan tidak perlu menangani detail 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)
        }
    });
}

Mode pengambilan data CTP

Komoditas berjangka menggunakan protokol CTP, semua pasar dan transaksi pesanan hanya diberitahu setelah ada perubahan, sedangkan permintaan pesanan, akun, dan kepemilikan adalah permintaan aktif. Oleh karena itu, cocok untuk menulis kebijakan frekuensi tinggi yang didorong oleh peristiwa.GetTickerGetDepthGetRecordsSemua data yang disimpan di cache untuk mendapatkan data terbaru, tidak ada data yang akan menunggu untuk mendapatkan data, jadi kebijakan tidak dapat menggunakan tidur. Ketika ada perubahan pasar, ticker, kedalaman, catatan akan diperbarui, pada saat ini panggilan antarmuka mana pun akan segera dikembalikan, keadaan antarmuka yang telah dipanggil akan ditempatkan sebagai mode pembaruan menunggu, panggilan berikutnya dari antarmuka yang sama, akan menunggu data baru kembali. Beberapa kontrak cold door atau situasi stagnasi akan muncul untuk waktu yang lama tidak berdagang, ini adalah situasi yang normal.

Jika Anda ingin mendapatkan data setiap kali Anda mengakses pasar, bahkan data lama, Anda dapat beralih ke mode pembaruan pasar instan.exchange.IO("mode", 0)Pada saat ini, kebijakan tidak dapat ditulis sebagai event-driven, dan perlu menambahkan sebuah peristiwa Sleep untuk menghindari siklus mati yang cepat. Beberapa kebijakan yang tidak memiliki frekuensi tinggi dapat menggunakan pola ini, dan desain kebijakan sederhana.exchange.IO("mode", 1)Anda dapat memindahkan ke mode cache default.

Untuk mengoperasikan kontrak tunggal, Anda dapat menggunakan mode default. Tetapi jika ada beberapa kontrak, mungkin satu kontrak tidak memperbarui pasar, yang menyebabkan kemacetan akses antarmuka pasar, dan pembaruan pasar kontrak lainnya tidak dapat diakses. Untuk mengatasi masalah ini, Anda dapat menggunakan mode pembaruan segera, tetapi tidak nyaman menulis kebijakan frekuensi tinggi.exchange.IO("wait")◦ Jika menambahkan beberapa objek bursa, hal ini jarang terjadi pada komoditas berjangka, dan dapat digunakanexchange.IO("wait_any")Pada saat ini, indeks yang dikembalikan menunjukkan indeks bursa yang dikembalikan.

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

Pada titik ini, struktur strategi dapat 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)
        }
    }
}

Perbedaan antara komoditas berjangka dan mata uang digital

Perlu juga diperhatikan perbedaan antara komoditas berjangka dengan bursa mata uang digital. Seperti GetDepth yang sebenarnya hanya memiliki satu file depth (biayanya mahal dengan 5 file depth), GetTrades juga tidak mendapatkan riwayat transaksi (semuanya dimodifikasi berdasarkan perubahan saham, tidak ada catatan transaksi nyata). Komoditas berjangka memiliki batas penurunan, ketika terhenti, harga jual jual dalam-dalam adalah harga penurunan, jumlah pesanan adalah 0, ketika terhenti, harga beli adalah harga penurunan, jumlah pesanan adalah 0;; ada juga komoditas berjangka permintaan antarmuka frekuensi, akses akun, pesanan, posisi, seperti batas ketat, umumnya membutuhkan 2s.

Menetapkan kontrak

exchange.IO("instruments"): Mengembalikan daftar semua kontrak di bursa {nama kontrak: detail} dalam bentuk kamus, hanya mendukung real time.exchange.IO("products"): Mengembalikan daftar semua produk pada bursa {nama produk: detail} dalam bentuk kamus, hanya mendukung piringan fisik.exchange.IO("subscribed"): Mengembalikan kontrak yang sudah terdaftar, formatnya sama, hanya mendukung real-time.

Ini adalah cara yang paling efektif untuk menghemat uang.ContractTypeID kontrak yang dimaksud adalah ID kontrak, yang dibedakan dengan huruf besar dan kecil.exchange.SetContractType("au1506")❖ Kontrak yang berhasil disetel kembali dengan rincian detail kontrak, seperti jumlah pembelian minimal, biaya, waktu pengiriman, dll. ❖ Saat berlangganan beberapa kontrak, hanya pertama kali permintaan langganan yang benar-benar dikirim, dan kemudian hanya bertukar transaksi pada tingkat kode, tidak memakan waktu. ❖ Kontrak utama berturut-turut adalah kode 888 seperti MA888, kontrak indeks berturut-turut adalah 000 seperti MA000, 888 dan 000 hanya mendukung retargeting untuk transaksi kontrak virtual, dan cakram nyata hanya mendukung pembelian transaksi.Namun, bahasa Mac dapat mengoperasikan kontrak utama, program yang akan secara otomatis menukar posisi, yaitu meratakan posisi non-utama, dan membuka posisi baru di posisi utama.

Tidak berhasil login tidak dapat mengatur kontrak, tetapi juga akan segera kembali, sehingga Anda dapat mencoba lagi dengan _C, mengetahui bahwa login CTP selesai. Setelah login berhasil, pengaturan kembali kontrak tidak memakan waktu dan tidak menghasilkan akses internet yang sebenarnya.

Peninggalan

SetDirectionAnda dapat mengambilbuy, closebuy, sell, closesellEmpat parameter, lebih banyak komoditas berjangkaclosebuy_todaydenganclosesell_todayDia mengatakan, "Saya tidak tahu apa yang akan terjadi.closebuy/closesellUntuk futures CTP tradisional, parameter kedua dapat disetel menjadi 1, 2, atau 3, masing-masing dengan menggunakan parameter spekulasi, profit, dan safety, tanpa mengatur spekulasi default.Operasi tertentu seperti jual beli, mendapatkan posisi, mendapatkan pesanan, menarik, mendapatkan akun dan lain-lain sama dengan perdagangan berjangka mata uang digital, dapat dilihat pada bab sebelumnya.

Operasi Parameter SetDirection Fungsi suborder
Keterlibatan tukar.SetDirection ((buy) Bertukar.Beli ((()
Perkebunan tukar.SetDirection ((closebuy) Bertukar.Menjual ((()
Gudang kosong pertukaran.SetDirection ((jual) Bertukar.Menjual ((()
gudang kosong exchange.SetDirection ((closesell) Bertukar.Beli ((()

Contoh di bawah ini adalah fungsi penghentian yang spesifik, perhatikan bahwa contoh ini terlalu sederhana, tetapi juga mempertimbangkan apakah ada pada waktu perdagangan, bagaimana melakukan uji ulang pesanan yang belum selesai, berapa jumlah pesanan maksimum, apakah frekuensi terlalu tinggi, apakah harga bergerak atau disalurkan, dan lain-lain. Hanya untuk referensi.Pada saat yang sama, perusahaan-perusahaan yang bergerak di bidang perdagangan virtual merekomendasikan untuk menggunakan basis data yang terbungkus dengan baik.https://www.fmz.com/strategy/12961◦ Ada penjelasan spesifik di bagian Kelas, dan disarankan untuk mempelajari kode sumber Kelas.

function Cover(contractType, amount, slide) {
    for (var i = 0; i < positions.length; i++) {
        if (positions[i].ContractType != contractType) {
            continue;
        }
        var depth = _C(e.GetDepth);
        if (positions[i].Type == PD_LONG || positions[i].Type == PD_LONG_YD) {
            exchange.SetDirection(positions[i].Type == PD_LONG ? "closebuy_today" : "closebuy");
            exchange.Sell(depth.Bids[0]-slide, amount, contractType, positions[i].Type == PD_LONG ? "平今" : "平昨", 'Bid', depth.Bids[0]);
        } else {
            exchange.SetDirection(positions[i].Type == PD_SHORT ? "closesell_today" : "closesell");
            exchange.Buy(depth.Asks[0]+slide, amount, contractType, positions[i].Type == PD_SHORT ? "平今" : "平昨", 'Ask', depth.Asks[0]);
        }
    }
}

Komoditas berjangka mendukung jenis pesanan kustom (mendukung real disk, tidak mendukung retest), yang ditentukan dengan cara penyangga, ditambahkan setelah penyangga, misalnya

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

"Saya tidak tahu apa yang akan terjadi", katanya.

  • ioc segera selesai, atau THOST_FTDC_TC_IOC dibatalkan
  • gfs Bagian ini valid THOST_FTDC_TC_GFS
  • gfd berlaku pada hari itu THOST_FTDC_TC_GFD
  • gtd berlaku sebelum tanggal yang ditentukan THOST_FTDC_TC_GTD
  • gtc berlaku sebelum dicabut THOST_FTDC_TC_GTC
  • gfa Pengumpulan penawaran berlaku THOST_FTDC_TC_GFA

Antarmuka yang Mudah

Secara default, pedagang berjangka komoditas membuka antarmuka CTP, yang dapat diganti dengan antarmuka Easy Transaction jika diperlukan. Dengan FMZ, paket dan cara panggilan sama. Perbedaannya adalah bahwa akun, pesanan, dan penyimpanan adalah mode push, sehingga pengelola memelihara data ini secara lokal, dan segera kembali ketika antarmuka yang sesuai dipanggil, dan tidak benar-benar mengirim permintaan.

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

  • gfd berlaku pada hari itu TAPI_ORDER_TIMEINFORCE_GFD
  • TAPI_ORDER_TIMEINFORCE_GTC berlaku sebelum gtc dibatalkan
  • TAPI_ORDER_TIMEINFORCE_GTD
  • Fak sebagian diselesaikan, yang tersisa dicabut TAPI_ORDER_TIMEINFORCE_FAK
  • ioc segera selesai, atau membatalkan TAPI_ORDER_TIMEINFORCE_FAK
  • fok gagal melakukan transaksi penuh, semua TAPI_ORDER_TIMEINFORCE_FOK dibatalkan

Fungsi global yang umum digunakan

Log Logging dan Push WeChat

Dalam antarmuka desktop, log sebuah log, ditambah dengan karakter @ di belakang string, maka pesan akan masuk ke antrian push, dan akan langsung disuntik setelah mengikat WeChat atau telegram.Log('推送到微信@')

Warna log juga dapat disesuaikanLog('这是一个红色字体的日志 #ff0000')#ff0000Untuk 16 sistem input warna RGB

Semua file log berada di dalam database sqlit pada hard disk di direktori tempat host berada, dapat diunduh dan dibuka dengan perangkat lunak database, atau dapat digunakan untuk menyalin cadangan dan pemulihan (nama database dan id hard disk yang sama).

LogProfit mencetak pendapatan

Mencatat pendapatan, dan menggambar kurva pendapatan di antarmuka hardisk, yang dapat disimpan setelah hardisk dihidupkan kembali.LogProfit(1000)Perhatikan.LogProfitJika Anda tidak ingin mendapatkan keuntungan, Anda dapat memilih untuk mengisi parameter Anda sendiri.

LogStatus Tampilan status bar (mengandung tabel)

Status disk, karena log akan disimpan terlebih dahulu dan terus diperbarui, jika Anda hanya perlu menampilkan informasi yang tidak disimpan, Anda dapat menggunakanLogStatusFungsi tersebut.LogStatusParameter adalah string, yang juga dapat digunakan untuk menunjukkan informasi tabel.

Contoh tabel yang menampilkan posisi status disk yang spesifik:

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

Parameternya adalah beberapa milidetik, sepertiSleep(1000)Untuk tidur sejenak. Karena semua transaksi dibatasi frekuensi akses, strategi umum adalah untuk memasukkan waktu tidur dalam siklus mati.

_G Menyimpan data

Setelah hardisk dihidupkan kembali, program akan dihidupkan kembali._GJika Anda ingin menyimpan konten JSON, Anda dapat menggunakan sistem operasi JSON._GFungsi ini ditulis dalamonexit()Dalam hal ini, setiap kali kebijakan dihentikan, informasi yang dibutuhkan akan disimpan secara otomatis. Jika Anda ingin menyimpan lebih banyak data format, fungsi _G tidak terlalu berguna, Anda dapat menggunakan Python untuk menulis langsung ke database.

function onexit(){
    _G('profit', profit)
}
function main(){
    _G("num", 1); // 设置一个全局变量num, 值为1 s
    _G("num", "ok"); // 更改一个全局变量num, 值为字符串ok 
    _G("num", null); // 删除全局变量 num 
    _G("num"); // 返回全局变量num的值,如果不存在返回null

    var profit = 0
    if(_G('profit')){
        profit = _G('profit')
    }
}

Fungsi presisi _N

Dalam pemesanan, seringkali untuk mengontrol presisi harga dan kuantitas, FMZ memiliki built-in_N fungsi untuk menentukan tempat penyimpanan digit titik kecil, seperti_N(4.253,2)Hasilnya adalah 4.25.

_C Coba ulang secara otomatis

Untuk memanggil API pertukaran, tidak ada jaminan bahwa setiap kunjungan akan berhasil, _C adalah fungsi yang mencoba ulang secara otomatis. Akan selalu memanggil fungsi tertentu sampai berhasil kembali (fungsi akan kembali null atau false akan mencoba kembali, misalnya)._C(exchange.GetTicker), dengan interval uji ulang default 3 detik, fungsi _CDelay dapat dipanggil untuk mengontrol interval uji ulang, seperti _CDelay ((1000), yang berarti mengubah interval uji ulang fungsi _C menjadi 1 detik, disarankanGetTicker(),exchange.GetDepth,GetTrade,GetRecords,GetAccount,GetOrders, GetOrderSemua menggunakan _C error tolerance untuk mencegah kegagalan akses menyebabkan gangguan program.

CancelOrderTidak dapat menggunakan fungsi _C, karena kegagalan pengunduran diri dapat terjadi karena berbagai alasan. Jika satu sel telah ditransfer, pengunduran diri akan kembali gagal, dan menggunakan fungsi _C akan menyebabkan terus mencoba lagi.

Fungsi _C juga dapat menyampaikan parameter, dan juga 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 string waktu saat ini, seperti:2019-08-15 03:46:14▽ Jika panggilan di tengah-tengah retest, waktu retest akan dikembalikan._D().slice(11) > '09:00:00':

_D(timestamp,fmt), akan mengubah ms timestamp ke string waktu, seperti_D(1565855310002)◎ fmt adalah format waktu, defaultyyyy-MM-dd hh:mm:ss

Fungsi indikator TA

Untuk beberapa fungsi indikator yang umum digunakan, seperti indikator umum seperti MA\MACD\KDJ\BOLL, FMZ platform secara langsung dibangun, indikator yang didukung secara khusus dapat dilihat dalam dokumentasi API.

Sebelum menggunakan fungsi indikator, sebaiknya menentukan panjang garis K. Jika panjang garis K sebelumnya tidak dapat memenuhi siklus yang dibutuhkan untuk perhitungan, hasilnya adalahnullJika panjang K-line input adalah 100 dan siklus MA dihitung adalah 10, maka 9 nilai pertama adalah nol, dan yang berikutnya dihitung normal.

JavaScript juga mendukung talib yang lengkap, yang didukung oleh perpustakaan pihak ketiga, yang dapat digunakan untuk panggilan seperti:talib.CCI(records)Untuk referensi.http://ta-lib.org/function.htmlUntuk Python, talib dapat diinstal sendiri, karena perlu dikompilasi, tidak dapat digunakan untuk pemasangan pip yang sederhana, Anda dapat mencari cara pemasangan sendiri.

Fungsi indikator dapat ditransmisikan ke dalam data K-line dan juga ke dalam himpunan arbitrer.

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

Fungsi JavaScript yang umum digunakan

Berikut adalah beberapa fungsi JavaScript yang umum digunakan di komputer.

  • Date.now()Kembali ke waktu saat ini
  • parseFloat()Mengubah string menjadi angka, sepertiparseFloat("123.21")
  • parseInt()Mengubah string menjadi bilangan bulat
  • num.toString()Mengubah angka menjadi string, num menjadi variabel digital
  • JSON.parse()Format string json, sepertiJSON.parse(exchange.GetRawJSON())
  • JavaScript sendiri membawa fungsi perpustakaan Math sepertiMath.max(),Math.abs()Seperti yang sering digunakan dalam operasi matematika, lihat:https://www.w3school.com.cn/jsref/jsref_obj_math.asp
  • FMZ mengacu pada perpustakaan matematika JavaScript pihak ketiga, lihat:https://mathjs.org/
  • FMZ mengacu pada JavaScript third-party underscore library, yang disarankan untuk dipelajari, yang memudahkan banyak operasi Js yang membosankan, seperti:https://underscorejs.org/

Perpustakaan template

Menulis sebuah fungsi strategi real disk sangat banyak hal yang perlu dipertimbangkan, seperti membeli 5 koin sebagai fungsi sederhana, kita harus mempertimbangkan: apakah saldo saat ini cukup? berapa harga pesanan? seberapa presisi? tidak perlu memisahkan pesanan untuk menghindari dampak pasar? bagaimana menangani pesanan yang belum selesai? dll.

Perpustakaan perdagangan mata uang digital JavaScript dan perpustakaan perdagangan komoditas berjangka dibangun secara default dan tidak perlu disalin. Perpustakaan template lainnya dapat ditemukan di Strategy Squarehttps://www.fmz.com/square/20/1❏ Menyalin dan menyimpan koleksi template dan memilih koleksi yang ingin digunakan saat membuat kebijakan Anda sendiri.

Fungsi templat JavaScript digunakan untuk$Pada awalnya, Python menggunakanextIni adalah awal.

Perpustakaan perdagangan mata uang digital

Sumber kode alamat:https://www.fmz.com/strategy/10989, sudah built-in, tidak perlu disalin. Implementasi fungsi tertentu dapat langsung merujuk ke kode sumber.

Akun yang diakses:

$.GetAccount(e)

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

Permintaan ini ditarik:

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

Pertimbangan lintas:

$.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的是数组, 则直接进行比较

Fungsi penarikan: $ (e, currency, address, amount, fee, password)

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

Perpustakaan perdagangan komoditas

Di sini, Anda dapat menemukan daftar broker Forex yang tersedia di situs kami.https://www.fmz.com/strategy/12961◦ Sudah tertanam, tidak perlu disalin.

CTA

  • Perangkat ini akan memetakan indeks secara otomatis ke kontinuitas utama.
  • Memproses pemindahan secara otomatis
  • Pemetaan ulang dapat menentukan pemetaan seperti rb000/rb888 yaitu memetakan transaksi indeks rb ke kontinuitas utama.
  • Anda juga bisa memetakan ke kontrak lain, misalnya rb000/MA888 yaitu melihat garis K dari indeks rb untuk memperdagangkan MA secara terus menerus.
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

Karena fungsi gambar asli lebih rumit, akan diperkenalkan dalam tutorial berikut, pemula disarankan untuk langsung menggunakan pustaka gambar, garis-garis gambar yang sangat sederhana, garis-garis K, dll. FMZ memiliki pustaka kelas sederhana yang dapat dilihat di halaman penyuntingan kebijakan, jika tidak ada built-in, pengguna harus menyalin dan menyimpan sendiri untuk memilih referensi dalam kebijakan.

img

Javascript Printer Library adalah sebuah aplikasi yang digunakan untuk membuat gambar.https://www.fmz.com/strategy/27293Di sini, Anda dapat mengklik halaman ini.https://www.fmz.com/strategy/39066

Contoh:

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

Setel parameter kebijakan

Di bawah editor kebijakan ada pengaturan parameter kebijakan, yang setara dengan variabel global kebijakan, yang dapat diakses di mana saja dalam kode. Parameter kebijakan dapat dimodifikasi di antarmuka real disk, dan berlaku setelah di-restart. Oleh karena itu, beberapa variabel dapat diatur sebagai parameter, dan parameter dapat diubah tanpa mengubah kebijakan.img

  • Nama variabel: yaitu number, string, combox, dan lain-lain dari gambar di atas, dapat digunakan secara langsung di kelompok kebijakan.
  • Deskripsi: nama parameter pada antarmuka kebijakan, untuk memudahkan pemahaman tentang arti parameter.
  • Penjelasan: penjelasan rinci tentang parameter, deskripsi yang akan muncul ketika mouse tinggal di atas parameter.
  • Jenis: tipe parameter, dijelaskan lebih lanjut di bawah ini.
  • Nilai default: nilai default dari parameter tersebut.

Jenis string dan tipe angka mudah dipahami dan merupakan tipe yang paling umum digunakan. Dropdown box akan menampilkan dropdown box yang opsional di antarmuka parameter, misalnya, Anda dapat mengatur nilai parameter dropdown box SYMBOL sebagaiBTC|USDT|ETHJika USDT dipilih pada dropdown pada halaman parameter, maka nilai SYMBOL dalam kebijakan adalah indeks 1 untuk USDT; tanda centang adalah kotak pilihan, tanda centang adalah true, jika tidak, false.

Ada banyak lagi parameter yang bisa disetel, untuk referensi.https://www.fmz.com/bbs-topic/1306

Uji Kembali Strategi

Setelah melakukan kuantifikasi strategi, Anda dapat menguji strategi Anda dengan data historis untuk melihat bagaimana strategi Anda menguntungkan dalam data historis. Tentu saja, hasil retargeting hanya untuk referensi. Platform kuantifikasi FMZ mendukung retargeting mata uang digital spot, futures, BitMEX futures, dan futures, di mana mata uang digital terutama mendukung varietas utama. Javascript retargeting dilakukan di browser, Python retargeting diperlukan pada host, yang dapat digunakan platform untuk menyediakan host publik.

Mekanisme retesting

Mekanisme retargeting onbar didasarkan pada K-line, dimana setiap K-line menghasilkan titik waktu retargeting di mana informasi seperti harga tinggi, harga rendah, volume perdagangan, dan lain-lain dapat diperoleh pada titik waktu saat ini.


Lebih banyak

Gaoencheerapi

Ilmu PengetahuanBagaimana cara menjalankan implementasi kebijakan secara lokal? Saya menulis pernyataan output Log sederhana dan mengikuti operasi di akhir kalimat. Langkah pertama adalah menggunakan laptop sebagai server dan menjalankan program administrator. Langkah kedua, menulis program test.py yang output informasi Log sederhana (fungsi API FMZ); Langkah ketiga, seperti pada akhir teks, menulis runfile yang akan dijalankan melalui run.py dengan panggilan test.py. /upload/asset/1add39483ef82d45b3ce3.png

Gyp9Saya membeli kursus Quantitative Cloud Trading, dan sekarang saya harus pergi ke mana?

MonuRajakBanyak

MonuRajakHai

PergilahBelajar

WqyAda sedikit kesalahan teks, GetAccount mendapatkan akun. dalam pengantarannya, FrozenStocks seharusnya menjadi saldo beku bukan saldo yang tersedia.

Tn.getorder outtime mendapatkan order outtime, bursa di okex, bagaimana caranya

Oumuamua membuat trik tinggiApakah Anda tidak bisa mendapatkan tingkat aset yang dijamin, 0% akan dipaksakan untuk rata-rata aset yang dijamin

Shifeng2020Saya melihat operasi k-string 1 menit, jadi waktu tidur siklus mati Python dapat diatur menjadi 0,1 s, yaitu sleep ((100) Apakah saya melihat Anda menulis satu sleep ((10) di dalamnya, yaitu 0.1 s tidak akan melebihi batas API huobi HM?

Tugu Angin Timurexchange.SetDirection (("closebuy"); // Jika kontrak permanen, langsung atur exchange.SetDirection (("sell") Di sini saya mencoba kontrak permanen OKex, jika Anda mengatur untuk menjual, langsung terbuka, tidak terlalu murah.

Tugu Angin Timurexchange.SetDirection (("closebuy"); // Jika kontrak permanen, langsung atur exchange.SetDirection (("sell") Di sini saya mencoba kontrak permanen OKex, jika Anda mengatur untuk menjual, langsung terbuka, tidak terlalu murah.

Tugu Angin TimurAda dua kesalahan ejaan dalam kode GetOrders. Salah satunya adalah fungsi yang ditulis sebagai fuction, dan yang lainnya adalah kondisi loop for;

Tugu Angin TimurAku salah. exchange.Buy ((-1, 0.5)), pasangan perdagangan adalah ETH_BTC, dan harga pasar mewakili pembelian ETH sebesar 0.5BTC exchange.Buy ((price, 0.5), jika ini adalah daftar harga, maka harga yang digunakan untuk membeli adalah 0.5ETH

Tugu Angin Timurexchange.Buy ((-1, 0.5), pasangan perdagangan adalah ETH_BTC, yang mewakili pembelian ETH sebesar 0.5BTC pada harga pasar Ini seharusnya menjadi harga jual untuk membeli 0.5 ETH.

Gyp9Terima kasih.

RumputSudah tersedia di situs https://study.163.com/course/courseMain.htm?share=2&shareId=400000000602076&courseId=1006074239&_trace_c_p_k2_=c3f5d238efc3457d93c8b92c0398d2b2

RumputTambahkan halaman utama WeChat, menarik Anda ke dalam kelompok

WqySaya tidak tahu di mana saya harus bertanya, tapi saya tidak tahu di mana saya harus bertanya, saya tidak tahu di mana saya harus bertanya.

RumputPerubahan

RumputDapatkan lagi

RumputAnda dapat menggunakan GetRawJSON atau melihat informasi di kolom info

Tugu Angin TimurSaya menemukan banyak kesalahan ejaan dalam kode, haha.

RumputOh, sudah diperbaiki, terima kasih telah menunjukkan kesalahan.

RumputBeberapa kontrak permanen yang mengizinkan pegangan dua arah, perlu untuk mengatur pegangan.