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 Quant トレーディング プラットフォームのアカウントの要求で
パラメーターNid
整数型で,ドッカーですID
.
返済値
{
"code":0,
"data":{
"result":true,
"error":null
}
}
DeleteRobot(RobotId, DeleteLogs)
ロボット (robot) を削除します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 Quant トレーディング プラットフォームのアカウントの要求で
パラメーター ない
返金値
{
"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アカウントの要求に
パラメーター
パラメータ名 | タイプ | コメント |
---|---|---|
ロボット | 整数 | ボットID |
表 ログデータベース表のログデータをクエリする:
パラメータ名 | タイプ | コメント |
---|---|---|
ログミント | 整数 | ログの最小ID |
ログマックスId | 整数 | ログの最大ID |
ログオフセット | 整数 | 範囲がlogMinIdとlogMaxIdによって決定された後,logOffsetオフセット (どれだけのレコードがスキップされているか) はデータを取得するための出発位置として使用され始めます |
ログ制限 | 整数 | 開始位置が決定された後,選択されたデータレコードの数 |
表 利益データベース表の利益データをクエリする:
パラメータ名 | タイプ | コメント |
---|---|---|
利益数 | 整数 | 記録の最小ID |
利益マックスId | 整数 | 記録の最大ID |
利益 オフセット | 整数 | オフセット (何レコードをスキップ) は,出発位置として使用されます. |
利益制限 | 整数 | 開始位置が決定された後,選択されたデータレコードの数 |
表 グラフデータベース表のチャートデータをクエリする:
パラメータ名 | タイプ | コメント |
---|---|---|
チャート | 整数 | 記録の最小ID |
図 MaxId | 整数 | 記録の最大ID |
chart オフセット | 整数 | オフセット |
chartLimit について | 整数 | 取得する記録の数 |
chartUpdateBaseId について | 整数 | 更新されたベース ID をクエリする |
chartUpdate日付 | 整数 | このタイムスタンプより大きいレコードをフィルタリングします. |
概要 制限状態バーのデータをクエリする:
ボットのステータスバーデータをクエリする.パラメータタイプは整数である. 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 | ログタイプ | イード | 命令された | 価格 | 額 | エクストラ | 日付 | 契約型 | 方向性 |
---|---|---|---|---|---|---|---|---|---|
3977 | 3 | "" | 0 | 0 | 売る (688.9,2): 20016 | 1526954372591 | "" | "" | |
3976 | 5 | "" | "" | 0 | 0 | 1526954372410 | "" | "" |
extra
印刷日記の付属メッセージです.
特定のログタイプlogType
値:
ログタイプ: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
logType の意味: | 購入する | 販売 | 撤回する | エラー | 利益 | メッセージ | RESTART について |
中国語 意味 | 購入オーダータイプログ | 販売オーダーの種類日記 | 撤退する | エラー | 収入 | ログ | 再起動 |
データベース内の収入表のログ表 グラフのログ表のデータは,戦略ログ表の収益ログと一致します.
"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基本的にはその文法 (実装されていない機能の説明を含む) と互換性があり,強化されています.
時間列の計算やアイデアの検証を迅速に行うのに使われますアドレスを使用する.
ページ 紹介:
下の"{}"はプレスホルダーを表し,すべての表記は小文字が重要でない.そして"x"はデータタイムシリーズを表します.
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の共変数.scale(x, a)
データを標準化して,sum(abs(x)) = a
(delta(x, d)
: 時間列の現在の値 x マイナス d 期前の値.signedpower(x, a)
: x^a
.decay_linear(x, d)
: 重度の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)]
グラフに2つの線を描きます.時間系列のデータを入力するだけでなく,簡単な計算機としても使用できます.
FMZ Quant Trading プラットフォームでは,交換 API インターフェースをまだカプセル化していないため,一般的なプロトコルプラグインプログラムを書くことでアクセスできます.この一般的なプロトコルを使って,取引のための API インターフェースを提供する任意の交換にアクセスできます.以下の2つのプロトコルはサポートされています:
この2つの差はFIX
プロトコルプラグインプログラムとREST
プロトコルプラグインプログラムは,プロトコルプラグインプログラムと交換インターフェイスの間の相互作用のみである. プロトコルプラグインプログラムは, FMZ Quant と同じ詳細なドッカープログラムインタラクション処理とデータフォーマットを持っています.詳細については,上記のリンクの例を参照してください.
FMZ Quant Trading プラットフォームは,モジュール化され,カスタマイズできる貿易ページ.あなたは自由に様々なデータモジュールと取引機能モジュールを追加し,独自のコードモジュール (取引端末プラグイン) を開発することもできます.非常に柔軟で無料の使用により,手動取引と半プログラム取引のユーザーを非常に便利にします.
デバッグツールボットによってコードを迅速にテストするための環境を提供します.JavaScript
currently.
FMZ Quant トレーディング プラットフォームへのローカルエディタ リモート同期戦略コードをサポートし,Sublime Text
/Atom
/Vim
/VSCode
戦略編集ページで,現在の戦略のリモート同期キー (トークン) を表示するためにプラグインダウンロードアドレスボタンを開くために"リモート編集"をクリックします.
現在のキー表示をリフレッシュするには"更新キー"をクリックし,現在の戦略の秘密キー (トークン) を削除するには"削除キー"をクリックします.
異なるエディタのプラグインのインストール方法は少し異なります. 特定のリモート同期プラグイン項目にジャンプするためにダウンロードボタンをクリックできます.
リアルボット設定のパラメータデータを保存する必要があります. 輸出ボタンをクリックできます. 輸出された戦略パラメータは,保存されますJSON
保存された戦略ボットパラメータを現在のボットにインポートするには,
ソースコードをダウンロード
戦略ソースコードをエクスポートすると,輸出ファイルのタイプは戦略プログラミング言語に基づきます. JavaScript 戦略は拡張子を持つファイルをエクスポートします.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 Quant Tradingプラットフォームと通信するために指定されたアドレス.
実行命令はApple Mac System
: ./robot -s node.fmz.com/xxxxxxx
; xxxxxxx
FMZ Quant Trading プラットフォーム上の各アカウントのユニークな識別IDです.コマンドを実行した後,対応する FMZ Quant Trading プラットフォームアカウントのパスワードを入力するプロンプトがあります.-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
操作中に coroutine の終了を待つため,多くの coroutines を生み出します.Decrypt: Secret key decrypt failed
FMZアカウントのパスワードを変更すると,すべての設定された取引が失敗します.API KEY
問題を解決するために,API KEY
ドーカーは再起動する必要があります.ValueError: bad marshal data (unknown type code)
. 戦略によって実行される Python 環境を戦略によってサポートされるバージョンの 1 つにアップグレードまたはインストールする:Python 2.7
, Python 3.5
そしてPython 3.6
.interrupt
ユーザがクリックするのでロボットを停止ボットページのボタンは,プログラムが操作を行うとき (プラットフォームインターフェイスにアクセスするなど),ボットが停止し,現在の操作によって印刷されたエラーメッセージを中断します.このエラーには効果がありません.それは単なるログ記録です.FMZ Quant トレーディングプラットフォームの
副口座
プラットフォームにログインした後,
サブアカウントには制限された権限があります.利用可能な権限副口座から確認できます 権限のあるボットは,パラメータを変更し,ライブ取引を停止し,再起動する権限がありますが,ボットによって設定された交換オブジェクトを変更することはできません.サブアカウントの使用シナリオは通常:
ライブ・トレード・ビュー FMZプラットフォームのボットリストボットページ公開ボタンをクリックすると,現在の行のボットが公開されます.現在,ライブボットを表示するには2つの方法があります.
そのまま戦略戦略の右側にある
戦略の共有
公共の共有 共有ボタンをクリックすると,ダイアログボックスがポップアップし, 公開共有を選択できます. この戦略はプラットフォームの"より多くの戦略"で完全に共有され, どのユーザーも戦略をコピーできます.
内部共有 共有ボタンをクリックすると,ダイアログボックスがポップアップし,内部共有を選択できます. 株式の有効期間と株式の数を選択した後,コピーページのアドレスそしてコピーコード戦略の生成されます. 指定された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
}
}
フューチャー=Binance
バイナンス・フューチャーズの二重ポジションモードをサポートします.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);
}
フューチャーズ_HuobiDM
署名に参加しているフュービー・フューチャーズのアドレスを変更します. デフォルトで切り替わることはありません.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
機能はサポートされていません.
フューチャー=Bitget
使用exchange.IO("cross", true)
交差位置モードに切り替えて,exchange.IO("cross", false)
隔離位置モードに切り替える
フューチャー=AOFEX
使用exchange.IO("cross", true)
交差位置モードに切り替えて,exchange.IO("cross", false)
隔離位置モードに切り替える
フューチャーズ_MEXC
使用exchange.IO("cross", true)
交差位置モードに切り替えて,` ` 交換.IO("クロス",