[TOC]

Arahan asas

Memulakan

Apa yang boleh dilakukan oleh Platform Dagangan Kuantum FMZ?

FMZ Quant Trading platform adalah komuniti kuantitatif yang paling profesional dalam bidang perdagangan kuantitatif. Di sini anda boleh belajar, menulis, berkongsi, membeli dan menjual strategi kuantitatif; anda boleh menjalankan backtesting dalam talian dan menggunakan bot simulasi untuk menjalankan perdagangan simulasi; anda juga boleh menjalankan, mempublikasikan, dan menonton perdagangan langsung. Kami menyokong hampir semua bursa mata wang digital arus perdana.

Siri Tutorial Lengkap

Tutorial Grafik:

Jika ada sebarang masalah, anda boleh menghantar soalan dan membincangkan di forum pada bila-bila masa, atau menghantar tiket, atau menghubungi pentadbir dalam kumpulan Telegram (Telegram), secara amnya, soalan ini akan dijawab dengan cepat.

Menyokong ChatGPT untuk bantuan pembangunan

Platform Perdagangan Kuantitatif FMZ telah menggunakan ChatGPT sebagai alat bantuan pembangunan yang boleh diakses dengan mengklik ChatGPT di bar pintasan di Dashboard untuk melompat keHalaman Alat Bantuan ChatGPT.

Bahasa pengaturcaraan yang tersedia untuk melaksanakan strategi saya?

FMZ Quant Platform Perdagangan menyokong untuk menggunakanJavaScript, TypeScript, Python, C++, Pine MylanguagedanBlockly Visualizationuntuk menulis dan merancang strategi.

Ia menyokongTypeScriptbahasa, masih menetapkannya kepadaJavaScriptstrategi apabila kita mencipta strategi, maka kita menulis// @ts-checkpada permulaan kod strategi atau klik butangTypeScriptdi sudut kanan atas kawasan penyuntingan strategi untuk beralih keTypeScriptPlatform akan mengenali kod sebagaiTypeScriptsecara automatik dan menyediakan anda dengan penyusunan dan sokongan pemeriksaan jenis yang sesuai untuk:

  • Keselamatan jenis:TypeScriptFungsi pemeriksaan jenis statik boleh membantu anda mencari kesilapan yang berpotensi semasa menulis kod dan meningkatkan kualiti kod.
  • Pengisian kod automatik:TypeScriptSistem jenis membuat ia lebih cepat untuk mencari sifat dan kaedah yang anda perlukan apabila menulis kod, meningkatkan kecekapan pembangunan.
  • Struktur kod yang lebih jelas:TypeScript, anda boleh mengatur dan mengekalkan kod anda dengan lebih baik, menjadikannya mudah dibaca dan difahami.
  • Ciri-ciri pengaturcaraan berorientasikan objek yang kuat:TypeScriptmenyediakan ciri pengaturcaraan berorientasikan objek yang kuat, seperti antara muka, kelas, generik dan sebagainya, membantu anda menulis kod strategi yang lebih kukuh dan boleh digunakan semula.

Anda hanya perlu menguasai salah satu bahasa ini. Selain menyokong cara merancang strategi dengan menulis kod, anda juga boleh membuat strategi menggunakan modul visual (Blockly).

BlocklyTutorial Visualisasi:

TetapkanPythonpenterjemah yang digunakan olehPythonprogram strategi

Strategi yang ditulis dalamPython, apabila backtesting atau perdagangan langsung, jika persekitaran sistem doker mempunyai kedua-duaPython2danPython3dipasang, anda boleh menetapkanPythonversi yang akan dilancarkan pada masa berjalan pada baris pertama strategi, seperti#!python3dan#!python2, supaya sistem akan mencari penterjemah secara automatik. dan anda juga boleh menentukan laluan mutlak, seperti:#!/usr/bin/python3.

Apakah Docker?

Docker boleh difahami sebagai pelaksana strategi perdagangan anda, bertanggungjawab untuk permintaan data yang kompleks, penerimaan data, pautan rangkaian, log postback dan sebagainya. Docker berjalan di pelayan anda, walaupun laman web platform Dagangan Kuantum FMZ mempunyai kegagalan rangkaian, ia tidak akan mempengaruhi operasi docker anda. Docker boleh berjalan padaLinux, Windows, Mac OS, Android, Raspberry Pi ARM Linuxdan sistem lain.Halaman Docker, Langkah pemasangan dan kemas kini Linux docker. Bot dan log yang diuruskan oleh docker disimpan dalam direktori/logs/storage- Fail itu adalahSqlitefail pangkalan data dengandb3, yang boleh diedit secara langsung olehSqliteuntuk fail dengan sambungandb3Dalam pangkalan data bot sebenar, nama fail adalah ID bot.

