Sumber daya yang dimuat... Pemuatan...

Tutorial dasar untuk FMZ Quant platform Strategy Writing

Penulis:Ninabadass, Dibuat: 2022-03-18 09:00:46, Diperbarui: 2022-04-02 11:48:15

[TOC] Tutorial ini berisi pengetahuan dasar tentang strategi menulis, termasuk pengenalan API, backtest, grafik dan banyak lagi. Setelah mempelajari tutorial dasar ini, pengguna akan dapat menggunakan API dasar dengan ahli dan menulis strategi bot yang stabil. Sebelum mempelajari tutorial, Anda perlu belajar cara menggunakanMemulai FMZ Quant Platform.

Tutorial versi lama:FMZ Quant (FMZ.COM) Manual Penulisan Strategi 2.0 (Tutorial); ada banyak indeks posting di tutorial, yang disarankan untuk dibaca.

Instruksi awal tentang Strategy Writing

Pengantar API

Perdagangan program adalah menggunakan program untuk terhubung dengan platform melalui API untuk mencapai pembelian dan penjualan otomatis atau fungsi lain sesuai dengan niat desain.

Saat ini, ada dua protokol antarmuka utama untuk platform cryptocurrency: REST dan Websocket. Setiap kali protokol REST memperoleh data, perlu diakses sekali. Mari kita ambil API platform simulasi Wex.app sebagai contoh. Buka [link] (https://api.wex.app/api/v1/public/ticker?market=BTC_USDT) langsung di browser, dan Anda dapat mendapatkan hasilnya sebagai berikut:

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

Dengan cara ini, Anda dapat melihat bahwa perdagangan mengikuti kutipan pasar terbaru dari pasangan perdagangan BTC_USDT, akan berubah setiap kali diperbarui; market=" diikuti oleh parameter pasangan perdagangan tertentu, yang dapat dimodifikasi untuk mendapatkan data pasangan perdagangan lainnya. Untuk antarmuka publik, seperti kutipan pasar, semua orang dapat mendapatkannya, sehingga tidak diperlukan verifikasi. Namun, beberapa antarmuka perlu menentukan identitas pengguna saat melakukan pesanan atau mendapatkan akun. Dalam hal ini, API-KEY diperlukan untuk menandatangani. Websocket adalah mode langganan. Setelah mengirim konten yang perlu langganan, platform akan mengirim data yang diperbarui ke program, dan tidak perlu direvisi setiap kali, sehingga lebih efisien.

Platform perdagangan FMZ Quant mengkapsulkan antarmuka REST dari setiap platform, dan menggunakan cara yang seragam untuk memanggil dan format data seragam, membuat strategi menulis lebih sederhana dan lebih umum.

Bahasa Pemrograman yang Berbeda

Sebagian besar bagian dari dokumen API platform FMZ menggunakan JavaScript sebagai contoh, tetapi karena enkapsulasi, hampir tidak ada perbedaan antara bahasa yang berbeda, dan Anda hanya perlu memperhatikan masalah sintaksis. C++" sedikit khusus, dan tutorial di masa depan akan memiliki pengenalan khusus. Karena Js relatif sederhana dan tidak memiliki masalah kompatibilitas, disarankan untuk pemula untuk menggunakannya. Platform FMZ Quant mendukung lengkap Python, dan dapat secara bebas menginstal berbagai paket. Disarankan untuk pengguna yang memiliki dasar pemrograman tertentu. Untuk pengguna yang tidak ingin belajar bahasa pemrograman dan hanya ingin menulis strategi, platform FMZ Quant juga mendukung Mylanguage, yang pada dasarnya kompatibel dengan strategi Webstock, dan disarankan untuk mereka yang memiliki pengalaman yang relevan. Kelemahannya adalah bahwa Webstock tidak memiliki kode yang sama kuat dan fleksibel seperti bahasa pemrograman.

Karena Python memiliki versi yang berbeda, itu dapat ditentukan di awal program, seperti#!Python2dan#!Python3. Perhatikan bahwa JavaScript baru-baru ini telah memperbarui sintaks ES6 nya, dan mereka yang tertarik dapat belajar tentang hal itu. Kode Python dan Javascript dengan fungsi yang sama ditunjukkan di bawah ini.

#python code
def main():
    while True:
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
#the corresponding Js code
function main(){
    while(true){
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
    }
}

Rekomendasi Sumber Daya

  • Tutorial ini tidak akan memberikan pengantar rinci pada setiap antarmuka di FMZ platform dokumen API, sehingga Anda dapat memeriksaartikel ini untuk lebih detail.
  • Jika Anda ingin menerima sinyal tradingview dan menempatkan pesanan di FMZ, Anda dapat merujuk keartikel ini.
  • Untuk cepat memulai Javascript dan Python, menulis strategi sederhana tidak memerlukan sintaksis yang kompleks, tetapi hanya membutuhkan beberapa konsep dasar; Anda dapat mempelajari tutorial saat Anda belajar cara memprogram (https://www.fmz.com/bbs-topic/9123, https://www.fmz.com/bbs-topic/9124).
  • Dokumen Mylanguage; Mylanguage masih sangat nyaman untuk strategi tren.
  • Berikut adalah contoh panggilan dari C++. Mereka yang tertarik pada C++ dapat melihat. Karena itu bukan bahasa interpretatif, debugging sangat sulit, jadicontohnyatidak dianjurkan.
  • Kursus Perdagangan Kuantitatif Cryptocurrency dari NetEase Cloud Classroom, secara resmi diproduksi oleh FMZ, hanya membutuhkan 20 yuan, dengan konten yang sangat rinci, dari sederhana hingga mendalam, cocok untuk pemula!kursuslink
  • Ini dia.beberapa strategi pengajaranAnda dapat mencoba menulis strategi saat Anda mempelajari dasar-dasarnya.
  • Penjelasan rinci tentang kode sumber strategi:linknya.

Alat Debug

Platform FMZ Quant menyediakanDebug Tooluntuk debugging API interface. Alat debugging hanya mendukung JavaScript dan hanya dapat dijalankan untuk jangka waktu tertentu; antarmuka platform dapat di-debug tanpa membuat bot; data pengembalian akan dikembalikan sebagai hasilnya, dan kode alat debugging tidak akan disimpan. Saat Anda bekerja melalui tutorial ini, Anda dapat bereksperimen dengan alat debugging pada saat yang sama.img

Kerangka Program Strategi

Program strategi sama dengan program normal, yang dijalankan dalam perintah kode. Bagian khususnya adalah bahwa harus ada fungsi main. Karena strategi perlu berjalan tanpa gangguan, biasanya loop ditambah waktu tidur diperlukan. Karena frekuensi akses API platform terbatas, waktu tidur perlu disesuaikan. Kerangka kerja ini adalah eksekusi khas pada interval tetap, dan Anda juga menggunakan Websocket untuk menulis strategi yang didorong oleh peristiwa. Misalnya, eksekusi segera selama kedalaman berubah, yang akan diperkenalkan dalam tutorial lanjutan.

Fungsi lain dengan tindakan khusus ditunjukkan sebagai berikut:

  • onexit() adalah fungsi normal pada saat keluar; waktu eksekusi maksimumnya adalah 5 menit; dapat tidak ditentukan; jika waktu habis, kesalahan gangguan akan dilaporkan.
  • onerror() adalah fungsi keluar abnormal; waktu eksekusi maksimumnya adalah 5 menit; dapat tidak ditentukan.
  • init() adalah fungsi inisialisasi; program strategi akan dipanggil secara otomatis saat mulai berjalan; dapat tidak ditentukan.
function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //write the strategy logic here, and it will be called ever 6 seconds
}
function main(){
    while(true){
        onTick()
        Sleep(6000)
    }
}

Dalam contoh sebelumnya, jika ada kesalahan dalam akses jaringan, strategi dapat dihentikan secara langsung. Jika Anda ingin strategi yang mirip dengan restart otomatis dan tidak akan berhenti, Anda dapat menggunakan try catch loop utama toleransi kesalahan dalam strategi bot (jangan menggunakan try untuk backtest). Tentu saja, ini hanya dianjurkan ketika strategi stabil, jika tidak semua kesalahan tidak akan dilaporkan, sehingga sulit untuk menemukan kesalahan dalam strategi.

function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //write the strategy logic here, and it will be called ever 6 seconds
}
function main(){
    try{
        while(true){
           onTick()
           Sleep(6000)
       }
    }catch(err){
        Log(err)
    }
}

