資源の読み込みに... 荷物...

FMZ API インストラクション

作者: リン・ハーンゼロ, 作成日:2020年4月20日 10:19:00, 更新日:2023年4月12日 14:44:56

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
        }
    }
    

削除Node (ノード)

DeleteNode(Nid)ドッカーノードを削除します (IDNid) に対応するAPI KEYFMZ Quant トレーディング プラットフォームのアカウントの要求で

  • パラメーターNid整数型で,ドッカーですID.

  • 返済値

    {
        "code":0,
        "data":{
            "result":true,
            "error":null
        }
    }
    

ロボットを削除します.

DeleteRobot(RobotId, DeleteLogs)ロボット (robot) を削除しますID: RobotId) に対応するAPI KEYFMZ Quantアカウントの請求書に

  • パラメーターRobotId整数型で,ロボットです.ID削除する.DeleteLogsボール式である.DeleteLogsログを削除するか否かを決定するtrueログを削除する

  • 返済値

    // Return value after successful deletion
    {
        "code": 0,
        "data": {
            "result": 0,
            "error": null
        }
    }
    

GetStrategyList (戦略リストを取得する)

GetStrategyList()戦略情報を取得するAPI KEYFMZ 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 ((設定) について)

NewRobot(Settings)パラメータ設定に従って新しいボットを作成します.API KEYFMZ Quantアカウントの要求に

  • パラメーターSettingsJSONオブジェクトタイプ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"}配置でeidFMZはデータを格納しません. データがドッカープログラムに直接送信されるので,この情報はボットが作成または再起動するたびに設定する必要があります.

    プラットフォームをサポートするためにプラグインを使用するボットを再起動するには,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デバッグツールページを使用すると,交換オブジェクトを1つだけサポートできます. 2つの交換オブジェクトを設定するとエラーが報告されません.設定, しかしコードで第2の交換オブジェクトにアクセスするとエラーが報告されます.

  • 返金値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 KEYFMZ Quantアカウントの要求に

  • パラメーター

    パラメータ名 タイプ コメント
    ロボット 整数 ボットID

    表 ログデータベース表のログデータをクエリする:

    パラメータ名 タイプ コメント
    ログミント 整数 ログの最小ID
    ログマックスId 整数 ログの最大ID
    ログオフセット 整数 範囲がlogMinIdとlogMaxIdによって決定された後,logOffsetオフセット (どれだけのレコードがスキップされているか) はデータを取得するための出発位置として使用され始めます
    ログ制限 整数 開始位置が決定された後,選択されたデータレコードの数

    表 利益データベース表の利益データをクエリする:

    パラメータ名 タイプ コメント
    利益数 整数 記録の最小ID
    利益マックスId 整数 記録の最大ID
    利益 オフセット 整数 オフセット (何レコードをスキップ) は,出発位置として使用されます.
    利益制限 整数 開始位置が決定された後,選択されたデータレコードの数

    表 グラフデータベース表のチャートデータをクエリする:

    パラメータ名 タイプ コメント
    チャート 整数 記録の最小ID
    図 MaxId 整数 記録の最大ID
    chart オフセット 整数 オフセット
    chartLimit について 整数 取得する記録の数
    chartUpdateBaseId について 整数 更新されたベース ID をクエリする
    chartUpdate日付 整数 このタイムスタンプより大きいレコードをフィルタリングします.

    概要 制限状態バーのデータをクエリする:

    ボットのステータスバーデータをクエリする.パラメータタイプは整数である. 0を設定すると,ステータスバー情報をクエリする必要がないことを意味し,ゼロ以外の数値に設定すると,クエリされるステータスバー情報のバイトの数を示します (インターフェースはデータ量を制限しません.より大きな範囲を指定できます.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 フューチャー_OKCoin "" 0 0 売る (688.9,2): 20016 1526954372591 "" ""
    3976 5 "" "" 0 0 OKCoin:this_week too many positions, long: 2 この週,ポジションが多く,ロング: 2 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線データです

トレーディングプラグイン

紹介

トレーディングターミナルの機能を改善し,手動取引を容易にするために,プラグイン機能が現在利用可能になっています.位置は以下のように示されています.

img

プラグインの原理

原則はデバッグツールと同じである:実行するために,Tradeターミナルページのドッカーにコードを送信し,チャートとテーブルの返却をサポートする (デバッグツールもアップグレード後にサポートすることができます).機能は,デバッグツール簡単な小さな機能を実現できます. 複雑な戦略はまだ実際の取引で実行する必要があります.

プラグイン作成

新戦略のページでは,戦略型を以下に設定します.Trading Plugin支持するJavaScript, Python, cppそしてMyLanguage.

img

プラグインの使用

このプラグインは,コードを一定の期間実行し,いくつかの簡単な操作を行うことができます.アイスバーグの注文, 待機中の命令, 注文のキャンセルそして注文計算同じようにデバッグツール,それは使用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 
    }
    

    img

  • クロスペリオド・スプレッドを引く

    // 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
    

    img

    More Strategiesには,以下のような他の例があります.小量で購入 / 販売, 戦略アドレス.