Protokol yang disokong

  • Aset Blockchain: Lebih daripada 50 pertukaran aset blockchain arus perdana (cryptocurrency) kini disokong dalam platform kami.
  • Akses Protokol Am:Protokol am

Keselamatan Strategi

Apabila strategi dagangan dibangunkan pada platform Dagangan Kuantiti FMZ, kandungan strategi hanya dapat dilihat oleh pemegang akaun FMZ. Dan pada platform dagangan kuantitatif FMZ, anda boleh mencapai penyetempatan kod strategi yang lengkap. Sebagai contoh, logik strategi boleh dikemas dalamPythonpakej, yang dimuatkan dalam kod strategi, supaya penyetempatan kandungan strategi dapat direalisasikan.

KeselamatanPythonKod: KeranaPythonadalah bahasa sumber terbuka yang sangat mudah dikompilasi, jika strategi tidak untuk kegunaan peribadi tetapi untuk disewa, anda boleh menjalankan strategi pada docker yang digunakan sendiri dan menyewanya dalam bentuk sub-akaun atau pengurusan docker penuh jika anda bimbang tentang kebocoran strategi.

PenyulitanPythonKod strategi: Secara lalai,PythonKod strategi tidak disulitkan apabila digunakan oleh pengarang dan disulitkan apabila disewa kepada orang lain. Dengan mengedit kod berikut di awalPythonstrategi, anda boleh menentukan sama ada untuk menyulitkan kod strategi untuk kegunaan peribadi atau sewa.Pythonversi yang menyokong penyulitan kod strategi adalah seperti berikut:Python 2.7, Python 3.5danPython 3.6.

  • Penulis strategi menjalankannya sendiri dan menyulitkan kod strategi untuk digunakan oleh orang lain melalui kod pendaftaran: Tentukan#!pythonsebagai versi penterjemah Python, dan kemudian menggunakan,untuk menjaga terpisah; masukkan perintah penyulitanencryptJika anda tidak menentukan versiPython, tambah#!,encrypt directly.
 #!python,encrypt

Atau

  #!encrypt
  • Ia tidak akan menyulitkan kod strategi apabila penulis strategi menjalankan untuk kegunaan mereka sendiri dan berkongsi dengan orang lain melalui kod pendaftaran:
  #!python, not encrypted

Atau

  #!not encrypted

Gunakan kodos.getenv('__FMZ_ENV__')untuk menentukan sama ada kod penyulitan adalah sah; pengembalian rentetan"encrypt"Ia hanya sah dalam bot sebenar, dan backtest tidak akan menyulitkanPythonKod 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")

Keselamatan Utama

Data sensitif, seperti maklumat akaun dan rentetan disulitkan dalam parameter strategi yang dikonfigurasikan pada platform Dagangan FMZ Quant, disulitkan di penyemak imbas web. Semua maklumat yang disimpan di platform Dagangan FMZ Quant disulitkan (bukan data teks biasa), dan hanya pengguna peranti peribadi yang dapat mendekripsi dan menggunakan maklumat itu, yang sangat meningkatkan keselamatan data sensitif. Sila jangan mendedahkan atau menjual strategi jika maklumat sensitif lain termasuk dalam kod strategi, tetapan parameter dan penerangan strategi dll.

  • Platform kami menyokong konfigurasi tempatan maklumat sensitif, seperti maklumat akaun pertukaran dan kunci rahsia Pada halaman di mana platform mengkonfigurasi maklumat pertukaran, semua kawalan kotak teks yang disulitkan dengan topeng menyokong cara mengkonfigurasi laluan fail untuk memuat fail tempatan dockers.RSA KEYkaedah pengesahan pertukaran sebagai contoh untuk menerangkan secara terperinci bagaimana untuk mengkonfigurasi maklumat sensitif secara tempatan pada peranti di mana program docker terletak.
  1. Buat kunci awam RSA dan kunci peribadi. Sebagai contoh, buat kunci awam dan peribadi dalam formatPKCS#8, terdapat banyak alat yang tersedia untuk mencipta, sepertiopenssl.
  2. MembuatRSA KEYpada pertukaran, dan memuat naik kunci awam yang dicipta dalamLangkah 1semasa penciptaan.
  3. Simpan kunci peribadi yang dicipta diLangkah 1dalam direktori yang sama dari docker dalam formattxtfile, atau di laluan lain dalam direktori program docker.
  4. Apabila mengkonfigurasi pertukaran di platform FMZ, isiRSA KEYdicipta oleh pertukaran dalam kotak suntingan konfigurasiAccess Key.
  5. Apabila mengkonfigurasi pertukaran di platform FMZ, isi laluantxtfail diletakkan dalam direktori peringkat yang sama dari docker diLangkah 3dalam kotak penyuntingan konfigurasiSecret Key. Sebagai contoh, jika nama fail yang diletakkan adalah:rsaKey.txt, dan fail dan docker diisi dalam direktori peringkat yang sama:file:///rsaKey.txt. Jika fail berada di direktori di sebelah direktori program dockerrsa_key, isi:file:///rsa_key//rsaKey.txtJika anda meletakkanrsaKey. txtdi tempat lain pada komputer atau pelayan anda mengikuti arahan ini dengan sewajarnya, perlu diperhatikan bahawa fail ini hanya boleh diletakkan sama ada pada direktori peringkat yang sama atau subdirectories berkenaan dengan docker.

