O recurso está a ser carregado... Carregamento...

Interface API estendida

A FMZ Quant abriu a interface API estendida da plataforma para suportar chamadas programáticas para várias funções da FMZ Quant Trading Platform.

Criar ApiKey

A plataforma de negociação quantitativa FMZ suporta a gestão de permissões do interface API estendida, e a permissão deAPI KEYNa opção API interface nas Configurações da conta (https://www.fmz.com/m/account) página da plataforma, clique no Criar novo botão ApiKey para criar a extensãoAPI KEY.

Você pode editar a caixa de entrada API Permission ao criar umAPI KEY, e entrar no*símbolo para permitir que todosInterface API estendidaPermissões. Se você quiser especificar permissões de interface específicas, você precisa inserir o nome da função API estendida correspondente. Use vírgulas para separar, por exemplo:GetRobotDetail,DeleteRobotIsto dá-nos isto.API KEYa autorização para chamar oObtenha informações detalhadas de negociação ao vivoInterface eExcluir negociação em tempo real interface.

OAPI KEYpágina de gestão também permite que vocêModificar, desativar, excluirO criadoAPI KEY.

Código de retorno da interface API estendida

Um exemplo da estrutura devolvida pela interface API estendida é o seguinte:

    "code":0,
    "data":{
        // ...
    }
}

Ocodecampo is: O código de estado do resultado da chamada retornado quando a interface API estendida é chamada.

Descrição Código
Execução bem sucedida 0
Chave de API errada 1
Assinatura errada. 2
Erro de não 3
Método incorreto 4
Parâmetro incorreto 5
Erro interno desconhecido 6

Código de negociação em tempo real

OGetRobotListinterfaces, oGetRobotDetailinterface, e oGetRobotLogsInterface de retorno de dados nostatusCampo para: código de estado de negociação em tempo real.

  • Iniciação normal
    Situação Código
    Inatividade 0
    Em funcionamento 1
    Parar 2
    Desligado. 3
    Parado. 4
    A estratégia tem erros. 5
  • Não normal.
    Situação Código
    A estratégia expirou, e por favor entre em contato com o escritor para comprá-lo novamente -1
    Nenhuma doca encontrada -2
    Erro de compilação da estratégia -3
    A negociação ao vivo já está a decorrer. -4
    Balanço insuficiente -5
    O número de estratégias simultâneas excede o limite -6

Métodos de verificação

Existem dois métodos de verificação ao chamar a interface API estendida, suportandotokenVerificação e verificação directa.

Verificação de token

Utilizaçãomd5método de encriptação a verificar, exemplo dePython, Golangchamada de idioma:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import json
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

try:
    import md5
    import urllib2
    from urllib import urlencode
except:
    import hashlib as md5
    import urllib.request as urllib2
    from urllib.parse import urlencode

accessKey = ''   # your API KEY
secretKey = ''   

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)).encode('utf-8')).hexdigest()
    # Note: for the timeout problem of "urllib2.urlopen" function, you can set the timeout time; for example, urllib2.urlopen ('https://www.fmz.com/api/v1', urlencode(d).encode('utf-8'), timeout = 10), that is, set timeout for 10 seconds
    return json.loads(urllib2.urlopen('https://www.fmz.com/api/v1', urlencode(d).encode('utf-8')).read().decode('utf-8'))

# Return the docker list
print(api('GetNodeList'))
# Return the exchange list
print(api('GetPlatformList'))
# GetRobotList(offset, length, robotStatus, label), passing "-1" means obtaining all
print(api('GetRobotList', 0, 5, -1, 'member2'))
# CommandRobot(robotId, cmd) sends command to live trading
print(api('CommandRobot', 123, 'ok'))
# StopRobot(robotId) returns the live trading status code
print(api('StopRobot', 123))  
# RestartRobot(robotId) returns the live trading status code
print(api('RestartRobot', 123))
# GetRobotDetail(robotId) returns detailed live trading information
print(api('GetRobotDetail', 123))
package main

import (
    "fmt"
    "time"
    "encoding/json"
    "crypto/md5"
    "encoding/hex"
    "net/http"
    "io/ioutil"
    "strconv"
    "net/url"
)

// Fill in your own FMZ platform api key
var apiKey string = ""                                  
// Fill in your own FMZ platform secret key
var secretKey string = ""                               
var baseApi string = "https://www.fmz.com/api/v1"

func api(method string, args ... interface{}) (ret interface{}) {
    // Process args
    jsonStr, err := json.Marshal(args)
    if err != nil {
        panic(err)
    }

    params := map[string]string{
        "version" : "1.0", 
        "access_key" : apiKey,
        "method" : method,
        "args" : string(jsonStr),
        "nonce" : strconv.FormatInt(time.Now().UnixNano() / 1e6, 10),
    }    

    data := fmt.Sprintf("%s|%s|%s|%v|%s", params["version"], params["method"], params["args"], params["nonce"], secretKey)
    h := md5.New()
    h.Write([]byte(data))
    sign := h.Sum(nil)

    params["sign"] = hex.EncodeToString(sign)

    // http request 
    client := &http.Client{}

    // request 
    urlValue := url.Values{}
    for k, v := range params {
        urlValue.Add(k, v)
    }
    urlStr := urlValue.Encode()
    request, err := http.NewRequest("GET", baseApi + "?" + urlStr, nil)
    if err != nil {
        panic(err)
    }    

    resp, err := client.Do(request)
    if err != nil {
        panic(err)
    }

    defer resp.Body.Close()

    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }

    ret = string(b)
    return 
}

