[TOC]

Instruksi Dasar

Memulai

Apa yang bisa dilakukan oleh FMZ Quant Trading Platform?

FMZ Quant Trading platform adalah komunitas kuantitatif paling profesional di bidang perdagangan kuantitatif. Di sini Anda dapat belajar, menulis, berbagi, membeli dan menjual strategi kuantitatif; Anda dapat melakukan backtesting online dan menggunakan bot simulasi untuk melakukan perdagangan simulasi; Anda juga dapat menjalankan, mempublikasikan, dan menonton perdagangan langsung. Kami mendukung hampir semua bursa mata uang digital arus utama.

Seri Tutorial Lengkap

Tutorial grafis:

Jika ada masalah, Anda dapat memposting pertanyaan dan mendiskusikan di forum kapan saja, atau mengirimkan tiket, atau menghubungi administrator di grup Telegram (Telegram), secara umum, pertanyaan ini akan dijawab dengan cepat.

Mendukung ChatGPT untuk bantuan pembangunan

FMZ Quantitative Trading Platform telah mengadopsi ChatGPT sebagai alat bantuan pembangunan yang dapat diakses dengan mengklik ChatGPT di bilah pintasan di Dashboard untuk melompat keHalaman Alat Bantuan ChatGPT.

Bahasa pemrograman apa yang tersedia untuk menerapkan strategi saya?

FMZ Quant Trading platform mendukung untuk menggunakanJavaScript, TypeScript, Python, C++, Pine MylanguagedanBlockly Visualizationuntuk menulis dan merancang strategi.

Ini mendukungTypeScriptbahasa, tetap mengaturnya keJavaScriptstrategi ketika kita membuat strategi, maka kita menulis// @ts-checkdi awal kode strategi atau klik tombolTypeScriptdi sudut kanan atas area editing strategi untuk beralih keTypeScriptPlatform akan mengenali kode sebagaiTypeScriptsecara otomatis dan memberikan dukungan penyusunan dan pemeriksaan tipe yang tepat untuk:

  • Keamanan tipe:TypeScriptFungsi pemeriksaan tipe statis dapat membantu Anda menemukan kesalahan potensial saat menulis kode dan meningkatkan kualitas kode.
  • Pengisian kode otomatis:TypeScriptSistem tipe membuat lebih cepat untuk menemukan atribut dan metode yang Anda butuhkan ketika menulis kode, meningkatkan efisiensi pengembangan.
  • Struktur kode yang lebih jelas:TypeScript, Anda dapat mengatur dan memelihara kode Anda dengan lebih baik, membuatnya mudah dibaca dan dipahami.
  • Fitur pemrograman berorientasi objek yang kuat:TypeScriptmemberikan fitur pemrograman berorientasi objek yang kuat, seperti antarmuka, kelas, generik dan sebagainya, membantu Anda menulis kode strategi yang lebih kuat dan dapat digunakan kembali.

Anda hanya perlu menguasai salah satu bahasa ini. Selain mendukung cara merancang strategi dengan menulis kode, Anda juga dapat membuat strategi menggunakan modul visual (Blockly).

BlocklyTutorial Visualisasi:

TetapkanPythonpenerjemah yang digunakan olehPythonprogram strategi

Strategi yang ditulis dalamPython, saat backtesting atau live trading, jika lingkungan sistem docker memiliki keduaPython2danPython3dipasang, Anda dapat mengaturPythonversi yang akan diluncurkan pada waktu berjalan pada baris pertama strategi, seperti#!python3dan#!python2, sehingga sistem akan menemukan penerjemah secara otomatis. Dan Anda juga dapat menentukan jalur absolut, seperti:#!/usr/bin/python3.

Apa itu Docker?

Docker dapat dipahami sebagai pelaksana strategi trading Anda, bertanggung jawab atas permintaan data yang kompleks, penerimaan data, tautan jaringan, log postback dan sebagainya. Docker berjalan di server Anda, bahkan jika situs web platform FMZ Quant Trading mengalami kegagalan jaringan, itu tidak akan mempengaruhi operasi docker Anda. Docker dapat berjalan padaLinux, Windows, Mac OS, Android, Raspberry Pi ARM Linuxdan sistem lainnya.Halaman Docker, Langkah-langkah instalasi dan pembaruan Linux docker. Bot dan log yang dikelola oleh docker disimpan di direktori/logs/storage. File adalahSqlitefile database dengandb3, yang dapat diedit langsung olehSqliteuntuk file dengan ekstensidb3Dalam database bot yang sebenarnya, nama file adalah ID bot.

Protokol yang Didukung

  • Aset Blockchain: Lebih dari 50 pertukaran aset blockchain (cryptocurrency) arus utama sekarang didukung di platform kami.
  • Akses Protokol Umum:protokol umum

Keamanan Strategi

Ketika strategi trading dikembangkan pada platform trading FMZ Quant, isi strategi hanya terlihat oleh pemegang akun FMZ. Dan pada platform trading kuantitatif FMZ, Anda dapat mencapai lokalisasi lengkap kode strategi.Pythonpaket, yang dimuat dalam kode strategi, sehingga lokalisasi konten strategi dapat direalisasikan.

KeamananPythonKode: KarenaPythonadalah bahasa sumber terbuka yang sangat mudah dikompilasi, jika strategi tidak untuk penggunaan pribadi tetapi untuk disewa, Anda dapat menjalankan strategi pada docker yang digunakan sendiri dan menyewanya dalam bentuk sub-akun atau manajemen docker penuh jika Anda khawatir tentang kebocoran strategi.