Ini menjadikannya lebih selamat untuk mencari dan menyimpan kunci peribadi, anda boleh merujuk kepadavideo penjelasanuntuk proses terperinci.

Sistem Ujian Belakang

Apakah sistem backtest, dan untuk apa ia digunakan?

Selepas anda menyelesaikan reka bentuk strategi perdagangan kuantitatif, bagaimana anda boleh mengetahui keadaan asas strategi anda, seperti logik strategi dan arah pulangan strategi? Sudah tentu, kita tidak boleh menggunakan wang sebenar secara langsung untuk menjalankan strategi di pasaran perdagangan sebenar, tetapi kita boleh menggunakan data sejarah untuk menguji strategi anda dan mengetahui keuntungan strategi anda dalam data sejarah.

Adakah data sistem backtest tepat dan bagaimana dengan ketepatan hasil backtest?

FMZ Quant Trading platform membahagikan sistem backtest ketahap pasaran sebenardantahap simulasi. tahap pasaran sebenar adalah untuk backtest sepenuhnya mengikut data sejarah lengkap; manakala tahap simulasi backtest menghasilkantickKedua-duanya berdasarkan data sejarah sebenar, tetapi data peringkat pasaran sebenar lebih tepat dan hasilnya lebih dipercayai.Mekanisme FMZ BacktestWalau bagaimanapun, backtesting hanyalah prestasi strategi mengikut data sejarah. Data sejarah tidak dapat mewakili sepenuhnya pasaran masa depan. Pasaran sejarah boleh berulang, atau ia juga boleh membawa kepada Black Swan. Oleh itu, hasil backtest harus dirawat secara rasional dan objektif.

Isu-isu yang perlu diperhatikan apabila menguji semula strategi bahasa pengaturcaraan yang berbeza:

Ujian belakangJavaScriptdanC++strategi perdagangan dijalankan dalam penyemak imbas, dan bot pasaran sebenar atauWexApppasaran sebenar pertukaran (iaituWexApppertukaran FMZ Quant Trading platform) berjalan tanpa memasang sebarang perisian lain, perpustakaan atau modul. Ujian belakangPythondilakukan pada docker; ia boleh dilakukan pada pelayan awam yang ditambahkan oleh platform FMZ Quant Trading, dan ia juga boleh dilakukan pada docker pengguna sendiri.PythonJika beberapa perpustakaan diperlukan, mereka perlu dipasang secara manual (hanya perpustakaan biasa disokong pada pelayan awam).

Data Backtest dalam Sistem

Terdapat dua jenis backtest platform FMZ Quant Trading: backtest tahap simulasi dan backtest tahap pasaran sebenar.tickSetiap tempoh K-line akan menjana 12 titik masa backtesting; Walau bagaimanapun, tahap pasaran sebenar mengumpultickssebenarnya, yang akan berlaku kira-kira sekali setiap beberapa saat, mengakibatkan sejumlah besar data dan kelajuan backtest yang lebih perlahan; jadi ia tidak boleh backtest untuk jangka masa yang sangat lama. mekanisme backtest FMZ membolehkan strategi perdagangan untuk berdagang beberapa kali pada satu K-line, mengelakkan keadaan di mana perdagangan hanya boleh dilaksanakan pada harga dekat. Ia lebih tepat sambil mengambil kira kelajuan backtest.Hubungan.

