В процессе загрузки ресурсов... загрузка...

Инструкции по API FMZ

Автор:Нуль, Создано: 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 ((Нид)

DeleteNode(Nid)Удаление узла докера (IDэтоNid) соответствуетAPI KEYв запросе счета платформы торговли FMZ Quant.

  • ПараметрNidимеет тип целого числа, а именно докерID.

  • Возвратная стоимость

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

УдалитьRobot(...)

DeleteRobot(RobotId, DeleteLogs)удаляет робота с указанным идентификатором (робот)ID: RobotId) соответствуетAPI KEYв запросе по счету FMZ Quant.

  • ПараметрRobotIdявляется целого типа, а именно роботIDУбрать.DeleteLogsявляется булевым типом;DeleteLogsчтобы решить, удалить журнал или нет;trueуказывает на удаление журнала.

  • Возвратная стоимость

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

GetStrategyList ((()

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 ((Настройки)

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интерфейс (для только одного объекта обмена может быть поддержан при использовании страницы 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 KEYв запросе счета FMZ Quant.

  • Параметр

    Наименование параметра Тип Примечания
    robotId цельное число Идентификатор бота

    таблица ЖурналЗадает запрос на данные журнала таблицы базы данных:

    Наименование параметра Тип Примечания
    LogMinId цельное число Минимальный идентификатор журнала
    logMaxId цельное число Максимальный идентификатор журнала
    LogOffset цельное число После того, как диапазон определяется logMinId и logMaxId, смещение logOffset (сколько записей пропустили) начинает использоваться в качестве исходного положения для получения данных
    LogLimit цельное число После определения исходной позиции количество выбранных записей данных

    Таблица Прибыльзадает запрос на данные о прибыли в таблице базы данных:

    Наименование параметра Тип Примечания
    Прибыль цельное число Минимальный идентификатор записи
    прибыльMaxId цельное число Максимальный идентификатор записи
    ПрибыльОфсет цельное число Сдвиг (сколько записей пропущено) начинает использоваться в качестве исходной позиции
    ПрибыльОграничение цельное число После определения исходной позиции количество выбранных записей данных

    Таблица Графикзадает запрос на данные диаграммы в таблице базы данных:

    Наименование параметра Тип Примечания
    График цельное число Минимальный идентификатор записи
    диаграммаMaxId цельное число Максимальный идентификатор записи
    ГрафикОффсет цельное число Компенсация
    ГрафикОграничение цельное число количество записей, которые необходимо получить
    chartUpdateBaseId цельное число Запрос обновленного идентификатора базы
    ТаблицаUpdateDate цельное число Запись данных обновляет временную метку, которая отфильтровывает записи больше, чем эта временная метка

    Резюмезапросы данных строки состояния:

    Он запрашивает данные строки состояния бота. Тип параметра является целым числом. Настройка на 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, "", ""]
    ],
    
    Идентификатор logType (тип журнала) Еда Упорядочен цены сумма Дополнительная дата контракт Тип направление
    3977 3 Фьючерсы_OKCoin "" 0 0 Продажа ((688.9, 2): 20016 1526954372591 "" ""
    3976 5 "" "" 0 0 OKCoin:this_week слишком много позиций, длинный: 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 для выполнения, и поддерживать возвращение графиков и таблиц (инструмент отладки также может поддерживать после обновления).инструмент отладкиОн может реализовать некоторые простые небольшие функции, сложные стратегии все еще должны работать в реальной торговле.

Создание плагинов

На странице Новая стратегия установить тип стратегии на: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 минут.

Инструмент анализа альфа-фактора

Введение

Формула анализа относится к методу расчета рыночной котировки в публичном доступе.alpha101изworldquant: http://q.fmz.com/chart/doc/101_Formulaic_Alphas.pdf, который в основном совместим с его грамматикой (с объяснениями не реализованных особенностей), и был улучшен. Он используется для быстрого выполнения расчетов по временным рядам и проверки идей.Использовать адрес.

Введение страницы:

img

Функции и операторы

"{}" ниже представляет собой местоимение, все выражения не являются чувствительными к буквам, а x представляет собой временные ряды данных

  • abs(x), log(x), sign(x)буквально означает абсолютное значение, логарифм и знаковую функцию соответственно.

Следующие операторы, в том числе:+, -, *, /, >, <, также соответствуют значениям их стандартов;==обозначает равное или не равное;||означает или;x? y: zобозначает трехсторонний оператор.

  • rank(x): ранжирование поперечных сечений, с возвратом процента местоположения; необходимо указать несколько целевых групп кандидатов, которые не могут быть рассчитаны для единого рынка и напрямую возвращают исходный результат.
  • delay(x, d): значение перед периодом d последовательности.
  • sma(x, d): простая скользящая средняя d периода последовательности.
  • correlation(x, y, d): коэффициент корреляции временных рядов x и y за последние d периоды.
  • covariance(x, y, d): ковариантность временных рядов x и y в прошлых d периодах.
  • 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-1, d-2... 1 (нормализованная).
  • indneutralize(x, g): нейтральная обработка для отраслевой классификации g, в настоящее время не поддерживается.
  • ts_{O}(x, d): выполнять операции O на временных рядах x в прошлых d периодах (O может конкретно представлять min и max и т. д., введенные позже), 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): сортировка значений временных рядов x прошлых d периодов (процентная сортировка).
  • 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)]В дополнение к вводу данных временных рядов, он также может быть использован в качестве простого калькулятора.

