En la carga de los recursos... Cargando...

Interfaz de API extendida

FMZ Quant ha abierto la interfaz API extendida de la plataforma para soportar llamadas programáticas a varias funciones de la plataforma de negociación FMZ Quant.

Crear ApiKey

La plataforma de negociación cuántica de FMZ admite la gestión de permisos de los la interfaz API extendida, y el permiso deAPI KEYEn la opción de interfaz API en la configuración Cuenta (El Consejohttps://www.fmz.com/m/account) página de la plataforma, haga clic en Crear nuevo botón ApiKey para crear la extensiónAPI KEY.

Puede editar el cuadro de entrada API Permission al crear unAPI KEY, y entrar en el*símbolo para permitir que todosInterfaz API extendidapermisos. Si desea especificar permisos específicos de interfaz, debe introducir el nombre de la función API extendida correspondiente. Use comas para separar, por ejemplo:GetRobotDetail,DeleteRobotEsto da esto.API KEYel permiso para llamar a laObtenga información detallada sobre el comercio en vivoInterfaz y elEliminar las operaciones en vivo interface.

ElAPI KEYla página de administración también le permitemodificado, Deshabilitar, borrarel creadoAPI KEY.

Código de retorno de la interfaz API extendida

Un ejemplo de la estructura devuelta por la interfaz API extendida es la siguiente:

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

Elcodecampo is: El código de estado del resultado de la llamada devuelto cuando se llama la interfaz API extendida.

Descripción Código
Ejecución exitosa 0
La clave de API equivocada 1
Firma equivocada. 2
Error de no uso 3
Método incorrecto 4
Parámetro incorrecto 5
Error interno desconocido 6

Código de negociación en vivo

ElGetRobotListla interfaz, elGetRobotDetailinterfaz, y elGetRobotLogsdatos de retorno de interfaz en elstatuscampo para: el código del estado de negociación en vivo.

  • Inicio normal
    Estatus de las personas Código
    En inactividad 0
    En funcionamiento 1
    Paración 2
    Se ha firmado. 3
    Se detiene. 4
    La estrategia tiene errores. 5
  • No es normal.
    Estatus de las personas Código
    La estrategia ha expirado, y por favor póngase en contacto con el escritor para comprarlo de nuevo -1
    No se ha encontrado ningún docker -2
    Error de compilación de la estrategia -3
    El comercio en vivo ya está funcionando -4
    Saldo insuficiente -5
    El número de estrategias concurrentes excede el límite -6

Métodos de verificación

Hay dos métodos de verificación cuando se llama a la interfaz API extendida, apoyandotokenla verificación y la verificación directa.

Verificación de fichas

Utilizaciónmd5método de cifrado para verificar, ejemplo dePython, GolangLlamado por 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)
}

Verificación directa

Apoya la verificación sintoken(pasado)secret_keydirectos), puede generar una URL a la que se puede acceder directamente. Por ejemplo, la URL que da directamente instrucciones interactivas para el comercio en vivo, que puede utilizarse paraTradingViewo elWebHookEn otros casos, la solicitud de devolución deCommandRobot(RobotId, Cmd)función, el parámetrononceno requiere verificación, y la frecuencia de acceso y Los tiempos de visita de la interfaz no están limitados.

Por ejemplo, elAccessKeyde la extensión creadaAPI KEYes:xxxy elSecretKeyes:yyyVer el siguiente enlace para enviar un mensaje de comando interactivo a la negociación en vivo con el ID de negociación en vivo186515, el mensaje el contenido es una cadena:"ok12345".


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

En la circunstancia de que la verificación directa es apoyada, SóloCommandRobotInterfaz es compatible para obtener elBodyPor ejemplo, las configuraciones en elWebHook URLde lasTradingView:


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

Preste atención a la configuración de acuerdo con el siguiente formato:args=[130350,+""], en el que130350es el comercio en vivoIDde la Plataforma de Comercio Cuántico FMZ.