Kaedah DEBUG Strategi dalam sistem backtesting

JavaScript strategi backtesting debugging dalam Chrome DevTools

Pertukaran yang disokong dalam sistem pengujian balik

  • Mata Wang Dienkripsi (mata wang kripto)

    Nama Jenis Petua
    Bitfinex objek pertukaran spot menyokong pasangan dagangan terhad, seperti:BTC_USD, ETH_USDdanLTC_USD, dll (perhatikan mata wang sebut harga pasangan dagangan adalahUSDdolar)
    Binance objek pertukaran spot menyokong pasangan dagangan terhad, seperti:BTC_USDT, ETH_USDT, ETH_BTCdanLTC_BTC, dan lain-lain
    OKX objek pertukaran spot menyokong pasangan dagangan terhad, seperti:BTC_USDT, ETH_USDT, ETH_BTCdanLTC_BTC, dan lain-lain
    Huobi objek pertukaran spot menyokong pasangan dagangan terhad, seperti:BTC_USDT, ETH_USDT, ETH_BTCdanLTC_BTC, dan lain-lain
    OKX Futures Objek pertukaran niaga hadapan menyokong pasangan dagangan terhad, seperti:BTC_USDdanETH_USD, dan lain-lain; mata wang sebut harga pasangan dagangan adalahUSD; selepas menetapkan kod kontrak khusus (sila rujuk fungsiexchange.SetContractType), kontrak adalah kontrak crypto-margined; kod kontrak yang disokong termasuk:this_week, next_week, quarterdanswap
    HuobiDM Objek pertukaran niaga hadapan HuobiDM adalah Huobi Futures (Huobi Contract), yang menyokong pasangan dagangan terhad, seperti:BTC_USDdanETH_USD, dan lain-lain; mata wang sebut harga pasangan dagangan adalahUSD; selepas menetapkan kod kontrak khusus (sila rujuk fungsiexchange.SetContractType), kontrak adalah kontrak crypto-margined; kod kontrak yang disokong termasuk:this_week, next_week, quarterdanswap.
    BitMEX Objek pertukaran niaga hadapan pasangan dagangan adalahXBT_USD; selepas menetapkan kod kontrak khusus (sila rujuk fungsiexchange.SetContractType), kontrak adalah kontrak dengan margin kripto; kod kontrak yang disokong ialah:XBTUSD
    Binance Futures Objek pertukaran niaga hadapan menyokong pasangan dagangan terhad, seperti:BTC_USDTdanETH_USDT, dan lain-lain; mata wang sebut harga pasangan dagangan adalahUSD; selepas menetapkan kod kontrak khusus (sila rujuk fungsiexchange.SetContractType), kontrak itu adalahUSDT- kontrak margin; kod kontrak yang disokong adalahswap
    Pilihan Derbit Objek pertukaran niaga hadapan Pasangan dagangan adalah:BTC_USDdanETH_USD; selepas menetapkan kod kontrak khusus (sila rujuk fungsiexchange.SetContractType), kontrak adalah kontrak dengan margin kripto; kod kontrak opsyen khusus perlu ditetapkan

    Untuk objek pertukaran niaga hadapan dalam sistem backtest, menukar pasangan dagangan tidak disokong sementara dalam kod strategi.

Tahap Simulasi

Ujian belakang tahap simulasi adalah berdasarkan data K-line asas sistem backtest, mensimulasikan data tik dalam rangka harga tertinggi, harga terendah, harga pembukaan, dan nilai harga penutupan Bar K-line asas tertentu mengikut algoritma tertentu.tickdata apabila antara muka diminta. Untuk butiran, sila rujuk:FMZ Quant Simulation Level Backtest Mechanism Penerangan.

Tahap pasaran sebenar

