xchangeList()
GetExchangeList()
mengembalikan daftar pertukaran yang didukung dan informasi konfigurasi yang diperlukan.
Parameter Tidak ada
Nilai kembali
{
"code": 0,
"data": {
"result": {
"exchanges": [{
"website": "https://www.huobi.pro/",
"name": "Huobi",
"priority": 1,
"meta": "[{"desc": "Access Key", "required": true, "type": "string", "name": "AccessKey", "label": "Access Key"}, {"encrypt": true, "name": "SecretKey", "required": true, "label": "Secret Key", "type": "password", "desc": "Secret Key"}]",
"eid": "Huobi",
"logo": "huobi.png",
"id": 1
}, {
"website": "https://www.kex.com/",
"name": "KEX",
"priority": -99,
"meta": "[{"desc": "Access Key", "required": true, "type": "string", "name": "AccessKey", "label": "Access Key"}, {"encrypt": true, "name": "SecretKey", "required": true, "label": "Secret Key", "type": "password", "desc": "Secret Key"}, {"encrypt": true, "required": true, "type": "password", "name": "Password", "label": "Trading Password"}]",
"eid": "KEX",
"logo": "",
"id": 43
},
...
]
},
"error": null
}
}
DeleteNode(Nid)
menghapus node docker (ID
adalahNid
) yang sesuai denganAPI KEY
dalam permintaan akun platform perdagangan FMZ Quant.
ParameterNid
adalah dari jenis integer, yaitu dockerID
.
Nilai Pengembalian
{
"code":0,
"data":{
"result":true,
"error":null
}
}
DeleteRobot(RobotId, DeleteLogs)
menghapus robot dengan ID yang ditentukan (robotID
: RobotId
) yang sesuai denganAPI KEY
dalam permintaan di bawah akun FMZ Quant.
ParameterRobotId
adalah jenis bilangan bulat, yaitu robotID
akan dihapus.DeleteLogs
adalah tipe Boolean; setDeleteLogs
untuk memutuskan apakah untuk menghapus log atau tidak;true
menunjukkan menghapus log.
Nilai Pengembalian
// Return value after successful deletion
{
"code": 0,
"data": {
"result": 0,
"error": null
}
}
GetStrategyList()
memperoleh informasi strategi yang sesuai denganAPI KEY
dalam permintaan akun platform perdagangan FMZ Quant.
Parameter Tidak ada
Nilai kembali
{
"code": 0,
"data": {
"result": {
"strategies": [{
"category": 0,
"username": "yifidslei",
"is_owner": true,
"name": "fmz simulation market test strategy",
"language": 0,
"hasToken": false,
"args": "[]",
"is_buy": false,
"public": 0,
"last_modified": "2018-01-18 12:36:03",
"date": "2018-01-17 09:19:32",
"forked": 0,
"id": 63372
}, {
"category": 20,
"username": "bifndslez",
"is_owner": true,
"name": "Line drawing library",
"language": 0,
"hasToken": false,
"args": "[]",
"is_buy": false,
"public": 0,
"last_modified": "2017-05-08 09:44:18",
"date": "2017-04-19 10:38:14",
"forked": 0,
"id": 39677
},
...
],
"all": 20
},
"error": null
}
}
NewRobot(Settings)
membuat bot baru sesuai dengan pengaturan parameter, sesuai denganAPI KEY
dalam permintaan akun FMZ Quant.
ParameterSettings
adalah dariJSON
tipe objek.Settings
adalahJSON
objek yang dikonfigurasi oleh bot.
PeraturanSettings
deskripsi dijelaskan sebagai berikut:
Settings = {
"name": "hedge test",
/*
Strategy parameters; the order does not have to be in correspondence with the parameter order, but the name must be the same as the parameter name
Note: the second element in the parameter array ["MAType", 0, 75882] is an array including three elements, in which the first one "MAType" is the parameter on the pattern referred by the bot-binding strategy, and the second one "0" is the specific value set by the parameter "MAType", and the third one "75882" is the pattern ID containing the parameter "MAType"
*/
"args": [["Interval", 500], ["MAType", 0, 75882]],
// Strategy ID, which can be obtained by "GetStrategyList" method
"strategy": 25189,
// K-line period parameter; "60" indicates 60 seconds
"period": 60,
// it can be specified to run on which docker; no writing of the attribute will lead to automatic assignment
"node" : 52924,
// custom field
"appid": "member2",
// Specify a bot group
"group": 1122,
"exchanges": [
// ZB; "pid" can be obtained by "GetPlatformList" method
{"pid": 15445, "pair": "ETH_BTC"},
// OKEX
{"pid": 13802, "pair": "BCH_BTC"},
// In addition to the exchanges configured by the FMZ dashboard (pid identification), you can also set exchange configuration information that has not been configured to operate the bot
{"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "xxx", "SecretKey": "yyy"}},
{"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "xxx", "SecretKey": "yyy"}}
]
}
Catatan:
Ketika Anda menggunakan informasi sensitif, seperti platformAPI KEY
, termasuk"meta":{"AccessKey":"xxx","SecretKey":"yyy"}
dalam konfigurasieid
, Anda harus tahu FMZ tidak menyimpan data. data akan dikirim langsung ke program docker, sehingga informasi ini harus dikonfigurasi setiap kali bot dibuat atau di-restart.
Untuk memulai kembali bot yang menggunakan plugin untuk mendukung platform, Saat mengkonfigurasiSettings
parameter, Anda harus membuat pengaturan berikut untukexchanges
atribut:
{"eid": "Exchange", "label" : "testXXX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123", "SecretKey": "1234", "Front" : "http://127.0.0.1:6666/XXX"}}
label
Atribut adalah untuk mengatur label untuk objek pertukaran diakses oleh protokol umum saat ini, yang dapat diperoleh olehexchange.GetLabel()
fungsi dalam strategi.
Strategi pengujian:
Parameter strategiInterval
JavaScript
kode strategi
function main(){
Log(exchange.GetAccount())
Log(exchange.GetTicker())
Log(exchange.GetDepth())
Log("Interval:", Interval)
}
Nilai kembali
// Create the bot successfully
{
"code": 0,
"data": {
"result": 74260,
"error": null
}
}
PluginRun(Settings)
menggunakan API diperpanjang untuk memanggilalat debugging function.
ParameterSettings
adalahJSON
objek, yaitu pengaturan dalam alat debugging (Settings
berisi kode tes yang ditulis dalam atributsource
).
Kode pengujianPython
Contoh:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import md5
import urllib
import json
# API KEY has been blurred; you can use your own API KEY to test
accessKey = 'f77XXXXXXXXXXXXXXX757'
# API KEY has been blurred; you can use your own API KEY to test
secretKey = 'd8XXXXXXXXXXXXXXXX41ca97ea15'
def api(method, *args):
d = {
'version': '1.0',
'access_key': accessKey,
'method': method,
'args': json.dumps(list(args)),
'nonce': int(time.time() * 1000),
}
d['sign'] = md5.md5('%s|%s|%s|%d|%s' % (d['version'], d['method'], d['args'], d['nonce'], secretKey)).hexdigest()
return json.loads(urllib.urlopen('https://www.fmz.com/api/v1', urllib.urlencode(d)).read())
code = '''
function main() {
Log(exchange.GetTicker())
exchange.SetTimeout(2000);
return exchanges[0].GetTicker()
}
'''
settings = {
# K-line period parameter "60" indicates 60 seconds
"period": 60,
"source": code,
# The docker ID can specify which docker to run the bot on; if the value is -1, it means automatic assignment
"node" : 54913,
"exchanges": [
{"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}},
{"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
]
}
print api("PluginRun", settings)
Catatan:{"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
{"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
Untukexchanges
atribut dalampengaturan, atribut hanya perlu diatur menjadi 1, ketika memanggilPluginRun
interface (hanya untuk satu objek pertukaran dapat didukung ketika Anda menggunakan halaman
Nilai kembaliapi("PluginRun", settings)
Hasil yang dikembalikan:
{
u'code': 0,
u'data': {
u'result': u'{"logs":[{"PlatformId":"","OrderId":"0","LogType":5,"Price":0,"Amount":0,"Extra":"{\\"Info\\":{\\"date\\":\\"1523715057\\",\\"ticker\\":{\\"high\\":\\"0.06400845\\",\\"vol\\":\\"117648.31546800\\",\\"last\\":\\"0.06204514\\",\\"low\\":\\"0.06178666\\",\\"buy\\":\\"0.06200001\\",\\"sell\\":\\"0.06208728\\"}},\\"High\\":0.06400845,\\"Low\\":0.06178666,\\"Sell\\":0.06208728,\\"Buy\\":0.06200001,\\"Last\\":0.06204514,\\"Volume\\":117648.315468,\\"OpenInterest\\":0,\\"Time\\":1523715057726}","Instrument":"","Direction":"","Time":1523715057726}],"result":"{\\"Info\\":{\\"date\\":\\"1523715057\\",\\"ticker\\":{\\"vol\\":\\"117648.31546800\\",\\"last\\":\\"0.06204514\\",\\"low\\":\\"0.06178666\\",\\"buy\\":\\"0.06200001\\",\\"sell\\":\\"0.06208728\\",\\"high\\":\\"0.06400845\\"}},\\"High\\":0.06400845,\\"Low\\":0.06178666,\\"Sell\\":0.06208728,\\"Buy\\":0.06200001,\\"Last\\":0.06204514,\\"Volume\\":117648.315468,\\"OpenInterest\\":0,\\"Time\\":1523715057774}"}\n',
u'error': None
}
}
GetRobotLogs(robotId, logMinId, logMaxId, logOffset, logLimit, profitMinId, profitMaxId, profitOffset, profitLimit, chartMinId, chartMaxId, chartOffset, chartLimit, chartUpdateBaseId, chartUpdateDate, summaryLimit)
mendapatkan informasi log robot (robotID
: robotId
), yang sesuai denganAPI KEY
dalam permintaan akun FMZ Quant.
Parameter
Nama Parameter | Jenis | Pengamatan |
---|---|---|
robotId | bilangan bulat | ID bot |
Tabel Logmenanyakan data log dari tabel database:
Nama Parameter | Jenis | Pengamatan |
---|---|---|
logMinId | bilangan bulat | ID minimal log |
logMaxId | bilangan bulat | ID maksimum log |
LogOffset | bilangan bulat | Setelah kisaran ditentukan oleh logMinId dan logMaxId, offset logOffset (berapa catatan yang dilewatkan) mulai digunakan sebagai posisi awal untuk mendapatkan data |
logLimit | bilangan bulat | Setelah menentukan posisi awal, jumlah catatan data yang dipilih |
Tabel Keuntunganmenanyakan data Laba dari tabel basis data:
Nama Parameter | Jenis | Pengamatan |
---|---|---|
laba MinId | bilangan bulat | ID rekaman minimum |
profitMaxId | bilangan bulat | ID rekaman maksimum |
profitOffset | bilangan bulat | Offset (berapa banyak catatan yang dilewatkan) mulai digunakan sebagai posisi awal |
profitLimit | bilangan bulat | Setelah menentukan posisi awal, jumlah catatan data yang dipilih |
Tabel Baganmenanyakan data Chart dari tabel database:
Nama Parameter | Jenis | Pengamatan |
---|---|---|
grafik MinId | bilangan bulat | ID rekaman minimum |
grafikMaxId | bilangan bulat | ID rekaman maksimum |
chartOffset | bilangan bulat | Kompensasi |
chartLimit | bilangan bulat | jumlah catatan yang akan diperoleh |
chartUpdateBaseId | bilangan bulat | Menanyakan ID basis yang diperbarui |
chartUpdate Tanggal | bilangan bulat | Catatan data memperbarui timestamp yang akan menyaring catatan yang lebih besar dari timestamp ini |
Ringkasanmenanyakan data dari bilah status:
Ini menanyakan data bilah status bot. Jenis parameter adalah bilangan bulat. Mengatur ke summaryLimit
parameter untuk mendapatkan semua informasi bar status). Data bar status disimpan dalam data yang dikembalikansummary
.
Python
Contoh:
api('GetRobotLogs', 63024, 0, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) # For the specific code, please refer to the above content: 4. Simple examples, which will not be repeated here; here only write the call and pass of "GetRobotLogs"
Nilai kembali data yang dikembalikan:
{
"code": 0,
"data": {
"result": {
"status": 1,
"updateTime": 1527049990197,
"wd": 0,
// The first data structure in logs is the log records in the strategy log table in the bot database
"logs": [{
"Max": 3984,
"Arr": [
[3977, 3, "Futures_OKCoin", "", 0, 0, "Sell(688.9, 2): 20016", 1526954372591, "", ""],
[3976, 5, "", "", 0, 0, "OKCoin:this_week too many positions, long: 2", 1526954372410, "", ""]
],
"Total": 1503,
"Min": 2482
}, {
// The second data structure in logs is the log records in the strategy log table in the bot database
"Max": 0,
"Arr": [],
"Total": 0,
"Min": 0
}, {
// The third data structure in logs is the log records in the strategy log table in the bot database
"Max": 0,
"Arr": [],
"Total": 0,
"Min": 0
}],
"chart": "",
"refresh": 1527049988000,
"summary": "...",
"chartTime ": 0,
"node_id ": 50755,
"online ": true
},
"error ": null
}
}
Tabel log strategi dalam database
PeraturanArr
deskripsi nilai atribut dalam data hasil yang dikembalikan di atas:
"Arr": [
[3977, 3, "Futures_OKCoin", "", 0, 0, "Sell(688.9, 2): 20016", 1526954372591, "", ""],
[3976, 5, "", "", 0, 0, "OKCoin:this_week too many positions, long: 2", 1526954372410, "", ""]
],
id | logType | eid | Perintah | harga | jumlah | tambahan | tanggal | kontrakJenis | arah |
---|---|---|---|---|---|---|---|---|---|
3977 | 3 | "" | 0 | 0 | 1526954372591 | "" | "" | ||
3976 | 5 | "" | "" | 0 | 0 | 1526954372410 | "" | "" |
extra
adalah pesan yang terlampir dari log yang dicetak.
Jenis log khusus yang diwakili olehlogType
nilai:
logType: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
Arti logType: | Membeli | Penjualan | Keluar | Kesalahan | Keuntungan | Pesan | Memulai kembali |
Arti Cina | Log jenis order beli | Jurnal jenis pesanan jual | Menarik | Kesalahan | Pendapatan | Log | Mulai kembali |
Tabel log grafik pendapatan dalam database Data dalam tabel log grafik konsisten dengan log pendapatan dalam tabel log strategi.
"Arr": [
[202, 2515.44, 1575896700315],
[201, 1415.44, 1575896341568]
]
Ambil salah satu data log sebagai contoh:
[202, 2515.44, 1575896700315]
202
sebagai logID
; 2515.44
sebagai nilai pendapatan;1575896700315
sebagai timestamp.
Tabel log grafik di database
"Arr": [
[23637, 0, "{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"],
[23636, 5, "{\"x\":1575960300000,\"y\":3.0735}"]
]
Ambil salah satu data log sebagai contoh:
[23637, 0, "{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"],
23637
adalah logID
, 0
adalah indeks dari seri data grafik, dan data terakhir"{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"
adalah data log; data ini adalah data K-line pada grafik.
Untuk meningkatkan fungsi terminal perdagangan dan memudahkan perdagangan manual, fungsi plug-in sekarang tersedia.
Prinsipnya sama dengan alat debugging: mengirim sepotong kode ke docker halaman terminal
Pada halaman Trading Plugin
, yang mendukungJavaScript
, Python
, cpp
danMyLanguage
.
Plugin dapat menjalankan kode untuk jangka waktu tertentu, dan dapat melakukan beberapa operasi sederhana, sepertipesanan gunung es, Perintah yang menunggu, pembatalan pesanandanPerhitungan pesananSama sepertialat debugging, itu menggunakanreturn
Ini adalah beberapa contoh, dan fungsi lain dapat dijelajahi sendiri.
Kembali ke gambar dalam
// Return to the depth snapshot
function main() {
var tbl = {
type: 'table',
title: 'snapshot of the order depth @ ' + _D(),
cols: ['#', 'Amount', 'Ask', 'Bid', 'Amount'],
rows: []
}
var d = exchange.GetDepth()
for (var i = 0; i < Math.min(Math.min(d.Asks.length, d.Bids.length), 15); i++) {
tbl.rows.push([i, d.Asks[i].Amount, d.Asks[i].Price+'#ff0000', d.Bids[i].Price+'#0000ff', d.Bids[i].Amount])
}
return tbl
}
def main():
tbl = {
"type": "table",
"title": "snapshot of the order depth @ " + _D(),
"cols": ["#", "Amount", "Ask", "Bid", "Amount"],
"rows": []
}
d = exchange.GetDepth()
for i in range(min(min(len(d["Asks"]), len(d["Bids"])), 15)):
tbl["rows"].append([i, d["Asks"][i]["Amount"], str(d["Asks"][i]["Price"]) + "#FF0000", str(d["Bids"][i]["Price"]) + "#0000FF", d["Bids"][i]["Amount"]])
return tbl
void main() {
json tbl = R"({
"type": "table",
"title": "abc",
"cols": ["#", "Amount", "Ask", "Bid", "Amount"],
"rows": []
})"_json;
tbl["title"] = "snapshot of the order depth @" + _D();
auto d = exchange.GetDepth();
for(int i = 0; i < 5; i++) {
tbl["rows"].push_back({format("%d", i), format("%f", d.Asks[i].Amount), format("%f #FF0000", d.Asks[i].Price), format("%f #0000FF", d.Bids[i].Price), format("%f", d.Bids[i].Amount)});
}
LogStatus("`" + tbl.dump() + "`");
// C++ does not support "return json" to display the table, and you can create a bot to display the table of the status bar
}
Menggambar spread lintas periode
// Draw cross-period spreads
var chart = {
__isStock: true,
title : { text : 'spread analysis chart'},
xAxis: { type: 'datetime'},
yAxis : {
title: {text: 'spread'},
opposite: false
},
series : [
{name : "diff", data : []}
]
}
function main() {
exchange.SetContractType('quarter')
var recordsA = exchange.GetRecords(PERIOD_M5)
exchange.SetContractType('this_week')
var recordsB = exchange.GetRecords(PERIOD_M5)
for(var i = 0; i < Math.min(recordsA.length, recordsB.length); i++){
var diff = recordsA[recordsA.length - Math.min(recordsA.length, recordsB.length) + i].Close - recordsB[recordsB.length - Math.min(recordsA.length, recordsB.length) + i].Close
chart.series[0].data.push([recordsA[recordsA.length - Math.min(recordsA.length, recordsB.length) + i].Time, diff])
}
return chart
}
chart = {
"__isStock": True,
"title": {"text": "spread analysis chart"},
"xAxis": {"type": "datetime"},
"yAxis": {
"title": {"text": "spread"},
"opposite": False
},
"series": [
{"name": "diff", "data": []}
]
}
def main():
exchange.SetContractType("quarter")
recordsA = exchange.GetRecords(PERIOD_M5)
exchange.SetContractType("this_week")
recordsB = exchange.GetRecords(PERIOD_M5)
for i in range(min(len(recordsA), len(recordsB))):
diff = recordsA[len(recordsA) - min(len(recordsA), len(recordsB)) + i].Close - recordsB[len(recordsB) - min(len(recordsA), len(recordsB)) + i].Close
chart["series"][0]["data"].append([recordsA[len(recordsA) - min(len(recordsA), len(recordsB)) + i]["Time"], diff])
return chart
// C++ does not support "return json" structure drawing
Ada contoh lain dalam
Tambahkan modul plugin dari terminal perdagangan
Seperti yang ditunjukkan pada gambar, buka menu menambahkan modul pada halaman terminal
Jalankan plugin
Klik
Waktu menjalankan plugin Waktu maksimum plugin berjalan adalah 3 menit; dan itu akan berhenti berjalan secara otomatis setelah melebihi 3 menit.
Rumus analisis mengacu pada metode perhitungan penawaran pasar di publik.alpha101
dariworldquant
: http://q.fmz.com/chart/doc/101_Formulaic_Alphas.pdf, yang pada dasarnya kompatibel dengan tata bahasanya (dengan penjelasan untuk fitur yang belum diimplementasikan), dan telah ditingkatkan.
Hal ini digunakan untuk cepat melakukan perhitungan pada seri waktu dan memvalidasi ide,Gunakan Alamat.
Pambuka halaman:
"{}" di bawah ini mewakili placeholder, semua ekspresi tidak sensitif huruf besar, dan
abs(x), log(x), sign(x)
secara harfiah berarti nilai absolut, logaritma dan tanda fungsi, masing-masing.Operator berikut, termasuk+, -, *, /, >, <
, juga memenuhi arti standar mereka;==
mewakili ||
berarti x? y: z
menunjukkan operator ternary.
rank(x)
: peringkat bagian-bagian yang berlawanan, mengembalikan persentase lokasi; perlu untuk menentukan beberapa calon target, yang tidak dapat dihitung untuk satu pasar tunggal dan akan langsung mengembalikan hasil asli.delay(x, d)
: nilai sebelum periode d dari urutan.sma(x, d)
: rata-rata bergerak sederhana dari periode d dari urutan.correlation(x, y, d)
: koefisien korelasi dari deret waktu x dan y selama periode d terakhir.covariance(x, y, d)
: kovariansi deret waktu x dan y pada periode d yang lalu.scale(x, a)
: ini menormalkan data, sehinggasum(abs(x)) = a
(delta(x, d)
: nilai saat ini dari deret waktu x dikurangi nilai sebelum periode d.signedpower(x, a)
: x^a
.decay_linear(x, d)
: rata-rata bergerak periode d tertimbang dari deret waktu x, dengan bobot d, d-1, d-2... 1 (normal).indneutralize(x, g)
: pemrosesan netral untuk klasifikasi industri ts_{O}(x, d)
: melakukan operasi ts_min(x, d)
: nilai minimum dari periode d terakhir.ts_max(x, d)
: nilai maksimum dari periode d terakhir.ts_argmax(x, d)
: ts_max(x, d)
position.ts_argmin(x, d)
: ts_min(x, d)
position.ts_rank(x, d)
: penyaringan nilai seri waktu d periode yang lalu x (penyaringan persentase).min(x, d)
: ts_min(x, d)
.max(x, d)
: ts_max(x, d)
.sum(x, d)
: jumlah periode d yang lalu.product(x, d)
: hasil dari periode d yang lalu.stddev(x, d)
: penyimpangan standar dari periode d yang lalu.Data input tidak sensitif huruf besar; data default adalah simbol yang dipilih di halaman web, atau dapat ditentukan secara langsung, sepertibinance.ada_bnb
returns
: pengembalian harga penutupan.open, close, high, low, volume
: yaitu harga buka, harga tutup, harga tertinggi, harga terendah dan volume perdagangan selama periode.vwap
: harga eksekusi tertimbang volume, belum dilaksanakan, yang saat ini merupakan harga penutupan.cap
: total nilai pasar, belum dilaksanakan.IndClass
: klasifikasi industri, belum diterapkan.Output beberapa hasil (diekspresikan oleh daftar) sekaligus didukung; misalnya,[sma(close, 10), sma(high, 30)]
Selain memasukkan data deret waktu, ini juga dapat digunakan sebagai kalkulator sederhana.
Untuk platform FMZ Quant Trading yang belum mengkapsulkan antarmuka API pertukaran, dapat diakses dengan menulis program plug-in protokol umum.
REST
Protokol:dokumentasi referensi.FIX
Protokol:Item referensi.Perbedaan antaraFIX
protokol plug-in program danREST
protokol plug-in program hanya interaksi antara protokol plug-in program dan antarmuka pertukaran. Protokol plug-in program memiliki detail yang sama pemrosesan dari docker program interaksi dan format data sebagai FMZ Quant. Untuk rincian, silakan lihat contoh di link di atas.
FMZ Quant Trading platform menyediakan modular dan dapat disesuaikan
Alat Debughalaman menyediakan lingkungan untuk cepat menguji kode oleh bot, mendukung hanyaJavaScript
currently.
Ini mendukung editor lokal kode strategi sinkronisasi jarak jauh ke platform FMZ Quant Trading, dan mendukungSublime Text
/Atom
/Vim
/VSCode
Pada halaman editing strategi, klik
Klik
Metode instalasi plug-in editor yang berbeda sedikit berbeda. Anda dapat mengklik tombol download untuk melompat ke item plug-in sinkronisasi jarak jauh tertentu.
Saat menjalankan perdagangan langsung, Anda perlu menyimpan data parameter dari konfigurasi bot nyata, Anda dapat mengklik tombol JSON
file, dan konfigurasi parameter strategi yang diekspor juga dapat diimpor ke bot nyata lagi. Klik tombol
Unduh Kode Sumber
Ekspor kode sumber strategi, dan jenis file ekspor didasarkan pada bahasa pemrograman strategi.js
; strategi python mengekspor file dengan ekstensipy
; C ++ strategi mengekspor file dengan ekstensicpp
; Mylanguage strategi mengekspor file dengan ekstensitxt
Perhatikan bahwa hanya kode sumber strategi yang diekspor, tidak termasuk parameter strategi, referensi template, dll.
Strategi Ekspor
Ekspor strategi lengkap, termasuk semua informasi strategi, seperti kode sumber strategi dan desain parameter.xml
file.
Strategi Impor
Gunakanxml
file diekspor oleh fungsi xml
Setelah mengimpor, Anda perlu mengklik tombol
Nama strategi dan deskripsi parameter strategi dapat ditulis dalamChinese|English
, ditampilkan dalam bahasa yang diakui oleh halaman web secara otomatis.
Di tempat lain, seperti:deskripsi strategi, instruksi penggunaandan teks lainnya dalamMarkdown
format, menggunakan[trans]Chinese|English[/trans]
atau[trans]Chinese||English[/trans]
Efek dari contoh di atas ditunjukkan dalam gambar berikut:
Tampilan halaman dalam bahasa Cina:
Tampilan halaman dalam bahasa Inggris:
Setelah beralih bahasa, akan mengambil efek setelah menyegarkan halaman web.
Fungsi yang dapat menulis string dalam kode strategi juga mendukung beralih bahasa, seperti fungsiLog
, fungsiLogStatus
, dll.
function main() {
Log("[trans]日志|log[/trans]")
var table = {
type: "table",
title: "[trans]操作|option[/trans]",
cols: ["[trans]列1|col1[/trans]", "[trans]列2|col2[/trans]", "[trans]操作|option[/trans]"],
rows: [
["[trans]比特币|BTC[/trans]", "[trans]以太坊|ETH[/trans]", {"type": "button", "cmd": "coverAll", "name": "平仓|cover", "description": "描述|description"}] // Note: It doesn't need to add [trans] tag in the button
]
}
LogStatus("[trans]信息|message[/trans]", "\n`" + JSON.stringify(table) + "`")
throw "[trans]错误|error[/trans]"
}
import json
def main():
Log("[trans]日志|log[/trans]")
table = {
"type": "table",
"title": "[trans]操作|option[/trans]",
"cols": ["[trans]列1|col1[/trans]", "[trans]列2|col2[/trans]", "[trans]操作|option[/trans]"],
"rows": [
["[trans]比特币|BTC[/trans]", "[trans]以太坊|ETH[/trans]", {"type": "button", "cmd": "coverAll", "name": "平仓|cover", "description": "描述|description"}]
]
}
LogStatus("[trans]信息|message[/trans]", "\n`" + json.dumps(table) + "`")
raise Exception("[trans]错误|error[/trans]")
void main() {
Log("[trans]日志|log[/trans]");
json table = R"({
"type": "table",
"title": "[trans]操作|option[/trans]",
"cols": ["[trans]列1|col1[/trans]", "[trans]列2|col2[/trans]", "[trans]操作|option[/trans]"],
"rows": [
["[trans]比特币|BTC[/trans]", "[trans]以太坊|ETH[/trans]", {"type": "button", "cmd": "coverAll", "name": "平仓|cover", "description": "描述|description"}]
]
})"_json;
LogStatus("[trans]信息|message[/trans]", "\n`" + table.dump() + "`");
Panic("[trans]错误|error[/trans]");
}
Setelah mengunduh perangkat lunak docker, file yang dapat dijalankan setelah dekompresi (nama file:robot
) adalah program docker; parameter dapat ditentukan untuk program docker, saat menyebarkan docker.
-v
: memeriksa informasi termasuk versi dan waktu kompilasi dari program docker saat ini.
Komando eksekusi lengkap didasarkan padaApple Mac System
: ./robot -v
.-s
: alamat yang ditentukan untuk berkomunikasi dengan platform FMZ Quant Trading saat menjalankan program docker.
Komando eksekusi lengkap didasarkan padaApple Mac System
: ./robot -s node.fmz.com/xxxxxxx
; xxxxxxx
adalah ID identifikasi unik dari setiap akun di platform FMZ Quant Trading; setelah mengeksekusi perintah, akan ada permintaan untuk memasukkan kata sandi untuk akun platform FMZ Quant Trading yang sesuai.-p
: Anda dapat secara langsung menentukan parameter dalam perintah run untuk memasukkan kata sandi, yang tidak dianjurkan, karena parameter kata sandi akan ditinggalkan dalam catatan sistem saat ini.node.fmz.com/xxxxxxx
adalah:abc123456
Aku tidak tahu.
Komando eksekusi lengkap didasarkan padaApple Mac System
: ./robot -s node.fmz.com/xxxxxxx -p abc123456
.-n
: melampirkan informasi label ke program docker yang sedang berjalan.
Komando eksekusi lengkap didasarkan padaApple Mac System
: ./robot -n macTest -s node.fmz.com/xxxxxxx
Akan adamacTest
label teks dalam informasi docker pada halaman manajemen platform docker.-l
: cetak daftar pertukaran yang didukung oleh docker saat ini.
Komando eksekusi lengkap didasarkan padaApple Mac System
: ./robot -l
, yaitu, nama pertukaran yang didukung dapat di output.exchange.Go
fungsi, tidak ada yang wajarwait
untuk menunggu akhir dari coroutine selama operasi, menghasilkan sejumlah besar coroutines.Decrypt: Secret key decrypt failed
, yang akan menyebabkan kegagalan memulai perdagangan langsung. Alasan kesalahan adalah bahwa modifikasi kata sandi akun FMZ menyebabkan semuaAPI KEY
Untuk memecahkan masalah ini,API KEY
perlu dikonfigurasi ulang, dan docker perlu di-restart.ValueError: bad marshal data (unknown type code)
. Upgrade atau menginstal lingkungan Python yang dijalankan oleh strategi ke salah satu versi yang didukung oleh strategi:Python 2.7
, Python 3.5
danPython 3.6
.interrupt
kesalahan; kesalahan adalah karena pengguna mengklikHentikan bottombol pada halaman Bot ketika program melakukan operasi (seperti mengakses antarmuka platform), dan bot berhenti dan mengganggu pesan kesalahan yang dicetak oleh operasi saat ini.Pada halaman
Sub Rekening
Setelah masuk ke platform, klik
Sub-akun memiliki izin terbatas; hanya bot yang sah dalam pengaturanizin yang tersediadapat dilihat di sub-akun. Bot yang berwenang memiliki wewenang untuk memodifikasi parameter, menghentikan dan memulai kembali perdagangan langsung, tetapi tidak dapat memodifikasi objek pertukaran yang dikonfigurasi oleh bot.
Tampilan Trading Langsung
Dalam daftar bot dari platform FMZhalaman bot, klik tombol
Pada
Berbagi Strategi
Berbagi Publik
Setelah mengklik tombol
Penggabungan Internal
Setelah mengklik tombol
Strategi Penyewaan
Penjualan Umum
Setelah mengklik tombol
Penjualan Internal
Setelah mengklik tombol
Catatan penting:
Ketika membuat dan mendistribusikantoken strategi, pastikan untuk memastikan dengan hati-hati apakah itu adalah
function returnAnalyze(totalAssets, profits, ts, te, period, yearDays) {
// force by days
period = 86400000
if (profits.length == 0) {
return null
}
var freeProfit = 0.03 // 0.04
var yearRange = yearDays * 86400000
var totalReturns = profits[profits.length - 1][1] / totalAssets
var annualizedReturns = (totalReturns * yearRange) / (te - ts)
// MaxDrawDown
var maxDrawdown = 0
var maxAssets = totalAssets
var maxAssetsTime = 0
var maxDrawdownTime = 0
var maxDrawdownStartTime = 0
var winningRate = 0
var winningResult = 0
for (var i = 0; i < profits.length; i++) {
if (i == 0) {
if (profits[i][1] > 0) {
winningResult++
}
} else {
if (profits[i][1] > profits[i - 1][1]) {
winningResult++
}
}
if ((profits[i][1] + totalAssets) > maxAssets) {
maxAssets = profits[i][1] + totalAssets
maxAssetsTime = profits[i][0]
}
if (maxAssets > 0) {
var drawDown = 1 - (profits[i][1] + totalAssets) / maxAssets
if (drawDown > maxDrawdown) {
maxDrawdown = drawDown
maxDrawdownTime = profits[i][0]
maxDrawdownStartTime = maxAssetsTime
}
}
}
if (profits.length > 0) {
winningRate = winningResult / profits.length
}
// trim profits
var i = 0
var datas = []
var sum = 0
var preProfit = 0
var perRatio = 0
var rangeEnd = te
if ((te - ts) % period > 0) {
rangeEnd = (parseInt(te / period) + 1) * period
}
for (var n = ts; n < rangeEnd; n += period) {
var dayProfit = 0.0
var cut = n + period
while (i < profits.length && profits[i][0] < cut) {
dayProfit += (profits[i][1] - preProfit)
preProfit = profits[i][1]
i++
}
perRatio = ((dayProfit / totalAssets) * yearRange) / period
sum += perRatio
datas.push(perRatio)
}
var sharpeRatio = 0
var volatility = 0
if (datas.length > 0) {
var avg = sum / datas.length;
var std = 0;
for (i = 0; i < datas.length; i++) {
std += Math.pow(datas[i] - avg, 2);
}
volatility = Math.sqrt(std / datas.length);
if (volatility !== 0) {
sharpeRatio = (annualizedReturns - freeProfit) / volatility
}
}
return {
totalAssets: totalAssets,
yearDays: yearDays,
totalReturns: totalReturns,
annualizedReturns: annualizedReturns,
sharpeRatio: sharpeRatio,
volatility: volatility,
maxDrawdown: maxDrawdown,
maxDrawdownTime: maxDrawdownTime,
maxAssetsTime: maxAssetsTime,
maxDrawdownStartTime: maxDrawdownStartTime,
winningRate: winningRate
}
}
Futures_Binance
Ini mendukung mode posisi ganda Binance berjangka; Anda dapat menggunakanexchange.IO
untuk beralih:
function main() {
var ret = exchange.IO("api", "POST", "/fapi/v1/positionSide/dual", "dualSidePosition=true")
// ret : {"code":200,"msg":"success"}
Log(ret)
}
def main():
ret = exchange.IO("api", "POST", "/fapi/v1/positionSide/dual", "dualSidePosition=false")
Log(ret)
void main() {
auto ret = exchange.IO("api", "POST", "/fapi/v1/positionSide/dual", "dualSidePosition=true");
Log(ret);
}
Ini mendukung beralih antara posisi silang / posisi terisolasi
function main() {
exchange.SetContractType("swap")
exchange.IO("cross", true) // Switch to crossed position
exchange.IO("cross", false) // Switch to isolated position
}
def main():
exchange.SetContractType("swap")
exchange.IO("cross", True)
exchange.IO("cross", False)
void main() {
exchange.SetContractType("swap");
exchange.IO("cross", true);
exchange.IO("cross", false);
}
Futures_HuobiDM
Ini mendukung memodifikasi alamat Huobi Futures yang berpartisipasi dalam tanda tangan, yang tidak beralih secara default.exchange.IO("signHost", "")
untuk mengatur string kosong.
Penggunaanexchange.IO("signHost", "https://aaa.xxx.xxx")
untuk mengubah alamat dasar Huobi Futures yang berpartisipasi dalam verifikasi tanda tangan.
Penggunaanexchange.IO("base", "https://bbb.xxx.xxx")
atauexchange.SetBase("https://bbb.xxx.xxx")
untuk mengubah alamat dasar antarmuka platform.
Ketika pasangan perdagangan diatur untukXXX_USDT
, gunakan fungsiexchange.SetContractType("swap")
untuk mengatur kode kontrak untukswap
kontrak abadi, menggunakanexchange.IO("cross", true)
bisa beralih keUSDT
- Margined kontrak abadi dalam mode posisi silang.exchange.IO("cross", false)
untuk beralih kembali ke mode posisi terisolasi. default awal adalah mode posisi terisolasi.
Huobi
Ini mendukung token leverage spot Huobi, seperti:LINK*(-3)
; kode yang didefinisikan oleh bursa adalah:link3susdt
, yang ditulis ketika FMZ menetapkan pasangan perdaganganLINK3S_USDT
Aku tidak tahu.
Hal ini juga mungkin untuk beralih pasangan perdagangan dalam strategi:
function main() {
exchange.SetCurrency("LINK3S_USDT")
Log(exchange.GetTicker())
}
def main():
exchange.SetCurrency("LINK3S_USDT")
Log(exchange.GetTicker())
void main() {
exchange.SetCurrency("LINK3S_USDT");
Log(exchange.GetTicker());
}
OKX
OKX interface dapat beralih ke lingkungan pengujian simulasi bot OKX; menggunakanexchange.IO("simulate", true)
Jika Anda ingin beralih ke lingkungan perdagangan nyata, gunakanexchange.IO("simulate", false)
default awal adalah lingkungan perdagangan yang sebenarnya.
Hal ini mendukung beralih mode margin akun; menggunakanexchange.IO("cross", true)
untuk beralih ke mode posisi silang, dan menggunakanexchange.IO("cross", false)
untuk beralih ke mode posisi terisolasi, default awal adalah mode posisi silang.
Futures_Bibox
Penggunaanexchange.IO("cross", true)
untuk beralih ke mode posisi silang, dan menggunakanexchange.IO("cross", false)
untuk beralih ke mode posisi terisolasi; default awal adalah mode posisi silang.
Bursa tidak mendukung kueri pesanan saat ini menunggu dan antarmuka untuk kueri catatan perdagangan sejarah pasar, sehinggaGetOrders
danGetTrades
fungsi tidak didukung.
Futures_Bitget
Penggunaanexchange.IO("cross", true)
untuk beralih ke mode posisi silang, dan menggunakanexchange.IO("cross", false)
untuk beralih ke mode posisi terisolasi.
Futures_AOFEX
Penggunaanexchange.IO("cross", true)
untuk beralih ke mode posisi silang, dan menggunakanexchange.IO("cross", false)
untuk beralih ke mode posisi terisolasi.
Futures_MEXC
Penggunaanexchange.IO("cross", true)
untuk beralih ke mode posisi silang, dan menggunakan` ` pertukaran.IO("salib",