Establecer en el cuadro de mensaje deTrading View(el organismo solicitado) datos que deben enviarse):

  • El formato JSON:

    https://www.fmz.comimg

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

    El comercio en vivo conIDde las186515puede recibir la cadena de comandos interactiva:{"close": 39773.75, "name": "aaa"}.

  • Formato de texto:

    https://www.fmz.comimg

    BTCUSDTPERP Crossing 39700.00 close: {{close}}
    

    El comercio en vivo conIDde las186515puede recibir la cadena de comandos interactiva:BTCUSDTPERP Crossing 39700.00 close: 39739.4.

Ejemplos dePython & GolangLlamadas por idioma:

#!/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)
}

Utilice la API extendida en FMZ Quant para realizar la alerta TradingView comercio de señales

Explicación de la interfaz API extendida

  • La interfaz API ampliada de la plataforma de negociación cuántica FMZ Añadir los parámetros de la consulta (separados por?) de la solicitud inmediatamente despuéshttps://www.fmz.com/api/v1Los siguientes son los parámetros de solicitud expresados utilizandoPython:

    {
        "version"   : "1.0",
        "access_key": "xxx",
        "method"    : "GetNodeList",
        "args"      : [],
        "nonce"     : 1516292399361,
        "sign"      : "085b63456c93hfb243a757366600f9c2"
    }
    
    Campos Direcciones
    versión Número de versión.
    acceso_clave AccessKey, solicítalo en la página de administración de cuentas.
    Método El método específico de llamada.
    las La lista de parámetros del método específico llamado.
    No es La marca de tiempo, en milisegundos, permite un error de 1 hora desde la marca de tiempo estándar.
    el signo Signature.

    Cada nombre de parámetro está separado por el carácter&, y los nombres y valores de los parámetros están relacionados con el símbolo=. La URL completa de la solicitud (tomandomethod=GetNodeListpor ejemplo):

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

    Tenga en cuenta quesecret_keyParámetro entre los parámetros de solicitud.

  • Método de firma Elsignel parámetro del parámetro de solicitud se cifrará de la siguiente manera, de acuerdo con el formato:

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

    Después de concatenar las cadenas, useMD5algoritmo de cifrado para cifrar la cadena y convertirla en un valor de cadena de datos hexadecimal, referido como el valor del parámetrosignPara la parte de la firma, véase elPythonInterfaz de API de extensión de códigoMétodos de verificación :

    # 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()
    

ObtenerNodeList

ElGetNodeListEl método se utiliza para obtener la lista de los trabajadores portuarios en la cuenta de la Plataforma de Comercio Cuántico FMZ correspondiente a laAPI KEYen la solicitud.

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

Descripción de los campos de valor devuelto (el significado literal es obvio y no se repetirá):

  • todos: el número de trabajadores portuarios asociados a la cuenta corriente.
  • Nodos: Registra los detalles del nodo del muelle.
    • Edificación: número de versión.
    • Ciudad: la ciudad donde se encuentra.
    • is_owner: verdadero indica un docker privado, falso indica un docker público.
    • Cargado: Carga, el número de instancias de estrategia.
    • público: 0 indica un puerto privado, 1 indica un puerto público.
    • región: ubicación geográfica.
    • versión: información detallada de la versión del docker.
    • wd: Si se habilitará la alarma fuera de línea, 0 significa no habilitada. Los campos comienzan con los prefijosecs_yunit_, que registra la información pertinente del servidor docker de implementación de un solo clic (nombre del operador, configuración, estado, etc.), ciclo de facturación, precio y otra información, que no se repetirá aquí.

No hay parámetro

GetRobotGrupo Lista

GetRobotGroupList()devuelve la lista de agrupación de operaciones en vivo de la cuenta de la Plataforma de Comercio Quant FMZ correspondiente a laAPI KEYen la solicitud.