Enkripsi dariPythonkode strategi: Secara default,Pythonkode strategi tidak dienkripsi ketika digunakan oleh penulis dan dienkripsi ketika disewa kepada orang lain. Dengan mengedit kode berikut di awalPythonstrategi, Anda dapat menentukan apakah untuk mengenkripsi kode strategi untuk penggunaan pribadi atau sewa.Pythonversi yang mendukung enkripsi kode strategi adalah sebagai berikut:Python 2.7, Python 3.5danPython 3.6.

  • Penulis strategi menjalankan sendiri dan mengenkripsi kode strategi untuk orang lain untuk digunakan melalui kode pendaftaran: Tentukan#!pythonsebagai versi interpreter Python, dan kemudian menggunakan,untuk menjaga terpisah; masukkan perintah enkripsiencrypt. Jika Anda tidak menentukan versi dariPython, tambahkan#!,encrypt directly.
 #!python,encrypt

Atau

  #!encrypt
  • Ini tidak akan mengenkripsi kode strategi ketika penulis strategi berjalan untuk penggunaan mereka sendiri dan berbagi dengan orang lain melalui kode pendaftaran:
  #!python, not encrypted

Atau

  #!not encrypted

Gunakan kodeos.getenv('__FMZ_ENV__')untuk menentukan apakah kode enkripsi adalah valid; kembalinya string"encrypt"Ini hanya valid di bot nyata, dan backtest tidak akan mengenkripsiPythonkode strategi.

#!encrypt
def main():
    ret = os.getenv('__FMZ_ENV__')
    # If the print variable ret is the string "encrypt" or ret == "encrypt" is true, that means the encryption is valid. 
    Log(ret, ret == "encrypt")

Kunci Keamanan

Data sensitif, seperti informasi akun dan string terenkripsi dalam parameter strategi yang dikonfigurasi pada platform FMZ Quant Trading, dienkripsi di browser web. Semua informasi yang disimpan pada platform FMZ Quant Trading dienkripsi (bukan data teks polos), dan hanya pengguna perangkat pribadi yang dapat mendekripsi dan menggunakan informasi, yang sangat meningkatkan keamanan data sensitif. Harap jangan mengungkapkan atau menjual strategi jika informasi sensitif lainnya termasuk dalam kode strategi, pengaturan parameter dan deskripsi strategi dll.

  • Platform kami mendukung konfigurasi lokal informasi sensitif, seperti informasi akun pertukaran dan kunci rahasia Pada halaman di mana platform mengkonfigurasi informasi pertukaran, semua kontrol kotak teks terenkripsi dengan topeng mendukung cara mengkonfigurasi jalur file untuk memuat file lokal docker.RSA KEYmetode otentikasi pertukaran sebagai contoh untuk menjelaskan secara rinci bagaimana untuk mengkonfigurasi informasi sensitif secara lokal pada perangkat di mana program docker terletak.
  1. Buat kunci publik dan kunci pribadi RSA. Misalnya, buat kunci publik dan pribadi dalam formatPKCS#8, ada banyak alat yang tersedia untuk pembuatan, sepertiopenssl.
  2. MembuatRSA KEYdi bursa, dan mengunggah kunci publik yang dibuat diLangkah 1selama penciptaan.
  3. Simpan kunci pribadi yang dibuat diLangkah 1dalam direktori yang sama dari docker dalam formattxtfile, atau di jalur lain di direktori program docker.
  4. Ketika mengkonfigurasi pertukaran di platform FMZ, isiRSA KEYdibuat oleh pertukaran di kotak suntingan konfigurasiAccess Key.
  5. Ketika mengkonfigurasi pertukaran di platform FMZ, isi jalurtxtfile ditempatkan di level yang sama direktori dari docker diLangkah 3di kotak sunting konfigurasiSecret Key. Misalnya, jika nama file ditempatkan adalah:rsaKey.txt, dan file dan docker diisi di level yang sama direktori:file:///rsaKey.txt. Jika file berada di direktori di sebelah direktori program dockerrsa_key, isi:file:///rsa_key//rsaKey.txtJika Anda menempatkanrsaKey. txtdi tempat lain di komputer atau server Anda mengikuti instruksi ini sesuai, harus dicatat bahwa file ini hanya dapat ditempatkan baik pada direktori tingkat yang sama atau subdirektori sehubungan dengan docker.

Ini membuatnya lebih aman untuk menemukan dan menyimpan kunci pribadi, Anda dapat merujuk kevideo penjelasanuntuk proses rinci.

Sistem Backtest

Apa itu sistem backtest, dan untuk apa digunakan?

Setelah Anda menyelesaikan desain strategi perdagangan kuantitatif, bagaimana Anda bisa mengetahui situasi dasar strategi Anda, seperti logika strategi dan arah pengembalian strategi? tentu saja, kita tidak dapat menggunakan uang riil secara langsung untuk menjalankan strategi di pasar perdagangan riil, tetapi kita dapat menggunakan data historis untuk menguji strategi Anda dan mengetahui keuntungan dari strategi Anda dalam data historis.

Apakah data sistem backtest akurat dan bagaimana dengan akurasi hasil backtest?

FMZ Quant Trading platform membagi sistem backtest menjadiTingkat pasar riildanTingkat simulasi. Tingkat pasar nyata adalah untuk backtest sepenuhnya sesuai dengan data historis lengkap; sementara level simulasi backtest menghasilkantickdata berdasarkan data K-line yang sebenarnya pada interval yang teratur untuk backtest. keduanya didasarkan pada data historis yang sebenarnya, tetapi data tingkat pasar yang sebenarnya lebih akurat dan hasilnya lebih kredibel.Deskripsi mekanisme FMZ Backtest. Namun, backtesting hanyalah kinerja strategi sesuai dengan data historis. Data historis tidak dapat sepenuhnya mewakili pasar masa depan. Pasar historis dapat berulang, atau juga dapat menyebabkan Black Swan. Oleh karena itu, hasil backtest harus diperlakukan secara rasional dan obyektif.