どう 使うか

  • 取引端末のプラグインモジュールを追加する Tradeターミナルページのモジュール追加メニューを開く.戦略ライブラリ追加するプラグインを見つけ,追加をクリックします.

    img

  • プラグインを実行 Executeをクリックすると,トレードターミナルプラグインが起動します.プラグインはログを表示しませんが,表示テーブルを返します.

  • プラグインを実行する時間 プラグインの最大実行時間は 3分です. 3分を超えると自動的に停止します.

アルファ因子分析ツール

紹介

分析式は,市場価格の計算方法を指します.alpha101についてworldquant: http://q.fmz.com/chart/doc/101_Formulaic_Alphas.pdf基本的にはその文法 (実装されていない機能の説明を含む) と互換性があり,強化されています. 時間列の計算やアイデアの検証を迅速に行うのに使われますアドレスを使用する.

ページ 紹介:

img

機能と操作者

下の"{}"はプレスホルダーを表し,すべての表記は小文字が重要でない.そして"x"はデータタイムシリーズを表します.

  • abs(x), log(x), sign(x)文字通り絶対値,対数,記号関数という意味です

以下の事業者+, -, *, /, >, <また,その基準の意味も満たしています.==同等または同等でないを表す.||or を表示する.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(a は 1 に設定されます)
  • delta(x, d): 時間列の現在の値 x マイナス d 期前の値.
  • signedpower(x, a): x^a.
  • decay_linear(x, d): 重度のd期間の移動平均値で,重量はd,d-1,d-2... 1 (正規化) である.
  • indneutralize(x, g)産業分類のための中性加工 g,現在サポートされていません.
  • ts_{O}(x, d): 過去d期間の時間列xでO操作を実行する (Oは,特にminmax等を表現することができる.
  • 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 プラットフォームは,モジュール化され,カスタマイズできる貿易ページ.あなたは自由に様々なデータモジュールと取引機能モジュールを追加し,独自のコードモジュール (取引端末プラグイン) を開発することもできます.非常に柔軟で無料の使用により,手動取引と半プログラム取引のユーザーを非常に便利にします. Tradeページのさまざまなモジュールは,ドラッグして拡大し,モジュールにリンクされた取引ペアと取引所の設定を変更し,同じタイプの複数のモジュールを追加することができます.

img

デバッグツール

デバッグツールボットによってコードを迅速にテストするための環境を提供します.JavaScript currently.

img

リモート編集

FMZ Quant トレーディング プラットフォームへのローカルエディタ リモート同期戦略コードをサポートし,Sublime Text/Atom/Vim/VSCode戦略編集ページで,現在の戦略のリモート同期キー (トークン) を表示するためにプラグインダウンロードアドレスボタンを開くために"リモート編集"をクリックします.

img

現在のキー表示をリフレッシュするには"更新キー"をクリックし,現在の戦略の秘密キー (トークン) を削除するには"削除キー"をクリックします.

img

異なるエディタのプラグインのインストール方法は少し異なります. 特定のリモート同期プラグイン項目にジャンプするためにダウンロードボタンをクリックできます.

img

ボットパラメータ 輸入&輸出

img

リアルボット設定のパラメータデータを保存する必要があります. 輸出ボタンをクリックできます. 輸出された戦略パラメータは,保存されますJSON保存された戦略ボットパラメータを現在のボットにインポートするには,インポートボタンをクリックします.その後,保存するには保存をクリックします.

戦略 輸入 輸出 ファイル

img

  • ソースコードをダウンロード 戦略ソースコードをエクスポートすると,輸出ファイルのタイプは戦略プログラミング言語に基づきます. JavaScript 戦略は拡張子を持つファイルをエクスポートします.js拡張子を持つファイルを輸出する.pyC++ 戦略は拡張子を持つファイルをエクスポートしますcppMylanguage 戦略は拡張子を持つファイルをエクスポートします.txt戦略パラメータ,テンプレート参照などを含まない戦略ソースコードのみが輸出されていることに注意してください.

  • 輸出戦略 戦略のソースコードやパラメータ設計などのすべての戦略情報を含む完全な戦略を輸出します.xml file.

  • 輸入戦略 試しにxml戦略編集ページの"インポート"ボタンをクリックしてxmlストラテジーを保存するには 保存ボタンをクリックします.

多言語サポート

戦略の名前や戦略パラメータの記述はChinese|Englishウェブページが自動的に認識する言語で表示されます.

img

img

他の場所 例えば:戦略の説明, 使用説明書そして他の文献でMarkdownフォーマット[trans]Chinese|English[/trans]または[trans]Chinese||English[/trans]自動認識の効果も達成できます.上記の例の効果は次の図に示されています.

  • 中国語版のページ表示:img

  • 英語のページ表示:img

言語を切り替えた後,ウェブページをリフレッシュした後,効果が表示されます.

戦略コードに文字列を書き込むことができる関数も,関数などの言語切り替えをサポートします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]");
}