Ujian belakang tahap pasaran sebenar adalahtickData tahap dalam siri masa Bar.tickdata tahap, menggunakan tahap pasaran sebenar untuk backtest adalah lebih dekat kepada realiti.tickdata adalah data yang direkodkan sebenar, bukan yang disimulasikan. Ia menyokong data kedalaman, main semula data rekod perdagangan pasaran, kedalaman tersuai dan setiap data perdagangan individu. Saiz maksimum backtest data peringkat pasaran sebenar adalah maksimum 50MB, tanpa had pada julat masa backtest dalam had atas set data. Jika anda perlu memperbesar julat masa backtest sebanyak mungkin, anda boleh mengurangkan nilai peralatan tetapan kedalaman Panggilan dan tidak menggunakan setiap data perdagangan individu untuk meningkatkan julat masa backtest.GetDepth,GetTradesPada masa data pasaran pada garis masa, memanggilGetTicker,GetTrades, GetDepthdanGetRecordstidak akan mendorong masa beberapa kali apabila masa bergerak pada garis masa backtest (yang tidak akan mencetuskan lompatan ke masa data pasaran seterusnya). Panggilan berulang ke salah satu fungsi di atas akan mendorong masa backtest untuk bergerak pada garis masa backtest (lompat ke masa data pasaran seterusnya). Apabila tahap pasaran sebenar digunakan untuk backtest, masa yang lebih awal tidak disyorkan untuk memilih. Mungkin tidak ada data tahap pasaran sebenar dalam tempoh masa yang lebih awal.

Ujian belakang tahap pasaran sebenar kini menyokong:

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

Pengoptimuman Parameter Sistem Backtesting

Fungsi pengoptimuman parameter sistem backtest platform FMZ Quant Trading adalah untuk menetapkan pengoptimuman mengikut setiap pilihan pengoptimuman parameter semasa backtest, dan pilihan ditunjukkan seperti berikut:

  • Nilai minimum: untuk menghadkan nilai permulaan parameter.
  • Nilai maksimum: untuk mengehadkan nilai maksimum parameter selepas perubahan tambahan.
  • Saiz langkah: jumlah pembolehubah tambahan parameter.

Menghasilkan kombinasi parameter, dan melintasi semua kombinasi itu untuk backtest (iaitu backtesting setiap kombinasi parameter sekali).nomborjenis boleh dioptimumkan dalam sistem backtesting.

Sebagai contoh, menetapkan pilihan pengoptimuman parameter pada halaman backtest:

img

Ujian belakang mod pengoptimuman parameter:

img

Simpan Tetapan Backtest

Dalam halaman penyuntingan strategi, dalam paginasi Backtest (iaitu sistem backtest), anda boleh menetapkan pilihan seperti konfigurasi backtest dan parameter strategi untuk menguji semula strategi. Tetapan backtest merujuk kepada julat masa backtest, platform pertukaran, slippoint dan yuran perkhidmatan dan lain-lain; sementara parameter strategi digunakan untuk menetapkan pilihan parameter untuk strategi. Apabila semua konfigurasi strategi ditetapkan, anda boleh menguji semula strategi mengikut tetapan. Jadi bagaimana anda menyimpan tetapan yang dikonfigurasikan ini untuk digunakan dalam tetapan backtest seterusnya (pilihan set semasa halaman menyegarkan akan ditetapkan semula)? Anda boleh mengklik butang Save Settings pada halaman strategi, dan semua tetapan backtest (termasuk konfigurasi backtest dan tetapan parameter) akan direkodkan dalam bentuk kod sumber dalam tetapan strategi. Apabila membuka halaman strategi dan beralih ke tetapan backtest, maklumat konfigurasi yang direkodkan dalam tetapan strategi akan direkodkan semula secara automatik pada halaman tetapan strategi.

img

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

img

Terdapat sedikit perbezaan 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 tersuai

Sistem ini menggunakanGETkaedah untuk meminta URL tersuai (URL yang boleh diakses awam) untuk mendapatkan sumber data luaran untuk backtest. Parameter permintaan tambahan adalah seperti berikut:

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 mesti didarabkan dengan 1000 dan dibulatkan
Di sekeliling Ketepatan kuantiti seperti 2, jumlah dalam data yang dikembalikan mesti didarabkan dengan 100 dan dibulatkan
Tempoh Tempoh bar (milisaat) seperti 60,000 menunjukkan bar meminta satu minit
Kedalaman Tahap Kedalaman 1-20
Perdagangan Sama ada perlu untuk membahagikan data benar/salah
Dari Masa Mula cap masa unix
Untuk Masa Akhir cap masa unix

Nota:

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 mestilah salah satu daripada dua format berikut (yang akan dikenali oleh sistem secara automatik):