Masalah yang harus diperhatikan saat melakukan backtesting strategi bahasa pemrograman yang berbeda:

Pengujian backtest dariJavaScriptdanC++strategi perdagangan dilakukan di browser, dan bot pasar nyata atauWexApppasar real (yaitu pasar realWexAppemulated exchange of FMZ Quant Trading platform) berjalan tanpa menginstal perangkat lunak, perpustakaan atau modul lainnya. Pengujian backtest dariPythondilakukan pada docker; dapat dilakukan pada server publik yang ditambahkan oleh platform FMZ Quant Trading, dan juga dapat dilakukan pada docker pengguna sendiri.PythonJika beberapa perpustakaan diperlukan, mereka perlu dipasang secara manual (hanya perpustakaan umum yang didukung pada server publik).

Data Backtest dalam Sistem

Ada dua jenis backtest platform FMZ Quant Trading: backtest tingkat simulasi dan backtest tingkat pasar nyata.tickSetiap periode K-line akan menghasilkan 12 titik waktu backtesting; Namun, tingkat pasar riil mengumpulkanticksmekanisme backtest FMZ memungkinkan strategi trading untuk berdagang beberapa kali pada satu garis K, menghindari situasi di mana trading hanya dapat dilaksanakan pada harga dekat. Ini lebih akurat sambil memperhitungkan kecepatan backtest. Untuk penjelasan yang lebih rinci, silakan lihatLink.

Metode DEBUG Strategi dalam sistem backtesting

JavaScript strategi backtesting debugging di Chrome DevTools

Pertukaran yang didukung dalam sistem backtesting

  • Mata uang terenkripsi (Cryptocurrency)

    Nama Jenis Instruksi
    Bitfinex objek pertukaran spot mendukung pasangan perdagangan terbatas, seperti:BTC_USD, ETH_USDdanLTC_USD, dll (perhatikan mata uang penawaran dari pasangan perdagangan adalahUSDdolar)
    Binance objek pertukaran spot mendukung pasangan perdagangan terbatas, seperti:BTC_USDT, ETH_USDT, ETH_BTCdanLTC_BTC, dll.
    OKX objek pertukaran spot mendukung pasangan perdagangan terbatas, seperti:BTC_USDT, ETH_USDT, ETH_BTCdanLTC_BTC, dll.
    Huobi objek pertukaran spot mendukung pasangan perdagangan terbatas, seperti:BTC_USDT, ETH_USDT, ETH_BTCdanLTC_BTC, dll.
    OKX Futures objek pertukaran futures mendukung pasangan perdagangan terbatas, seperti:BTC_USDdanETH_USD, dll; mata uang kutipan dari pasangan perdagangan adalahUSD; setelah pengaturan kode kontrak khusus (silakan lihat fungsiexchange.SetContractType), kontrak adalah kontrak dengan margin kripto; kode kontrak yang didukung meliputi:this_week, next_week, quarterdanswap
    HuobiDM objek pertukaran futures HuobiDM adalah Huobi Futures (Huobi Contract), yang mendukung pasangan perdagangan terbatas, seperti:BTC_USDdanETH_USD, dll.; mata uang kutipan dari pasangan perdagangan adalahUSD; setelah pengaturan kode kontrak khusus (silakan lihat fungsiexchange.SetContractType), kontrak adalah kontrak dengan margin kripto; kode kontrak yang didukung meliputi:this_week, next_week, quarterdanswap.
    BitMEX objek pertukaran futures pasangan perdagangan adalahXBT_USD; setelah pengaturan kode kontrak khusus (silakan lihat fungsiexchange.SetContractType), kontrak adalah kontrak dengan margin kripto; kode kontrak yang didukung adalah:XBTUSD
    Binance Futures objek pertukaran futures mendukung pasangan perdagangan terbatas, seperti:BTC_USDTdanETH_USDT, dll; mata uang kutipan dari pasangan perdagangan adalahUSD; setelah pengaturan kode kontrak khusus (silakan lihat fungsiexchange.SetContractType), kontrak adalahUSDT- kontrak dengan margin; kode kontrak yang didukung adalahswap
    Opsi Derbit objek pertukaran futures pasangan perdagangan adalah:BTC_USDdanETH_USD; setelah pengaturan kode kontrak khusus (silakan lihat fungsiexchange.SetContractType), kontrak adalah kontrak dengan margin kripto; kode kontrak opsi khusus perlu ditetapkan

    Untuk obyek pertukaran berjangka dalam sistem backtest, mengubah pasangan perdagangan sementara tidak didukung dalam kode strategi.

Tingkat Simulasi

Simulasi tingkat backtest didasarkan pada data K-line yang mendasari dari sistem backtest, mensimulasikan data tik dalam kerangka harga tertinggi, harga terendah, harga pembukaan, dan nilai harga penutupan dari K-line Bar yang mendasari berdasarkan algoritma tertentu.tickdata ketika antarmuka diminta. Untuk rincian, silakan lihat:FMZ Quant Simulation Level Backtest Mechanism Deskripsi.

Tingkat Pasar Nyata