WexApp シミュレーションマーケット

  • 24時間連続で 強力な取引マッチングシステムで リアル取引をシミュレートします
  • 強力なマーケットメーカリングボットで 流動性もオーダーボックスの深さも
  • 完全なAPIインターフェースサポート, FMZ Quantでシミュレーションされた定量取引のためにテストできるだけでなく,自分でAPIインターフェイスに接続することができます. アドレス:ウェックスアプリ.

Docker プログラムのパラメータ

ドッカーソフトウェアをダウンロードした後,デコンプレッション後の実行ファイル (ファイル名:robot) はドッカープログラムであり,ドッカープログラムを展開する際に,ドッカープログラムにパラメータを指定することができます.

  • -v: 現在のドッカープログラムのバージョンとコンパイル時間を含む情報をチェックします. 実行命令はApple Mac System: ./robot -v.
  • -s: ドッカープログラムを実行する際にFMZ Quant Tradingプラットフォームと通信するために指定されたアドレス. 実行命令はApple Mac System: ./robot -s node.fmz.com/xxxxxxx; xxxxxxxFMZ 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 を生み出します.
  • 復習関数呼び出しの層が多すぎると coroutines のスタックサイズが超過します
  • インターフェース業務エラーやネットワーク要求エラーなど.そのようなエラーメッセージは,関連する交換オブジェクト名,機能名,エラー関連メッセージおよび理由,その他の情報を含む情報を表示します.そのようなエラーは実際の取引の異常な停止を引き起こすことはありません (そのようなエラーは通常原因ですが,直接的な原因ではありません.直接的な原因は通常,取引の停止です.合法性を判断するためのインターフェース返却値なしで直接使用によって引き起こされるプログラム例外).
  • プラットフォームの下層の誤り,一般的な例はDecrypt: Secret key decrypt failedFMZアカウントのパスワードを変更すると,すべての設定された取引が失敗します.API KEY問題を解決するために,API KEYドーカーは再起動する必要があります.
  • Python 戦略をレンタルする際に,プラットフォームで暗号化された Python と戦略実行時の Python のバージョン互換性によるエラーが報告されます.ValueError: bad marshal data (unknown type code). 戦略によって実行される Python 環境を戦略によってサポートされるバージョンの 1 つにアップグレードまたはインストールする:Python 2.7, Python 3.5そしてPython 3.6.
  • interruptユーザがクリックするのでロボットを停止ボットページのボタンは,プログラムが操作を行うとき (プラットフォームインターフェイスにアクセスするなど),ボットが停止し,現在の操作によって印刷されたエラーメッセージを中断します.このエラーには効果がありません.それは単なるログ記録です.