Приложение

Общий протокол

Для платформы FMZ Quant Trading, которая еще не инкапсулировала интерфейс API биржи, к ней можно получить доступ, написав плагин-программу общего протокола.

Разница междуFIXПротокол плагин-программы иRESTпротокольная плагин-программа представляет собой только взаимодействие между протокольной плагин-программой и интерфейсом обмена. Протокольная плагин-программа имеет такую же детальную обработку взаимодействия докерной программы и формат данных, как FMZ Quant. Для подробности, пожалуйста, обратитесь к примерам в приведенных выше ссылках.

Торговый терминал

Платформа FMZ Quant Trading предоставляет модульный и настраиваемыйТорговляВы можете свободно добавлять различные модули данных и модули торговых функций, и даже разрабатывать свои собственные модули кода (плагины торговых терминалов). Различные модули на странице Trade можно перетаскивать и увеличивать, можно изменять настройки торговых пар и бирж, связанных с модулями, и можно добавлять несколько модулей одного типа.

img

Инструмент отладки

Инструмент отладкистраница предоставляет среду для быстрого тестирования кодов ботом, поддерживая толькоJavaScript currently.

img

Удалённое редактирование

Он поддерживает локальный редактор удаленного синхронизации стратегии кода к FMZ Quant Trading платформы, и он поддерживаетSublime Text/Atom/Vim/VSCodeНа странице редактирования стратегии нажмите Remote Edit, чтобы развернуть кнопку адреса загрузки плагина, чтобы отобразить удаленный ключ синхронизации (токен) текущей стратегии.

img

Нажмите Ключ обновления для обновления отображения текущего ключа и нажмите Ключ удаления для удаления секретного ключа (токона) текущей стратегии.

img

Способы установки плагина различных редакторов немного отличаются. Вы можете нажать кнопку загрузки, чтобы перейти к конкретному элементу плагина удаленной синхронизации.

img

Параметры бота Импорт и экспорт

img

При запуске живой торговли, вам нужно сохранить параметры данных реальной конфигурации бота, вы можете нажать кнопку Export.JSONфайл, и экспортированная конфигурация параметров стратегии также может быть импортирована в реальный бот снова. Нажмите кнопку Import для импорта сохраненных параметров стратегии бота в текущий реальный бот. Затем нажмите Save для сохранения.