Backtest tingkat pasar yang sebenarnya adalahtickUntuk strategi yang didasarkan padaticktingkat data, menggunakan tingkat pasar riil untuk backtest lebih dekat ke realitas.tickdata adalah data yang tercatat nyata, bukan yang disimulasikan. Ini mendukung data kedalaman, pemutaran data rekaman perdagangan pasar, kedalaman kustom dan setiap data perdagangan individu. Ukuran maksimum backtest data tingkat pasar nyata adalah maksimal 50MB, tanpa batasan pada rentang waktu backtest dalam batas atas dataset. Jika Anda perlu memperbesar rentang waktu backtest sebanyak mungkin, Anda dapat mengurangi nilai peralatan pengaturan kedalaman Call dan tidak menggunakan setiap data perdagangan individu untuk meningkatkan rentang waktu backtest.GetDepth,GetTradesPada saat data pasar pada timeline, panggilanGetTicker,GetTrades, GetDepthdanGetRecordstidak akan mendorong waktu beberapa kali ketika waktu bergerak pada garis waktu backtest (yang tidak akan memicu lompatan ke momen data pasar berikutnya). panggilan berulang ke salah satu fungsi di atas akan mendorong waktu backtest untuk bergerak pada garis waktu backtest (lompat ke momen data pasar berikutnya). Ketika tingkat pasar riil digunakan untuk backtest, waktu yang lebih awal tidak dianjurkan untuk memilih. Mungkin tidak ada data tingkat pasar riil dalam periode waktu prematur.

Backtest tingkat pasar riil saat ini mendukung:

  • Binance
  • OKX (OKX Spot)
  • HuobiDM (Huobi Futures)

Pengoptimalan Parameter Sistem Backtesting

Fungsi pengoptimalan parameter dari sistem backtest dari platform FMZ Quant Trading adalah untuk mengatur pengoptimalan sesuai dengan setiap opsi pengoptimalan parameter selama backtest, dan opsi ditunjukkan sebagai berikut:

  • Nilai minimum: untuk membatasi nilai awal parameter.
  • Nilai maksimum: untuk membatasi nilai maksimum parameter setelah perubahan bertahap.
  • Ukuran langkah: jumlah variabel tambahan dari parameter.

Menghasilkan kombinasi parameter, dan melintasi semua kombinasi untuk backtest (yaitu backtesting setiap kombinasi parameter sekali).nomorjenis dapat dioptimalkan dalam sistem backtesting.

Misalnya, mengatur parameter pilihan optimasi pada halaman backtest:

img

Backtest dari mode optimasi parameter:

img

Simpan Pengaturan Backtest

Pada halaman pengeditan strategi, di paginasi Backtest (yaitu sistem backtest), Anda dapat mengatur opsi seperti konfigurasi backtest dan parameter strategi untuk melakukan backtest strategi. Pengaturan backtest mengacu pada rentang waktu backtest, platform pertukaran, slippoint dan biaya layanan dll.; sementara parameter strategi digunakan untuk mengatur opsi parameter untuk strategi. Ketika semua konfigurasi strategi telah ditetapkan, Anda dapat melakukan backtest strategi sesuai dengan pengaturan. Jadi bagaimana Anda menyimpan pengaturan yang dikonfigurasi ini untuk digunakan pada halaman backtest berikutnya (opsi set set selama halaman refresh akan diatur kembali)? Anda dapat mengklik tombol Save Settings pada halaman strategi, dan semua pengaturan backtest (termasuk konfigurasi backtest dan pengaturan parameter) akan tercatat dalam bentuk kode sumber dalam halaman strategi tes. Saat membuka halaman strategi dan beralih ke halaman konfigurasi backtest, informasi konfigurasi yang tercatat dalam kode strategi tes akan secara otomatis tercatat di halaman backtesting.

img

AmbilJavaScriptstrategi sebagai contoh, dan klik Save Backtest Settings to Source File:

img

Ada sedikit perbedaan pada Save Backtest Settings to Source File antaraJavaScript, Python, cppdanMylanguage:

/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
'''backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

Mylanguage:

(*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*)

Sumber Data Khusus

Sistem ini menggunakanGETmetode untuk meminta URL khusus (URL yang dapat diakses publik) untuk mendapatkan sumber data eksternal untuk backtest.

Parameter Makna Penjelasan
Simbol Nama Simbol seperti BTC_USD_OKCoin_EN
Idul Fitri Pertukaran seperti OKCoin_EN
Bulat Keakuratan Harga seperti 3, harga dalam data yang dikembalikan harus dikalikan dengan 1000 dan dibulatkan
Di sekitar Keakuratan kuantitas seperti 2, jumlah dalam data yang dikembalikan harus dikalikan dengan 100 dan dibulatkan
Periode Periode Bar (Milisekund) seperti 60.000 menunjukkan bar meminta satu menit
Kedalaman Tingkat kedalaman 1-20
Perdagangan Apakah Perlu Pembagian Data benar/salah
Dari Waktu Mulai timestamp unix
Untuk Waktu Akhir timestamp unix

Catatan:

Round and V-Round are two parameters designed to avoid losing the precision of floating-point numbers during network transmission. The price data, trading volume and order amount, are all transmitted using integers.

Contoh data yang dijahit:

http://customserver:80/data?symbol=BTC_USD_OKCoin_EN&eid=OKCoin_EN&round=3&vround=3&period=900000&from=1564315200&to=1567267200

Format yang dikembalikan harus salah satu dari dua format berikut (yang akan dikenali oleh sistem secara otomatis):

Tes Backtest Tingkat Bar Biasa

{
    "schema":["time","open","high","low","close","vol"],
    "data":[[1564315200000,9531300,9531300,9497060,9497060,787],[1564316100000,9495160,9495160,9474260,9489460,338]]
}

Data backtest tingkat Tick (termasuk informasi kedalaman pasar, array dengan format kedalaman [harga, volume]; bisa ada beberapa tingkat kedalaman; menanyakan mengacu pada urutan kenaikan harga, dan menyewa mengacu pada urutan harga terbalik.)

{
    "schema":["time","asks", "bids","trades","close","vol"],
    "data":[[1564315200000,[[9531300,10]], [[9531300,10]],[[1564315200000,0,9531300,10]],9497060,787]]
}

Deskripsi

Lapangan Deskripsi
Skema Ini menentukan atribut kolom dalam array data, yang sensitif huruf besar dan hanya terbatas pada time, open, high, low, close, vol, asks dan bids
Data Sebuah array yang menyimpan data dengan skema

Format data

Lapangan Deskripsi
permintaan/penawaran [harga, volume],...]
perdagangan [waktu, arah, harga, volume,...]

Memberikan data tingkat pendanaan:

Sebagai contoh, ketika melakukan backtesting Binance Futures, perlu memiliki data tambahan tentang tingkat pendanaan, yang perlu disediakan oleh sumber data kustom.

{
  "detail": {},
  "symbol": "futures_binance.eth_usdt.funding",
  "schema": ["time", "open", "high", "low", "close", "vol"],
  "data": [
    [1582876800000, 25289, 25289, 25289, 25289, 0],
    [1582905600000, 30522, 30522, 30522, 30522, 0],
    [1582934400000, 40998, 40998, 40998, 40998, 0],
        ...
    [1626652800000, 198, 198, 198, 198, 0],
    [1626681600000, 691, 691, 691, 691, 0],                  // The adjacent periodic interval is 8 hours
    [1626710400000, 310, 310, 310, 310, 0],                  // The funding rate of Binance updates every 8 hours, and why the data of the funding rate turns out to be 310?
    [1626739200000, 310, 310, 310, 310, 0],                  // Like the bars data, to avoid losing the precision of floating-point numbers during network transmission, the data uses integer, so the data needs to be processed according to round parameter; the data, returned to the backtest system after processing, is 310 
    [1626768000000, -41610, -41610, -41610, -41610, 0],      // The funding rate might be a negative value
    [1626796800000, -5125, -5125, -5125, -5125, 0],
        ...   
    [1627977600000, 10000, 10000, 10000, 10000, 0]
  ]
}

Contoh permintaan data dari sistem backtest:

http://customserver:80/data?symbol=futures_binance.eth_usdt.funding&eid=Futures_Binance&round=8&vround=5&depth=20&trades=1&custom=0&period=3600000&from=1360771200&to=1628006400

Contoh untuk Sumber Data Khusus:

Tentukan sumber data, URL:http://xxx.xx.x.xx:9090/dataSesuaikan server data, ditulis dalam golang:

package main 
import (
    "fmt"
    "net/http"
    "encoding/json"
)

func Handle (w http.ResponseWriter, r *http.Request) {
    // e.g. set on backtest DataSourse: http://xxx.xx.x.xx:9090/data
    // r.URL: /data?depth=20&detail=true&eid=Binance&from=1566820800&period=900000&round=3&symbol=BTC_USDT_Binance&to=1569686400&trades=1&vround=5
    // response
    defer func() {
        // response data
        /* e.g. data
        {
            "schema":["time","open","high","low","close","vol"],
            "data":[
                [1564315200000,9531300,9531300,9497060,9497060,787],
                [1564316100000,9495160,9495160,9474260,9489460,338]
            ]
        }
        */
        ret := map[string]interface{}{
            "schema" : []string{"time","open","high","low","close","vol"},
            "data" : []interface{}{
                []int64{1564315200000,9531300,9531300,9497060,9497060,787},
                []int64{1564316100000,9495160,9495160,9474260,9489460,338},
            },
        }
        b, _ := json.Marshal(ret)
        w.Write(b)
    }()
}

func main () {
    fmt.Println("listen http://localhost:9090")
    http.HandleFunc("/data", Handle)
    http.ListenAndServe(":9090", nil)
}

Strategi pengujian,JavaScriptContoh:

/*backtest
start: 2019-07-28 00:00:00
end: 2019-07-29 00:00:00
period: 1m
platforms: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
*/

function main() {
    var ticker = exchange.GetTicker()
    var records = exchange.GetRecords()
    Log(ticker)
    Log(records)
}

Grafik yang digambar oleh data khusus dalam sistem backtest:

Strategi cetak informasi:

Mesin Backtest Lokal

FMZ Quant Trading platform telah open source untukJavaScriptversi danPythonversi mesin backtest lokal, mendukung pengaturanPeriode K Line yang mendasariselama backtesting.

Kunci Pintasan Halaman Backtest

  • Tombol pintasan untuk beralih antara halaman Editing dan halaman Backtesting

    Gunakan kunci.Ctrl +,untuk beralih kembali ke halaman Backtest dan halaman Edit Strategy.CtrlTekan tombol.,.

  • Kunci pintasan untuk strategi penghematan

    Gunakan kunci.Ctrl + suntuk menyelamatkan strategi.

  • Jalan pintas untuk memulai strategi backtest

    Gunakan kunci.Ctrl + buntuk memungkinkan Start Backtest.

Deskripsi Kode

Fungsi Masuk

Nama Fungsi Deskripsi
main() Ini adalah fungsi entri.
onexit() Ini adalah fungsi pembersihan ketika keluar secara normal, waktu eksekusi maksimumnya adalah 5 menit, yang dapat dibiarkan tidak dinyatakan; jika timeout terjadi,mengganggukesalahan akan dilaporkan.
onerror() ini adalah fungsi keluar abnormal, waktu eksekusi maksimumnya adalah 5 menit, yang dapat dibiarkan tidak dinyatakan. strategi yang ditulis dalamPythondancpptidak mendukung fungsi ini.
init() ini adalah fungsi inisialisasi, program strategi akan dipanggil secara otomatis ketika mulai berjalan, yang dapat dibiarkan tidak dinyatakan.
  • Deskripsi:
    1. Sistem backtest tidak mendukung fungsionerror().
    1. Jika fungsionerror()diaktifkan di bot, fungsionexit()tidak akan dipicu.

satuxit ((()

onexit(), pengolahan pekerjaan pembersihan, dengan waktu pelaksanaan maksimum 5 menit, yang direalisasikan oleh pengguna.

function main(){
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)
}

// onexit function implementation
function onexit(){
    var beginTime = new Date().getTime()
    while(true){
        var nowTime = new Date().getTime()
        Log("The program stops counting down..The cleaning starts and has passed:", (nowTime - beginTime) / 1000, "Seconds!")
        Sleep(1000)
    }
}
import time 
def main():
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)

def onexit():
    beginTime = time.time() * 1000
    while True:
        ts = time.time() * 1000
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!")
        Sleep(1000)
void main() {
    Log("Start running, stop after 5 seconds, and execute onexit function!");
    Sleep(1000 * 5);
}

void onexit() {
    auto beginTime = Unix() * 1000;
    while(true) {
        auto ts = Unix() * 1000;
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!");
        Sleep(1000);
    }
}

Ini adalah

Pengguna mengimplementasikan fungsi inisialisasiinit(), yang akan secara otomatis menjalankan fungsiinit()Pada awal strategi untuk menyelesaikan tugas inisialisasi.

function main(){
    Log("The first line of the code executed in the program!", "#FF0000")
    Log("Exit!")
}

// Initialization Function
function init(){     
    Log("Initialization!")
}
def main():
    Log("The first line of the code is executed!", "#FF0000")
    Log("Exit!")

def init():
    Log("Initialization!")
void main() {
    Log("The first line of the code is executed!", "#FF0000");
    Log("Exit!");
}

void init() {
    Log("Initialization!");
}

Kesalahan.

Pelaksanaan fungsionerror()Fungsi ini tidak mendukung strategi yang ditulis diPythondancpp.

function main() {
    var arr = []
    Log(arr[6].Close)
}

function onerror() {
    Log("error")
}
# not supported by python 
// not supported by C++ 

Kerangka Strategi Klasik

Dalam strategi yang ditulis dalamJavaScript, Pythondancpp, yangSleep()fungsi perlu dipanggil di loop utama dari strategi tersebut. Ini akan digunakan untuk mengontrol kecepatan backtracking. Di bot, ini digunakan untuk mengontrol interval polling strategi, dan juga mengontrol frekuensi permintaan untuk mengakses antarmuka API pertukaran.

  • Contoh kerangka dasar strategi cryptocurrency:

    function onTick(){
        //Write strategy logic here, and it will be called constantly, such as printing market information
        Log(exchange.GetTicker())
    }
    
    function main(){
        while(true){
            onTick()
            //The function "Sleep" is mainly used to control the polling frequency of cryptocurrency strategies to prevent accessing the exchange API interafce too frequently 
            Sleep(60000)
        }
    }
    
    def onTick():
        Log(exchange.GetTicker())
    
    def main():
        while True:
            onTick()
            Sleep(60000)
    
    void onTick() {
        Log(exchange.GetTicker());
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(60000);
        }
    }
    

    Ambil contoh yang paling sederhana, jika saya ingin menempatkan pesanan beli dengan harga 100 dan kuantitas 1 di bursa setiap detik, saya bisa menulisnya seperti ini:

    function onTick(){
        // It is just an example; for all the assets will be used to place orders fast during backtest or in the bot, do not implement the example in the bot
        exchange. Buy(100, 1)
    }
    
    function main(){
        while(true){
            onTick()
            // The pause period can be customized in millisecond (1 second = 1000 milliseconds)
            Sleep(1000)
        }
    }
    
    def onTick():
        exchange.Buy(100, 1)
    
    def main():
        while True:
            onTick()
            Sleep(1000)
    
    void onTick() {
        exchange.Buy(100, 1);
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(1000);
        }
    }
    

Perpustakaan template

Peraturanperpustakaan templateadalah modul kode yang dapat digunakan kembali di platform FMZ Quant Trading, bekerja sebagai kategori kode strategi trading.Perpustakaan template, template ditambahkan ke halaman Strategy dari akun yang saat ini masuk ke platform Trading FMZ Quant. Setelah dibuat, tidak lagi mungkin untuk memodifikasi kategori ke strategi normal.

Perpustakaan Template diJavaScript:

img

Perpustakaan Template diPython:

img

Perpustakaan Template dicpp:

img

  • Fungsi ekspor dari Template library Fungsi ekspor adalah fungsi antarmuka dari Template library, dan dapat dipanggil dengan strategi yang mengacu pada Template library.

    /*
    -- This method is called directly with $.Test() after the strategy refers to the template
    -- The "main" function will not be triggered in the strategy, and it is only used as the entry point for template debugging
    */
    $.Test = function() {
        Log('Test')
    }
    
    function main() {
        $.Test()
    }
    
    def Test():
        Log("template call")
    
    # Export "Test" function; the main strategy can be called by ext.Test()
    ext.Test = Test 
    
    // The strategy refers to the template and calls this method directly with ext::Test()
    void Test() {
        Log("template call");
    }
    
  • Peraturan perpustakaan template Template library juga dapat mengatur parameter antarmuka sendiri, yang digunakan dalam bentuk variabel global dalam kode Template library.

    Template library pengaturan parameter:

    img

    Kode perpustakaan template:

    $.SetParam1 = function(p1) {
        param1 = p1
    }
    
    $.GetParam1 = function() {
        Log("param1:", param1)
        return param1
    }
    
    def SetParam1(p1):
        global param1
        param1 = p1
    
    def GetParam1():
        Log("param1:", param1)
        return param1
    
    ext.SetParam1 = SetParam1
    ext.GetParam1 = GetParam1
    
    void SetParam1(float p1) {
        param1 = p1;
    }
    
    float GetParam1() {
        Log("param1:", param1);
        return param1;
    }
    

    Lihat kode strategi diPerpustakaan templatecontoh yang disebutkan di atas:

    function main () {
        Log("call $.GetParam1:", $.GetParam1())
        Log("call $.SetParam1:", "#FF0000")
        $.SetParam1(20)
        Log("call $.GetParam1:", $.GetParam1())
    }
    
    def main():
        Log("call ext.GetParam1:", ext.GetParam1())
        Log("call ext.SetParam1:", "#FF0000")
        ext.SetParam1(20)
        Log("call ext.GetParam1:", ext.GetParam1())
    
    void main() {
        Log("call ext::GetParam1:", ext::GetParam1());
        Log("call ext::SetParam1:", "#FF0000");
        ext::SetParam1(20);
        Log("call ext::GetParam1:", ext::GetParam1());
    }
    

    img

  • Kutipan Perpustakaan Template

    Setelah memeriksa referensi di kolom template halaman pengeditan strategi, simpan strategi.

    img

Struktur Terpadu

Variabel Global

Pertukaran

ExchangeSemua interaksi data dengan pertukaran direalisasikan melalui fungsi dalam objek ini.

  • Menambahkan objek pertukaran di Backtest

  • Menambahkan objek pertukaran pada halaman Bot

Objek pertukaran yang ditambahkan sesuai denganexchangeobjek dalam kode:

function main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
}
def main():
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
void main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel());
}
Pertukaran

Hal ini dapat dipahami sebagai array yang menyimpan semua objek pertukaran sepertiexchangeobjek pertukaran, yang dapat berisi beberapa objek pertukaran;exchanges[0]adalahexchange.

Objek pertukaran tambahan sesuai denganexchanges[0], exchanges[1], exchanges[2]...dan seterusnya dalam kode strategi.

function main() {
    for(var i = 0; i < exchanges.length; i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
    }
}
def main():
    for i in range(len(exchanges)):
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
void main() {
    for(int i = 0; i < exchanges.size(); i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel());
    }
}
Status pesanan

AtributnyaStatusdalamOrder structure.

Nama konstan Definisi Nilai
Order_state_pending belum selesai 0
ORDER_STATE_CLOSED selesai 1
ORDER_STATE_CANCELED (Pengaturan_Pemerintahan_Batal) dibatalkan 2
ORDER_STATE_UNKNOWN negara yang tidak diketahui (negara lain) 3

ORDER_STATE_UNKNOWNstatus bisa memanggilexchange.GetRawJSON()untuk mendapatkan informasi status pesanan asli, query file pertukaran, dan melihat deskripsi spesifik. Nama konstan dalam formulir dapat digunakan langsung dalam kode strategi untuk membandingkan dengan atributStatusdalamOrderStruktur, untuk memastikan status pesanan dengan menilai apakah mereka sama.nama konstandan yang sesuainilai-nilai, dan nama konstan lainnya di bawah ini bekerja dengan cara yang sama, jadi tidak akan ada deskripsi yang lebih rinci tentang mereka.

Jenis Transaksi Order

AtributnyaTypedalamOrder structure.

Nama konstan Definisi Nilai
Order_TYPE_Buy Perintah Beli 0
Orde_Types_Sell Perintah Jual 1
Jenis Posisi

AtributnyaTypedalamPosition structure.

Nama konstan Definisi Deskripsi Berlaku Nilai
PD_LONG Posisi Panjang Penggunaan berjangka cryptocurrencyexchange.SetDirection("closebuy")untuk mengatur arah posisi dekat, dan menutup jenis posisi ini Futures Cryptocurrency 0
PD_SHORT Posisi Pendek Penggunaan berjangka cryptocurrencyexchange.SetDirection("closesell")untuk mengatur arah posisi dekat, dan menutup jenis posisi ini Futures Cryptocurrency 1
Futures Pembukaan & Penutupan posisi Arah

AtributnyaOffsetdalamOrder structure.

Nama konstan Definisi Nilai
ORDER_OFFSET_OPEN Perintah Posisi Terbuka 0
ORDER_OFFSET_CLOSE Perintah Posisi Tutup 1
Parameter Strategi

Dalam kode strategi perdagangan, parameter strategi yang ditetapkan pada antarmuka strategi tercermin dalam bentuk variabel global.JavaScriptbahasa dapat secara langsung mengakses nilai parameter yang ditetapkan atau dimodifikasi pada antarmuka strategi; sementara dalam fungsiPythonstrategi, kata kunciglobaldiperlukan untuk memodifikasi variabel global dalam strategi.

Jenis parameter:

img

Variabel Deskripsi Pengamatan Jenis Nilai default Deskripsi
Nomor Jenis numerik Pengamatan Nomor (nomor) 1 Strategi C++ adalah tipe floating-point
String string Pengamatan String (string) Halo FMZ Nilai default tidak perlu dikutip. Input diperlakukan sebagai string
Kotak ComboBox Pengamatan ComboBox (dipilih) 1|2|3 Variabel combox itu sendiri adalah nilai numerik, yang mewakili indeks kolom yang dipilih oleh kontrol Combobox.
Bool Pilihan pemeriksaan Pengamatan Boolean (benar/salah) benar Jika diperiksa, variabel bool adalah benar; jika tidak diperiksa, variabel bool adalah salah
SecretString Senar yang dienkripsi Pengamatan String terenkripsi (string) Kata sandi Dengan penggunaan yang sama seperti string, string terenkripsi akan dikirim dengan enkripsi dan tidak akan dikirim dalam teks biasa
  • Parameter antarmuka ditetapkan di bagian parameter strategi di bawah bagian pengeditan kode dari halaman pengeditan strategi.
  • Parameter antarmuka ada sebagai variabel global dalam kode strategi, yaitu, parameter antarmuka dapat dimodifikasi dalam kode.
  • Nama variabel dari parameter antarmuka dalam kode strategi (dilihat dalam formulir di atas):number, string, combox, bool, secretString.
  • Opsi deskripsi: nama parameter antarmuka pada antarmuka strategi.
  • Opsi komentar: deskripsi rinci dari parameter antarmuka; deskripsi akan ditampilkan ketika mouse melayang di atas parameter antarmuka.
  • Opsi tipe: jenis parameter antarmuka.
  • Opsi nilai default: nilai default dari parameter antarmuka.

Pengaturan ketergantungan parameter: Satu parameter dapat diatur untuk memungkinkan parameter lain untuk ditampilkan dan disembunyikan berdasarkan pemilihan parameter.numberA, yang merupakan tipe numerik.numberAditampilkan atau disembunyikan berdasarkan apakah parameterisShowA(tipe Boolean) adalah benar atau salah.numberApada parameter antarmuka sebagai:numberA@isShowA.

img

Dengan cara ini, jika parameterisShowAtidak diperiksa, parameternumberASeperti untuk parameter jenis kontrol ComboBox, bagian tergantung dari parameter adalah untuk menilai apakah nilai parameter sama dengannilai indeksdengan cara yang sama, mengambil parameterisShowASebagai contoh, ketika Anda mengatur variabel dalam parameter, tulis:numberA@combox==2. ParameternumberAakan menampilkan atau menyembunyikan, berdasarkan apakah parametercomboxakan diperiksa sebagai opsi ketiga (di mana indeks 0 sesuai dengan opsi pertama, indeks 1 sesuai dengan opsi kedua, dan indeks 2 sesuai dengan opsi ketiga.)

Parameter antarmuka strategi, kontrol interaktif, dan fungsi pengelompokan parameter pada Template: Tambahkan saja(?First group)di awal deskripsi parameter yang memulai pengelompokan, seperti yang ditunjukkan pada gambar berikut:

img

Ketika Anda menggunakan strategi, parameter ditampilkan dalam kelompok:

img

Simpan nilai default parameter: Parameter strategi ditunjukkan dalam gambar. Selama backtest, jika Anda ingin menyimpan nilai default dari parameter strategi, Anda dapat mengklikSave settingstombol setelah memodifikasi parameter strategi.

img

img

Anda dapat menyimpan pengaturan parameter strategi dalam bentuk kode:

/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/
'''backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
'''
/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/

Struktur Data

Beberapa fungsi akan disertai dengan asliJSONdata yang diminta selama panggilan.JSONdata disimpan dalam atributInfoKarena backtest tidak untuk mengakses antarmuka platform, data yang dikembalikan selama backtest tidak memiliki atributInfoBerikut ini adalah deskripsi atribut utama dari setiap struktur data.

Perdagangan

Dapatkan semua riwayat perdagangan (bukan dirinya sendiri), dikembalikan oleh fungsiexchange.GetTrades().

{
    Id      : 9585306,          // Trading record ID; if the exchange interface does not provide order ID, use the timestamp to fill in 
    Time    : 1567736576000,    // Time (Unix timestamp milliseconds)
    Price   : 1000,             // Price
    Amount  : 1,                // Volume
    Type    : 0                 // Order Type; refer to the order type in the constants; 0 is ORDER_TYPE_BUY, meaning the value of ORDER_TYPE_BUY is 0
}
Tickle

Kuotasi pasar dikembalikan oleh fungsiexchange.GetTicker().

{
    Info    : {...},             // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    High    : 1000,              // Highest price; if the platform interface does not provide the 24-hour highest price, use sell price 1 to fill in 
    Low     : 500,               // Lowest price; if the platform interface does not provide the 24-hour lowest price, use buy price 1 to fill in 
    Sell    : 900,               // Sell price 1
    Buy     : 899,               // Buy price 1 
    Last    : 900,               // Last executed price
    Volume  : 10000000,          // Recent trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency  
    Time    : 1567736576000      // Millisecond-level timestamp
}
Catatan

StandarOHLCStruktur digunakan untuk menggambar garis K dan perhitungan dan analisis indikator proses.exchange.GetRecords()mengembalikan array struktur.Recordstruktur mewakili k-line bar, yaitu satu k-lineBAR.TimedalamRecordadalah waktu awal periode garis K.

{
    Time    : 1567736576000,     // A timestamp, accurate to millisecond, in the same format as the result obtained by Javascript's newDate().GetTime()
    Open    : 1000,              // Open price
    High    : 1500,              // Highest price
    Low     : 900,               // Lowest price
    Close   : 1200,              // Close price 
    Volume  : 1000000            // Trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency
}
Perintah

Struktur pesanan dapat dikembalikan oleh fungsi, termasukexchange.GetOrder()danexchange.GetOrders(). Fungsiexchange.GetOrders()mengembalikan array atau array kosong dari struktur (jika tidak adapesanan yang belum selesai saat ini, kembali[], yaitu array kosong).

{
    Info        : {...},         // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    Id          : 123456,        // Unique ide