ボットと戦略のグループ化

FMZ Quant トレーディングプラットフォームの Botページと Strategyページをクリックできますグループ設定グループで戦略と実際の取引を管理する右のボタンをクリックします.テンプレート, JavaScript 戦略そしてバックテストの戦略3つのグループに分けられます

サブアカウント & ライブボット

副口座 プラットフォームにログインした後, ダッシュボードアカウントをクリックして FMZ アカウント [管理ページ] にジャンプします (https://www.fmz.com/m/account追加されたサブアカウントがアクセスできるボットを選択します.利用可能な権限管理し,サブアカウントを設定します.ユーザー名そしてサブアカウントのログインパスワードについてユーザー情報control. 副アカウントを作成するには サブメンバーを追加するボタンをクリックします. 追加されたサブアカウントは現在のページに表示され, 変更, ロック/ロック解除,および 削除することができます.

サブアカウントには制限された権限があります.利用可能な権限副口座から確認できます 権限のあるボットは,パラメータを変更し,ライブ取引を停止し,再起動する権限がありますが,ボットによって設定された交換オブジェクトを変更することはできません.サブアカウントの使用シナリオは通常:

  • A. 定量的なチームが複数のボット戦略を管理するときにログインして管理することは便利です.
  • B. 戦略がレンタルされる時にデバッグする

ライブ・トレード・ビュー FMZプラットフォームのボットリストボットページ公開ボタンをクリックすると,現在の行のボットが公開されます.現在,ライブボットを表示するには2つの方法があります.

    1. [ライブ ビュー] (https://www.fmz.com/live公開ボタンをクリックして,FMZのプラットフォームで公開されたページを選択します.公共のシェア.
    1. プライベートリンクを作成します. 公開ボタンをクリックして内部 シェア戦略ボットのプライベートライブビューページにログインするプライベートリンクを生成するために有効期間を設定できます.

戦略 共有 & 賃貸

そのまま戦略戦略の右側にある Actionボタンをクリックすると,ポップアップするメニューには共有とレンタリングのオプションがあります.

戦略の共有

  • 公共の共有 共有ボタンをクリックすると,ダイアログボックスがポップアップし, 公開共有を選択できます. この戦略はプラットフォームの"より多くの戦略"で完全に共有され, どのユーザーも戦略をコピーできます.

  • 内部共有 共有ボタンをクリックすると,ダイアログボックスがポップアップし,内部共有を選択できます. 株式の有効期間と株式の数を選択した後,コピーページのアドレスそしてコピーコード戦略の生成されます. 指定されたFMZプラットフォームユーザーに配布できます. この戦略を必要とするユーザーは,コピーページのアドレスリンク,ログインコピーページ戦略を取得すると,自動的に"戦略"ページに表示されます.

戦略 家賃

  • 公開販売 レンタルボタンをクリックすると,ダイアログボックスがポップアップし,公開販売を選択できます. 戦略はリストに適用できます (承認の対象).

  • 内部販売 Rentボタンをクリックすると,ダイアログボックスはポップアップし,あなたは"内部販売"を選択することができます.登録ページのアドレスそして戦略トークンこの戦略が生成される.それは指定された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); 取引所によって定義されたコードは:link3susdtFMZが取引ペアを設定するときに書き込まれます.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("クロス",


もっと