Pendahuluan API Platform

Set Platform dan Pasangan Perdagangan

Jika hanya satu platform-trading pair yang ditambahkan saat membuat bot, gunakanexchangeuntuk mewakili objek ini.exchange.GetTicker()akan mendapatkan adalah ticker pasar dari pasangan perdagangan pertukaran ini.

Platform FMZ Quant mendukung penambahan beberapa exchange-trading pair objek pada saat yang sama. Misalnya, Anda dapat mengoperasikan BTC dan ETH dari akun platform yang sama pada saat yang sama, atau Anda dapat mengoperasikan BTC dari satu pertukaran dan ETH dari pertukaran lain pada saat yang sama. Perhatikan bahwa akun yang berbeda pada platform yang sama juga dapat ditambahkan pada saat yang sama, dan mereka dibedakan sesuai dengan label yang ditambahkan ke situs web FMZ. Ketika ada beberapa exchange-trading pair objek, gunakanexchangesarray untuk mewakili mereka, yaituexchanges[0]danexchanges[1]...dan seterusnya, sesuai dengan urutan penjumlahan ketika bot dibuat.BTC_USDT, mantan BTC adalah mata uang perdagangan, dan USDT adalah mata uang penawaran.

img

Jelas, jika kita mengoperasikan banyak pasangan perdagangan, metode ini akan sangat tidak nyaman.exchange.SetCurrency("BTC_USDT")Kemudian, pasangan perdagangan yang terikat denganexchangemenjadiBTC_USDT, yang akan tetap berlaku sampai panggilan berikutnya untuk mengubah pasangan perdagangan.Perhatikan bahwa backtest mendukung beralih pasangan perdagangan baru-baru iniDi 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)
  }
}

Dapatkan Antarmuka Publik

Seperti yang disebutkan dalam contoh sebelumnya, antarmuka pasar umumnya adalah antarmuka publik, yang dapat diakses oleh semua orang. Antarmuka pasar yang umum adalah: GetTicker, GetDepth, GetRecords dan GetTrades. Kutipan pasar adalah dasar untuk strategi untuk membuat penilaian perdagangan. Kemudian, saya akan memperkenalkan mereka satu per satu. Lebih baik mencoba mereka di Debug Tool sendiri. Jika Anda membutuhkan penjelasan rinci, Anda dapat memeriksanya di dokumen API.

Setiap antarmuka umumnya memilikiInfofield, yang mewakili string data asli yang dikembalikan oleh platform, dan yang dapat digunakan untuk melengkapi informasi tambahan.JSON.parse(), sementara Python menggunakan perpustakaan json.Timebidang menunjukkan time stamp dari permintaan, yang dapat digunakan untuk menilai keterlambatan.

ketika menggunakan API apa pun di bot, akses mungkin gagal dan kembalinull, dan Python kembaliNonePada saat ini, data yang digunakan akan melaporkan kesalahan dan menyebabkan bot berhenti, sehingga toleransi kesalahan sangat penting. Tutorial ini akan memperkenalkan toleransi kesalahan secara khusus.

GetTicker

GetTicker mungkin adalah antarmuka yang paling umum digunakan. Anda dapat menemukan harga terakhir kali dieksekusi, harga buy1 dan harga sell1, dan volume perdagangan terbaru. Sebelum menempatkan pesanan, harga yang dieksekusi dapat ditentukan sesuai dengan informasi ticker.{"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 in the debugging tool, and you can see the specific result
    Log('Last time executed price:',ticker.Last, 'Buy1 price:', ticker.Buy)
}

GetDepth