Ujian belakang peringkat bar biasa

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

Data backtest tahap Tick (termasuk maklumat kedalaman pasaran, array dengan format kedalaman [harga, jumlah]; boleh ada pelbagai tahap kedalaman; meminta merujuk kepada pesanan harga yang meningkat, dan tawaran merujuk kepada pesanan harga yang terbalik.)

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

Penerangan

Lapangan Penerangan
Skema Ia menentukan atribut lajur dalam array data, yang sensitif huruf besar dan hanya terhad kepada time, open, high, low, close, vol, asks dan bids
Data Array yang menyimpan data mengikut skema

Format Data

Lapangan Penerangan
Permintaan/Tawaran [harga, jumlah],...]
perdagangan [waktu,arah] [0:beli,1:jual],harga,volume],...]

Menyediakan data kadar pembiayaan:

Sebagai contoh, ketika melakukan backtesting Binance Futures, adalah perlu untuk mempunyai data tambahan kadar pembiayaan, yang perlu disediakan oleh sumber data tersuai.

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

Tentukan sumber data, URL:http://xxx.xx.x.xx:9090/dataSesuaikan pelayan 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 ujian,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)
}

Carta yang digambar oleh data tersuai dalam sistem backtest:

Maklumat cetak strategi:

Enjin Ujian Kembali Lokal

Platform FMZ Quant Trading telah membuka sumber untukJavaScriptversi danPythonversi enjin backtest tempatan, sokongan tetapanTempoh Garis K Asassemasa backtesting.

Tombol pintasan halaman Backtest

  • Tombol pintasan untuk beralih antara halaman Editing dan halaman Backtesting

    Gunakan kunci.Ctrl +,untuk beralih semula ke halaman Backtest dan halaman Edit Strategy.CtrlTekan kekunci.,.

  • Kunci pintasan untuk strategi penjimatan

    Gunakan kunci.Ctrl + suntuk menyelamatkan strategi.

  • Pintasan untuk memulakan strategi backtest

    Gunakan kunci.Ctrl + buntuk membolehkan Start Backtest.

Penerangan Kod

Fungsi Masuk

Nama Fungsi Penerangan
main() Ia adalah fungsi kemasukan.
onexit() Ia adalah fungsi pembersihan apabila keluar secara normal, masa pelaksanaannya maksimum adalah 5 minit, yang boleh dibiarkan tidak dideklarasikan;menggangguKesilapan akan dilaporkan.
onerror() ia adalah fungsi keluar yang tidak normal, masa pelaksanaannya maksimum adalah 5 minit, yang boleh dibiarkan tidak dideklarasikan.Pythondancpptidak menyokong fungsi ini.
init() ia adalah fungsi inisialisasi, program strategi akan dipanggil secara automatik apabila ia mula berjalan, yang boleh dibiarkan tidak dinyatakan.
  • Penerangan:
    1. Sistem backtest tidak menyokong fungsionerror().
    1. Jika fungsionerror()adalah dicetuskan dalam bot, fungsionexit()tidak akan dicetuskan.

satuxit ((()

onexit(), memproses kerja pembersihan, dengan masa pelaksanaan maksimum 5 minit, yang diwujudkan 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);
    }
}

mulakan

Pengguna melaksanakan fungsi inisialisasiinit(), yang akan secara automatik melaksanakan fungsiinit()pada permulaan 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 menyokong strategi yang ditulis dalamPythondancpp.

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

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

Rangka Kerja Strategi Klasik

Dalam strategi yang ditulis dalamJavaScript, Pythondancpp, yangSleep()fungsi perlu dipanggil dalam gelung utama strategi tersebut. Ia akan digunakan untuk mengawal kelajuan mundur. Dalam bot, ia digunakan untuk mengawal selang pilihan raya strategi, dan juga mengawal kekerapan permintaan mengakses antara muka API pertukaran.

  • Contoh kerangka asas strategi mata wang kripto:

    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 mudah, jika saya mahu meletakkan pesanan beli dengan harga 100 dan kuantiti 1 di bursa setiap saat, saya boleh 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 Templat

PeraturanPerpustakaan templatadalah modul kod yang boleh digunakan semula dalam platform FMZ Quant Trading, berfungsi sebagai kod kategori strategi dagangan.Perpustakaan Templat, templat ditambahkan di halaman Strategi akaun yang kini log masuk ke platform FMZ Quant Trading. Selepas penciptaan, tidak lagi mungkin untuk mengubahsuai kategori ke strategi biasa.