{
    "code": 0,
    "data": {
        "result": {
            "items": [{
                "id": 3417,
                "name": "Test"
            }, {
                "id": 3608,
                "name": "Live trading demo"
            }]
        },
        "error": null
    }
}
  • Se trata de la información sobre el grupo de operaciones en tiempo real.
    • Identificación del grupo de operaciones en vivo.
    • nombre: nombre de la agrupación de operaciones en vivo. ElitemsEl campo sólo registra los grupos recién creados.items.

No hay parámetro

Obtenga la lista de plataformas

GetPlatformList()devuelve la lista de los intercambios que han se ha añadido por la cuenta de la Plataforma de Comercio Cuántico FMZ correspondiente a laAPI KEYen la solicitud.

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

No hay parámetro

GetRobotList es una lista de robots

ElGetRobotListEl método se utiliza para obtener la lista de operaciones en vivo bajo la cuenta de la plataforma de negociación FMZ Quant correspondiente a laAPI KEYen la solicitud.

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

El ajuste de desplazamiento de la consulta de búsqueda. de desplazamiento falsos Número El ajuste de la longitud de la consulta de búsqueda. longitud falsos Número Especificar el estado de la negociación en vivo a consultar, consultar la interfaz API extendidaCódigo de negociación en vivo, pase-1para obtener todos los intercambios en vivo. robotEstado falsos Número Especifique la etiqueta personalizada del comercio en vivo que desea consultar, y puede filtrar todas las operaciones en vivo de esta etiqueta. etiqueta falsos la cuerda

Tome elPythonInterfaz API extendida del lenguajeMétodos de verificaciónPor ejemplo:print(api('GetRobotList', 'member2')): imprimir la información de todas las operaciones en vivo con la etiqueta personalizadamember2. print(api('GetRobotList', 0, 5, -1, 'member2')): páginas de 0 a 5 y una lista de hasta 5 robots etiquetados conmember2.

ComandoRobot

ElCommandRobotel método se utiliza para enviar una orden de interacción a la operación en vivo bajo la cuenta de la plataforma de negociación FMZ Quant correspondiente a laAPI KEYEl ID de la operación en vivo que recibe el comando de interacción es el ID de la operación en vivo especificado por elrobotIdParámetro, y el comando de interacción es devuelto por elGetCommand()función llamada en la estrategia para capturarlo.

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

El parámetrorobotIdSe utiliza para especificar el ID de la negociación en vivo que recibe el comando interactivo.GetRobotListmétodo para obtener la información de la negociación en vivo en la cuenta, que contiene el ID de negociación en vivo. El robot verdadero Número El parámetrocmdes el comando interactivo enviado al bot; el comando será capturado por la funciónGetCommand(), que activa la lógica interactiva en la estrategia.GetCommand()La función en elManual de la API de la plataforma de negociación cuántica FMZ- ¿ Por qué? el CMD verdadero la cuerda

Detener el robot

StopRobot(RobotId)se utiliza para solicitar elAPI KEYEl ID de negociación en vivo para dejar de funcionar es el ID de negociación en vivo especificado por la plataforma de negociación FMZ Quant.robotId parameter.

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

El parámetrorobotIdSe utiliza para especificar el ID de la negociación en vivo para ser detenido.GetRobotListmétodo para obtener la información de la negociación en vivo en la cuenta, que contiene el ID de negociación en vivo. El robot verdadero Número

Reinicie el robot

ElRestartRobotel método se utiliza para reiniciar la negociación en vivo bajo elAPI KEYEl ID de la negociación en vivo reiniciada es el ID de negociación en vivo especificado por elrobotId parameter.

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

ElrobotIdEl parámetro se utiliza para especificar el ID de la negociación en vivo a reiniciar.GetRobotListmétodo para obtener la información de la negociación en vivo en la cuenta, que contiene el ID de negociación en vivo. El robot verdadero Número Los parámetros de configuración de operaciones en vivo, los parámetrossettingsel formato es el siguiente:

{
    "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"}}
    ]
}

Cuando utiliza la información confidencial, como la plataformaAPI KEY, incluidos"meta":{"AccessKey":"xxx","SecretKey":"yyy"}en la configuración deeid, usted debe saber que FMZ no almacena los datos. Los datos serán enviados directamente al programa docker, por lo que esta información debe configurarse cada vez que se crea o reinicia el comercio en vivo.