GetDepth untuk mendapatkan informasi mendalam tentang pesanan tertunda. Meskipun GetTicker mencakup harga beli 1 dan jual 1, jika Anda ingin menanyakan pesanan tertunda yang lebih dalam, Anda dapat menggunakan antarmuka ini, untuk secara umum memeriksa 200 pesanan tertunda. Harga kejutan dapat dihitung dengan menggunakan antarmuka ini. Di bawah ini adalah hasil pengembalian yang sebenarnya. Di antara mereka, Asks mewakili pesanan penjualan tertunda, dan arraynya adalah Sell1, Sell2... Jadi harganya juga naik bergantian. Bids mewakili pesanan pembelian tertunda, dan arraynya adalah buy1, buy2... Harga turun bergantian.

{
    "Info":null,
    "Asks":[
        {"Price":5866.38,"Amount":0.068644},
        {"Price":5866.39,"Amount":0.263985},
        ......
        ]
    "Bids":[
        {"Price":5865.13,"Amount":0.001898},
        {"Price":5865,"Amount":0.085575},
        ......
        ],
    "Time":1530241857399
}

Contoh penggunaan GetDepth untuk Ask & Bids:

function main() {
    var depth = exchange.GetDepth()
    Log('Buy 1 price:', depth.Bids[0].Price, 'Sell 1 price:', depth.Asks[0].Price)
}

GetRecords

GetRecords adalah salah satu antarmuka yang paling umum digunakan, dapat mengembalikan informasi harga dalam jangka waktu yang lama pada suatu waktu, yang merupakan dasar untuk menghitung berbagai indikator. Jika periode K-line tidak ditentukan, itu berarti menggunakan periode default ketika menambahkan bot. Panjang K-line tidak dapat ditentukan, dan akan terus meningkat dari waktu ke waktu. Jumlah maksimum adalah 2000, dan dalam panggilan pertama jumlahnya sekitar 200 (platform yang berbeda mengembalikan angka yang berbeda).

exchange.SetMaxBarLen(Len)dapat mengatur jumlah K-line yang diperoleh untuk pertama kalinya (didukung oleh beberapa platform), dan mengatur jumlah maksimum K-line.Seperti:exchange.SetMaxBarLen(500).

GetRecords dapat menentukan periode seperti PERIOD_M1: 1 menit, PERIOD_M5: 5 menit, PERIOD_M15: 15 menit, PERIOD_M30: 30 menit, PERIOD_H1: 1 jam dan PERIOD_D1: 1 hari.exchange.GetRecords(PERIOD_M1). Setelah meng-upgrade docker terbaru, itu akan mendukung kustomisasi periode, yang hanya melewati angka kedua periode sebagai parameter. kustomisasi tingkat menit akan disintesis sesuai dengan garis K 1 menit, garis K di bawah 1 menit akan disintesis melalui GetTrades ((), dan komoditas berjangka akan disintesis sesuai dengan tik.Perhatikan bahwa ada juga variabel besar lainnya sepertiPERIOD_M1di tutorial. Mereka adalah variabel global default FMZ. Jika Anda tertarik, Anda dapat log nilai spesifik mereka sendiri, dan Anda dapat menggunakannya secara langsung dalam biasa.

Contoh data pengembalian:

[
    {"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 K-line yang diulang:

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

GetTrades memperoleh data perdagangan dalam rentang waktu tertentu (bukan data perdagangan Anda sendiri), yang tidak didukung oleh beberapa platform.

Dapatkan Akun untuk Perdagangan

Antarmuka tersebut terkait dengan akun, sehingga tidak dapat diperoleh secara langsung. Untuk mendapatkannya, Anda perlu menggunakan API-KEY untuk mendaftar. Setelah pemrosesan latar belakang otomatis terpadu dari platform FMZ, Anda dapat menggunakannya secara langsung.

DapatkanAkun

GetAccount untuk mendapatkan informasi akun. Sebagai salah satu antarmuka yang paling umum digunakan, perlu dipanggil sebelum melakukan pesanan, untuk menghindari saldo yang tidak cukup. Hasil pengembalian adalah seperti:{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}Di mana Stocks adalah saldo yang tersedia dari mata uang perdagangan pasangan perdagangan, FrozenStocks adalah saldo beku dari pesanan yang tidak dieksekusi, Balance adalah jumlah yang tersedia dari mata uang penawaran, dan FrozenBalance adalah saldo beku.BTC_USDT, Stocks mengacu pada BTC, dan Balance mengacu pada USDT.

Perhatikan bahwa hasil pengembalian adalah hasil dari pasangan perdagangan yang ditentukan, dan informasi mata uang lain dalam akun perdagangan berada di bidang Info, sehingga Anda tidak perlu memanggilnya beberapa kali, ketika Anda mengoperasikan beberapa pasangan perdagangan.

Bot terus menerus mencetak nilai total dari pasangan perdagangan saat ini:

function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var account = exchange.GetAccount()
        var price = ticker.Buy
        var stocks = account.Stocks + account.FrozenStocks
        var balance = account.Balance + account.FrozenBalance
        var value = stocks*price + balance
        Log('Account value is: ', value)
        LogProfit(value)
        Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed
        //when run in debug tool, add a break here
    }
}

Perintah Beli

Membeli order. Metode panggilan termasukexchange.Buy(Price, Amount)danexchange.Buy(Price, Amount, Msg), di mana Price menunjukkan harga, Amount adalah jumlah, Msg adalah string tambahan yang dapat ditampilkan dalam log bot, tetapi tidak diperlukan. Metode ini adalah pesanan yang sedang menunggu. Jika pesanan tidak dapat sepenuhnya dieksekusi segera, pesanan yang belum selesai akan dihasilkan; id pesanan dikembalikan jika pesanan berhasil ditempatkan, dannullakan dikembalikan jika pesanan tidak berhasil, yang digunakan untuk menanyakan status pesanan.

Jika Anda ingin menempatkan pesanan beli pada harga pasar, Harga adalah -1, dan Jumlah adalah nilai pesanan.exchange.Buy(-1, 0.5); jika pasangan perdagangan adalahETH_BTCBeberapa platform tidak mendukung pesanan pasar, juga tidak melakukan backtest futures.

Beberapa platform memiliki persyaratan presisi untuk harga dan jumlah yang dapat dikendalikan dengan fungsi presisi_N()Untuk perdagangan berjangka, Buy dan Sell memiliki arti lain, yang akan diperkenalkan secara khusus.

Contoh pembelian setelah mencapai 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')
}