Pelajaran Templat dalamJavaScript:

img

Pelajaran Templat dalamPython:

img

Pelajaran Templat dalamcpp:

img

  • Fungsi Pengeksport Perpustakaan Templat Fungsi eksport adalah fungsi antara muka perpustakaan Template, dan ia boleh dipanggil dengan strategi yang merujuk kepada perpustakaan Template.

    /*
    -- 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");
    }
    
  • Library Template parameter Perpustakaan Template juga boleh menetapkan parameter antara muka sendiri, yang digunakan dalam bentuk pembolehubah global dalam kod Perpustakaan Template.

    Library Template tetapan parameter:

    img

    Kod perpustakaan templat:

    $.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;
    }
    

    Rujuk kod strategi dalamPerpustakaan Templatcontoh 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 Templat

    Selepas memeriksa rujukan dalam lajur templat halaman penyuntingan strategi, simpan strategi.

    img

Struktur terbina dalam

Variabel Global

Pertukaran

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

  • Menambah objek pertukaran dalam Backtest

  • Menambah objek pertukaran pada halaman Bot

Objek pertukaran yang ditambahkanexchangeobjek dalam kod:

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

Ia boleh difahami sebagai array yang menyimpan semua objek pertukaran sepertiexchangeobjek pertukaran, yang boleh mengandungi beberapa objek pertukaran;exchanges[0]adalahexchange.

Objek pertukaran yang ditambahkan adalahexchanges[0], exchanges[1], exchanges[2]...dan seterusnya dalam kod 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 Perintah

AtributStatusdalamOrder structure.

Nama Tetap Definisi Nilai
ORDER_STATE_PENDING tidak selesai 0
ORDER_STATE_CLOSED Selesai 1
ORDER_STATE_CANCELED dibatalkan 2
ORDER_STATE_UNKNOWN keadaan tidak diketahui (negara lain) 3

ORDER_STATE_UNKNOWNstatus boleh memanggilexchange.GetRawJSON()untuk mendapatkan maklumat status pesanan asal, query fail pertukaran, dan melihat penerangan khusus. Nama-nama yang berterusan dalam borang boleh digunakan secara langsung dalam kod strategi untuk membandingkan dengan sifatStatusdalamOrderMencetak nama-nama yang berterusan akan menunjukkan status pesanan dengan menilai sama ada mereka sama.nama-nama berterusandan yang sepadannilai, dan nama-nama pelarut lain di bawah berfungsi dengan cara yang sama, jadi tidak akan ada penerangan yang lebih terperinci mengenai mereka.

Jenis urus niaga pesanan

AtributTypedalamOrder structure.

Nama Tetap Definisi Nilai
ORDER_TYPE_BUY Membeli Perintah 0
ORDER_TYPE_SELL Perintah Jual 1
Jenis kedudukan

AtributTypedalamPosition structure.

Nama Tetap Definisi Penerangan Berlaku Nilai
PD_LONG Posisi Panjang Penggunaan niaga hadapan cryptocurrencyexchange.SetDirection("closebuy")untuk menetapkan arah kedudukan dekat, dan menutup jenis kedudukan ini Masa hadapan mata wang kripto 0
PD_SHORT Posisi Pendek Penggunaan niaga hadapan cryptocurrencyexchange.SetDirection("closesell")untuk menetapkan arah kedudukan dekat, dan menutup jenis kedudukan ini Masa hadapan mata wang kripto 1
Futures Pembukaan & Penutupan Arahan Posisi

AtributOffsetdalamOrder structure.

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

Dalam kod strategi dagangan, parameter strategi yang ditetapkan pada antara muka strategi tercermin dalam bentuk pembolehubah global.JavaScriptbahasa boleh terus mengakses nilai parameter yang ditetapkan atau diubah suai pada antara muka strategi; sementara dalam fungsiPythonstrategi, kata kunciglobaldiperlukan untuk mengubah suai pembolehubah global dalam strategi.

Jenis parameter:

img

Variabel Penerangan Catatan Jenis Nilai lalai Penerangan
Nombor Jenis nombor Catatan Nombor 1 Strategi C ++ adalah jenis koma terapung
String senar Catatan String (string) Halo FMZ Nilai lalai tidak perlu dipetik. input dianggap sebagai rentetan
Kotak ComboBox Catatan ComboBox (dipilih) 1|2|3 Variabel combox itu sendiri adalah nilai berangka, yang mewakili indeks lajur yang dipilih oleh kawalan Combobox. Nilai ComboBox pertama adalah 1, dan yang lain adalah 0, dan sebagainya
Bool Pilihan semak Catatan Boolean (benar/salah) betul Jika diperiksa, pembolehubah bool adalah benar; jika tidak diperiksa, pembolehubah bool adalah salah
RahsiaString Senar yang disulitkan Catatan String yang disulitkan (string) Kata laluan Dengan penggunaan yang sama seperti rentetan, rentetan yang disulitkan akan dihantar dengan penyulitan dan tidak akan dihantar dalam teks biasa
  • Parameter antara muka ditetapkan dalam bahagian parameter strategi di bawah bahagian penyuntingan kod halaman penyuntingan strategi.
  • Parameter antara muka wujud sebagai pembolehubah global dalam kod strategi, iaitu, parameter antara muka boleh diubahsuai dalam kod.
  • Nama pembolehubah parameter antara muka dalam kod strategi (dilihat dalam borang di atas):number, string, combox, bool, secretString.
  • Pilihan penerangan: nama parameter antara muka pada antara muka strategi.
  • Pilihan Nota: penerangan terperinci parameter antara muka; penerangan akan dipaparkan apabila tetikus melayang di atas parameter antara muka.
  • Pilihan jenis: jenis parameter antara muka.
  • Pilihan nilai lalai: nilai lalai parameter antara muka.

Tetapan Kebergantungan Parameter: Satu parameter boleh ditetapkan untuk membenarkan parameter lain untuk dipaparkan dan tersembunyi berdasarkan pilihan parameter.numberA, yang merupakan jenis nombor.numberAakan dipaparkan atau disembunyikan berdasarkan sama ada parameterisShowAKita perlu menetapkan pembolehubahnumberApada parameter antara muka sebagai:numberA@isShowA.

img

Dengan cara ini, jika parameterisShowAtidak diperiksa, parameternumberABagi parameter jenis kawalan ComboBox, bahagian bergantung parameter adalah untuk menilai sama ada nilai parameter sama dengannilai indeksdengan cara yang sama, mengambil parameterisShowAApabila menetapkan pembolehubah dalam parameter, tulis:numberA@combox==2. ParameternumberAakan memaparkan atau menyembunyikan, berdasarkan sama ada parametercomboxakan diperiksa sebagai pilihan ketiga (di mana indeks 0 sepadan dengan pilihan pertama, indeks 1 sepadan dengan pilihan kedua, dan indeks 2 sepadan dengan pilihan ketiga.)

Parameter antara muka strategi, kawalan interaktif, dan fungsi pengelompokan parameter pada Template: Hanya menambah(?First group)pada permulaan penerangan parameter yang memulakan pengelompokan, seperti yang ditunjukkan dalam gambar berikut:

img

Apabila anda menggunakan strategi, parameter dipaparkan dalam kumpulan:

img

Simpan parameter nilai lalai: Parameter strategi ditunjukkan dalam gambar. Semasa backtest, jika anda ingin menyimpan nilai lalai parameter strategi, anda boleh klikSave settingsbutang selepas mengubah suai parameter strategi.

img

img

Anda boleh menyimpan tetapan parameter strategi dalam bentuk kod:

/*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 disertakan dengan asalJSONdata yang diminta semasa panggilan.JSONdata disimpan dalam atributInfoOleh kerana backtest tidak untuk mengakses antara muka platform, data yang dikembalikan semasa backtest tidak mempunyai sifatInfoBerikut adalah penerangan ciri utama setiap struktur data.

Perdagangan

Dapatkan semua sejarah dagangan (bukan 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
}
Tikal

Nilai pasaran 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
}
Rekod

StandardOHLCstruktur digunakan untuk melukis K-garis dan proses pengiraan penunjuk dan analisis.exchange.GetRecords()mengembalikan array struktur. SetiapRecordstruktur mewakili bar k-garis, iaitu satu k-garisBAR.TimedalamRecordadalah masa permulaan tempoh bar K-line.

{
    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 boleh dikembalikan oleh fungsi, termasukexchange.GetOrder()danexchange.GetOrders(). Fungsiexchange.GetOrders()mengembalikan susunan atau susunan kosong struktur (jika tidak adaPerintah yang belum selesai, kembali[], iaitu, 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