Стратегия Импорт и экспорт файлы

img

  • Скачать исходный код Экспорт исходного кода стратегии, и тип экспортного файла основан на языке программирования стратегии.js; стратегия python экспортирует файлы с расширениемpy; Стратегия C++ экспортирует файлы с расширениемcpp; Стратегия Mylanguage экспортирует файлы с расширениемtxt. Обратите внимание, что экспортируется только исходный код стратегии, не включая параметры стратегии, ссылки на шаблоны и т. д.

  • Стратегия экспорта Экспорт полной стратегии, включая всю информацию о стратегии, такую как исходный код стратегии и дизайн параметров.xml file.

  • Стратегия импорта Используйтеxmlфайл экспортируется функцией Export, и нажмите кнопку Import на странице редактирования стратегии, чтобы выбрать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 самостоятельно, адрес:WexApp.

Параметры программы Docker

После загрузки докерного программного обеспечения, исполняемый файл после декомпрессии (наименование файла:robot) является программой докера; параметры могут быть указаны для программы докера при развертывании докера.

  • -v: проверьте информацию, включая версию и время компиляции текущей программы докера. Полная команда исполнения основана наApple Mac System: ./robot -v.
  • -s: адрес, указанный для связи с платформой FMZ Quant Trading при запуске программы докера. Полная команда исполнения основана наApple Mac System: ./robot -s node.fmz.com/xxxxxxx; xxxxxxxявляется уникальным идентификационным идентификатором каждого счета на платформе FMZ Quant Trading; после выполнения команды будет предложено ввести пароль для соответствующей платформы FMZ Quant Trading.
  • -p: вы можете напрямую указать параметр в команде run для ввода пароля, что не рекомендуется, потому что параметр пароля останется в текущей системе записи.node.fmz.com/xxxxxxxявляется:abc123456- Да. Полная команда исполнения основана наApple Mac System: ./robot -s node.fmz.com/xxxxxxx -p abc123456.
  • -n: присоедините информацию об этикетке к запущенной программе докера. Полная команда исполнения основана наApple Mac System: ./robot -n macTest -s node.fmz.com/xxxxxxxБудет...macTestтекстовый ярлык в информации докера на странице управления докером платформы.
  • -l: распечатать список обмена, поддерживаемый текущим докером. Полная команда исполнения основана наApple Mac System: ./robot -l, т.е. можно выводить названия поддерживаемых бирж.

Частые причины ошибки бота и ненормального выхода

  • Стратегия статические грамматические ошибки (такие ошибки очевидны, и обычно вы можете увидеть знак ошибки на странице редактирования стратегии), которые могут быть найдены и исправлены во время обратного теста.
  • Ошибки выполнения стратегии, наиболее распространенным примером является прямое использование значения возврата функции без юридического суждения.
  • Слишком много содержимого, которое не может быть собрано в мусор, хранится в глобальных переменных, что приводит к чрезмерному использованию памяти.
  • При использовании асинхронныхexchange.GoФункция, нет разумногоwaitждать окончания корротины во время операции, что приводит к большому количеству корротинов.
  • Слишком много слоев рекурсивных вызовов функций вызывают превышение размера стека корутин.
  • Ошибки в работе интерфейса и ошибки в запросе сети и т. д.; такие сообщения об ошибках отображают информацию, включая соответствующие имена объектов обмена, имена функций, сообщения и причины, связанные с ошибками, и другую информацию. Такие ошибки не вызывают ненормального остановки в фактической торговле (такие ошибки обычно являются причинами, но не прямыми причинами.Исключения программы, вызванные прямым использованием без интерфейса, возвращающего значение для оценки законности).
  • Ошибки подслоя платформы, распространенный примерDecrypt: Secret key decrypt failedПричина ошибки заключается в том, что изменение пароля учетной записи FMZ вызывает все настроенныеAPI KEYЧтобы решить эту проблему,API KEYНужно переконфигурировать, а докер нужно перезапустить.
  • При аренде стратегии Python сообщается о ошибке из-за несовместимости версий между Python, зашифрованной платформой, и Python во время выполнения стратегии:ValueError: bad marshal data (unknown type code). Обновление или установка среды Python, управляемой стратегией, на одну из версий, поддерживаемых стратегией:Python 2.7, Python 3.5иPython 3.6.
  • interruptошибка; ошибка происходит потому, что пользователь нажимаетОстанови ботакнопка на странице бота, когда программа выполняет операцию (например, доступ к интерфейсу платформы), и бот останавливает и прерывает сообщение об ошибке, напечатанное текущей операцией.