Perintah Jual

Perintah jual. Parameternya sama dengan Buy. Parameter pesanan pasar memiliki arti yang berbeda. Perintah jual pasar, sepertiexchange.Sell(-1, 0.2), berarti menjual 0,2 ETH dengan harga pasar.

GetOrder

GetOrder memperoleh informasi order berdasarkan order id. Ketika antarmuka umum ini memanggil metodeexchange.GetOrder(OrderId), OrderId adalah order id, yang akan dikembalikan ketika menempatkan pesanan.Typedan nilai pesanan yang sebenarnyaStatusadalah angka, yang mewakili makna yang berbeda, tetapi tidak kondusif untuk memori.Statusnilai pesanan yang belum selesai adalah 0, yang setara denganORDER_STATE_PENDING. Semua konstanta global ini dapat dilihat dalam dokumen... Hasil pengembalian:

{
    "Id":125723661, //Order id
    "Amount":0.01, //Order ammount 
    "Price":7000, //Order price 
    "DealAmount":0, //Executed amount 
    "AvgPrice":0, //executed average price
    "Status":0, //0: not completely executed; 1: executed; 2: canceled 
    "Type":1,//Order type; 0: buy order; 1: sell order 
    "ContractType":"",//contract type, used in futures trading
    "Info":{} //the platform returns the raw information
    }
}

Strategi untuk membeli sejumlah mata uang 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){ //Here you can aslo use "status == ORDER_STATE_PENDING" to judge 
                exchange.CancelOrder(id)
            }
        }
    }
}

GetOrders

GetOrder mendapatkan daftar semua order yang belum selesai dari pasangan perdagangan saat ini. Jika tidak ada order yang belum selesai, kembalikan array kosong. Hasil spesifik dari daftar order, seperti GetOrder.

Contoh pembatalan semua order dari pasangan perdagangan saat ini:

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 Pemesanan

Menurut ID pesanan, batalkan pesanan.exchange.CancelOrder(OrderId). Jika pembatalan berhasil, kembali true; jika tidak, kembali false.

Futures & Kontrak Perpetual

Untuk cryptocurrency, perdagangan futures berbeda dari perdagangan spot. Fungsi perdagangan spot di atas juga berlaku untuk perdagangan futures, dan perdagangan futures tunggal memiliki fungsinya sendiri. Sebelum melakukan perdagangan program futures cryptocurrency, Anda harus akrab dengan operasi manual di situs web dan memahami konsep dasar, seperti terbuka, dekat, silang, terisolasi, leverage, dekat keuntungan dan kerugian, pendapatan mengambang, margin dan konsep lainnya, serta rumus perhitungan yang sesuai. Tutorial yang sesuai dapat ditemukan di berbagai platform futures, dan Anda perlu mempelajarinya sendiri.

Kontrak abadi mirip dengan kontrak berjangka, tetapi perbedaannya adalah bahwa tidak ada konsep memegang posisi panjang dan pendek pada saat yang sama.

Jika platform mendukung futures dan spot, seperti futures OKEX dan Huobi, Anda perlu memilih OKEX Futures dan Huobi Futures secara terpisah pada antarmuka platform untuk ditambahkan, karena platform futures tersebut dianggap sebagai platform yang berbeda dari platform spot di FMZ.

SetContractType

Langkah pertama dalam perdagangan berjangka adalah mengatur kontrak yang akan diperdagangkan. Mengambil OKEX futures sebagai contoh, pilih pasangan perdagangan BTC saat membuat bot atau backtesting, dan Anda juga perlu mengatur kontrak mingguan, minggu depan atau triwulanan dalam kode. Jika tidak diatur, itu akan memintainvalid contract type. Berbeda dengan pasangan perdagangan spot, kontrak berjangka sering menggunakan mata uang perdagangan seperti BTC sebagai margin. Menambahkan BTC ke pasangan perdagangan biasanya mewakili pasangan perdagangan BTC_USD yang menggunakan BTC sebagai margin. Jika ada kontrak berjangka dengan USDT sebagai margin, bot perlu dibuat untuk menambahkan pasangan perdagangan BTC_USDT. Misalnya, kontrak abadi seperti Binance OKEX Futures, dengan kontrak bermargin crypto dan USDT.Setelah mengatur pasangan perdagangan, Anda juga harus menetapkan jenis kontrak tertentu, seperti perpetual, mingguan, minggu depan, dll. Setelah mengatur kontrak, Anda dapat melakukan operasi seperti mendapatkan penawaran pasar, membeli dan menjual.

Binance, OKEX, HuobiDM, dll memiliki kontrak dengan margin crypto dan USDT, yang perlu dibedakan saat menambahkan bot dan mengatur kontrak.

//OKEX Futures
exchange.SetContractType("swap")        // set to perpetual contract
exchange.SetContractType("this_week")   // set to weekly contract 
exchange.SetContractType("next_week")   // set to next week contract 
exchange.SetContractType("quarter")     // set to quarterly contract

//HuobiDM
exchange.SetContractType("this_week")   // set to weekly contract 
exchange.SetContractType("next_week")   // set to next week contract
exchange.SetContractType("quarter")     // set to quarterly contract 
exchange.SetContractType("swap")        // set to perpetual contract

//Binance Futures
exchange.SetContractType("swap")   // set to perpetual contract, and notice that crypto-margined and USDT-margined contracts are all in the perpetual contract
exchange.SetContractType("quarter")   // set to quarterly contract
exchange.SetContractType("next_quarter")  // set to next quarter contract

//BitMEX
exchange.SetContractType("XBTUSD")    // set to perpetual contract
exchange.SetContractType("XBTM19")  // the contract settled at a specific time; for more details, please log in BitMEX to check each contract code

//GateIO
exchange.SetContractType("swap")      // set to perpetual contract, and do not set the default as swap perpetual contract 
//Deribit
exchange.SetContractType("BTC-27APR18")  // the contract settled at a specific time; for more details, please log in Deribit to check out 

DapatkanPosisi