Para reiniciar el comercio en vivo que utiliza el complemento para apoyar el intercambio, al configurar elsettingsParámetro, debe hacer las siguientes configuraciones para elexchangesel atributo:

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

labelatributo es establecer una etiqueta para el objeto de intercambio accesado por el actualProtocolo general, que puede obtenerse mediante elexchange.GetLabel()El objetivo de la estrategia es:

ajustes falsos Objeto JSON

Si el comercio en vivo se crea mediante la API extendida, la API extendidaRestartRobot (RobotId, Settings)Se debe utilizar para reiniciar, y elsettingsEl comercio en vivo creado en la página de la plataforma se puede reiniciar a través de la API extendida o haciendo clic en el botón de la página.settingsParámetro. Si sólo pasa elRobotIdParámetro, iniciar la negociación en vivo de acuerdo con la configuración actual de negociación en vivo.

GetRobotDetail es el nombre de un robot.

ElGetRobotDetailEl método se utiliza para obtener los detalles de la negociación en vivo bajo la cuenta de la plataforma de negociación FMZ Quant correspondiente a laAPI KEYEl ID de la operación en vivo que se desea recuperar es el ID de la operación en vivo especificado por elrobotId 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
    }
}

ElrobotIdEl parámetro se utiliza para especificar el ID de la negociación en vivo para la que se deben obtener los detalles.GetRobotListmétodo para obtener información sobre la negociación en vivo en la cuenta, que contiene el ID de negociación en vivo. El robot verdadero Número

Elsummaryatributo en los datos devueltos (información en la barra de estado del bot; almacenado en caché durante 10 segundos; no los datos más recientes) actualmente tiene un límite de cantidad de datos (datos almacenados en caché). El límite de cantidad de datos es de 200KB, y el exceso de datos se truncará.GetRobotLogsInterfaz para obtener (cuandoGetRobotLogsObtiene la información de la barra de estado, el camposummaryes el último dato).

La descripción del atributo destrategy_exchange_pairs, por ejemplo, los siguientes datos:

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

Los primeros datos60representa el período predeterminado de línea K establecido por la negociación en vivo es de 1 minuto, es decir, 60 segundos.[44314,42960,15445,14703]es el objeto de intercambiopidconfigurado para operaciones en vivo (según la orden de adición).[\"BTC_USDT\",\"BTC_USDT\",\"ETH_USDT\",\"ETH_USDT\"]es el par de operaciones establecido para el objeto de intercambio configurado mediante operaciones en vivo (en orden de suma y en correspondencia uno a uno conpid).

Obtener Cuenta

ElGetAccountEl método se utiliza para obtener la información de la cuenta correspondiente a laAPI KEYen la solicitud de la cuenta de la plataforma de negociación cuántica 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
    }
}

Obtener lista de cambio

ElGetExchangeListEl método se utiliza para obtener la lista de intercambios y la información de configuración requerida soportada por la plataforma de negociación de FMZ Quant.

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

No se puede eliminar

ElDeleteNode(Nid)método se utiliza para eliminar el nodo de docker correspondiente a laAPI KEYen la solicitud de la cuenta de la plataforma de negociación FMZ Quant.nid parameter.

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

ElnidEl parámetro se utiliza para especificar el ID del docker a eliminar.GetNodeListmétodo para obtener información sobre los doctores de la cuenta. Ni siquiera verdadero Número

EliminarRobot

ElDeleteRobot(RobotId, DeleteLogs)El método se utiliza para eliminar el comercio en vivo correspondiente a laAPI KEYen la solicitud de la cuenta de la plataforma de negociación FMZ Quant.robotId parameter.

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