func main() {
    settings := map[string]interface{}{
        "name": "hedge test",
        "strategy": 104150,                      
        // K-line period parameter, "60" means 60 seconds
        "period": 60,                           
        "node" : 73938,                         
        "appid": "member2",                
        "exchanges": []interface{}{
            map[string]interface{}{
                "eid": "Exchange", 
                "label" : "test_bjex", 
                "pair": "BTC_USDT", 
                "meta" : map[string]interface{}{
                    // Fill in the access key
                    "AccessKey": "",                                
                    // Fill in the secret key
                    "SecretKey": "",                                
                    "Front" : "http://127.0.0.1:6666/exchange",
                },
            },
        },
    }

    method := "RestartRobot"
    fmt.Println("Call interface:", method)
    ret := api(method, 124577, settings)
    fmt.Println("main ret:", ret)
}

Verificação directa

Suporta a verificação semtoken(passagem)secret_keyPara o acesso direto, você pode gerar um URL que pode ser acessado diretamente. Por exemplo, o URL que dá diretamente instruções interativas para A negociação ao vivo, que pode ser utilizada paraTradingViewou oWebHookPara os outros casos.CommandRobot(RobotId, Cmd)função, o parâmetrononceNão é necessário verificar, e a frequência de acesso e Os tempos de visita da interface não são limitados.

Por exemplo, oAccessKeyda extensão criadaAPI KEYé:xxxe oSecretKeyé:yyy. Visualize o seguinte link para enviar uma mensagem de comando interativa para a negociação em tempo real com o ID de negociação em tempo real186515, a mensagem o conteúdo é uma cadeia:"ok12345".


https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyy&method=CommandRobot&args=[186515,"ok12345"]

Sob a circunstância de que a verificação direta é apoiada, apenasCommandRobotInterface é suportada para obter oBodyOs dados na solicitação.WebHook URLdeTradingView:


https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyy&method=CommandRobot&args=[186515,+""]

Preste atenção ao ajuste de acordo com o seguinte formato:args=[130350,+""], em que130350é a negociação ao vivoIDda plataforma de negociação FMZ Quant.

Configurar na caixa de mensagens deTrading View(o Corpo solicitado dados a transmitir):

  • Formato JSON:

    https://www.fmz.comimg

    {"close": {{close}}, "name": "aaa"}
    

    O comércio ao vivo comIDde186515pode receber a sequência de comandos interativa:{"close": 39773.75, "name": "aaa"}.

  • Formato de texto:

    https://www.fmz.comimg

    BTCUSDTPERP Crossing 39700.00 close: {{close}}
    

    O comércio ao vivo comIDde186515pode receber a sequência de comandos interativa:BTCUSDTPERP Crossing 39700.00 close: 39739.4.

Exemplos dePython & Golangchamadas de idiomas:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import json
import ssl

ssl._create_default_https_context = ssl._create_unverified_context

try:
    import urllib2
except:
    import urllib.request as urllib2

accessKey = 'your accessKey'
secretKey = 'your secretKey'

def api(method, *args):
    return json.loads(urllib2.urlopen(('https://www.fmz.com/api/v1?access_key=%s&secret_key=%s&method=%s&args=%s' % (accessKey, secretKey, method, json.dumps(list(args)))).replace(' ', '')).read().decode('utf-8'))

# If APIKEY does not have the interface permission, the call to
print(api('RestartRobot', 186515)) will fail, and the returned data
is: {'code': 4, 'data': None}
# print(api('RestartRobot', 186515))

# Printed Id: the live trading details of 186515
print(api('GetRobotDetail', 186515))  
package main

import (
    "fmt"
    "encoding/json"
    "net/http"
    "io/ioutil"
    "net/url"
)

// Fill in your own FMZ platform api key
var apiKey string = "your access_key"

// Fill in your own FMZ platform secret key
var secretKey string = "your secret_key"
var baseApi string = "https://www.fmz.com/api/v1"

func api(method string, args ... interface{}) (ret interface{}) {
    jsonStr, err := json.Marshal(args)
    if err != nil {
        panic(err)
    }
    
    params := map[string]string{
        "access_key" : apiKey,
        "secret_key" : secretKey,
        "method" : method,
        "args" : string(jsonStr),
    }    

    // http request 
    client := &http.Client{}

    // request 
    urlValue := url.Values{}
    for k, v := range params {
        urlValue.Add(k, v)
    }
    urlStr := urlValue.Encode()
    request, err := http.NewRequest("GET", baseApi + "?" + urlStr, nil)
    if err != nil {
        panic(err)
    }    

    resp, err := client.Do(request)
    if err != nil {
        panic(err)
    }

    defer resp.Body.Close()

    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }

    ret = string(b)
    return 
}

func main() {
    method := "GetRobotDetail"
    fmt.Println("Call interface:", method)
    ret := api(method, 186515)
    fmt.Println("main ret:", ret)
}

