xchangeList()
GetExchangeList()
mengembalikan senarai pertukaran yang disokong dan maklumat konfigurasi yang diperlukan.
Parameter Tiada
Nilai pulangan
{
"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)
memadamkan nod dok (ID
adalahNid
) yang sepadan denganAPI KEY
dalam permintaan akaun platform Dagangan FMZ Quant.
ParameterNid
adalah jenis bilangan bulat, iaitu dockerID
.
Nilai pulangan
{
"code":0,
"data":{
"result":true,
"error":null
}
}
DeleteRobot(RobotId, DeleteLogs)
memadamkan robot dengan ID yang ditentukan (robotID
: RobotId
) yang sepadan denganAPI KEY
dalam permintaan di bawah akaun FMZ Quant.
ParameterRobotId
adalah jenis bilangan bulat, iaitu robotID
untuk dihapuskan.DeleteLogs
adalah jenis Boolean; setDeleteLogs
untuk memutuskan sama ada untuk memadam log atau tidak;true
menunjukkan penghapusan log.
Nilai pulangan
// Return value after successful deletion
{
"code": 0,
"data": {
"result": 0,
"error": null
}
}
GetStrategyList()
memperoleh maklumat strategi yang sepadan denganAPI KEY
dalam permintaan akaun platform Dagangan FMZ Quant.
Parameter Tiada
Nilai pulangan
{
"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)
mencipta bot baru mengikut tetapan parameter, sepadan denganAPI KEY
dalam permintaan akaun FMZ Quant.
ParameterSettings
adalah daripadaJSON
Jenis objek.Settings
adalahJSON
objek yang dikonfigurasi oleh bot.
PeraturanSettings
Penerangan dijelaskan seperti 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"}}
]
}
Nota:
Apabila anda menggunakan maklumat sensitif, seperti platformAPI KEY
, termasuk"meta":{"AccessKey":"xxx","SecretKey":"yyy"}
dalam konfigurasieid
, anda harus tahu FMZ tidak menyimpan data. Data akan dihantar terus ke program docker, jadi maklumat ini mesti dikonfigurasi setiap kali bot dibuat atau dimulakan semula.
Untuk memulakan semula bot yang menggunakan pemalam untuk menyokong platform, Apabila mengkonfigurasiSettings
parameter, anda harus membuat tetapan 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 menetapkan label untuk objek pertukaran diakses oleh protokol umum semasa, yang boleh diperoleh olehexchange.GetLabel()
fungsi dalam strategi.
Strategi ujian:
Parameter strategiInterval
JavaScript
Kod strategi
function main(){
Log(exchange.GetAccount())
Log(exchange.GetTicker())
Log(exchange.GetDepth())
Log("Interval:", Interval)
}
Nilai pulangan
// Create the bot successfully
{
"code": 0,
"data": {
"result": 74260,
"error": null
}
}
PluginRun(Settings)
menggunakan API lanjutan untuk memanggilalat debugging function.
ParameterSettings
adalahJSON
objek, iaitu tetapan dalam alat debugging (Settings
mengandungi kod ujian yang ditulis dalam atributsource
).
Kod ujianPython
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)
Nota:{"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
{"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
Untukexchanges
atribut dalamtetapan, atribut hanya perlu ditetapkan kepada 1, apabila memanggilPluginRun
Nilai pulanganapi("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 maklumat log robot (robotID
: robotId
), bersamaan denganAPI KEY
dalam permintaan akaun FMZ Quant.
Parameter
Nama Parameter | Jenis | Catatan |
---|---|---|
robotId | bilangan bulat | ID bot |
Jadual Logmenyoal data log jadual pangkalan data:
Nama Parameter | Jenis | Catatan |
---|---|---|
logMinId | bilangan bulat | ID minimum log |
logMaxId | bilangan bulat | ID maksimum log |
logOffset | bilangan bulat | Selepas julat ditentukan oleh logMinId dan logMaxId, logOffset offset (berapa banyak rekod yang dilewatkan) mula digunakan sebagai kedudukan permulaan untuk mendapatkan data |
logLimit | bilangan bulat | Selepas menentukan kedudukan permulaan, bilangan rekod data yang dipilih |
Jadual KeuntunganMencari data Keuntungan dari jadual pangkalan data:
Nama Parameter | Jenis | Catatan |
---|---|---|
keuntunganMinId | bilangan bulat | ID rekod minimum |
keuntunganMaxId | bilangan bulat | ID rekod maksimum |
keuntunganOffset | bilangan bulat | Offset (bagaimana banyak rekod yang dilewatkan) mula digunakan sebagai kedudukan permulaan |
KeuntunganLimit | bilangan bulat | Selepas menentukan kedudukan permulaan, bilangan rekod data yang dipilih |
Jadual Grafikmenyoal data carta dari jadual pangkalan data:
Nama Parameter | Jenis | Catatan |
---|---|---|
cartaMinId | bilangan bulat | ID rekod minimum |
cartaMaxId | bilangan bulat | ID rekod maksimum |
cartaOffset | bilangan bulat | Pengimbangan |
chartLimit | bilangan bulat | bilangan rekod yang akan diperoleh |
chartUpdateBaseId | bilangan bulat | Mencari ID pangkalan yang dikemas kini |
chartUpdateDate | bilangan bulat | Rekod data mengemas kini stempel masa yang akan menapis rekod yang lebih besar daripada stempel masa ini |
RingkasanSempadanmenyoal data bar status:
Ia menyoal data bar status bot. Jenis parameter adalah bilangan bulat. Tetapan untuk summaryLimit
parameter untuk mendapatkan semua maklumat 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 pulangan 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
}
}
Jadual log strategi dalam pangkalan data
PeraturanArr
penerangan 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 | tarikh | kontrakJenis | Arah |
---|---|---|---|---|---|---|---|---|---|
3977 | 3 | "" | 0 | 0 | 1526954372591 | "" | "" | ||
3976 | 5 | "" | "" | 0 | 0 | 1526954372410 | "" | "" |
extra
adalah mesej lampiran log cetak.
Jenis log khusus yang diwakili olehlogType
nilai:
logTipe: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
Makna logType: | Beli | Jualan | Mengundur | Kesilapan | Keuntungan | Mesej | Mulakan semula |
Makna Cina | Log jenis pesanan beli | Log jenis pesanan jual | Berundur. | Kesilapan | Hasil | Log | Mulakan semula |
Jadual log carta pendapatan dalam pangkalan data Data dalam jadual log carta adalah konsisten dengan log pendapatan dalam jadual 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 cap masa.
Jadual log carta dalam pangkalan data
"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 siri data carta, dan data terakhir"{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"
adalah data log; Data ini adalah data K-line pada carta.
Untuk meningkatkan fungsi terminal perdagangan dan memudahkan perdagangan manual, fungsi plug-in kini tersedia.
Prinsipnya sama dengan alat debugging: menghantar sekeping kod ke docker halaman terminal
Pada halaman Trading Plugin
, yang menyokongJavaScript
, Python
, cpp
danMyLanguage
.
Plugin boleh menjalankan kod untuk tempoh masa, dan ia boleh melakukan beberapa operasi mudah, sepertiPerintah aisberg, Perintah menunggu, pembatalan pesanandanPengiraan pesananSama sepertialat debugging, ia menggunakanreturn
Berikut adalah beberapa contoh, dan fungsi lain boleh diterokai sendiri.
Kembali ke snapshot kedalaman
// 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 perbezaan antara tempoh
// 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
Terdapat contoh lain dalam
Tambah modul pemalam terminal perdagangan
Seperti yang ditunjukkan dalam gambar, buka menu menambah modul pada halaman terminal
Jalankan pemalam
Klik
Masa menjalankan pemalam Masa maksimum pemacu pemalam adalah 3 minit; dan ia akan berhenti berjalan secara automatik selepas melebihi 3 minit.
Rumus analisis merujuk kepada kaedah pengiraan harga pasaran di khalayak ramaialpha101
daripadaworldquant
: http://q.fmz.com/chart/doc/101_Formulaic_Alphas.pdf, yang pada dasarnya serasi dengan tatabahasanya (dengan penjelasan untuk ciri-ciri yang tidak dilaksanakan), dan telah ditingkatkan.
Ia digunakan untuk cepat melakukan pengiraan pada siri masa dan mengesahkan idea,Gunakan Alamat.
Pambuka Halaman:
"{}" di bawah mewakili tempat penahan, semua ungkapan tidak sensitif huruf besar, dan
abs(x), log(x), sign(x)
secara harfiah bermaksud nilai mutlak, logaritma dan tanda fungsi, masing-masing.Pengendali berikut, termasuk+, -, *, /, >, <
, juga memenuhi maksud standard mereka;==
mewakili ||
bermaksud x? y: z
menunjukkan pengendali ternar.
rank(x)
: ranking cross-sections, mengembalikan peratusan lokasi; adalah perlu untuk menentukan kumpulan sasaran calon yang berbilang, yang tidak boleh dikira untuk pasaran tunggal dan akan mengembalikan hasil asal secara langsung.delay(x, d)
: nilai sebelum tempoh d urutan.sma(x, d)
: purata bergerak mudah tempoh d urutan.correlation(x, y, d)
: pekali korelasi siri masa x dan y dalam tempoh d yang lalu.covariance(x, y, d)
: kovarians siri masa x dan y dalam tempoh d yang lalu.scale(x, a)
: ia menormalkan data, supayasum(abs(x)) = a
(delta(x, d)
: nilai semasa siri masa x tolak nilai sebelum tempoh d.signedpower(x, a)
: x^a
.decay_linear(x, d)
: purata bergerak tempoh d bertingkat siri masa x, dengan berat adalah d, d-1, d-2... 1 (normal).indneutralize(x, g)
: pemprosesan neutral untuk klasifikasi industri ts_{O}(x, d)
: melakukan operasi ts_min(x, d)
: nilai minimum untuk tempoh d yang lalu.ts_max(x, d)
: nilai maksimum untuk tempoh d yang lalu.ts_argmax(x, d)
: ts_max(x, d)
position.ts_argmin(x, d)
: ts_min(x, d)
position.ts_rank(x, d)
: pemisahan nilai siri masa d tempoh yang lalu (peratusan pemisahan).min(x, d)
: ts_min(x, d)
.max(x, d)
: ts_max(x, d)
.sum(x, d)
: jumlah tempoh d yang lalu.product(x, d)
: hasil daripada tempoh d yang lalu.stddev(x, d)
: penyimpangan piawai tempoh d yang lalu.Data input tidak sensitif huruf besar; data lalai adalah simbol yang dipilih di halaman web, atau ia boleh ditentukan secara langsung, sepertibinance.ada_bnb
returns
: pulangan harga penutupan.open, close, high, low, volume
: iaitu harga buka, harga tutup, harga tertinggi, harga terendah dan jumlah dagangan dalam tempoh itu.vwap
: harga pelaksanaan berwajaran jumlah, belum dilaksanakan, yang kini merupakan harga penutupan.cap
: jumlah nilai pasaran, belum dilaksanakan.IndClass
: klasifikasi industri, belum dilaksanakan.Pengeluaran hasil berbilang (diungkapkan oleh senarai) sekaligus disokong; contohnya,[sma(close, 10), sma(high, 30)]
Selain memasukkan data siri masa, ia juga boleh digunakan sebagai kalkulator mudah.
Untuk platform FMZ Quant Trading yang belum mengkapsulkan antara muka API pertukaran, ia boleh diakses dengan menulis program pemalam protokol umum. Anda boleh menggunakan protokol umum ini untuk mengakses mana-mana pertukaran yang menyediakan antara muka API untuk perdagangan, dan dua protokol berikut disokong:
REST
Protokol:dokumentasi rujukan.FIX
Protokol:Item rujukan.Perbezaan antaraFIX
protokol plug-in program danREST
protokol plug-in program hanya interaksi antara protokol plug-in program dan pertukaran antara muka. Protokol plug-in program mempunyai yang sama butiran pemprosesan interaksi program docker dan format data sebagai FMZ Quant. Untuk butiran, sila rujuk kepada contoh dalam pautan di atas.
Platform Perdagangan Kuantum FMZ menyediakan modul dan boleh disesuaikan
Alat Debughalaman menyediakan persekitaran untuk cepat menguji kod oleh bot, menyokong hanyaJavaScript
currently.
Ia menyokong kod strategi penyelarasan jauh editor tempatan ke platform FMZ Quant Trading, dan ia menyokongSublime Text
/Atom
/Vim
/VSCode
Pada halaman penyuntingan strategi, klik
Klik
Kaedah pemasangan pemalam editor yang berbeza sedikit berbeza. Anda boleh klik butang muat turun untuk melompat ke item pemalam penyegerakan jauh tertentu.
Apabila menjalankan perdagangan langsung, anda perlu menyimpan data parameter konfigurasi bot sebenar, anda boleh klik butang JSON
file, dan konfigurasi parameter strategi yang dieksport juga boleh diimport ke bot sebenar lagi. Klik butang
Muat turun kod sumber
Mengeksport kod sumber strategi, dan jenis fail eksport adalah berdasarkan bahasa pengaturcaraan strategi.js
; strategi python mengeksport fail dengan sambunganpy
; C ++ strategi mengeksport fail dengan sambungancpp
; Mylanguage strategi mengeksport fail dengan sambungantxt
. Perhatikan bahawa hanya kod sumber strategi yang dieksport, tidak termasuk parameter strategi, rujukan templat, dll.
Strategi Eksport
Mengeksport keseluruhan strategi, termasuk semua maklumat strategi, seperti kod sumber strategi dan reka bentuk parameter.xml
file.
Strategi Import
Gunakanxml
file yang dieksport oleh fungsi xml
Selepas mengimport, anda perlu klik butang
Nama strategi dan penerangan parameter strategi boleh ditulis dalamChinese|English
, dipaparkan dalam bahasa yang dikenali oleh halaman web secara automatik.
Di tempat lain, seperti:penerangan strategi, arahan penggunaandan teks lain dalamMarkdown
format, menggunakan[trans]Chinese|English[/trans]
atau[trans]Chinese||English[/trans]
juga dapat mencapai kesan pengenalan automatik. Kesan contoh di atas ditunjukkan dalam gambar berikut:
Paparan halaman dalam bahasa Cina:
Paparan halaman dalam bahasa Inggeris:
Selepas menukar bahasa, ia akan mengambil kesan selepas menyegarkan halaman web.
Fungsi yang boleh menulis rentetan dalam kod strategi juga menyokong pertukaran bahasa, seperti fungsiLog
, fungsiLogStatus
, dan lain-lain
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]");
}
Selepas memuat turun perisian docker, fail pelaksanaan selepas dekompresi (nama fail:robot
) adalah program docker; parameter boleh ditentukan untuk program docker, semasa menggunakan docker.
-v
: periksa maklumat termasuk versi dan masa kompilasi program docker semasa.
Perintah pelaksanaan lengkap adalah berdasarkanApple Mac System
: ./robot -v
.-s
: alamat yang ditentukan untuk berkomunikasi dengan platform FMZ Quant Trading semasa menjalankan program docker.
Perintah pelaksanaan lengkap adalah berdasarkanApple Mac System
: ./robot -s node.fmz.com/xxxxxxx
; xxxxxxx
adalah ID pengenalan unik setiap akaun di platform Dagangan Kuantum FMZ; selepas menjalankan perintah, akan muncul permintaan untuk memasukkan kata laluan untuk akaun platform Dagangan Kuantum FMZ yang sepadan.-p
: anda boleh secara langsung menentukan parameter dalam perintah menjalankan untuk memasukkan kata laluan, yang tidak disyorkan, kerana parameter kata laluan akan ditinggalkan dalam rekod sistem semasa.node.fmz.com/xxxxxxx
ialah:abc123456
.
Perintah pelaksanaan lengkap adalah berdasarkanApple Mac System
: ./robot -s node.fmz.com/xxxxxxx -p abc123456
.-n
: melampirkan maklumat label kepada program docker yang sedang berjalan.
Perintah pelaksanaan lengkap adalah berdasarkanApple Mac System
: ./robot -n macTest -s node.fmz.com/xxxxxxx
. akan adamacTest
label teks dalam maklumat docker pada halaman pengurusan platform docker.-l
: cetak senarai pertukaran yang disokong oleh docker semasa.
Perintah pelaksanaan lengkap adalah berdasarkanApple Mac System
: ./robot -l
, iaitu, nama pertukaran yang disokong boleh output.exchange.Go
fungsi, tidak ada yang munasabahwait
untuk menunggu akhir coroutine semasa operasi, mengakibatkan sebilangan besar coroutines.Decrypt: Secret key decrypt failed
, yang akan menyebabkan kegagalan untuk memulakan perdagangan hidup. Sebab kesilapan adalah bahawa pengubahsuaian kata laluan akaun FMZ menyebabkan semua yang dikonfigurasikanAPI KEY
Untuk menyelesaikan masalah ini,API KEY
perlu dikonfigurasi semula, dan docker perlu dihidupkan semula.ValueError: bad marshal data (unknown type code)
. Tingkatkan atau memasang persekitaran Python yang dijalankan oleh strategi ke salah satu versi yang disokong oleh strategi:Python 2.7
, Python 3.5
danPython 3.6
.interrupt
kesalahan; kesilapan adalah kerana pengguna mengklikHentikan botbutang pada halaman Bot apabila program melakukan operasi (seperti mengakses antara muka platform), dan bot berhenti dan mengganggu mesej ralat yang dicetak oleh operasi semasa.Pada halaman
Sub-Akaun
Selepas log masuk ke platform, klik
Sub-akaun mempunyai keizinan terhad; hanya bot yang dibenarkan dalam tetapankeizinan yang adaboleh dilihat dalam sub-akaun. Bot yang dibenarkan mempunyai kuasa untuk mengubah suai parameter, menghentikan dan memulakan semula perdagangan langsung, tetapi ia tidak boleh mengubah objek pertukaran yang dikonfigurasikan oleh bot. Senario penggunaan sub akaun biasanya:
Live Trading View
Dalam senarai bot platform FMZHalaman bot, klik butang
Pada
Perkongsian Strategi
Perkongsian Awam
Selepas mengklik butang
Perkongsian Dalaman
Selepas mengklik butang
Strategi Penyewaan
Jualan Awam
Selepas mengklik butang
Jualan dalaman
Selepas mengklik butang
Nota penting:
Apabila mencipta dan mengedarkanToken strategi, sila pastikan untuk mengesahkan dengan teliti sama ada ia 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
Ia menyokong mod dua kedudukan niaga hadapan Binance; anda boleh menggunakanexchange.IO
untuk menukar:
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);
}
Ia menyokong beralih antara kedudukan bersilang / kedudukan terpencil
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
Ia menyokong pengubahsuaian alamat Huobi Futures yang mengambil bahagian dalam tandatangan, yang tidak ditukar secara lalai.exchange.IO("signHost", "")
untuk menetapkan rentetan kosong.
Penggunaanexchange.IO("signHost", "https://aaa.xxx.xxx")
untuk menukar alamat pangkalan Huobi Futures yang mengambil bahagian dalam pengesahan tandatangan.
Penggunaanexchange.IO("base", "https://bbb.xxx.xxx")
atauexchange.SetBase("https://bbb.xxx.xxx")
untuk menukar alamat asas antara muka platform.
Apabila pasangan dagangan ditetapkan untukXXX_USDT
, gunakan fungsiexchange.SetContractType("swap")
untuk menetapkan kod kontrak kepadaswap
kontrak kekal, menggunakanexchange.IO("cross", true)
boleh beralih keUSDT
- Margined kontrak kekal dalam mod kedudukan crossed.exchange.IO("cross", false)
untuk beralih semula ke mod kedudukan terpencil. lalai awal adalah mod kedudukan terpencil.
Huobi
Ia menyokong token leverage spot Huobi, seperti:LINK*(-3)
; kod yang ditakrifkan oleh bursa adalah:link3susdt
, yang ditulis apabila FMZ menetapkan pasangan daganganLINK3S_USDT
.
Ia juga mungkin untuk menukar pasangan dagangan 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 antara muka boleh beralih ke persekitaran ujian bot simulasi OKX; menggunakanexchange.IO("simulate", true)
Jika anda ingin beralih ke persekitaran perdagangan sebenar, gunakanexchange.IO("simulate", false)
Permulaan lalai adalah persekitaran perdagangan sebenar.
Ia menyokong menukar mod margin akaun; menggunakanexchange.IO("cross", true)
untuk beralih ke mod kedudukan bersilang, dan menggunakanexchange.IO("cross", false)
untuk beralih ke mod kedudukan terpencil, lalai awal adalah mod kedudukan bersilang.
Futures_Bibox
Penggunaanexchange.IO("cross", true)
untuk beralih ke mod kedudukan bersilang, dan menggunakanexchange.IO("cross", false)
untuk beralih ke mod kedudukan terpencil; lalai awal adalah mod kedudukan bersilang.
Bursa tidak menyokong pertanyaan pesanan yang sedang menunggu semasa dan antara muka untuk menyoal rekod perdagangan sejarah pasaran, jadiGetOrders
danGetTrades
fungsi tidak disokong.
Futures_Bitget
Penggunaanexchange.IO("cross", true)
untuk beralih ke mod kedudukan bersilang, dan menggunakanexchange.IO("cross", false)
untuk beralih ke mod kedudukan terpencil.
Futures_AOFEX
Penggunaanexchange.IO("cross", true)
untuk beralih ke mod kedudukan bersilang, dan menggunakanexchange.IO("cross", false)
untuk beralih ke mod kedudukan terpencil.
Futures_MEXC
Penggunaanexchange.IO("cross", true)
untuk beralih ke mod kedudukan bersilang, dan menggunakan` ` pertukaran.IO("bersalib",