Untuk mendapatkan daftar informasi posisi saat ini, OKEX (OKCOIN) berjangka dapat lulus dalam parameter untuk menentukan jenis kontrak yang akan diperoleh.[], jika tidak ada posisi. Informasi posisi dikembalikan sebagai berikut. Ada banyak informasi spesifik, yang perlu dianalisis dalam kombinasi dengan pasangan perdagangan.

Jenis data Nama variabel Deskripsi
objek Informasi struktur mentah yang dikembalikan platform
nomor MarginLevel ukuran leverage; OKCoin adalah 10 atau 20, dan posisi silang OK berjangka kembali 10 (fixed), untuk API mentah tidak mendukung
nomor Jumlah jumlah posisi; OKCoin menunjukkan jumlah kontrak (bilangan bulat lebih dari 1)
nomor Frozen Jumlah Jumlah posisi beku
nomor Harga harga rata-rata posisi
nomor Margin Margin beku
nomor Keuntungan komoditas berjangka: keuntungan dan kerugian dari posisi tanda ke pasar; cryptocurrency: unit cryptocurrency: BTC / LTC, unit berjangka tradisional: RMB (catatan:Dalam kasus posisi silang berjangka OKCoin, ini mengacu pada keuntungan dan kerugian yang direalisasikan, bukan keuntungan dan kerugian dari posisi. Di bawah posisi terisolasi, ini mengacu pada keuntungan dan kerugian dari posisi.)
const Jenis PD_LONG adalah posisi panjang (CTP menggunakan closebuy_today untuk menutup posisi ); PD_SHORT adalah posisi pendek (CTP menggunakan closesell_today untuk menutup posisi); dalam berjangka CTP, PD_LONG_YD menunjukkan posisi panjang kemarin (yang menggunakan closebuy untuk menutup posisi); PD_SHORT_YD adalah posisi pendek kemarin (yang menggunakan closesell untuk menutup posisi)
string Jenis Kontrak Komoditas berjangka adalah kode kontrak, dan saham adalah platform code_stock code; jenis parameter spesifik yang dilewati dari SetContractType
function main(){
    exchange.SetContractType("this_week");
    var position = exchange.GetPosition();
    if(position.length>0){ //especially pay attention to judging the length of position before call, or an error will occur
        Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
            position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,"ContractType:", position[0].ContractType)
    }
}

Futures Open & Close Positions (Posisi Terbuka dan Tutup)

Pertama-tama, Anda perlu mengatur ukuran leverage; metode panggilan:exchange.SetMarginLevel(10), di mana 10 berarti 10 kali leverage, dan ukuran leverage yang didukung spesifik dapat diperiksa di platform yang sesuai,Perhatikan bahwa leverage harus ditetapkan di platform, dan kode harus konsisten dengan pengaturan yang ditetapkan di platform, jika tidak akan terjadi kesalahanAnda juga bisa membiarkannya tidak diatur dan menggunakan leverage default. Kemudian, tetapkan arah perdagangan; metode panggilan:exchange.SetDirection(Direction), yang sesuai dengan posisi terbuka dan tutup.Tidak seperti futures, jika kontrak abadi tidak memegang konsep panjang dan pendek pada saat yang sama, yaitu satu posisi tidak diizinkan.buydansellJika mendukung posisi dua arah, Anda perlu mengaturclosebuy, closesell.Hubungan khusus:

Operasi SetDirection Parameter Fungsi Penetapan Perintah
Open Long Position (Posisi Panjang Terbuka) tukar.SetDirection ((buy) Bertukar.Beli ((()
Tutup Posisi Panjang tukar.SetDirection ((closebuy) Bertukar.Menjual ((()
Posisi Pendek Terbuka pertukaran.SetDirection ((jual) Bertukar.Menjual ((()
Tutup Posisi Pendek exchange.SetDirection ((closesell) Bertukar.Beli ((()

Akhirnya, ada kode khusus untuk posisi terbuka dan dekat. Jumlah pesanan yang ditempatkan bervariasi dari platform ke platform. Misalnya, futures Huobi didasarkan pada jumlah jumlah kontrak, dan satu kontrak adalah 100 dolar AS. Perhatikan bahwa backtest futures tidak mendukung pesanan pasar.

function main(){
    exchange.SetContractType("this_week")    // for example, set OKEX futures to weekly contract 
    price = exchange.GetTicker().Last
    exchange.SetMarginLevel(10) // set to 10 times of leverage  
    exchange.SetDirection("buy") // set the order type as buy long 
    exchange.Buy(price+10, 20) // set contract quantity as 20 orders
    pos = exchange.GetPosition()
    Log(pos)
    Log(exchange.GetOrders()) // check out if there is any unfinished order 
    exchange.SetDirection("closebuy"); // if it is a perpetual contract, directly set exchange.SetDirection("sell")
    exchange.Sell(price-10, 20)
}

Berikan contoh strategi spesifik dari posisi tutup penuh sebagai berikut:

function main(){
    while(true){
        var pos = exchange.GetPosition()
        var ticker = exchange.GetTicekr()
        if(!ticker){
            Log('not able to obtain ticker')
            return
        }
        if(!pos || pos.length == 0 ){
            Log('no position')
            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)
            }
        }
    }
}

Perdagangan Leverage Cryptocurrency

Perdagangan leverage cryptocurrency perlu beralih ke akun leverage dalam kode, dan bagian lainnya sama dengan perdagangan spot.

Penggunaanexchange.IO("trade_margin") untuk beralih ke mode akun leverage; menempatkan pesanan dan memperoleh aset akun akan mengakses antarmuka platform leverage. Penggunaanexchange.IO("trade_normal") untuk beralih kembali ke mode akun biasa.

Platform yang didukung:

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

Perdagangan Komoditas Berjangka

Perdagangan berjangka komoditas dan perdagangan berjangka cryptocurrency sangat berbeda. Pertama-tama, waktu perdagangan berjangka komoditas sangat singkat, tetapi cryptocurrency diperdagangkan selama 24 jam; protokol berjangka komoditas bukan REST API yang umum digunakan; frekuensi perdagangan dan jumlah pesanan yang tertunda dari berjangka komoditas terbatas, tetapi yang dari cryptocurrency sangat longgar, dan sebagainya. Oleh karena itu, ada banyak poin yang membutuhkan perhatian khusus saat perdagangan berjangka komoditas, dan direkomendasikan bagi mereka yang memiliki pengalaman yang kaya dalam operasi manual. FMZ sekarang mendukung robot simulasi komoditas berjangka, dan Anda dapat merujuk:https://www.fmz.com/bbs-topic/325Untuk menambahkan perusahaan berjangka komoditas:https://www.fmz.com/bbs-topic/371

Komoditas berjangka telah menerapkan pengawasan tembus pandang pada bulan Juni 2019; untuk program individu, pengguna individu perlu membuka akun untuk mengajukan kode otorisasi untuk pialang berjangka (cithakan informasi aplikasi tertentu dapat dikirim ke grup WeChat atau grup QQ), yang umumnya memakan waktu 4-5 hari; prosedurnya cukup rumit. Sebagai penyedia perdagangan terprogram, platform FMZ telah mengajukan kode otorisasi perangkat lunak dari berbagai penyedia layanan berjangka. Pengguna dapat menggunakannya secara langsung tanpa mendaftar. Saat menambahkan pialang berjangka, cari see through untuk melihat daftar yang telah diajukan oleh FMZ. Pos referensi spesifik:https://www.fmz.com/bbs-topic/3860Jika broker berjangka Anda tidak lagi ada dalam daftar, Anda hanya dapat mengajukan diri, atau membuka akun baru dari broker yang didukung, yang umumnya membutuhkan waktu 2 hari. FMZ memiliki hubungan kerja sama yang mendalam dengan beberapa penyedia layanan; misalnya, Guotai Junan Hongyuan Futures telah membeli versi institusional platform FMZ, yang dapat digunakan oleh penggunanya, dan pengguna secara otomatis menjadi VIP saat membuka akun, dan biaya layanan diminimalkan. Referensi pembukaan akun:https://www.fmz.com/bbs-topic/506.

Karena kelebihan struktur platform FMZ Quant, pengguna juga dapat menambahkan beberapa akun broker berjangka, dan menerapkan beberapa fungsi yang tidak dapat diselesaikan oleh perangkat lunak perdagangan program berjangka komoditas lainnya, seperti sintesis tik frekuensi tinggi; Anda dapat merujuk pada:https://www.fmz.com/bbs-topic/1184

Kerangka Strategi

Pertama-tama, karena ini bukan perdagangan 24 jam dan membutuhkan operasi login, perlu untuk menilai status link sebelum perdagangan.exchange.IO("status")adalahtrue, yang mengindikatkan koneksi yang berhasil ke platform. Jika API dipanggil ketika login tidak berhasil, not login tidak diminta. Anda dapat menambahkan Sleep (2000) setelah strategi dimulai, memberikan waktu tertentu untuk masuk. Anda juga dapat mencoba lagi untuk berlangganan_C(exchange.SetContractType,"MA888"), yang akan memastikan login yang sukses.

Kode akuisisi dan perdagangan pasar komoditas berjangka adalah sama dengan yang berjangka cryptocurrency.

function main(){
    _C(exchange.SetContractType,"MA888") //If you do not log in successfully, you cannot subscribe to the contract, so better to try again
    while(true){
        if(exchange.IO("status")){
            var ticker = exchange.GetTicker()
            Log("MA888 ticker:", ticker)
            LogStatus(_D(), "Already connected with CTP !")//_D obtain event
        } else {
            LogStatus(_D(), "Not connected with CTP !")
            Sleep(1000)
        }
    }
}

Disarankan untuk menggunakan perpustakaan berjangka komoditas untuk perdagangan (yang akan dijelaskan nanti), kode akan sangat sederhana pada saat ini, dan tidak perlu berurusan dengan detail yang membosankan.https://www.fmz.com/strategy/57029

function main() {
    // Use the CTA strategy framework of commodity futures library 
    $.CTA(Symbols, function(st) {
        var r = st.records
        var mp = st.position.amount
        var symbol = st.symbol
        /*
        "r" represents K-line, "mp" indicates the position amount of the current variety; positive number means long position, negative number means short position, and 0 means no position; "symbol" is the variety name
        if the return value is n: 
            n = 0 : full close positions (no matter now they are long or short)
            n > 0 : if right now long positions are held, add n long positions; if now they are short positions, close n short posiitons; if n is over the position amount right now, reverse to open long positions 
            n < 0 : if right now short positions are held, add n short positions; if now they are long positions, close n long posiitons; if -n is over the position amount right now, reverse to open short positions 
        */
        if (r.length < SlowPeriod) {
            return
        }
        var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
        if (mp <= 0 && cross > ConfirmPeriod) {
            Log(symbol, "Golden Cross Period", cross, "the moment position", mp);
            return Lots * (mp < 0 ? 2 : 1)
        } else if (mp >= 0 && cross < -ConfirmPeriod) {
            Log(symbol, "Death Cross Period", cross, "the moment position", mp);
            return -Lots * (mp > 0 ? 2 : 1)
        }
    });
}

Cara Mendapatkan Data CTP

Komoditas berjangka menggunakan protokol CTP, dan semua kutipan pasar dan eksekusi pesanan hanya akan diberitahu setelah ada perubahan, sementara kueri tentang pesanan, akun, dan posisi adalah kueri aktif.GetTicker, GetDepthdanGetRecords, semua perlu memiliki data yang di-cache untuk mendapatkan data terbaru. Jika tidak ada data, itu akan menunggu sampai ada data, jadi tidak perlu bagi strategi untuk menggunakan Sleep. Ketika ada perubahan penawaran pasar, ticker, kedalaman dan catatan akan diperbarui. Pada saat ini, memanggil salah satu antarmuka ini akan segera kembali, dan keadaan antarmuka yang dipanggil akan diatur ke wait for update mode. Lain kali ketika antarmuka yang sama dipanggil, itu akan menunggu sampai ada data baru yang dikembalikan. Beberapa kontrak yang tidak populer atau batas harga akan menyebabkan tidak ada perdagangan untuk waktu yang lama, yang berarti strategi telah macet untuk waktu yang lama, juga normal.

Jika Anda ingin mendapatkan data setiap kali Anda mendapatkan kutipan pasar, bahkan jika itu data lama, Anda dapat beralih ke mode pembaruan segera kutipan pasarexchange.IO("mode", 0). Pada saat ini, strategi tidak dapat ditulis sebagai event-driven, dan peristiwa SLeep perlu ditambahkan untuk menghindari loop tak terbatas yang cepat. Beberapa strategi jarang dapat menggunakan mode ini, dan desain strategi sederhana.exchange.IO("mode", 1)untuk beralih kembali ke mode cache default.

Ketika mengoperasikan kontrak tunggal, gunakan mode default. Namun, jika ada beberapa kontrak, mungkin salah satu kontrak tidak memperbarui kutipan pasar, yang mengakibatkan blokade antarmuka untuk mendapatkan kutipan pasar, dan pembaruan kutipan kontrak lain tidak dapat diperoleh, juga. Untuk memecahkan masalah ini, mode pembaruan segera dapat digunakan, tetapi tidak nyaman untuk menulis strategi frekuensi tinggi. Pada saat ini Anda dapat menggunakan mode push acara untuk mendapatkan push pesanan dan kutipan.exchange.IO("wait")Jika beberapa objek pertukaran ditambahkan, yang jarang terjadi dalam komoditas berjangka, Anda dapat menggunakanexchange.IO("wait_any"), dan kembali Index akan menunjukkan kembali indeks platform.

Push dari perubahan tik pasar:{Event:"tick", Index: platform index (in the order of the platforms added in the bot), Nano: event of nanosecond-level time, Symbol: contract name}Push order:{Event:"order", Index:Exchange index, Nano:Event of nanosecond-level time, Order:Order information (same as GetOrder)}

Pada saat ini, struktur strategi dapat ditulis sebagai:

function on_tick(symbol){
    Log("symbol update")
    exchange.SetContractType(symbol)
    Log(exchange.GetTicker())
}

function on_order(order){
    Log("order update", order)
}

function main(){
    while(true){
        if(exchange.IO("status")){ //Judge the link status 
            exchange.IO("mode", 0)
            _C(exchange.SetContractType, "MA888")//Subscribe to MA; only the subscription request for the first time is ture, and the later ones are program switches, which do not consume time
            _C(exchange.SetContractType, "rb888")//Subscribe to 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 & Cryptocurrency

Perhatikan juga perbedaan antara komoditas berjangka dan platform cryptocurrency. Misalnya, GetDepth sebenarnya hanya memiliki satu tingkat kedalaman (5 tingkat kedalaman mahal), dan GetTrades tidak dapat memperoleh riwayat perdagangan (semua disimulasikan berdasarkan perubahan posisi, dan tidak ada catatan perdagangan nyata). Komoditas berjangka memiliki mekanisme batas harga. Ketika batasnya naik, harga pesanan jual kedalaman untuk menjual satu adalah harga batas, dan volume pesanan adalah 0. Ketika batasnya turun, harga pesanan beli untuk membeli satu adalah harga batas, dan volume pesanan adalah 0. Selain itu, frekuensi antarmuka kueri komoditas berjangka, seperti mendapatkan akun, pesanan, dan posisi, sangat terbatas, umumnya setiap 2 detik. Komoditas berjangka juga memiliki batasan jumlah pesanan yang ditempatkan dan dibatalkan.

Set Kontrak

exchange.IO("instruments"): mengembalikan daftar semua kontrak di platform {nama kontrak: detail} dalam bentuk kamus, dan hanya mendukung bot.exchange.IO("produk"): mengembalikan daftar semua item di platform {nama kontrak: detail} dalam bentuk kamus, dan hanya mendukung bot.exchange.IO("langganan"): ini mengembalikan penawaran pasar langganan di platform dalam bentuk kamus, dan hanya mendukung bot.

PeraturanContractTypeDi dalam kontrak berjangka CTP tradisional, ID kontrak yang bersifat case-sensitive.exchange.SetContractType("au1506"). Setelah kontrak ditetapkan dengan sukses, itu akan mengembalikan informasi rinci kontrak, seperti jumlah pembelian minimum, biaya layanan, waktu pengiriman, dll. Saat berlangganan beberapa kontrak, hanya pertama kalinya permintaan langganan benar-benar dikirim, dan kemudian pasangan perdagangan hanya beralih pada tingkat kode, yang tidak membutuhkan waktu. Kontrak terus menerus utama adalah kode 888, seperti MA888, kontrak tingkat terus menerus adalah 000, seperti MA000; 888 dan 000 adalah perdagangan kontrak virtual yang hanya mendukung backtest, dan bot nyata hanya mendukung kutipan pasar.Namun, Mylanguage dapat mengoperasikan kontrak utama, dan program akan secara otomatis mengubah posisi, yaitu, menutup posisi non-utama dan membuka posisi baru pada posisi utama.

Login yang gagal tidak dapat mengatur kontrak, tetapi akan segera kembali, jadi Anda dapat mencoba dengan _c lagi, untuk mengetahui login CTP telah selesai.

Posisi Terbuka & Posisi Tutup

Direction dariSetDirectiondapat memperoleh empat parameter:buy, closebuy, sell, closesell. Komoditas berjangka memiliki lebihclosebuy_todaydanclosesell_today, menunjukkan penutupan posisi saat ini; default adalahclosebuy/ closesell, yang menunjukkan penutupan posisi kemarin; hanya varietas Bursa Berjangka Shanghai yang dibagi menjadi penutupan hari ini dan penutupan kemarin, yang dapat mempengaruhi biaya layanan, sehingga perlu untuk memberikan prioritas untuk menutup posisi kemarin. Untuk berjangka tradisional CTP, Anda dapat mengatur parameter kedua sebagai 1 atau 2 atau 3, yang masing-masing mengacu pada spekulasi, arbitrage, dan hedge. Jika tidak diatur, defaultnya adalah spekulasi.Operasi spesifik seperti membeli dan menjual, mendapatkan posisi, mendapatkan pesanan, membatalkan pesanan, dan mendapatkan akun adalah sama dengan perdagangan berjangka cryptocurrency, jadi silakan lihat bagian sebelumnya.

Operasi SetDirection Parameter Fungsi Penetapan Perintah
Open Long Position (Posisi Panjang Terbuka) tukar.SetDirection ((buy) Bertukar.Beli ((()
Tutup Posisi Panjang tukar.SetDirection ((closebuy) Bertukar.Menjual ((()
Posisi Pendek Terbuka pertukaran.SetDirection ((jual) Bertukar.Menjual ((()
Tutup Posisi Pendek exchange.SetDirection ((closesell) Bertukar.Beli ((()

Contoh berikut adalah fungsi posisi penutupan tertentu. Perhatikan bahwa contoh ini terlalu sederhana. Anda juga harus mempertimbangkan apakah dalam waktu perdagangan, bagaimana mencoba kembali pesanan yang sedang menunggu jika tidak sepenuhnya diisi, berapa volume pesanan maksimum, apakah frekuensi terlalu tinggi, dan apakah itu harga geser atau harga pasar dan sebagainya. Hanya untuk referensi,ini adalah paket perpustakaan platform yang disarankan untuk membuka dan menutup posisi di bot nyata:https://www.fmz.com/strategy/12961Ada pengantar khusus di bagian perpustakaan, dan juga disarankan untuk mempelajari kode sumber perpustakaan.

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 ? "Close today" : "Close yesterday", '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 ? "Close today" : "Close yesterday", 'Ask', depth.Asks[0]);
        }
    }
}

Komoditas berjangka mendukung jenis pesanan khusus (dukungan untuk bot, tetapi tidak untuk backtest), yang ditentukan oleh akhiran, ditambahkan ke _, seperti:

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

Pengucapan khusus:

  • ioc segera selesai, atau batalkan THOST_FTDC_TC_IOC
  • gfs valid di node THOST_FTDC_TC_GFS
  • Gfd berlaku pada hari THOST_FTDC_TC_GFD
  • gtd berlaku sebelum tanggal yang ditentukan THOST_FTDC_TC_GTD
  • gtc valid sebelum dibatalkan THOST_FTDC_TC_GTC
  • gfa berlaku dalam penawaran lelang THOST_FTDC_TC_GFA

Antarmuka Esunny

Secara default, antarmuka yang dibuka di broker berjangka komoditas adalah semua antarmuka CTP. Jika diperlukan, mereka dapat diganti dengan antarmuka Esunny. Melalui enkapsulasi FMZ, metode panggilan adalah sama. Perbedaannya adalah bahwa akun, pesanan, dan posisi semuanya berada dalam mode push, sehingga docker akan mempertahankan data ini secara lokal, dan akan segera kembali ketika antarmuka yang sesuai dipanggil, tanpa benar-benar membuat permintaan.

Jenis pesanan khusus adalah:

  • Gfd berlaku pada hari TAPI_ORDER_TIMEINFORCE_GFD
  • gtc valid sebelum dibatalkan TAPI_ORDER_TIMEINFORCE_GTC
  • gtd berlaku sebelum tanggal yang ditentukan TAPI_ORDER_TIMEINFORCE_GTD
  • fak Sebagian dieksekusi, batalkan sisanya TAPI_ORDER_TIMEINFORCE_FAK
  • ioc mengeksekusi segera, atau membatalkan TAPI_ORDER_TIMEINFORCE_FAK
  • fok tidak dijalankan sepenuhnya, batalkan semua TAPI_ORDER_TIMEINFORCE_FOK

Fungsi Global yang Umum Digunakan

Log - Log & WeChat Push

Ketika log catatan log pada antarmuka bot, dan menambahkan karakter @ setelah string, pesan akan masuk ke antrian push, dan akan didorong langsung setelah mengikat ke WeChat atau telegram, sepertiLog('Push to WeChat@').

Warna log juga dapat disesuaikan, sepertiLog('this is a log in red font #ff0000'). #ff0000adalah hexadecimal dari warna RGB, menunjukkan bahwa semua file log disimpan dalam database SqLit bot di direktori di mana docker berada, yang dapat diunduh dan dibuka dengan perangkat lunak database, atau dapat digunakan untuk menyalin cadangan dan memulihkan (nama database dan id bot adalah sama).

LogProfit - Keuntungan cetak

Ini mencatat keuntungan, dan menggambar kurva keuntungan pada antarmuka bot, yang dapat dipertahankan setelah bot di-restart.LogProfit(1000)Perhatikan bahwa parameter dariLogProfittidak selalu keuntungan, dan itu bisa menjadi nomor apapun dan perlu diisi sendiri.

LogStatus - Tampilan Status (Termasuk Tabel)

Jika status bot, karena log akan disimpan terlebih dahulu dan diperbarui terus-menerus, membutuhkan informasi hanya untuk menampilkan tidak untuk menyimpan, Anda dapat menggunakanLogStatusParameter dariLogStatusadalah string, yang juga dapat digunakan untuk mewakili informasi tabel.

Contoh tabel tampilan posisi bot nyata tertentu:

var table = {type: 'table', title: 'position information', cols: ['Column1', 'Column2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}; 
LogStatus('`' + JSON.stringify(table) + '`'); // After serialization, JSON will be added the character "'" on both sides, which is regarded as a comlpex messag format (now supporting tables)
LogStatus('The first line information\n`' + JSON.stringify(table) + '`\nthe third line information'); // the table information can be displayed in multiple lines
LogStatus('`' + JSON.stringify([table, table]) + '`'); // Multiple tables are supported to be displayed at the same time, which will be displayed in one group by TAB  
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // Multiple tables are displayed up and down by arrangement 

Tidur

Parameternya adalah jumlah milidetik, sepertiSleep(1000)Karena frekuensi akses terbatas dari semua platform, waktu tidur harus ditambahkan ke loop tak terbatas dalam strategi umum.

_G

Setelah bot di-restart, program akan di-restart._Gsangat nyaman dan praktis, dan dapat menyimpan konten JSON berurutan._Gfungsi ditulis dalamonexit(), sehingga setiap kali strategi dihentikan, informasi yang diperlukan akan disimpan secara otomatis. Jika Anda ingin menyimpan data yang lebih diformat, fungsi _G tidak cocok, tetapi


Lebih banyak