Use a API estendida no FMZ Quant para realizar o alerta TradingView negociação de sinais

Explicação da Interface API Estendida

  • A interface API estendida da plataforma de negociação quântica FMZ Aplicar os parâmetros da consulta (separados por?) do pedido imediatamente apóshttps://www.fmz.com/api/v1Os seguintes são os parâmetros de pedido expressos usandoPython:

    {
        "version"   : "1.0",
        "access_key": "xxx",
        "method"    : "GetNodeList",
        "args"      : [],
        "nonce"     : 1516292399361,
        "sign"      : "085b63456c93hfb243a757366600f9c2"
    }
    
    Campos Orientações
    versão Número de versão.
    acesso_chave AccessKey, solicite-o na página de gestão de contas.
    Método O método específico de chamada.
    Argos A lista de parâmetros do método específico chamado.
    não A marca de tempo, em milissegundos, permite um erro de 1 hora a partir da marca de tempo padrão.
    sinalização Signature.

    Cada nome de parâmetro é separado pelo carácter&, e os nomes e valores dos parâmetros estão ligados ao símbolo=. O URL de solicitação completo (tomandomethod=GetNodeListPor exemplo:

    https://www.fmz.com/api/v1?access_key=xxx&nonce=1516292399361&args=%5B%5D&sign=085b63456c93hfb243a757366600f9c2&version=1.0&method=GetNodeList
    

    Observe que não hásecret_keyParâmetro entre os parâmetros solicitados.

  • Método de assinatura OsignO parâmetro no parâmetro de solicitação é criptografado do seguinte modo, de acordo com o formato:

    version + "|" + method + "|" + args + "|" + nonce + "|" + secretKey
    

    Depois de concatenar cordas, useMD5Algoritmo de criptografia para criptografar a cadeia e convertê-la em um valor de cadeia de dados hexadecimal, referido como o valor do parâmetrosignPara a parte relativa à assinatura, ver oPythonInterface API de extensão de códigoMétodos de verificação :

    # Parameter
    d = {
        'version': '1.0',
        'access_key': accessKey,
        'method': method,
        'args': json.dumps(list(args)),
        'nonce': int(time.time() * 1000),
    }
    
    # Calculate "sign" signature
    d['sign'] = md5.md5(('%s|%s|%s|%d|%s' % (d['version'], d['method'], d['args'], d['nonce'], secretKey)).encode('utf-8')).hexdigest()
    

GetNodeList

OGetNodeListO método é utilizado para obter a lista dos trabalhadores portuários no âmbito da conta da Plataforma de Negociação Quant FMZ correspondente aoAPI KEYno pedido.

{
    "code": 0,
    "data": {
        "result": {
            "all": 1,
            "nodes": [{
                "build": "3.7",
                "city": "...",
                "created": "2024-11-08 09:21:08",
                "date": "2024-11-08 16:37:16",
                "forward": "...",
                "guid": "...",
                "host": "node.fmz.com:9902",
                "id": 123,
                "ip": "...",
                "is_owner": true,
                "loaded": 0,
                "name": "MacBook-Pro-2.local",
                "online": true,
                "os": "darwin/amd64",
                "peer": "...",
                "public": 0,
                "region": "...",
                "tunnel": false,
                "version": "...",
                "wd": 0
            }]
        },
        "error": null
    }
}

Descrição dos campos de valor de retorno (o significado literal é óbvio e não será repetido):

  • todos: número de trabalhadores portuários associados à conta corrente.
  • Nodos: Regista os detalhes do nó do docker.
    • construção: número de versão.
    • Cidade: A cidade onde você está localizando.
    • is_owner: true indica um dock privado, false indica um dock público.
    • carregado: Carga, número de instâncias de estratégia.
    • público: 0 indica um docker privado, 1 indica um docker público.
    • Região: localização geográfica.
    • versão: informações detalhadas sobre a versão do docker.
    • wd: Ativar ou não o alarme offline, 0 significa não habilitado. O docker de implantação de um clique contém algumas informações adicionais.ecs_eunit_, que regista as informações relevantes do servidor do docker de implantação de um clique (nome do operador, configuração, estado, etc.), ciclo de faturamento, preço e outras informações, que não serão repetidas aqui.

Nenhum parâmetro

GetRobotGroupList

GetRobotGroupList()Retorna a lista de agrupamento de negociação em tempo real da conta da Plataforma de Negociação Quant FMZ correspondente àAPI KEYno pedido.

{
    "code": 0,
    "data": {
        "result": {
            "items": [{
                "id": 3417,
                "name": "Test"
            }, {
                "id": 3608,
                "name": "Live trading demo"
            }]
        },
        "error": null
    }
}
  • Informações sobre o agrupamento de operações em tempo real.
    • Identificação do grupo de negociação em tempo real
    • Nome: nome do grupo de negociação em tempo real. OitemsO campo só registra grupos recém-criados.items.

Nenhum parâmetro

GetPlatformList

GetPlatformList()Retorna a lista de trocas que têm foi adicionado pela conta da Plataforma de Negociação Quant FMZ correspondente para oAPI KEYno pedido.

{
    "code": 0,
    "data": {
        "result": {
            "all": 2,
            "platforms": [{
                "category": "加密货币||Crypto",
                "date": "2023-12-07 13:44:52",
                "eid": "Binance",
                "id": 123,
                "label": "Binance",
                "logo": "...",
                "name": "币安现货|Binance",
                "stocks": ["BTC_USDT", "LTC_USDT", "ETH_USDT", "ETC_USDT", "BTC_TUSD", "ETH_TUSD", "BNB_TUSD"],
                "website": "..."
            }, {
                "category": "通用协议|Custom Protocol",
                "date": "2020-11-09 11:23:48",
                "eid": "Exchange",
                "id": 123,
                "label": "XX Exchange REST Protocol",
                "logo": "...",
                "name": "通用协议|Custom Protocol",
                "stocks": ["BTC_USDT", "ETH_USDT"],
                "website": ""
            }]
        },
        "error": null
    }
}

Nenhum parâmetro

GetRobotList

OGetRobotListO método é utilizado para obter a lista de negociações em tempo real sob a conta da plataforma de negociação FMZ Quant correspondente aoAPI KEYno pedido.

{
    "code": 0,
    "data": {
        "result": {
            "all": 53,
            "robots": [{
                "date": "2017-12-25 09:29:27",
                "end_time": "2017-12-28 17:44:21",
                "id": 66054,
                // If the value is 1, the live trading is a virtual platform live trading
                "is_sandbox": 1,                                      
                "name": "C++ test strategy",
                "node_guid": "705d9aaaaaaaa93b49baaaaa787581cb087",
                "profit": 0,
                "public": 0,
                "refresh": 151345645647000,
                "start_time": "2017-12-28 17:44:15",
                "status": 3,
                "strategy_id": 65365,
                "strategy_isowner": true,
                "strategy_name": "C++  Version Docker API Test Strategy(cryptocurrency futures and spot markets)",
                "wd": 0
            }, ...
            ]
        },
        "error": null
    }
}

A configuração de deslocamento da consulta de chamada. deslocamento Falso Número O ajuste de comprimento da consulta de chamada. comprimento Falso Número Especificar o estado da negociação ao vivo a ser consultada, consultar a interface API estendidaCódigo de negociação em tempo realPassa.-1para obter todas as negociações ao vivo. robotStatus Falso Número Especifique o rótulo personalizado da negociação ao vivo que você deseja consultar, e você pode filtrar todas as negociações ao vivo deste rótulo. etiqueta Falso cordel

Leva oPythoninterface API estendida do languagesMétodos de verificaçãoPor exemplo:print(api('GetRobotList', 'member2')): imprimir as informações de todas as negociações em tempo real com o rótulo personalizadomember2. print(api('GetRobotList', 0, 5, -1, 'member2')): páginas de 0 a 5 e lista de até 5 robôs rotulados commember2.

ComandoRobot

OCommandRobotO método é utilizado para enviar um comando de interação para a negociação em tempo real sob a conta da Plataforma de Negociação Quant FMZ correspondente aoAPI KEYO ID da negociação em tempo real que recebe o comando de interação é o ID de negociação em tempo real especificado pelorobotIdParâmetro, e o comando de interação é devolvido peloGetCommand()função chamada na estratégia para capturá-lo.

{
    // The API request was successfully executed
    "code": 0,
    "data": {
        // However, sending a command to live trading that is not running returns failure
        "result": false,       
        "error": null
    }
}

O parâmetrorobotIdé usado para especificar o ID da negociação ao vivo que recebe o comando interativo.GetRobotListmétodo para obter as informações sobre a negociação em tempo real sob a conta, que contém o ID de negociação em tempo real. robotId verdade Número O parâmetrocmdé o comando interativo enviado para o bot; o comando será capturado pela funçãoGetCommand(), que desencadeia a lógica interactiva na estratégia.GetCommand()função naManual da API da plataforma de negociação quântica FMZ- Não. cmd verdade cordel

StopRobot

StopRobot(RobotId)é utilizado para solicitar oAPI KEYO ID de negociação em tempo real para parar de funcionar é o ID de negociação em tempo real especificado pela plataforma de negociação FMZ Quant.robotId parameter.

{
    "code": 0,
    "data": {
        // 2 means stopping
        "result": 2,           
        "error": null
    }
}

O parâmetrorobotIdA função de interrupção é utilizada para especificar o ID da negociação ao vivo a ser interrompida.GetRobotListmétodo para obter as informações sobre a negociação em tempo real sob a conta, que contém o ID de negociação em tempo real. robotId verdade Número

ReiniciarRobot

ORestartRobotO método é utilizado para reiniciar a negociação ao vivo no âmbito doAPI KEYO ID da negociação em tempo real reiniciada é o ID de negociação em tempo real especificado pelorobotId parameter.

{
    "code": 0,
    "data": {
        // 1 means running
        "result": 1,          
        "error": null
    }
}

OrobotIdO parâmetro é usado para especificar o ID da negociação ao vivo a ser reiniciada.GetRobotListmétodo para obter as informações sobre a negociação em tempo real sob a conta, que contém o ID de negociação em tempo real. robotId verdade Número Os parâmetros da configuração de negociação ao vivo, os parâmetrossettingsO formato é o seguinte:

{
    "name": "hedge test",
    // Strategy parameter
    "args": [["Interval", 500]],            
    // Strategy ID, which can be obtained with "GetStrategyList" method
    "strategy": 25189,                      
    // K-line period parameter, "60" means 60 seconds
    "period": 60,                           
    // Specify on which docker to run; if the attribute is not written, it will be automatically assigned to run
    "node" : 51924,                         
    // Custom field
    "appid": "member2",                     
    "exchanges": [
        // ZB; "pid" can be obtained by "GetPlatformList" method
        {"pid": 15445, "pair": "ETH_BTC"},     
        // OKX; 2 exchange objects are configured
        {"pid": 13802, "pair": "BCH_BTC"},     
        
        // In addition to the platforms ("pid" identification) configured by the FMZ dashboard, you can also set exchange configuration information that has not been configured to operate live trading
        {"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "xxx", "SecretKey": "yyy"}},
        {"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "xxx", "SecretKey": "yyy"}}
    ]
}

Quando você usa as informações confidenciais, tais como plataformaAPI KEY, incluindo"meta":{"AccessKey":"xxx","SecretKey":"yyy"}na configuração deeid, você deve saber que FMZ não armazena os dados. Os dados serão enviados diretamente para o programa docker, então essas informações devem ser configuradas toda vez que a negociação ao vivo é criada ou reiniciada.

Para reiniciar a negociação ao vivo que usa o plugin para suportar a troca, ao configurar osettingsParâmetro, você deve fazer as seguintes configurações para oexchangesAtributo:

{"eid": "Exchange", "label" : "testXXX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123", "SecretKey": "1234", "Front" : "http://127.0.0.1:6666/XXX"}}

labelatributo é definir um rótulo para o objeto de troca acessado pelo atualProtocolo Geral, que podem ser obtidos através doexchange.GetLabel()A política de emprego

configurações Falso Objeto JSON

Se a negociação em tempo real for criada pela API estendida, a API estendidaRestartRobot (RobotId, Settings)deve ser utilizado para reiniciar, e osettingsA negociação ao vivo criada na página da plataforma pode ser reiniciada através da API estendida ou clicando no botão na página.settingsParâmetro. Se você só passar oRobotIdParâmetro, iniciar a negociação ao vivo de acordo com as configurações de negociação ao vivo atuais.

GetRobotDetail

OGetRobotDetailO método é utilizado para obter os pormenores da negociação ao vivo sob a conta da plataforma de negociação FMZ Quant correspondente aoAPI KEYO ID da negociação em tempo real a ser recuperado é o ID da negociação em tempo real especificado pelorobotId parameter.

{
    "code": 0,
    "data": {
        "result": {
            "robot": {
                // Next payment time, namely the effective cut-off time after the current payment
                "charge_time": 1561992608,                                                  
                // Elapsed Time
                "charged": 3600,                                                            
                // Amount consumed (0.125 CNY = 12500000 / 1e8)
                "consumed": 12500000,                                                       
                "date": "2019-07-01 21:50:08",
                "debug": "{\"Nano\":1561989722431145193,\"Stderr\":\"\",\"Stdout\":\"\"}",  
                // Stop time
                "end_time": "2019-07-01 22:02:02",                                          
                // The docker ID assigned when live trading is running; if it is automatic, the value is -1
                "fixed_id": 85960,                                                          
                "id": 150288,
                "is_deleted": 0,
                // Whether it has the permission to manage live trading
                "is_manager": true,                                                         
                // Whether it is a simulation trading
                "is_sandbox": 0,                                                            
                // Live trading name
                "name": "Spread monitoring2",                                                         
                // Docker ID
                "node_id": 85960,                                                           
                // The exchange objects configured by live trading
                "pexchanges": {                                                             
                    // 14703 is pid, and "GateIO" is exchange name
                    "14703": "GateIO",                                                      
                    "15445": "ZB",
                    "42960": "OKEX",
                    "44314": "Huobi"
                },
                // label information of the exchange object configured by live trading
                "plabels": {                                                                
                    "14703": "Gate.IO (old name: BTER)",
                    "15445": "ZB",
                    "42960": "OKEX spot V3 test",
                    "44314": "Huobi - newest test"
                },
                "profit": 0,
                // Whether to show public
                "public": 0,                                                                
                // Recent active time
                "refresh": 1561989724000,                                                   
                "robot_args": "[[\"TickInterval\",500],[\"StrOnePair\",\"spot:Huobi:spot;spot:OKEX:spot;false;60;5;0;0\"],[\"StrTwoPair\",\"spot:ZB:spot;spot:GateIO:spot;false;60;5;0;0\"],[\"StrThreePair\",\"null\"],[\"StrFourPair\",\"null\"],[\"StrSixPair\",\"null\"],[\"StrFivePair\",\"null\"],[\"ResetChart\",false]]",
                "start_time": "2019-07-01 22:00:54",
                // Live trading status
                "status": 4,                                                                
                "strategy_args": "[[\"TickInterval\",\"Detection frequency (ms)\",\"This is millisecond. Don't set it too small.\",500],[\"StrOnePair\",\"Combination1\",\"Spread Combination\",\"spot:Huobi:spot;spot:OKCoin:spot;false;60;5;0;0\"],[\"StrTwoPair\",\"Combination2\",\"Spread Combination\",\"future:Futures_OKCoin:this_week;spot:OKCoin:spot;false;60;5;0;0\"],[\"StrThreePair\",\"Combination3\",\"Spread Combination\",\"future:Futures_OKCoin:this_week;future:Futures_OKCoin:quarter;true;60;5;0;0\"],[\"StrFourPair\",\"Combination4\",\"Spread Combination\",\"null\"],[\"StrSixPair\",\"Combination6\",\"Combination\",\"null\"],[\"StrFivePair\",\"Combination5\",\"Combination\",\"null\"],[\"ResetChart\",\"whether to clear the previous chart\",\"clear the previous chart\",false]]",
                // Configured exchange objects, set trading pair information
                "strategy_exchange_pairs": "[60,[44314,42960,15445,14703],[\"BTC_USDT\",\"BTC_USDT\",\"ETH_USDT\",\"ETH_USDT\"]]",
                // Strategy ID
                "strategy_id": 21337,                                                       
                // Strategy's last modification time
                "strategy_last_modified": "2018-11-29 12:07:58",                            
                // Strategy name
                "strategy_name": "Digital currency spread monitoring and analysis",                                       
                "summary": "Polling time consuming: 500ms\n`[{\"type\":\"table\",\"title\":\"pair basic data\",\"cols\":[\"ID\",\"NameA - NameB\",\"SymbolA - SymbolB\",\"UpdCycle\",\"isUSD\",\"Collect\"],\"rows\":[[\"0 \",\"Huobi/OKEX\",\"spot/spot\",60,false,\"612ms\"],[\"1 \",\"ZB/GateIO\",\"spot/spot\",60,false,\"501ms\"]]},{\"type\":\"table\",\"title\":\"pair ticker data\",\"cols\":[\"ID\",\"NameA - NameB\",\"SymbolA - SymbolB\",\"A_Bids1\",\"B_Asks1\",\"Plus\",\"A_Asks1\",\"B_Bids1\",\"Minus\"],\"rows\":[[\"0 \",\"Huobi/OKEX\",\"spot/spot\",10518.02,10525.1,-7.08,10520,10523,-3],[\"1 \",\"ZB/GateIO\",\"spot/spot\",285.68,286,-0.32,285.8,285.85,-0.05]]},{\"type\":\"table\",\"title\":\"pair statistical data\",\"cols\":[\"ID\",\"NameA - NameB\",\"SymbolA - SymbolB\",\"Maximum spread\",\"Minimum spread\",\"Mean positive premium\",\"Mean negative premium\"],\"rows\":[[\"0 \",\"Huobi/OKEX\",\"spot/spot\",0,-3,0,-1.47],[\"1 \",\"ZB/GateIO\",\"spot/spot\",0.03,-0.05,0.03,-0.05]]}]`\n",
                // Whether to enable offline alert
                "wd": 0                                                                      
            }
        },
        "error": null
    }
}

OrobotIdO parâmetro é usado para especificar o ID da negociação ao vivo para a qual os detalhes devem ser obtidos.GetRobotListmétodo de obtenção de informações sobre a negociação em tempo real no âmbito da conta, que contém o ID de negociação em tempo real. robotId verdade Número

Osummaryatributo nos dados devolvidos (informação na barra de status do bot; armazenado em cache por 10 segundos; não os dados mais recentes) atualmente tem um limite de quantidade de dados (dados armazenados em cache). O limite de quantidade de dados é de 200KB, e o excesso de dados será truncado.GetRobotLogsinterface para obter (quandoGetRobotLogsobtém as informações da barra de estado, o camposummarysão os dados mais recentes).

A descrição do atributo destrategy_exchange_pairs, por exemplo, os seguintes dados:

[60,[44314,42960,15445,14703],[\"BTC_USDT\",\"BTC_USDT\",\"ETH_USDT\",\"ETH_USDT\"]]

Os primeiros dados60representa o período de linha K por defeito definido pela negociação ao vivo é de 1 minuto, ou seja, 60 segundos.[44314,42960,15445,14703]é o objeto de trocapidConfigurado para negociação em tempo real (de acordo com a ordem de adição).[\"BTC_USDT\",\"BTC_USDT\",\"ETH_USDT\",\"ETH_USDT\"]é o par de negociação definido para o objeto de troca configurado por negociação em tempo real (na ordem de adição e em correspondência um a um compid).

GetAccount

OGetAccountO método é utilizado para adquirir as informações da conta correspondentes aoAPI KEYNo pedido da conta da plataforma de negociação quantitativa FMZ.

{
    "code": 0, 
    "data": {
        "result": {
            "username": "littlelittledream",
            "level": 0,
            "consumed": 3235500000,
            "invitation_code": "1545967",
            "points": 25,
            // The value here, due to precision control, is expressed in integer. To convert it to actual value, you need to divide it by 1e8 (i.e. 10 to the 8th power), and the actual result here is: 65.421
            "balance": 6542100000               
        },
        "error": None
    }
}

GetExchangeList

OGetExchangeListO método é utilizado para obter a lista de bolsas e as informações de configuração necessárias suportadas pela plataforma de negociação quantitativa FMZ.

{
    "code": 0,
    "data": {
        "result": {
            "exchanges": [{
                "website": "https://www.huobi.pro/",
                "name": "Huobi",
                "priority": 1,
                "meta": "[{"desc": "Access Key", "required": true, "type": "string", "name": "AccessKey", "label": "Access Key"}, {"encrypt": true, "name": "SecretKey", "required": true, "label": "Secret Key", "type": "password", "desc": "Secret Key"}]",
                "eid": "Huobi",
                "logo": "huobi.png",
                "id": 1
            }, {
                "website": "https://www.kex.com/",
                "name": "KEX",
                "priority": -99,
                "meta": "[{"desc": "Access Key", "required": true, "type": "string", "name": "AccessKey", "label": "Access Key"}, {"encrypt": true, "name": "SecretKey", "required": true, "label": "Secret Key", "type": "password", "desc": "Secret Key"}, {"encrypt": true, "required": true, "type": "password", "name": "Password", "label": "Trading Password"}]",
                "eid": "KEX",
                "logo": "",
                "id": 43
            }, 

             ...
      
            ]
        },
        "error": null
    }
}

DeleteNode

ODeleteNode(Nid)método é usado para excluir o nó do docker correspondente aoAPI KEYA ID do nó do docker excluído é a ID do docker especificada pelonid parameter.

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

OnidO parâmetro é usado para especificar a ID do docker a ser excluído.GetNodeListO método para obter informações sobre os portadores da conta. Nido verdade Número

DeleteRobot

ODeleteRobot(RobotId, DeleteLogs)O método é utilizado para excluir a negociação ao vivo correspondente aoAPI KEYO ID de negociação em tempo real excluído é o ID de negociação em tempo real especificado pelorobotId parameter.

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

O parâmetrorobotIdA função de identificação de transacções é utilizada para especificar a identificação da transacção em tempo real a eliminar.GetRobotListmétodo para obter as informações sobre a negociação em tempo real sob a conta, que contém o ID de negociação em tempo real. robotId verdade Número OdeleteLogsO parâmetro é utilizado para definir se deve apagar o diário de negociação em tempo real, caso seja passado um valor verdadeiro (por exemplo:true), o registo das operações em tempo real é suprimido. DeleteLogs verdade Bool

GetStrategyList (Lista de estratégias)

OGetStrategyList()O método é utilizado para obter a informação estratégica correspondente aoAPI KEYNo pedido da conta da plataforma de negociação quantitativa FMZ.

{
    "code": 0,
    "data": {
        "result": {
            "strategies": [{
                "category": 0,
                "username": "yifidslei",
                "is_owner": true,
                "name": "fmz simulation trading 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": "Plot 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

ONewRobotO método é utilizado para criar uma negociação ao vivo sob oAPI KEYcorrespondente à conta da plataforma de negociação quantitativa FMZ referida no pedido.

// Create live trading successfully
{
    "code": 0,
    "data": {
        "result": 74260,
        "error": null
    }
}

Os parâmetros da configuração de negociação em tempo real,settingsO formato dos parâmetros é o seguinte:

{
    "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 live trading-binding strategy
    The second one "0" is the specific value set by the parameter "MAType".
    The third element, 75882, is the ID of the template to which the MAType parameter belongs, and is used to identify which template the parameter belongs to
    */
    "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 live trading 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 live trading
        {"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "xxx", "SecretKey": "yyy"}},
        {"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "xxx", "SecretKey": "yyy"}}
    ]
}

configurações verdade Objeto JSON

Quando você usa as informações confidenciais, tais como plataformaAPI KEY, incluindo"meta":{"AccessKey":"xxx","SecretKey":"yyy"}na configuração deeid, deve saber que a FMZ não armazena os dados. Os dados serão enviados diretamente para o programa docker, de modo que esta informação deve ser configurada toda vez que a negociação ao vivo é criada ou reiniciada.

Se você quiser criar negociação ao vivo que usa o plugin para suportar a plataforma, ao configurar osettingsParâmetro, você deve fazer as seguintes configurações para oexchangesAtributo:

{"eid": "Exchange", "label" : "testXXX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123", "SecretKey": "1234", "Front" : "http://127.0.0.1:6666/XXX"}}

labelAtributo é definir um rótulo para o objeto de troca acessado pelo protocolo geral atual, que pode ser obtido peloexchange.GetLabel()A política de emprego

PluginExecutar

OPluginRunmétodo é usado para chamar oferramenta de depuraçãoFunção da plataforma de negociação quantitativa FMZ.

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

Os parâmetros de configuração na ferramenta de depuração,settingsConfiguração, incluir o código de ensaio nosourceAtributo.settingsO formato do parâmetro é o seguinte:

    # K-line period parameter, "60" indicates 60 seconds
    "period": 60,
    "source": "function main() {Log("Hello FMZ")}", 
    # 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"}}
    ]
} ```
settings
true
JSON object

```{"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}```
```{"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}```

For the ```exchanges``` attribute in the ```settings```, the attribute only needs to be set to 1, when calling the ```PluginRun``` interface (for only one exchange object can be supported when you use the "Debug Tool" page).
No error will be reported when you set 2 exchange objects  in ```settings```, but an error will be reported when the second exchange object is accessed in the code.


### GetRobotLogs

The ```GetRobotLogs``` method is used to get the log information of the live trading under the FMZ Quant Trading Platform account corresponding to the ```API KEY``` in the request. The Id of the live trading platform to be obtained is the live trading platform Id specified by the ```robotId``` parameter.

- O quê? código: 0, dados : { resultado: { status: 1, atualizaçãoTempo : 1527049990197, wd: 0, // A primeira estrutura de dados em logs é os registros de log na tabela de log estratégia no banco de dados de negociação ao vivo logs:
Max: 3984, - Não, não. [3977, 3, Futures_OKCoin, , 0, 0, Sell ((688.9, 2): 20016, 1526954372591, , ], [3976, 5, , , 0, 0, OKCoin:this_week excessive positions, long: 2, 1526954372410, , ] ], Total : 1503, Min: 2482 Não, não.
// A segunda estrutura de dados em logs é os registros de log na tabela de log estratégia no banco de dados de negociação ao vivo Max: 0, Arr: [], Total: 0, Min: 0 Não, não.
// A terceira estrutura de dados em logs é os registros de log na tabela de log estratégia no banco de dados de negociação ao vivo Max: 0, Arr: [], Total: 0, Min: 0 ], quadro: , refresh: 1527049988000, resumo: ..., "ChartTime": 0, "node_id": 50755, "online": verdadeiro }, "erro": nulo - Não. - Não.



The ```robotId``` parameter is used to specify the Id of the live trading for which the log information is to be obtained. You can use the ```GetRobotList``` method to obtain information about the live trading under the account, which contains the live trading Id.
robotId
true
number
The ```logMinId``` parameter is used to specify the minimum Id of the Log.
logMinId
true
number
The ```logMaxId``` parameter is used to specify the maximum Id of the Log.
logMaxId
true
number
The ```logOffset``` parameter is used to set the offset, after determining the range  by ```logMinId``` and ```logMaxId```, offset based on the ```logOffset``` (how many records are skipped). Start as the starting position for fetching data.
logOffset
true
number
The parameter ```logLimit``` is used to set the number of data records to be selected after the starting position is determined.
logLimit
true
number
The ```profitMinId``` parameter is used to set the minimum Id of the profit log.
profitMinId
true
number
The parameter ```profitMaxId``` is used to set the maximum Id of the profit log.
profitMaxId
true
number
The parameter ```profitOffset``` is used to set the offset (how many records are skipped) as the starting position.
profitOffset
true
number
The parameter ```profitLimit``` is used to set the number of data records to be selected after the starting position is determined.
profitLimit
true
number
The parameter ```chartMinId``` is used to set the minimum Id of the chart data record.
chartMinId
true
number
The parameter ```chartMaxId``` is used to set the maximum Id of the chart data record.
chartMaxId
true
number
The parameter ```chartOffset``` is used to set the offset.
chartOffset
true
number
The parameter ```chartLimit``` is used to set the number of records to obtain.
chartLimit
true
number
The parameter ```chartUpdateBaseId``` is used to set the base Id after the query is updated.
chartUpdateBaseId
true
number
The parameter ```chartUpdateDate``` is used to set the data record update timestamp, and it will filter out records greater than this timestamp.
chartUpdateDate
true
number
The parameter ```summaryLimit``` is used to set the number of bytes of status bar data to be queried. The parameter is of integer type for querying the status bar data of the live trading.
Setting to "0" means there is no need to query the status bar information, and setting to non-zero number indicates the number of bytes of the status bar information to be queried (the interface does not limit the data quantity, so you can specify a larger ```summaryLimit``` parameter to get all status bar information). The status bar data is stored in the returned data ```summary```.

summaryLimit
true
number

- The strategy log table in the database
  The ```Arr``` attribute value in the first element of the ```Logs``` attribute value (array structure) in the return data (log data) is described as follows:
  

- Não, não. [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 | logType | eid | orderId | price | amount | extra | date | contractType | direction |
| - | - | - | - | - | - | - | - | - | - |
| 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 | "" | "" |

```extra``` is the attached message of the printed log.

The specific log types represented by the ```logType``` values are described as follows:

| logType: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| - | - | - | - | - | - | - | - |
| Meaning of logType: | BUY | SALE | RETRACT | ERROR | PROFIT | MESSAGE | RESTART |

- Log table of the profit chart in the database
The data in the chart's log table is consistent with the profit log in the strategy log table.

- Não, não. [202, 2515.44, 1575896700315], [201, 1415.44, 1575896341568] ]


Take one of the log data as an example:

[202, 2515.44, 1575896700315]


```202``` is log ```ID```; ```2515.44``` is profit value; ```1575896700315``` is timestamp.
- Chart log table in the database

- Não, não. [23637, 0, {close:648, high:650.5, low:647, open:650, x:1575960300000}, [23636, 5, {x:1575960300000, y:3.0735}] ]


Take one of the log data as an example:

[23637, 0, {close:648, high:650.5, low:647, open:650, x:1575960300000},


```23637``` is the log ```ID```, ```0``` is the index of the chart data series, and the last data ```"{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"``` is the log data; This data is the K-line data on the chart.
Biblioteca integrada Terminal de negociação