[TOC]
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
Bahasa pemrograman apa yang tersedia untuk menerapkan strategi saya?
FMZ Quant Trading platform mendukung untuk menggunakanJavaScript
, TypeScript
, Python
, C++
, Pine
Mylanguage
danBlockly Visualization
untuk menulis dan merancang strategi.
Ini mendukungTypeScript
bahasa, tetap mengaturnya keJavaScript
strategi ketika kita membuat strategi, maka kita menulis// @ts-check
di awal kode strategi atau klik tombolTypeScript
di sudut kanan atas area editing strategi untuk beralih keTypeScript
Platform akan mengenali kode sebagaiTypeScript
secara otomatis dan memberikan dukungan penyusunan dan pemeriksaan tipe yang tepat untuk:
TypeScript
Fungsi pemeriksaan tipe statis dapat membantu Anda menemukan kesalahan potensial saat menulis kode dan meningkatkan kualitas kode.TypeScript
Sistem tipe membuat lebih cepat untuk menemukan atribut dan metode yang Anda butuhkan ketika menulis kode, meningkatkan efisiensi pengembangan.TypeScript
, Anda dapat mengatur dan memelihara kode Anda dengan lebih baik, membuatnya mudah dibaca dan dipahami.TypeScript
memberikan 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).
Blockly
Tutorial Visualisasi:
Tetapkan
Python
penerjemah yang digunakan olehPython
program strategi
Strategi yang ditulis dalamPython
, saat backtesting atau live trading, jika lingkungan sistem docker memiliki keduaPython2danPython3dipasang, Anda dapat mengaturPython
versi yang akan diluncurkan pada waktu berjalan pada baris pertama strategi, seperti#!python3
dan#!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 adalahSqlite
file database dengandb3
, yang dapat diedit langsung olehSqlite
untuk file dengan ekstensidb3
Dalam database bot yang sebenarnya, nama file adalah ID bot.
Protokol yang Didukung
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.Python
paket, yang dimuat dalam kode strategi, sehingga lokalisasi konten strategi dapat direalisasikan.
KeamananPython
Kode:
KarenaPython
adalah 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 dariPython
kode strategi:
Secara default,Python
kode strategi tidak dienkripsi ketika digunakan oleh penulis dan dienkripsi ketika disewa kepada orang lain.
Dengan mengedit kode berikut di awalPython
strategi, Anda dapat menentukan apakah untuk mengenkripsi kode strategi untuk penggunaan pribadi atau sewa.Python
versi yang mendukung enkripsi kode strategi adalah sebagai berikut:Python 2.7
, Python 3.5
danPython 3.6
.
#!python
sebagai 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
#!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 mengenkripsiPython
kode 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")
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.
RSA KEY
metode otentikasi pertukaran sebagai contoh untuk menjelaskan secara rinci bagaimana untuk mengkonfigurasi informasi sensitif secara lokal pada perangkat di mana program docker terletak.PKCS#8
, ada banyak alat yang tersedia untuk pembuatan, sepertiopenssl
.RSA KEY
di bursa, dan mengunggah kunci publik yang dibuat diLangkah 1selama penciptaan.txt
file, atau di jalur lain di direktori program docker.RSA KEY
dibuat oleh pertukaran di kotak suntingan konfigurasiAccess Key
.txt
file 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.txt
Jika Anda menempatkanrsaKey. txt
di 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.
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 menghasilkantick
data 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.tick
Setiap periode K-line akan menghasilkan 12 titik waktu backtesting; Namun, tingkat pasar riil mengumpulkanticks
mekanisme 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
Mata uang terenkripsi (Cryptocurrency)
Nama | Jenis | Instruksi |
---|---|---|
Bitfinex | objek pertukaran spot | mendukung pasangan perdagangan terbatas, seperti:BTC_USD , ETH_USD danLTC_USD , dll (perhatikan mata uang penawaran dari pasangan perdagangan adalahUSD dolar) |
Binance | objek pertukaran spot | mendukung pasangan perdagangan terbatas, seperti:BTC_USDT , ETH_USDT , ETH_BTC danLTC_BTC , dll. |
OKX | objek pertukaran spot | mendukung pasangan perdagangan terbatas, seperti:BTC_USDT , ETH_USDT , ETH_BTC danLTC_BTC , dll. |
Huobi | objek pertukaran spot | mendukung pasangan perdagangan terbatas, seperti:BTC_USDT , ETH_USDT , ETH_BTC danLTC_BTC , dll. |
OKX Futures | objek pertukaran futures | mendukung pasangan perdagangan terbatas, seperti:BTC_USD danETH_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 , quarter danswap |
HuobiDM | objek pertukaran futures | HuobiDM adalah Huobi Futures (Huobi Contract), yang mendukung pasangan perdagangan terbatas, seperti:BTC_USD danETH_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 , quarter danswap . |
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_USDT danETH_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_USD danETH_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.
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.tick
data ketika antarmuka diminta. Untuk rincian, silakan lihat:FMZ Quant Simulation Level Backtest Mechanism Deskripsi.
Backtest tingkat pasar yang sebenarnya adalahtick
Untuk strategi yang didasarkan padatick
tingkat data, menggunakan tingkat pasar riil untuk backtest lebih dekat ke realitas.tick
data 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
,GetTrades
Pada saat data pasar pada timeline, panggilanGetTicker
,GetTrades
, GetDepth
danGetRecords
tidak 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:
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:
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:
Backtest dari mode optimasi parameter:
Pada halaman pengeditan strategi, di paginasi
AmbilJavaScript
strategi sebagai contoh, dan klik
Ada sedikit perbedaan pada JavaScript
, Python
, cpp
danMylanguage
:
/*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"}]
*)
Sistem ini menggunakanGET
metode 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 |
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/data
Sesuaikan 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,JavaScript
Contoh:
/*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:
FMZ Quant Trading platform telah open source untukJavaScript
versi danPython
versi mesin backtest lokal, mendukung pengaturanPeriode K Line yang mendasariselama backtesting.
Tombol pintasan untuk beralih antara halaman
Gunakan kunci.Ctrl +,
untuk beralih kembali ke halaman Ctrl
Tekan tombol.,
.
Kunci pintasan untuk strategi penghematan
Gunakan kunci.Ctrl + s
untuk menyelamatkan strategi.
Jalan pintas untuk memulai strategi backtest
Gunakan kunci.Ctrl + b
untuk memungkinkan
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 dalamPython dancpp tidak mendukung fungsi ini. |
init() |
ini adalah fungsi inisialisasi, program strategi akan dipanggil secara otomatis ketika mulai berjalan, yang dapat dibiarkan tidak dinyatakan. |
onerror()
.onerror()
diaktifkan di bot, fungsionexit()
tidak akan dipicu.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);
}
}
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!");
}
Pelaksanaan fungsionerror()
Fungsi ini tidak mendukung strategi yang ditulis diPython
dancpp
.
function main() {
var arr = []
Log(arr[6].Close)
}
function onerror() {
Log("error")
}
# not supported by python
// not supported by C++
Dalam strategi yang ditulis dalamJavaScript
, Python
dancpp
, 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);
}
}
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
JavaScript
:
Python
:
cpp
:
Fungsi ekspor dari
/*
-- 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");
}
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());
}
Kutipan
Setelah memeriksa referensi di kolom template halaman pengeditan strategi, simpan strategi.
Exchange
Semua interaksi data dengan pertukaran direalisasikan melalui fungsi dalam objek ini.
Menambahkan objek pertukaran di
Menambahkan objek pertukaran pada halaman
Objek pertukaran yang ditambahkan sesuai denganexchange
objek 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());
}
Hal ini dapat dipahami sebagai array yang menyimpan semua objek pertukaran sepertiexchange
objek 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());
}
}
AtributnyaStatus
dalamOrder
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 atributStatus
dalamOrder
Struktur, 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.
AtributnyaType
dalamOrder
structure.
Nama konstan | Definisi | Nilai |
---|---|---|
Order_TYPE_Buy | Perintah Beli | 0 |
Orde_Types_Sell | Perintah Jual | 1 |
AtributnyaType
dalamPosition
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 |
AtributnyaOffset
dalamOrder
structure.
Nama konstan | Definisi | Nilai |
---|---|---|
ORDER_OFFSET_OPEN | Perintah Posisi Terbuka | 0 |
ORDER_OFFSET_CLOSE | Perintah Posisi Tutup | 1 |
Dalam kode strategi perdagangan, parameter strategi yang ditetapkan pada antarmuka strategi tercermin dalam bentuk variabel global.JavaScript
bahasa dapat secara langsung mengakses nilai parameter yang ditetapkan atau dimodifikasi pada antarmuka strategi; sementara dalam fungsiPython
strategi, kata kunciglobal
diperlukan untuk memodifikasi variabel global dalam strategi.
Jenis parameter:
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 |
number
, string
, combox
, bool
, secretString
.Pengaturan ketergantungan parameter:
Satu parameter dapat diatur untuk memungkinkan parameter lain untuk ditampilkan dan disembunyikan berdasarkan pemilihan parameter.numberA
, yang merupakan tipe numerik.numberA
ditampilkan atau disembunyikan berdasarkan apakah parameterisShowA
(tipe Boolean) adalah benar atau salah.numberA
pada parameter antarmuka sebagai:numberA@isShowA
.
Dengan cara ini, jika parameterisShowA
tidak diperiksa, parameternumberA
Seperti untuk parameter jenis kontrol ComboBox, bagian tergantung dari parameter adalah untuk menilai apakah nilai parameter sama dengannilai indeksdengan cara yang sama, mengambil parameterisShowA
Sebagai contoh, ketika Anda mengatur variabel dalam parameter, tulis:numberA@combox==2
. ParameternumberA
akan menampilkan atau menyembunyikan, berdasarkan apakah parametercombox
akan 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 (?First group)
di awal deskripsi parameter yang memulai pengelompokan, seperti yang ditunjukkan pada gambar berikut:
Ketika Anda menggunakan strategi, parameter ditampilkan dalam kelompok:
Simpan nilai default parameter:
Parameter strategi ditunjukkan dalam gambar. Selama backtest, jika Anda ingin menyimpan nilai default dari parameter strategi, Anda dapat mengklikSave settings
tombol setelah memodifikasi parameter strategi.
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]]
*/
Beberapa fungsi akan disertai dengan asliJSON
data yang diminta selama panggilan.JSON
data disimpan dalam atributInfo
Karena backtest tidak untuk mengakses antarmuka platform, data yang dikembalikan selama backtest tidak memiliki atributInfo
Berikut ini adalah deskripsi atribut utama dari setiap struktur data.
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
}
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
}
StandarOHLC
Struktur digunakan untuk menggambar garis K dan perhitungan dan analisis indikator proses.exchange.GetRecords()
mengembalikan array struktur.Record
struktur mewakili k-line bar, yaitu satu k-lineBAR
.Time
dalamRecord
adalah 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
}
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