Группировка ботов и стратегии

На странице Bot и Strategy платформы FMZ Quant Trading можно нажатьНастройка группыНапример, для группового настройки стратегий,Образец, Стратегия JavaScriptиСтратегия обратного тестированиямогут быть разделены на три группы соответственно.

Подаккаунт и живый бот

Подсчет После входа в платформу нажмите Дашборд и Акаунт, чтобы перейти к учетной записи FMZ [страница управления] (https://www.fmz.com/m/accountНажмите Подсчет для просмотра страницы создания подсчета, выберите бота, к которому может получить доступ добавленный подсчет вдоступные разрешенияКонтроль и установка подсчетовимя пользователяипароль для входа в субсчетвинформация о пользователеКонтроль. Нажмите кнопку Добавить подчлена для создания подсчета. Добавленный подсчет будет отображаться на текущей странице и может быть изменен, заперт/разблокирован и удалён.

Подаккаунты имеют ограниченные разрешения; только авторизованные боты в настройкахдоступные разрешенияможно увидеть на подсчетах. Авторизованный бот имеет право изменять параметры, останавливать и возобновлять прямую торговлю, но он не может изменять объект обмена, настроенный ботом.

  • A. Удобно войти и управлять, когда количественная команда управляет несколькими стратегиями ботов.
  • B. Исправление ошибок, когда стратегия продается.

Вид торговли в реальном времени В списке ботов платформы FMZСтраница бота, нажмите кнопку Public для публичного отображения ботов текущей строки.

    1. Показать ботов на [Live View] (https://www.fmz.com/live) страницы, опубликованной на платформе FMZ, после нажатия кнопки Public и выбораДоля общественности.
    1. Создать личную ссылку для просмотра. После нажатия кнопки Public и выбораВнутренняя доля, вы можете установить срок действия для генерации частной ссылки для входа на страницу частного живого просмотра бота стратегии.

Совместное использование стратегии и аренда

НаСтратегияПосле нажатия кнопки Action в правой части стратегии, в появляющемся меню появятся параметры для совместного использования и аренды.

Совместное использование стратегии

  • Общественное распространение После нажатия кнопки Sharing, всплывет диалоговое окно, и вы можете выбрать Public Sharing, так что стратегия полностью разделена на платформах More Strategies, и любой пользователь может скопировать стратегию.

  • Внутреннее совместное использование После нажатия кнопки Sharing в окне диалога появится опция Internal Sharing.Адрес страницы копированияиКод копированияВ этом случае будет создана стратегия, которая может быть распределена между пользователями платформы FMZ.Адрес страницы копированияссылка, чтобы войти вкопия страницыПосле получения стратегии, она будет отображаться на странице Стратегия автоматически.

Стратегия аренды

  • Публичная продажа После нажатия кнопки Rent всплывает диалоговое окно, и вы можете выбрать Public Sale.

  • Внутренняя продажа После нажатия кнопки 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
    }
}

Специальные инструкции по обмену

  • Фьючерсы_Binance Он поддерживает режим двойной позиции фьючерсов 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 Он поддерживает изменение адреса Huobi Futures участвующих в подписи, который не переключается по умолчанию.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());
    }
    
  • ОКX Интерфейс 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("кросс",


Больше