xchangeList()
GetExchangeList()
지원되는 교환자 목록과 필요한 구성 정보를 반환합니다.
매개 변수 아무 것도 없습니다
반환 값
{
"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)
도커 노드를 삭제합니다 (ID
이Nid
) 에 해당하는API KEY
FMZ 퀀트 거래 플랫폼 계정의 요청에
매개 변수Nid
정수 타입입니다. 즉 도커ID
.
반환 값
{
"code":0,
"data":{
"result":true,
"error":null
}
}
DeleteRobot(RobotId, DeleteLogs)
지정된 ID (로봇) 를 가진 로봇을 삭제합니다ID
: RobotId
) 에 해당하는API KEY
FMZ Quant 계정에 대한 요청
매개 변수RobotId
정수 타입입니다. 로봇입니다.ID
삭제합니다.DeleteLogs
부올형입니다.DeleteLogs
로그를 삭제할지 여부를 결정하기 위해true
로그 삭제 표시
반환 값
// Return value after successful deletion
{
"code": 0,
"data": {
"result": 0,
"error": null
}
}
GetStrategyList()
의 전략 정보를 얻습니다.API KEY
FMZ 퀀트 거래 플랫폼 계정의 요청에
매개 변수 아무 것도 없습니다
반환 값
{
"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)
새로운 봇을 생성합니다.API KEY
FMZ Quant 계정의 요청에
매개 변수Settings
의JSON
객체 유형Settings
이JSON
로봇이 구성한 객체입니다.
이Settings
설명은 다음과 같습니다.
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"}}
]
}
참고:
플랫폼과 같은 민감한 정보를 사용할 때API KEY
,"meta":{"AccessKey":"xxx","SecretKey":"yyy"}
구성을 통해eid
, FMZ가 데이터를 저장하지 않는다는 것을 알아야 합니다. 데이터는 도커 프로그램에 직접 전송됩니다. 그래서 이 정보는 로봇이 생성되거나 다시 시작될 때마다 구성되어야 합니다.
플랫폼을 지원하기 위해 플러그인을 사용하는 봇을 다시 시작하려면,Settings
매개 변수, 당신은 다음 설정을 해야 합니다exchanges
속성:
{"eid": "Exchange", "label" : "testXXX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123", "SecretKey": "1234", "Front" : "http://127.0.0.1:6666/XXX"}}
label
이 속성은 현재 일반적인 프로토콜에 의해 액세스되는 교환 객체에 대한 라벨을 설정하는 것입니다.exchange.GetLabel()
전략의 역할입니다.
테스트 전략:
전략 매개 변수Interval
JavaScript
전략 코드
function main(){
Log(exchange.GetAccount())
Log(exchange.GetTicker())
Log(exchange.GetDepth())
Log("Interval:", Interval)
}
반환 값
// Create the bot successfully
{
"code": 0,
"data": {
"result": 74260,
"error": null
}
}
PluginRun(Settings)
호출을 위해 확장된 API를 사용합니다디버깅 도구 function.
매개 변수Settings
이JSON
즉 디버깅 도구의 설정 (Settings
속성에 쓰인 테스트 코드를 포함합니다.source
).
테스트 코드Python
예를 들어:
#!/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)
참고:{"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
{"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
의 경우exchanges
속성설정, 속성은 호출할 때 1으로 설정할 필요가 있습니다.PluginRun
인터페이스 (
반환 값api("PluginRun", settings)
반환된 결과:
{
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)
로봇 로그 정보를 얻습니다 (로봇ID
: robotId
),API KEY
FMZ Quant 계정의 요청에
매개 변수
매개 변수 이름 | 종류 | 언급 |
---|---|---|
로봇 | 정수 | 봇 아이디 |
테이블 로그데이터베이스 테이블의 로그 데이터를 검색합니다:
매개 변수 이름 | 종류 | 언급 |
---|---|---|
logMinId | 정수 | 로그의 최소 ID |
logMaxId | 정수 | 최대 로그 ID |
로그 오프셋 | 정수 | 범위가 logMinId와 logMaxId에 의해 결정된 후, logOffset 오프셋 (몇 개의 레코드가 건너뛰어) 은 데이터를 얻기 위한 출발 위치로 사용되기 시작합니다. |
logLimit | 정수 | 출발 위치를 결정한 후 선택된 데이터 레코드 수 |
표 수익데이터베이스 테이블의 수익 데이터를 검색합니다.
매개 변수 이름 | 종류 | 언급 |
---|---|---|
이익 | 정수 | 기록의 최소 ID |
이윤MaxId | 정수 | 최대 레코드 ID |
수익 오프셋 | 정수 | 오프셋 (몇 개의 레코드가 건너뛰어) 시작 위치로 사용되기 시작합니다 |
이익 제한 | 정수 | 출발 위치를 결정한 후 선택된 데이터 레코드 수 |
표 도표데이터베이스 테이블의 차트 데이터를 검색합니다.
매개 변수 이름 | 종류 | 언급 |
---|---|---|
차트 | 정수 | 기록의 최소 ID |
차트MaxId | 정수 | 최대 레코드 ID |
차트 오프셋 | 정수 | 오프셋 |
chartLimit | 정수 | 취득해야 할 기록의 수 |
chartUpdateBaseId | 정수 | 업데이트 된 기본 ID를 검색 |
chartUpdateDate (차트 업데이트 날짜) | 정수 | 데이터 레코드는 시간표를 업데이트, 이 시간표보다 더 큰 레코드를 필터 |
요약 제한상태 표시줄의 데이터를 검색합니다.
그것은 봇의 상태 표시줄 데이터를 질의합니다. 매개 변수 유형은 정수입니다. summaryLimit
모든 상태 표시줄 정보를 얻기 위한 매개 변수). 상태 표시줄 데이터는 반환된 데이터에 저장됩니다summary
.
Python
예를 들어:
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"
반환 값 반환된 데이터:
{
"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
}
}
데이터베이스의 전략 로그 테이블
이Arr
상기 반환된 결과 데이터의 속성 값 설명:
"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 | 로그 타입 | eid | 명령 | 가격 | 금액 | 추가 | 날짜 | 계약 유형 | 방향 |
---|---|---|---|---|---|---|---|---|---|
3977 | 3 | "" | 0 | 0 | 1526954372591 | "" | "" | ||
3976 | 5 | "" | "" | 0 | 0 | 1526954372410 | "" | "" |
extra
인쇄된 로그의 첨부 메시지입니다.
특정 로그 유형logType
값:
로그 타입: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
logType의 의미: | 구매 | 판매 | 철회 | 오류 | 이익 | 메시지 | 재시작 |
중국어 의미 | 구매 주문 유형 로그 | 판매 주문 유형 로그 | 철수 | 오류 | 수입 | 로그 | 다시 시작 |
데이터베이스의 매출 차트 로그 테이블 차트 로그 테이블의 데이터는 전략 로그 테이블의 수익 로그와 일치합니다.
"Arr": [
[202, 2515.44, 1575896700315],
[201, 1415.44, 1575896341568]
]
로그 데이터 중 하나를 예를 들어보죠.
[202, 2515.44, 1575896700315]
202
로그로ID
; 2515.44
수익 가치로1575896700315
시간표로
데이터베이스의 차트 로그 테이블
"Arr": [
[23637, 0, "{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"],
[23636, 5, "{\"x\":1575960300000,\"y\":3.0735}"]
]
로그 데이터 중 하나를 예를 들어보죠.
[23637, 0, "{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"],
23637
로그입니다.ID
, 0
차트 데이터 시리즈의 인덱스, 마지막 데이터"{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"
로그 데이터입니다. 이 데이터는 차트의 K-라인 데이터입니다.
거래 터미널의 기능을 개선하고 수동 거래를 촉진하기 위해 플러그인 기능이 이제 제공됩니다. 위치는 다음과 같습니다.
원리는 디버깅 도구와 동일합니다: 실행하기 위해
Trading Plugin
, 이것은 지원JavaScript
, Python
, cpp
그리고MyLanguage
.
이 플러그인은 코드를 일정 기간 동안 실행할 수 있고 몇 가지 간단한 작업을 수행할 수 있습니다.아이스버그 주문, 미뤄진 명령, 주문 취소그리고주문 계산같은디버깅 도구, 그것은 사용return
결과를 반환할 수 있고, 차트와 테이블을 직접 반환할 수도 있습니다. 여기 몇 가지 예가 있습니다. 다른 함수들도 직접 탐색할 수 있습니다.
깊이 스냅샷으로 돌아가
// 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
}
기간 간 스프레드를 적립합니다
// 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
거래 단말기의 플러그인 모듈을 추가
그림과 같이,
플러그인을 실행
플러그인을 실행하는 시간 플러그인의 최대 실행 시간은 3분이고, 3분 이상 지나면 자동으로 실행을 멈추게 됩니다.
분석 공식은 시장 코팅 계산 방법을 가리킨다.alpha101
의worldquant
: http://q.fmz.com/chart/doc/101_Formulaic_Alphas.pdf, 이는 기본적으로 문법과 호환됩니다 (시행되지 않은 기능에 대한 설명과 함께), 향상되었습니다.
그것은 시간 계열에 대한 계산을 빠르게 수행하고 아이디어를 검증하는 데 사용됩니다.주소 사용.
페이지 소개:
아래의 "{}"는
abs(x), log(x), sign(x)
말 그대로 절대값, 로그리듬, 그리고 기호 함수를 의미합니다.다음 사업자+, -, *, /, >, <
, 또한 그들의 표준의 의미를 충족;==
||
x? y: z
세차 연산자를 나타냅니다.
rank(x)
: 위치는 위치의 비율을 반환하는 가로 절단 순위; 단일 시장에 대해 계산할 수 없으며 원래 결과를 직접 반환하는 여러 후보 타겟 풀을 지정해야합니다.delay(x, d)
: d 계열의 기간 전의 값.sma(x, d)
: 순서 d 기간의 단순한 이동 평균.correlation(x, y, d)
: 지난 d 기간 동안의 시간 계열 x와 y의 상관 계수.covariance(x, y, d)
: 지난 d 기간 동안의 시간 계열 x 및 y의 covariance.scale(x, a)
: 데이터를 정상화하여sum(abs(x)) = a
(delta(x, d)
: 시간 계열의 현재 값 x 빼기 d 기간 전 값signedpower(x, a)
: x^a
.decay_linear(x, d)
: 시간 계열 x의 가중된 d 기간 이동 평균, 무게는 d, d-1, d-2... 1 (정상화) 이다.indneutralize(x, g)
: 산업 분류를 위한 중립 처리 ts_{O}(x, d)
: 지난 d 기간에 시간 계열 x에 ts_min(x, d)
: 지난 d 기간의 최소 값.ts_max(x, d)
: 지난 d 기간의 최대 값.ts_argmax(x, d)
: ts_max(x, d)
position.ts_argmin(x, d)
: ts_min(x, d)
position.ts_rank(x, d)
: 지난 d 기간의 시간 시리즈 x 값의 분류 (퍼센트 분류).min(x, d)
: ts_min(x, d)
.max(x, d)
: ts_max(x, d)
.sum(x, d)
: 지난 d 기간의 합.product(x, d)
: 지난 d 기간의 곱.stddev(x, d)
: 지난 d 기간의 표준편차.입력 데이터는 대문자 민감하지 않습니다. 기본 데이터는 웹 페이지에서 선택한 기호 또는 직접 지정 할 수 있습니다.binance.ada_bnb
returns
: 종료 가격의 반환.open, close, high, low, volume
: 개시 가격, 폐쇄 가격, 최고 가격, 최저 가격 및 거래량vwap
: 아직 실행되지 않은 부피 가중된 실행 가격, 현재 종료 가격입니다.cap
: 아직 적용되지 않은 전체 시장 가치.IndClass
: 산업 분류, 아직 적용되지 않았습니다.한 번에 여러 결과를 출력하는 것이 지원됩니다. 예를 들어,[sma(close, 10), sma(high, 30)]
그래프에 두 줄을 그리겠습니다. 시간 시리즈 데이터를 입력하는 것 외에도 간단한 계산기로 사용할 수 있습니다.
아직 교환 API 인터페이스를 캡슐화하지 않은 FMZ 퀀트 트레이딩 플랫폼의 경우 일반 프로토콜 플러그인 프로그램을 작성하여 액세스 할 수 있습니다. 이 일반 프로토콜을 사용하여 거래에 API 인터페이스를 제공하는 모든 거래소에 액세스 할 수 있으며 다음 두 개의 프로토콜이 지원됩니다.
그 사이의 차이점FIX
프로토콜 플러그인 프로그램과REST
프로토콜 플러그인 프로그램은 프로토콜 플러그인 프로그램과 교환 인터페이스 사이의 상호 작용에 불과합니다. 프로토콜 플러그인 프로그램은 FMZ 퀀트와 같은 도커 프로그램 상호 작용 및 데이터 형식의 세부 처리 기능을 가지고 있습니다. 자세한 내용은 위의 링크의 예제를 참조하십시오.
FMZ 퀀트 트레이딩 플랫폼은 모듈화되고 사용자 정의 가능한
디버그 도구이 페이지는 로봇에 의해 코드를 빠르게 테스트하는 환경을 제공합니다.JavaScript
currently.
그것은 FMZ 양 거래 플랫폼에 로컬 편집자 원격 동기화 전략 코드를 지원하고, 그것은 지원Sublime Text
/Atom
/Vim
/VSCode
전략 편집 페이지에서
현재 키 표시를 갱신하기 위해
서로 다른 편집기의 플러그인 설치 방법은 약간 다릅니다. 다운로드 버튼을 클릭하면 특정 원격 동기화 플러그인 항목으로 이동할 수 있습니다.
라이브 트레이딩을 실행할 때, 당신은 실제 봇 구성의 매개 변수 데이터를 저장해야합니다, 당신은 JSON
파일, 그리고 수출된 전략 파라미터 구성 또한 실제 봇에 다시 수입할 수 있습니다. 현재 실제 봇에 저장된 전략 봇 파라미터를 수입하기 위해
소스 코드를 다운로드
전략 소스 코드를 수출하고, 수출 파일의 유형은 전략 프로그래밍 언어를 기반으로 합니다. 자바스크립트 전략은 확장자를 가진 파일을 수출js
; 파이썬 전략은 확장자를 가진 파일을 수출py
; C++ 전략은 확장자를 가진 파일을 수출cpp
; MyLanguage 전략은 확장자를 가진 파일을 내보냅니다.txt
. 전략 매개 변수, 템플릿 참조 등을 포함하지 않고 전략 소스 코드만 수출된다는 점에 유의하십시오.
수출 전략
전체 전략을 내보낼 수 있습니다. 전략 소스 코드 및 매개 변수 설계와 같은 모든 전략 정보를 포함합니다.xml
file.
수입 전략
사용xml
xml
즉, 당신은 전체 전략을 가져올 수 있습니다. 수입 후, 당신은 전략을 저장하기 위해
전략 이름과 전략 매개 변수 설명은Chinese|English
, 웹 페이지에서 자동으로 인식 된 언어로 표시됩니다.
다른 곳, 예를 들어:전략 설명, 사용 설명서그리고 다른 문헌Markdown
포맷[trans]Chinese|English[/trans]
또는[trans]Chinese||English[/trans]
또한 자동 인식의 효과를 얻을 수 있습니다. 위의 예제에서 효과는 다음 그림에서 나타납니다.
중국어로 페이지 표시:
영어 페이지 표시:
언어를 변경하면 웹 페이지를 갱신한 후에 효과를 볼 수 있습니다.
전략 코드에 문자열을 쓸 수 있는 함수는 또한 언어 전환을 지원합니다.Log
, 기능LogStatus
, 등등
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]");
}
도커 소프트웨어를 다운로드 한 후, 실행 파일은 압축 해제 후 (파일 이름:robot
) 는 도커 프로그램입니다. 도커 프로그램을 배포할 때 도커 프로그램에 대한 매개 변수를 지정할 수 있습니다.
-v
: 현재 도커 프로그램의 버전과 컴파일 시간을 포함한 정보를 확인합니다.
전체 실행 명령어는Apple Mac System
: ./robot -v
.-s
: 도커 프로그램을 실행할 때 FMZ 퀀트 트레이딩 플랫폼과 통신하기 위해 지정된 주소.
전체 실행 명령어는Apple Mac System
: ./robot -s node.fmz.com/xxxxxxx
; xxxxxxx
FMZ 양자 거래 플랫폼의 각 계정의 고유 식별 ID입니다. 명령을 실행 한 후 해당 FMZ 양자 거래 플랫폼 계정의 암호를 입력하도록 요청됩니다.-p
: 당신은 직접 입력 암호를 실행 명령에 매개 변수를 지정할 수 있습니다, 그것은 현재 시스템 레코드에서 비밀번호 매개 변수가 남아 있기 때문에 권장되지 않습니다. 주소와 일치하는 계정 암호를 가정node.fmz.com/xxxxxxx
이 경우:abc123456
- 그래요
전체 실행 명령어는Apple Mac System
: ./robot -s node.fmz.com/xxxxxxx -p abc123456
.-n
: 실행되는 도커 프로그램에 라벨 정보를 첨부합니다.
전체 실행 명령어는Apple Mac System
: ./robot -n macTest -s node.fmz.com/xxxxxxx
.macTest
플랫폼 도커 관리 페이지의 도커 정보에 텍스트 라벨.-l
: 현재 도커가 지원하는 교환 목록을 인쇄합니다.
전체 실행 명령어는Apple Mac System
: ./robot -l
, 즉 지원 교환의 이름을 출력 할 수 있습니다.exchange.Go
기능, 합리적인 없습니다wait
작업 중 코로루틴이 끝날 때까지 기다립니다. 많은 수의 코로루틴이 발생합니다.Decrypt: Secret key decrypt failed
이 오류의 이유는 FMZ 계정 비밀번호 변경으로 구성된 모든API KEY
문제 해결을 위해,API KEY
다시 구성해야 하고, 도커를 다시 시작해야 합니다.ValueError: bad marshal data (unknown type code)
. 전략에 의해 실행되는 파이썬 환경을 전략에 의해 지원되는 버전 중 하나로 업그레이드 또는 설치:Python 2.7
, Python 3.5
그리고Python 3.6
.interrupt
오류; 오류는 사용자가 클릭하기 때문에로봇을 중지프로그램에서 동작을 수행할 때 (플랫폼 인터페이스에 액세스하는 것과 같이) bot 페이지의 버튼을 누르면 bot가 중지하고 현재 동작에 의해 인쇄된 오류 메시지를 중단합니다. 오류는 아무런 효과도 없으며 로그 기록일 뿐입니다.FMZ 퀀트 트레이딩 플랫폼의
부계산
플랫폼에 로그인 한 후,
하위 계정은 제한된 권한이 있습니다.사용 가능한 권한부계좌에서 볼 수 있습니다. 승인 된 봇은 매개 변수를 수정하고 실시간 거래를 중지하고 다시 시작할 권한을 가지고 있지만 봇이 구성한 교환 객체를 수정할 수 없습니다. 하위 계정의 사용 시나리오는 일반적으로 다음과 같습니다.
라이브 트레이딩 보기
FMZ 플랫폼의 봇 목록봇 페이지, 현재 행의 봇을 공개적으로 표시하기 위해
시작
전략 공유
공개 공유
내부 공유
전략 임대
공공판매
내부 판매
중요한 참고:
개발 및 유통에전략 토큰,
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
}
}
미래에셋자산
그것은 바이낸스 선물의 이중 위치 모드를 지원합니다; 당신은 사용할 수 있습니다exchange.IO
전환하기 위해:
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);
}
그것은 교차 위치 / 격리 위치 사이의 전환을 지원
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);
}
미래에셋대우
그것은 서명에 참여하는 Huobi 미래에셋의 주소를 수정하는 것을 지원합니다. 기본으로 전환되지 않습니다. 기능을 비활성화해야하는 경우, 당신은 사용할 수 있습니다exchange.IO("signHost", "")
빈 문자열을 설정합니다.
사용exchange.IO("signHost", "https://aaa.xxx.xxx")
서명 검증에 참여하는 Huobi Futures의 기본 주소를 변경합니다.
사용exchange.IO("base", "https://bbb.xxx.xxx")
또는exchange.SetBase("https://bbb.xxx.xxx")
플랫폼 인터페이스의 기본 주소를 변경합니다.
거래 쌍이XXX_USDT
, 함수를 사용exchange.SetContractType("swap")
계약 코드를swap
영구 계약, 사용exchange.IO("cross", true)
로 전환할 수 있습니다.USDT
- 마진 상속계약exchange.IO("cross", false)
격리된 위치 모드로 다시 전환합니다. 초기 기본값은 격리된 위치 모드입니다.
후오비
그것은 Huobi 스팟 레버리지 토큰을 지원합니다.LINK*(-3)
; 거래소에서 정의한 코드는:link3susdt
, FMZ가 거래 쌍을 설정할 때 쓰인다.LINK3S_USDT
- 그래요
또한 전략에서 거래 쌍을 변경할 수 있습니다:
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 인터페이스는 OKX의 시뮬레이션 봇 테스트 환경에 전환할 수 있습니다.exchange.IO("simulate", true)
시뮬레이션 거래 환경으로 전환할 수 있습니다. 실제 거래 환경으로 전환하려면exchange.IO("simulate", false)
초기 기본값은 실제 거래 환경입니다.
계정 마진 모드를 전환하는 것을 지원합니다.exchange.IO("cross", true)
교차 위치 모드로 전환하고 사용exchange.IO("cross", false)
격리된 위치 모드로 전환하려면 초기 기본값은 교차된 위치 모드입니다.
퓨처스_비박스
사용exchange.IO("cross", true)
교차 위치 모드로 전환하고 사용exchange.IO("cross", false)
격리된 위치 모드로 전환합니다. 초기 기본 설정은 교차 위치 모드입니다.
거래소는 현재 미뤄진 주문을 검색하고 시장의 역사 거래 기록을 검색하는 인터페이스를 지원하지 않습니다.GetOrders
그리고GetTrades
함수들은 지원되지 않습니다.
퓨처스_비트젯
사용exchange.IO("cross", true)
교차 위치 모드로 전환하고 사용exchange.IO("cross", false)
격리된 위치 모드로 전환합니다.
미래에셋대우
사용exchange.IO("cross", true)
교차 위치 모드로 전환하고 사용exchange.IO("cross", false)
격리된 위치 모드로 전환합니다.
퓨처스_MEXC
사용exchange.IO("cross", true)
교차 위치 모드로 전환하고 사용``` 교환.IO("크로스",