El parámetrorobotIdSe utiliza para especificar el ID de la negociación en vivo que se eliminará.GetRobotListmétodo para obtener la información de la negociación en vivo en la cuenta, que contiene el ID de negociación en vivo. El robot verdadero Número EldeleteLogsEl parámetro se utiliza para establecer si se elimina el registro de operaciones en vivo, si se pasa un valor verdadero (por ejemplo:true), se suprime el registro de operaciones en vivo. Descargar registros verdadero - ¿ Qué?

Obtener estrategia lista

ElGetStrategyList()El método se utiliza para obtener la información estratégica correspondiente a laAPI KEYen la solicitud de la cuenta de la plataforma de negociación cuántica 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
    }
}

NuevoRobot

ElNewRobotel método se utiliza para crear una negociación en vivo bajo elAPI KEYcorrespondiente a la cuenta de la plataforma de negociación cuántica FMZ en la solicitud.

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

los parámetros de configuración de operaciones en vivo,settingsel formato de los parámetros es el siguiente:

{
    "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"}}
    ]
}

ajustes verdadero Objeto JSON

Cuando utiliza la información confidencial, como la plataformaAPI KEY, incluidos"meta":{"AccessKey":"xxx","SecretKey":"yyy"}en la configuración deeid, usted debe saber FMZ no almacena los datos. Los datos se enviarán directamente al programa docker, por lo que esta información debe configurarse cada vez que se cree o reinicie el comercio en vivo.

Si desea crear el comercio en vivo que utiliza el complemento para apoyar la plataforma, al configurar elsettingsParámetro, debe hacer las siguientes configuraciones para elexchangesel atributo:

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

labelEl atributo es establecer una etiqueta para el objeto de intercambio al que accede el protocolo general actual, que puede obtenerse mediante elexchange.GetLabel()El objetivo de la estrategia es:

PluginEjecutar

ElPluginRunEl método se utiliza para llamar elherramienta de depuraciónfunción de la plataforma de negociación cuantitativa FMZ.

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

Los parámetros de configuración en la herramienta de depuración,settingsConfiguración, incluye el código de ensayo en elsourceel atributo.settingsel formato del parámetro es el siguiente:

    # 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.

¿ Qué pasa? código: 0, datos: { resultado: { estado : 1, actualización Tiempo : 1527049990197, wd: 0, // La primera estructura de datos en los registros es los registros de registro en la tabla de registro de estrategia en la base de datos de operaciones en vivo logs: [{
Max: 3984, ¿Por qué no lo haces? [3977, 3, Futures_OKCoin, , 0, 0, Sell ((688.9, 2): 20016, 1526954372591, , ], [3976, 5, , , 0, 0, OKCoin:this_week excesivas posiciones, largo: 2, 1526954372410, , ] ], Total : 1503, Min: 2482 ¿Por qué no?
// La segunda estructura de datos en los registros es los registros de registro en la tabla de registro de estrategia en la base de datos de operaciones en vivo Max: 0, Arr: [], Total : 0, Min: 0 ¿Por qué no?
// La tercera estructura de datos en los registros es los registros de registro en la tabla de registro de estrategia en la base de datos de operaciones en vivo Max: 0, Arr: [], Total : 0, Min: 0 Se trata de: gráfico: , refresh: 1527049988000, resumen: ..., "Tiempo de gráfico": 0, "node_id": 50755, "en línea": verdadero El número de "error": nulo ¿ Por qué? ¿ Por qué?



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:
  

¿Por qué no lo haces? [3977, 3, Futures_OKCoin, , 0, 0, Sell ((688.9, 2): 20016, 1526954372591, , ], [3976, 5, , , 0, 0, OKCoin:esta_semana demasiadas posiciones, largo: 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.

¿Por qué no lo haces? [202, 2515.44, 1575896700315], [201, 1415.44, 1575896341568] ¿Qué es lo que quiere decir? ¿ Por qué?


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

¿Por qué no lo haces? [23637, 0, { cerrado :648, alto :650.5, bajo :647, abierto :650, x :1575960300000} , ¿Por qué no lo haces? ¿ Por qué?


Take one of the log data as an example:

[23637, 0, { cerrado :648, alto :650.5, bajo :647, abierto :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 negociación