리소스 로딩... 로딩...

FMZ API 지침

저자:제로, 제작: 2020-04-20 10:19:00, 업데이트: 2023-04-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(Nid)

DeleteNode(Nid)도커 노드를 삭제합니다 (IDNid) 에 해당하는API KEYFMZ 퀀트 거래 플랫폼 계정의 요청에

  • 매개 변수Nid정수 타입입니다. 즉 도커ID.

  • 반환 값

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

DeleteRobot(...)

DeleteRobot(RobotId, DeleteLogs)지정된 ID (로봇) 를 가진 로봇을 삭제합니다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 퀀트 거래 플랫폼 계정의 요청에

  • 매개 변수 아무 것도 없습니다

  • 반환 값

    {
        "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객체 유형SettingsJSON로봇이 구성한 객체입니다.

    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.

  • 매개 변수SettingsJSON즉 디버깅 도구의 설정 (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인터페이스 (Debug Tool 페이지를 사용할 때 하나의 교환 객체만 지원할 수 있습니다.)설정, 하지만 두 번째 교환 객체에 액세스 할 때 오류가 보고됩니다.

  • 반환 값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(...)

GetRobotLogs(robotId, logMinId, logMaxId, logOffset, logLimit, profitMinId, profitMaxId, profitOffset, profitLimit, chartMinId, chartMaxId, chartOffset, chartLimit, chartUpdateBaseId, chartUpdateDate, summaryLimit)로봇 로그 정보를 얻습니다 (로봇ID: robotId),API KEYFMZ Quant 계정의 요청에

  • 매개 변수

    매개 변수 이름 종류 언급
    로봇 정수 봇 아이디

    테이블 로그데이터베이스 테이블의 로그 데이터를 검색합니다:

    매개 변수 이름 종류 언급
    logMinId 정수 로그의 최소 ID
    logMaxId 정수 최대 로그 ID
    로그 오프셋 정수 범위가 logMinId와 logMaxId에 의해 결정된 후, logOffset 오프셋 (몇 개의 레코드가 건너뛰어) 은 데이터를 얻기 위한 출발 위치로 사용되기 시작합니다.
    logLimit 정수 출발 위치를 결정한 후 선택된 데이터 레코드 수

    표 수익데이터베이스 테이블의 수익 데이터를 검색합니다.

    매개 변수 이름 종류 언급
    이익 정수 기록의 최소 ID
    이윤MaxId 정수 최대 레코드 ID
    수익 오프셋 정수 오프셋 (몇 개의 레코드가 건너뛰어) 시작 위치로 사용되기 시작합니다
    이익 제한 정수 출발 위치를 결정한 후 선택된 데이터 레코드 수

    표 도표데이터베이스 테이블의 차트 데이터를 검색합니다.

    매개 변수 이름 종류 언급
    차트 정수 기록의 최소 ID
    차트MaxId 정수 최대 레코드 ID
    차트 오프셋 정수 오프셋
    chartLimit 정수 취득해야 할 기록의 수
    chartUpdateBaseId 정수 업데이트 된 기본 ID를 검색
    chartUpdateDate (차트 업데이트 날짜) 정수 데이터 레코드는 시간표를 업데이트, 이 시간표보다 더 큰 레코드를 필터

    요약 제한상태 표시줄의 데이터를 검색합니다.

    그것은 봇의 상태 표시줄 데이터를 질의합니다. 매개 변수 유형은 정수입니다. 0로 설정하면 상태 표시줄 정보를 질의 할 필요가 없으며 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 로그 타입 eid 명령 가격 금액 추가 날짜 계약 유형 방향
    3977 3 미래상품_OKCoin "" 0 0 판매 ((688.9, 2): 20016 1526954372591 "" ""
    3976 5 "" "" 0 0 OKCoin:this_week too many positions, long: 2 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-라인 데이터입니다.

거래 플러그인

소개

거래 터미널의 기능을 개선하고 수동 거래를 촉진하기 위해 플러그인 기능이 이제 제공됩니다. 위치는 다음과 같습니다.

img

플러그인의 원리

원리는 디버깅 도구와 동일합니다: 실행하기 위해 Trade 터미널 페이지의 도커에 코드 한 조각을 보내고 차트와 테이블의 반환을 지원합니다.디버깅 도구, 그것은 단지 3 분 동안 실행 될 수 있습니다, 충전없이. 그것은 몇 가지 간단한 작은 기능을 실현 할 수 있습니다, 복잡한 전략은 여전히 실제 거래에서 실행해야합니다.

플러그인 작성

새 전략 페이지에서 전략 유형을 설정합니다: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

    더 많은 전략에는 다른 예가 있습니다.소량으로 구매/판매, 전략 주소.

사용 방법

  • 거래 단말기의 플러그인 모듈을 추가 그림과 같이, Trade 터미널 페이지에서 모듈 추가 메뉴를 열고,전략 라이브러리현재 FMZ 계정 목록에서 자동으로 표시됩니다, 추가 할 플러그인을 찾아 Add을 클릭합니다.

    img

  • 플러그인을 실행 Execute를 클릭하면 거래 단말기 플러그인이 실행됩니다. 플러그인은 로그를 표시하지 않지만 표시 테이블을 반환 할 수 있습니다.

  • 플러그인을 실행하는 시간 플러그인의 최대 실행 시간은 3분이고, 3분 이상 지나면 자동으로 실행을 멈추게 됩니다.

알파 인자 분석 도구

소개

분석 공식은 시장 코팅 계산 방법을 가리킨다.alpha101worldquant: 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의 covariance.
  • scale(x, a): 데이터를 정상화하여sum(abs(x)) = a(a 기본값은 1).
  • 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): 산업 분류를 위한 중립 처리 g, 현재 지원되지 않습니다.
  • ts_{O}(x, d): 지난 d 기간에 시간 계열 x에 O 연산을 수행 (O는 구체적으로 minmax 등을 나타낼 수 있으며 나중에 소개됩니다), d은 정수로 변환됩니다.
  • 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 퀀트 트레이딩 플랫폼은 모듈화되고 사용자 정의 가능한무역페이지. 당신은 자유롭게 다양한 데이터 모듈과 거래 기능 모듈을 추가 할 수 있으며 심지어 자신의 코드 모듈 (거래 단말기 플러그인) 을 개발 할 수 있습니다. 매우 유연하고 무료 사용으로 수동 거래 및 반 프로그램 거래의 사용자를 크게 용이하게합니다. Trade 페이지의 다양한 모듈을 끌고 확대할 수 있고, 모듈에 묶인 거래 쌍과 거래소의 설정을 수정할 수 있으며, 같은 유형의 여러 모듈을 추가할 수 있습니다.

img

디버깅 도구

디버그 도구이 페이지는 로봇에 의해 코드를 빠르게 테스트하는 환경을 제공합니다.JavaScript currently.

img

원격 편집

그것은 FMZ 양 거래 플랫폼에 로컬 편집자 원격 동기화 전략 코드를 지원하고, 그것은 지원Sublime Text/Atom/Vim/VSCode전략 편집 페이지에서 Remote Edit을 클릭하여 플러그인 다운로드 주소를 펼치면 현재 전략의 원격 동기화 키 (토큰) 를 표시할 수 있습니다.

img

현재 키 표시를 갱신하기 위해 업데이트 키를 클릭하고, 현재 전략의 비밀 키 (토큰) 를 삭제하기 위해 삭제 키를 클릭합니다.

img

서로 다른 편집기의 플러그인 설치 방법은 약간 다릅니다. 다운로드 버튼을 클릭하면 특정 원격 동기화 플러그인 항목으로 이동할 수 있습니다.

img

봇 매개 변수 수입 & 수출

img

라이브 트레이딩을 실행할 때, 당신은 실제 봇 구성의 매개 변수 데이터를 저장해야합니다, 당신은 출력 버튼을 클릭 할 수 있습니다. 수출 전략 매개 변수는 저장됩니다JSON파일, 그리고 수출된 전략 파라미터 구성 또한 실제 봇에 다시 수입할 수 있습니다. 현재 실제 봇에 저장된 전략 봇 파라미터를 수입하기 위해 이포트 버튼을 클릭합니다. 다음, 저장하기 위해 를 클릭합니다.

전략 수입 & 수출 파일

img

  • 소스 코드를 다운로드 전략 소스 코드를 수출하고, 수출 파일의 유형은 전략 프로그래밍 언어를 기반으로 합니다. 자바스크립트 전략은 확장자를 가진 파일을 수출js; 파이썬 전략은 확장자를 가진 파일을 수출py; C++ 전략은 확장자를 가진 파일을 수출cpp; MyLanguage 전략은 확장자를 가진 파일을 내보냅니다.txt. 전략 매개 변수, 템플릿 참조 등을 포함하지 않고 전략 소스 코드만 수출된다는 점에 유의하십시오.

  • 수출 전략 전체 전략을 내보낼 수 있습니다. 전략 소스 코드 및 매개 변수 설계와 같은 모든 전략 정보를 포함합니다.xml file.

  • 수입 전략 사용xml출력 함수에 의해 내보낸 파일, 그리고 전략 편집 페이지에서 이포트 버튼을 클릭하여xml즉, 당신은 전체 전략을 가져올 수 있습니다. 수입 후, 당신은 전략을 저장하기 위해 Save 버튼을 클릭해야합니다.

다국어 지원

전략 이름과 전략 매개 변수 설명은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]");
}

