xchangeList()
GetExchangeList()
trả về danh sách các sàn giao dịch được hỗ trợ và thông tin cấu hình cần thiết.
Parameter Không có
Giá trị trả lại
{
"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)
xóa nút dock (ID
làNid
) tương ứng vớiAPI KEY
trong yêu cầu của tài khoản nền tảng giao dịch FMZ Quant.
ParameterNid
là loại số nguyên, cụ thể là dockerID
.
Giá trị trả về
{
"code":0,
"data":{
"result":true,
"error":null
}
}
DeleteRobot(RobotId, DeleteLogs)
xóa robot với ID được chỉ định (robotID
: RobotId
) tương ứng vớiAPI KEY
trong yêu cầu theo tài khoản FMZ Quant.
ParameterRobotId
là loại số nguyên, cụ thể là robotID
sẽ bị xóa.DeleteLogs
là kiểu Boolean; tập hợpDeleteLogs
để quyết định xem có xóa nhật ký hay không;true
chỉ ra việc xóa nhật ký.
Giá trị trả về
// Return value after successful deletion
{
"code": 0,
"data": {
"result": 0,
"error": null
}
}
GetStrategyList()
thu thập các thông tin chiến lược tương ứng vớiAPI KEY
trong yêu cầu của tài khoản nền tảng giao dịch FMZ Quant.
Parameter Không có
Giá trị trả lại
{
"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)
tạo một bot mới theo các thiết lập tham số, tương ứng vớiAPI KEY
trong yêu cầu của tài khoản FMZ Quant.
ParameterSettings
là củaJSON
loại đối tượng.Settings
là mộtJSON
đối tượng được cấu hình bởi bot.
CácSettings
mô tả được giải thích như sau:
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"}}
]
}
Lưu ý:
Khi bạn sử dụng thông tin nhạy cảm, như nền tảngAPI KEY
, bao gồm"meta":{"AccessKey":"xxx","SecretKey":"yyy"}
trong cấu hình củaeid
, bạn nên biết FMZ không lưu trữ dữ liệu. Dữ liệu sẽ được gửi trực tiếp đến chương trình docker, vì vậy thông tin này phải được cấu hình mỗi khi bot được tạo hoặc khởi động lại.
Để khởi động lại bot sử dụng plugin để hỗ trợ nền tảng, Khi cấu hìnhSettings
tham số, bạn nên thực hiện các thiết lập sau đây cho cácexchanges
thuộc tính:
{"eid": "Exchange", "label" : "testXXX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123", "SecretKey": "1234", "Front" : "http://127.0.0.1:6666/XXX"}}
label
thuộc tính là để thiết lập một nhãn cho đối tượng trao đổi truy cập bởi các giao thức chung hiện tại, có thể được thu thập bởi cácexchange.GetLabel()
trong chiến lược.
Chiến lược thử nghiệm:
Parameter chiến lượcInterval
JavaScript
mã chiến lược
function main(){
Log(exchange.GetAccount())
Log(exchange.GetTicker())
Log(exchange.GetDepth())
Log("Interval:", Interval)
}
Giá trị trả lại
// Create the bot successfully
{
"code": 0,
"data": {
"result": 74260,
"error": null
}
}
PluginRun(Settings)
sử dụng API mở rộng để gọicông cụ gỡ lỗi function.
ParameterSettings
là mộtJSON
đối tượng, cụ thể là các cài đặt trong công cụ gỡ lỗi (Settings
chứa mã thử nghiệm được viết trong thuộc tínhsource
).
Mã thử nghiệmPython
ví dụ:
#!/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)
Lưu ý:{"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
{"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
Đối vớiexchanges
thuộc tính trongcài đặt, thuộc tính chỉ cần được thiết lập thành 1, khi gọiPluginRun
giao diện (chỉ có thể hỗ trợ một đối tượng trao đổi khi bạn sử dụng trang
Giá trị trả lạiapi("PluginRun", settings)
Kết quả trả về:
{
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)
lấy thông tin nhật ký robot (robotID
: robotId
), tương ứng vớiAPI KEY
trong yêu cầu của tài khoản FMZ Quant.
Parameter
Tên tham số | Loại | Nhận xét |
---|---|---|
robotId | số nguyên | ID bot |
bảng Logtruy vấn dữ liệu Log của bảng cơ sở dữ liệu:
Tên tham số | Loại | Nhận xét |
---|---|---|
logMinId | số nguyên | ID tối thiểu của nhật ký |
logMaxId | số nguyên | ID tối đa của nhật ký |
LogOffset | số nguyên | Sau khi phạm vi được xác định bởi logMinId và logMaxId, logOffset offset (số hồ sơ được bỏ qua) bắt đầu được sử dụng như là vị trí khởi đầu để thu thập dữ liệu |
logLimit | số nguyên | Sau khi xác định vị trí khởi đầu, số lượng các bản ghi dữ liệu được chọn |
bảng Lợi nhuậntruy vấn dữ liệu Lợi nhuận của bảng cơ sở dữ liệu:
Tên tham số | Loại | Nhận xét |
---|---|---|
Lợi nhuận | số nguyên | ID hồ sơ tối thiểu |
lợi nhuậnMaxId | số nguyên | ID tối đa của bản ghi |
Lợi nhuận | số nguyên | Sự dịch chuyển (số lượng bản ghi được bỏ qua) bắt đầu được sử dụng như là vị trí bắt đầu |
Lợi nhuận | số nguyên | Sau khi xác định vị trí khởi đầu, số lượng các bản ghi dữ liệu được chọn |
Biểu đồ bảngtruy vấn dữ liệu biểu đồ của bảng cơ sở dữ liệu:
Tên tham số | Loại | Nhận xét |
---|---|---|
biểu đồMinId | số nguyên | ID hồ sơ tối thiểu |
biểu đồMaxId | số nguyên | ID tối đa của bản ghi |
biểu đồOffset | số nguyên | Tiền bù |
chartLimit | số nguyên | số lượng hồ sơ cần thu thập |
chartUpdateBaseId | số nguyên | truy vấn ID cơ sở được cập nhật |
chartUpdateDate | số nguyên | Đăng ký dữ liệu cập nhật dấu thời gian, sẽ lọc các bản ghi lớn hơn dấu thời gian này |
Tóm lạitruy vấn dữ liệu của thanh trạng thái:
Nó truy vấn dữ liệu thanh trạng thái của bot. Loại tham số là số nguyên. Thiết lập summaryLimit
tham số để có được tất cả thông tin thanh trạng thái). Dữ liệu thanh trạng thái được lưu trữ trong dữ liệu trả vềsummary
.
Python
ví dụ:
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"
Giá trị trả lại Dữ liệu được trả về:
{
"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
}
}
Bảng nhật ký chiến lược trong cơ sở dữ liệu
CácArr
Mô tả giá trị thuộc tính trong dữ liệu kết quả được trả về ở trên:
"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 | Đặt hàng | giá cả | số tiền | thêm | ngày | hợp đồngLoại | hướng |
---|---|---|---|---|---|---|---|---|---|
3977 | 3 | "" | 0 | 0 | 1526954372591 | "" | "" | ||
3976 | 5 | "" | "" | 0 | 0 | 1526954372410 | "" | "" |
extra
là thông báo đính kèm của nhật ký in.
Các loại gỗ cụ thể được đại diện bởilogType
giá trị:
logType: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
Ý nghĩa của logType: | Mua | Bán hàng | RETRACT | ERROR | Lợi nhuận | Thông điệp | Bắt đầu lại |
Ý nghĩa Trung Quốc | Lưu trữ loại lệnh mua | Ghi chép loại lệnh bán | Tránh đi. | Lỗi | Thu nhập | Ký hiệu | Khởi động lại |
Bảng nhật ký biểu đồ doanh thu trong cơ sở dữ liệu Dữ liệu trong bảng ghi nhật ký biểu đồ phù hợp với nhật ký doanh thu trong bảng ghi nhật ký chiến lược.
"Arr": [
[202, 2515.44, 1575896700315],
[201, 1415.44, 1575896341568]
]
Lấy một trong các dữ liệu nhật ký như một ví dụ:
[202, 2515.44, 1575896700315]
202
như logID
; 2515.44
Như giá trị doanh thu;1575896700315
như dấu thời gian.
Bảng nhật ký biểu đồ trong cơ sở dữ liệu
"Arr": [
[23637, 0, "{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"],
[23636, 5, "{\"x\":1575960300000,\"y\":3.0735}"]
]
Lấy một trong các dữ liệu nhật ký như một ví dụ:
[23637, 0, "{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"],
23637
là nhật kýID
, 0
là chỉ số của chuỗi dữ liệu biểu đồ, và dữ liệu cuối cùng"{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"
là dữ liệu nhật ký; Dữ liệu này là dữ liệu đường K trên biểu đồ.
Để cải thiện chức năng của trạm giao dịch và tạo điều kiện giao dịch bằng tay, hiện có một chức năng plug-in.
Nguyên tắc tương tự như công cụ gỡ lỗi: gửi một đoạn mã đến docker của trang đầu cuối
Trên trang Trading Plugin
, hỗ trợJavaScript
, Python
, cpp
vàMyLanguage
.
Plugin có thể thực hiện mã trong một khoảng thời gian, và nó có thể thực hiện một số hoạt động đơn giản, chẳng hạn nhưlệnh băng trôi, lệnh đang chờ, hủy lệnhvàtính toán lệnhTương tự nhưcông cụ gỡ lỗi, nó sử dụngreturn
Đây là một vài ví dụ, và các chức năng khác có thể được khám phá bởi chính bạn.
Trở lại ảnh chụp sâu
// 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
}
Kích thước chênh lệch giữa các giai đoạn
// 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
Có những ví dụ khác trong
Thêm module plugin của giao dịch
Như được hiển thị trong hình, mở menu thêm module trên trang đầu cuối
Chạy plugin
Nhấp vào
Thời gian chạy plugin Thời gian chạy tối đa của plugin là 3 phút; và nó sẽ ngừng chạy tự động sau khi vượt quá 3 phút.
Công thức phân tích đề cập đến phương pháp tính giá thị trường trong công chúngalpha101
củaworldquant
: http://q.fmz.com/chart/doc/101_Formulaic_Alphas.pdf, về cơ bản tương thích với ngữ pháp của nó (với lời giải thích cho các tính năng chưa được thực hiện), và đã được nâng cao.
Nó được sử dụng để nhanh chóng thực hiện tính toán về chuỗi thời gian và xác nhận ý tưởng,Sử dụng địa chỉ.
Trang giới thiệu:
"{}" bên dưới đại diện cho vị trí giữ, tất cả các biểu thức không nhạy cảm với chữ cái lớn và
abs(x), log(x), sign(x)
nghĩa đen là giá trị tuyệt đối, logaritm và hàm ký hiệu, tương ứng.Các nhà khai thác sau đây, bao gồm+, -, *, /, >, <
, cũng đáp ứng ý nghĩa của các tiêu chuẩn của họ;==
đại diện cho ||
có nghĩa là x? y: z
chỉ ra toán tử ba.
rank(x)
: xếp hạng các phần cắt ngang, trả về tỷ lệ phần trăm của vị trí; cần phải xác định nhiều nhóm mục tiêu ứng cử viên, không thể được tính toán cho một thị trường duy nhất và sẽ trả về kết quả ban đầu trực tiếp.delay(x, d)
: giá trị trước thời gian d của chuỗi.sma(x, d)
: trung bình di chuyển đơn giản của thời gian d của chuỗi.correlation(x, y, d)
: hệ số tương quan của chuỗi thời gian x và y trong d giai đoạn trước.covariance(x, y, d)
: sự tương đồng của chuỗi thời gian x và y trong d giai đoạn trước.scale(x, a)
: nó bình thường hóa dữ liệu, đểsum(abs(x)) = a
(delta(x, d)
: giá trị hiện tại của chuỗi thời gian x trừ đi giá trị trước d giai đoạn.signedpower(x, a)
: x^a
.decay_linear(x, d)
: trung bình động d-thời gian được cân nhắc của chuỗi thời gian x, với trọng lượng là d, d-1, d-2... 1 (được bình thường hóa).indneutralize(x, g)
: chế biến trung tính cho phân loại ngành ts_{O}(x, d)
: thực hiện các hoạt động ts_min(x, d)
: giá trị tối thiểu của d thời gian qua.ts_max(x, d)
: giá trị tối đa của d thời gian qua.ts_argmax(x, d)
: ts_max(x, d)
position.ts_argmin(x, d)
: ts_min(x, d)
position.ts_rank(x, d)
: sắp xếp các d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d dmin(x, d)
: ts_min(x, d)
.max(x, d)
: ts_max(x, d)
.sum(x, d)
: tổng của d giai đoạn trước.product(x, d)
: sản phẩm của d giai đoạn trước.stddev(x, d)
: độ lệch chuẩn của d giai đoạn trước.Dữ liệu đầu vào không nhạy cảm với chữ cái lớn; dữ liệu mặc định là biểu tượng được chọn trên trang web, hoặc nó có thể được chỉ định trực tiếp, chẳng hạn nhưbinance.ada_bnb
returns
: trả về giá đóng cửa.open, close, high, low, volume
: cụ thể là giá mở, giá đóng cửa, giá cao nhất, giá thấp nhất và khối lượng giao dịch trong thời gian đó.vwap
: giá thực hiện được cân nhắc theo khối lượng, chưa được thực hiện, hiện là giá đóng cửa.cap
: tổng giá trị thị trường, chưa được thực hiện.IndClass
: phân loại ngành, chưa được thực hiện.Việc xuất nhiều kết quả (được thể hiện bằng danh sách) cùng một lúc được hỗ trợ; ví dụ:[sma(close, 10), sma(high, 30)]
Ngoài việc nhập dữ liệu chuỗi thời gian, nó cũng có thể được sử dụng như một máy tính đơn giản.
Đối với nền tảng FMZ Quant Trading chưa đóng gói giao diện API trao đổi, nó có thể được truy cập bằng cách viết một chương trình plug-in giao thức chung. Bạn có thể sử dụng giao thức chung này để truy cập bất kỳ sàn giao dịch nào cung cấp giao diện API cho giao dịch và hai giao thức sau đây được hỗ trợ:
REST
giao thức:tài liệu tham khảo.FIX
giao thức:Điểm tham khảo.Sự khác biệt giữaFIX
giao thức plug-in chương trình vàREST
Chương trình protocol plug-in chỉ là sự tương tác giữa chương trình protocol plug-in và giao diện trao đổi. Chương trình protocol plug-in có cùng một quy trình xử lý chi tiết về tương tác chương trình docker và định dạng dữ liệu như FMZ Quant. Để biết chi tiết, vui lòng tham khảo các ví dụ trong các liên kết trên.
Nền tảng FMZ Quant Trading cung cấp một mô-đun và tùy chỉnh
Công cụ gỡ lỗitrang cung cấp một môi trường để nhanh chóng kiểm tra mã bởi bot, hỗ trợ chỉJavaScript
currently.
Nó hỗ trợ các biên tập viên địa phương mã chiến lược đồng bộ hóa từ xa đến nền tảng FMZ Quant Trading, và nó hỗ trợSublime Text
/Atom
/Vim
/VSCode
trên trang chỉnh sửa chiến lược, bấm
Nhấp vào
Các phương pháp cài đặt plugin của các trình soạn thảo khác nhau hơi khác nhau. Bạn có thể nhấp vào nút tải xuống để chuyển sang mục plugin đồng bộ từ xa cụ thể.
Khi chạy giao dịch trực tiếp, bạn cần lưu dữ liệu tham số của cấu hình bot thực, bạn có thể nhấp vào nút JSON
file, và cấu hình tham số chiến lược xuất khẩu cũng có thể được nhập vào bot thực sự một lần nữa. Nhấp vào nút
Tải mã nguồn
Xuất khẩu mã nguồn chiến lược, và loại tệp xuất dựa trên ngôn ngữ lập trình chiến lược.js
; chiến lược python xuất các tệp với phần mở rộngpy
; C ++ chiến lược xuất các tệp với phần mở rộngcpp
; Mylanguage chiến lược xuất các tệp với phần mở rộngtxt
Lưu ý rằng chỉ có mã nguồn chiến lược được xuất, không bao gồm các tham số chiến lược, tham chiếu mẫu, vv
Chiến lược xuất khẩu
xuất toàn bộ chiến lược, bao gồm tất cả các thông tin chiến lược, chẳng hạn như mã nguồn chiến lược và thiết kế tham số.xml
file.
Chiến lược nhập khẩu
Sử dụngxml
file được xuất bởi các chức năng xml
Sau khi nhập, bạn cần nhấp vào nút
Tên chiến lược và mô tả tham số chiến lược có thể được viết trongChinese|English
, hiển thị bằng ngôn ngữ được các trang web nhận ra tự động.
Ở những nơi khác, như:Mô tả chiến lược, hướng dẫn sử dụngvà các văn bản khác trongMarkdown
định dạng, sử dụng[trans]Chinese|English[/trans]
hoặc[trans]Chinese||English[/trans]
cũng có thể đạt được hiệu ứng nhận dạng tự động.
Hiển thị trang bằng tiếng Trung:
Hiển thị trang bằng tiếng Anh:
Sau khi chuyển đổi ngôn ngữ, nó sẽ có hiệu ứng sau khi làm mới trang web.
Các hàm có thể viết chuỗi trong mã chiến lược cũng hỗ trợ chuyển đổi ngôn ngữ, chẳng hạn như hàmLog
, chức năngLogStatus
, vv
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]");
}
Sau khi tải xuống phần mềm docker, tệp thực thi sau khi giải nén (tên tệp:robot
) là chương trình docker; các tham số có thể được chỉ định cho chương trình docker, khi triển khai docker.
-v
: kiểm tra thông tin bao gồm phiên bản và thời gian biên dịch của chương trình docker hiện tại.
Toàn bộ lệnh thực thi dựa trênApple Mac System
: ./robot -v
.-s
: địa chỉ được chỉ định để giao tiếp với nền tảng FMZ Quant Trading khi chạy chương trình docker.
Toàn bộ lệnh thực thi dựa trênApple Mac System
: ./robot -s node.fmz.com/xxxxxxx
; xxxxxxx
là ID nhận dạng duy nhất của mỗi tài khoản trên nền tảng giao dịch FMZ Quant; sau khi thực hiện lệnh, sẽ có một nhắc nhập mật khẩu cho tài khoản nền tảng giao dịch FMZ Quant tương ứng.-p
: bạn có thể trực tiếp chỉ định tham số trong lệnh chạy để nhập mật khẩu, mà không được khuyến cáo, bởi vì các tham số mật khẩu sẽ được để lại trong bản ghi hệ thống hiện tại.node.fmz.com/xxxxxxx
là:abc123456
.
Toàn bộ lệnh thực thi dựa trênApple Mac System
: ./robot -s node.fmz.com/xxxxxxx -p abc123456
.-n
: đính kèm thông tin nhãn với chương trình docker đang chạy.
Toàn bộ lệnh thực thi dựa trênApple Mac System
: ./robot -n macTest -s node.fmz.com/xxxxxxx
Sẽ có mộtmacTest
Nhãn văn bản trong thông tin docker trên trang quản lý docker nền tảng.-l
: in danh sách trao đổi được hỗ trợ bởi docker hiện tại.
Toàn bộ lệnh thực thi dựa trênApple Mac System
: ./robot -l
, tức là, tên của các sàn giao dịch được hỗ trợ có thể được xuất.exchange.Go
chức năng, không có hợp lýwait
để chờ đợi kết thúc của coroutine trong quá trình hoạt động, dẫn đến một số lượng lớn coroutines.Decrypt: Secret key decrypt failed
Lý do cho lỗi là thay đổi mật khẩu tài khoản FMZ gây ra tất cả các cấu hình giao dịchAPI KEY
Để giải quyết vấn đề, cácAPI KEY
cần được cấu hình lại, và docker cần được khởi động lại.ValueError: bad marshal data (unknown type code)
. Nâng cấp hoặc cài đặt môi trường Python được chạy bởi chiến lược sang một trong những phiên bản được hỗ trợ bởi chiến lược:Python 2.7
, Python 3.5
vàPython 3.6
.interrupt
lỗi; lỗi là bởi vì người dùng nhấp vàoNgừng robotnút trên trang Bot khi chương trình thực hiện một hoạt động (chẳng hạn như truy cập giao diện nền tảng), và bot dừng lại và gián đoạn thông báo lỗi được in bởi hoạt động hiện tại.Trên trang
Tài khoản phụ
Sau khi đăng nhập vào nền tảng, hãy nhấp vào
Tài khoản con có quyền hạn hạn chế; chỉ có các bot được ủy quyền trong cài đặt củaquyền có sẵncó thể thấy trong các tài khoản phụ. Bot được ủy quyền có quyền sửa đổi các tham số, dừng và khởi động lại giao dịch trực tiếp, nhưng nó không thể sửa đổi đối tượng trao đổi được cấu hình bởi bot.
Xem giao dịch trực tiếp
Trong danh sách bot của nền tảng FMZtrang bot, nhấp vào nút
Trên
Chia sẻ chiến lược
Chia sẻ công khai
Sau khi nhấp vào nút
Chia sẻ nội bộ
Sau khi nhấp vào nút
Chiến lược cho thuê
Bán hàng công khai
Sau khi nhấp vào nút
Bán hàng nội bộ
Sau khi nhấp vào nút
Lưu ý quan trọng:
Khi tạo ra và phân phốimã thông báo chiến lược, vui lòng chắc chắn để xác nhận cẩn thận nếu nó là một
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
Nó hỗ trợ chế độ vị trí kép của Binance tương lai; bạn có thể sử dụngexchange.IO
để chuyển đổi:
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);
}
Nó hỗ trợ chuyển đổi giữa vị trí chéo / vị trí cô lập
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);
}
Tiền tương lai_HuobiDM
Nó hỗ trợ sửa đổi địa chỉ của Huobi tương lai tham gia vào chữ ký, mà không được chuyển đổi theo mặc định.exchange.IO("signHost", "")
để đặt một chuỗi trống.
Sử dụngexchange.IO("signHost", "https://aaa.xxx.xxx")
để thay đổi địa chỉ cơ sở của Huobi Futures tham gia xác minh chữ ký.
Sử dụngexchange.IO("base", "https://bbb.xxx.xxx")
hoặcexchange.SetBase("https://bbb.xxx.xxx")
để thay đổi địa chỉ cơ sở của giao diện nền tảng.
Khi cặp giao dịch được thiết lập thànhXXX_USDT
, sử dụng chức năngexchange.SetContractType("swap")
để thiết lập mã hợp đồngswap
hợp đồng vĩnh viễn, sử dụngexchange.IO("cross", true)
có thể chuyển sangUSDT
-thỏa thuận vĩnh viễn trong chế độ vị trí chéo.exchange.IO("cross", false)
để chuyển trở lại chế độ vị trí cô lập.
Huobi
Nó hỗ trợ các token đòn bẩy giao ngay của Huobi, chẳng hạn như:LINK*(-3)
; mã được xác định bởi sàn giao dịch là:link3susdt
, được viết khi FMZ đặt cặp giao dịchLINK3S_USDT
.
Nó cũng có thể chuyển đổi các cặp giao dịch trong chiến lược:
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 giao diện có thể chuyển sang môi trường thử nghiệm robot mô phỏng của OKX; sử dụngexchange.IO("simulate", true)
Nếu bạn muốn chuyển sang môi trường giao dịch thực, sử dụngexchange.IO("simulate", false)
mặc định ban đầu là môi trường giao dịch thực sự.
Nó hỗ trợ chuyển đổi các chế độ ký quỹ tài khoản; sử dụngexchange.IO("cross", true)
để chuyển sang chế độ vị trí chéo và sử dụngexchange.IO("cross", false)
để chuyển sang chế độ vị trí cô lập, mặc định ban đầu là chế độ vị trí chéo.
Futures_Bibox
Sử dụngexchange.IO("cross", true)
để chuyển sang chế độ vị trí chéo và sử dụngexchange.IO("cross", false)
để chuyển sang chế độ vị trí cô lập; mặc định ban đầu là chế độ vị trí chéo.
Sàn giao dịch không hỗ trợ truy vấn các lệnh đang chờ hiện tại và giao diện để truy vấn các hồ sơ giao dịch lịch sử của thị trường, do đó,GetOrders
vàGetTrades
các chức năng không được hỗ trợ.
Tiền tương lai_Bitget
Sử dụngexchange.IO("cross", true)
để chuyển sang chế độ vị trí chéo và sử dụngexchange.IO("cross", false)
để chuyển sang chế độ vị trí cô lập.
Tiền tương lai_AOFEX
Sử dụngexchange.IO("cross", true)
để chuyển sang chế độ vị trí chéo và sử dụngexchange.IO("cross", false)
để chuyển sang chế độ vị trí cô lập.
Tiền tương lai_MEXC
Sử dụngexchange.IO("cross", true)
để chuyển sang chế độ vị trí chéo và sử dụng``` trao đổi.IO("cross",