벡스앱 시뮬레이션 시장

  • 24시간 연속 운영, 강력한 거래 매칭 시스템, 실제 거래 시뮬레이션
  • 강력한 시장 제작 봇으로 유동성도 좋고 주문부도 깊습니다.
  • 완전한 API 인터페이스 지원, 뿐만 아니라 FMZ 양을 시뮬레이션 양적 거래에 테스트 할 수 있습니다, 또한 API 인터페이스에 직접 연결 할 수 있습니다, 주소:WexApp.

도커 프로그램 매개 변수

도커 소프트웨어를 다운로드 한 후, 실행 파일은 압축 해제 후 (파일 이름:robot) 는 도커 프로그램입니다. 도커 프로그램을 배포할 때 도커 프로그램에 대한 매개 변수를 지정할 수 있습니다.

  • -v: 현재 도커 프로그램의 버전과 컴파일 시간을 포함한 정보를 확인합니다. 전체 실행 명령어는Apple Mac System: ./robot -v.
  • -s: 도커 프로그램을 실행할 때 FMZ 퀀트 트레이딩 플랫폼과 통신하기 위해 지정된 주소. 전체 실행 명령어는Apple Mac System: ./robot -s node.fmz.com/xxxxxxx; xxxxxxxFMZ 양자 거래 플랫폼의 각 계정의 고유 식별 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작업 중 코로루틴이 끝날 때까지 기다립니다. 많은 수의 코로루틴이 발생합니다.
  • 반복 함수 호출의 너무 많은 계층이 coroutines의 초과된 스택 크기를 유발합니다.
  • 인터페이스 비즈니스 오류 및 네트워크 요청 오류 등; 이러한 오류 메시지는 관련 교환 객체 이름, 함수 이름, 오류 관련 메시지 및 이유 및 기타 정보를 포함하여 정보를 표시합니다. 이러한 오류는 실제 거래에서 비정상적 인 중단을 일으키지 않습니다 (이런 오류는 일반적으로 원인과 직접적인 원인은 아닙니다. 직접적인 원인은 일반적으로프로그램 예외를 직접 사용으로 인한 인터페이스 반환 값이 아닌 합법성을 판단).
  • 플랫폼 하층 오류, 일반적인 예는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 계정 [관리 페이지]로 이동합니다. (https://www.fmz.com/m/account). 하위 계정 생성 페이지를 보기 위해 하위 계정을 클릭 하 여 추가 하위 계정에서 액세스 할 수 있는 봇을 선택사용 가능한 권한통제 및 하위 계정을 설정사용자 이름그리고하위 계정 로그인 비밀번호사용자 정보제어. 하위 계정을 생성하기 위해 부회원 추가 버튼을 클릭하십시오. 추가 하위 계정은 현재 페이지에 표시되며 변경, 잠금/해제, 그리고 삭제 할 수 있습니다.

하위 계정은 제한된 권한이 있습니다.사용 가능한 권한부계좌에서 볼 수 있습니다. 승인 된 봇은 매개 변수를 수정하고 실시간 거래를 중지하고 다시 시작할 권한을 가지고 있지만 봇이 구성한 교환 객체를 수정할 수 없습니다. 하위 계정의 사용 시나리오는 일반적으로 다음과 같습니다.

  • A. 양적 팀이 여러 봇 전략을 관리할 때 로그인하고 관리하는 것이 편리합니다.
  • B. 전략이 임대될 때 디버깅

라이브 트레이딩 보기 FMZ 플랫폼의 봇 목록봇 페이지, 현재 행의 봇을 공개적으로 표시하기 위해 Public 버튼을 클릭합니다. 현재 실시간 봇을 볼 수있는 두 가지 방법이 있습니다.

    1. [라이브 뷰]에 로봇을 표시 (https://www.fmz.com/live공개 버튼을 클릭한 후 FMZ 플랫폼에서 게시된 페이지대중의 몫.
    1. 비공개 링크를 생성합니다. 공개 버튼을 클릭하고내부 점유율, 당신은 전략 봇의 개인 라이브 뷰 페이지에 로그인하기 위해 개인 링크를 생성하는 유효 기간을 설정할 수 있습니다.

전략 공유 및 임대

시작전략페이지, 전략의 오른쪽에있는 Action 버튼을 클릭 한 후, 팝업 메뉴는 공유 및 임대 옵션을 가지고 있습니다.

전략 공유

  • 공개 공유 공유 버튼을 클릭하면 대화 상자가 팝업되며, 공유을 선택할 수 있습니다.

  • 내부 공유 공유 버튼을 눌러면 대화 상자가 열리고, 내부공유을 선택할 수 있습니다.복사 페이지 주소그리고복사 코드이 전략이 생성됩니다. 그것은 지정된 FMZ 플랫폼 사용자에게 배포 될 수 있습니다. 이 전략이 필요한 사용자는복사 페이지 주소링크, 로그인복사 페이지그리고 전략을 얻기 위해 복사 코드를 입력합니다. 전략을 얻으면 자동으로 전략 페이지에 표시됩니다.

전략 임대

  • 공공판매 임대 버튼을 클릭 한 후 대화 상자가 팝업되며, 공중 판매를 선택할 수 있습니다. 이 전략은 목록에 적용 될 수 있습니다.

  • 내부 판매 Rent 버튼을 클릭 한 후, 대화 상자가 팝업 하 고, 당신은 Internal Sale를 선택할 수 있습니다. 사용 할 날 수, 최대 동시 수 및 전략 토큰 수를 선택 한 후,등록 페이지 주소그리고전략 토큰이 전략이 생성됩니다. 그것은 지정된 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("크로스",


더 많은