Oak ensina você a usar o JS para interagir com a API estendida FMZ

Autora:Lydia., Criado: 2022-12-20 13:27:24, Atualizado: 2023-09-20 11:12:14

img

Oak ensina você a usar o JS para interagir com a API estendida FMZ

Introdução

Olá a todos, sou o Oak Quant, devido ao lembrete de tendência do mercado que desenvolvi há algum tempo.monitorizar o mercado, que é popular, e há um lembrete síncrono do número de serviço do mesmo nome, que dá aos usuários novos e antigos uma nova referência para julgar a tendência do mercado. Para aproveitar esse calor, começamos a acoplar a API estendida do FMZ para alcançar a comunicação de mensagens entre robôs e enviar alertas de mercado para robôs designados diretamente.

Este artigo apresenta principalmente:

  1. Como os desenvolvedores interagem com as APIs estendidas FMZ através da linguagem JS. (Este artigo leva o método GetNodeList como exemplo.)
  2. Caso 1: utilizar o método CommandRobot da API estendida para realizar a comunicação de mensagens entre o robô de monitorização e outros robôs.
  3. Caso 2: Utilize o método GetRobotDetail da API estendida para realizar o monitoramento e a exibição unificados de vários dados do robô.

1. Use o JS para interagir com a API estendida do FMZ

1) Solicitar a AccessKey e a SecretKey (doravante designadas por AK e SK). Aplicamos no menu de [Conta] -> [ApiKey] -> [Criar novo ApiKey] no site oficial da FMZ, e, em seguida, obtemos e gravamos um grupo de AK e SK. (AK e SK na FMZ são visíveis, podemos visualizar os dados completos de AK e SK no menu [API Interface] a qualquer momento.)

img

2) Desenvolver de acordo com o documento API estendido Primeiro, vamos olhar para as etapas-chave da API de solicitação.

  1. Interface da API FMZ:
https://www.fmz.com/api/v1
  1. Parâmetros básicos do pedido
{
    'version'   : '1.0',                                //Custom version number
    'access_key': '8a148320e0bxxxxxxxxxxxxxx19js99f',   //AK
    'method'    : 'GetNodeList',                        //The specific method to call
    'args'      : [],                                   //List of parameters for the specific method algorithm
    'nonce'     : 1516292399361,                        //Timestamp, in milliseconds
    'sign'      : '085b63456c93hfb243a757366600f9c2'    //Signature (need to be encrypted according to the above 5 parameters to obtain, as discussed below)
}
  1. URLs de solicitação completas são emolduradas na forma de sinal de interrogação e passagem de parâmetros
Take the GetNodeList method as an example:
https://www.fmz.com/api/v1?
access_key=8a148320e0bxxxxxxxxxxxxxx19js99f&
nonce=1516292399361&
args=%5B%5D&
sign=085b63456c93hfb243a757366600f9c2&
version=1.0&
method=GetNodeList
  1. Método de assinatura
After the parameters are spliced in the following order, the MD5 encryption algorithm is used to encrypt the string and convert it to a hexadecimal data string value, which is used as the value of the parameter sign.
version + "|" + method + "|" + args + "|" + nonce + "|" + secretKey
  1. Em resumo, o seguinte código está disponível: Endereço do código fonte:[Oak Quant] - JS acoplamento FMZ extensão API Demo
var URL = "https://www.fmz.com/api/v1?";
var AK = "b3a53d3XXXXXXXXXXXXXXXXXXX866fe5";//Replace here with your own AccessKey
var SK = "1d9ddd7XXXXXXXXXXXXXXXXXXX85be17";//Replace here with your own SecretKey

function main() {
    //Get 5 basic parameter objects
    var param = getParam("1.0.0",AK,getArgs());
    Log("param:",param);
    //Get the result after md5 encryption of splicing parameters
    var md5Result = md5(param);
    //Assign the encryption result to the basic parameter object
    param.sign = md5Result;
    //Get the URL of the request api
    var finalUrl = getFinalUrl(param);
    Log("finalUrl:",finalUrl);
    //Execute the request and print the results
    var info = HttpQuery(finalUrl);
    Log("info:",info);
}

//Get 5 basic parameter objects
function getParam(version,ak,args){
    return {
        'version': version,
        'access_key': ak,
        'method': 'GetNodeList',
        'args': JSON.stringify(args),
        'nonce': new Date().getTime()
    }
}

//Execute md5 encryption
function md5(param){
    var paramUrl = param.version+"|"+param.method+"|"+param.args+"|"+param.nonce+"|"+SK
    Log("paramUrl:",paramUrl);
    return Hash("md5", "hex", paramUrl)
}

//Get the final request URL
function getFinalUrl(param){
    return URL+"access_key="+AK+"&nonce="+param.nonce+"&args="+param.args+"&sign="+param.sign+"&version="+param.version+"&method="+param.method;
}

//The naming method of... args is not supported in js, so the arguments keyword is used instead to obtain the parameter array
function getArgs(){
    return [].slice.call(arguments);
}

Caso 2: Utilizando o método CommandRobot da API estendida para alcançar a comunicação de mensagens entre robôs

Com base no código acima, utilizaremos o método CommandRobot para obter comunicação de mensagens entre robôs.

Em primeiro lugar, vamos dar uma olhada nos dois parâmetros exigidos pelo método CommandRobot (RobotId, Cmd):

Nome do parâmetro Tipo Significado
RobotId int Robot ID, que pode ser obtido com GetRobotList (...) ou na página de detalhes do robô
Cmd Corda Mensagem enviada para robô

Agora que sabemos o significado do parâmetro, vamos implementar o método de chamada.

  1. Obtenha a ID do robô na página de detalhes do robô

  2. Implementar o método de obtenção de mensagem Cmd

//Get message header information
function getMessageBody(toUserName,msgType,content){
    return ({
        "toUserName":toUserName,//Who to send to
        "fromUserName":AOKE_INFO,//Source
        "createTime": new Date().getTime(),//Current timestamp
        "msgType":msgType,//Message Type
        "content":content,//Message content
        "msgId":Math.random().toString(36).slice(-8)//Message ID
    })
}

//Get message body trend information (data of message header content field)
function getCtaDate(symbol,timeCycle,direction,nowCycleTime){
    return {
        "symbol":symbol,//Trading currency
        "timeCycle":timeCycle,//Trend cycle
        "direction":direction,//Current entry direction, 0: berish, 1: bullish
        "createTime":new Date().getTime(),//Current timestamp
        "nowCycleTime":nowCycleTime//Start time of current cycle
    }
}
  1. Modificar o código de envio da mensagem
//Get messages before sending them
var sendMessage = getMessageBody("Test object",'CTARemind',getCtaDate('BTC_USDT','120','0','2020-05-1620:00:00'));

//Get the robot ID and message body through the getArgs() method, and pass in the basic parameters.
var param = getParam("1.0.0",AK,getArgs(17777,sendMessage));
  1. Execute o método principal. Depois de enviar a mensagem, use o método GetCommand() para obter a mensagem
function main(){
    while(true) { 
        var cmd = GetCommand()
        if (cmd) { 
            Log(cmd)
        }
        Sleep(1000) 
    }
}

Mensagem enviada com êxito:

img

Mensagem recebida com êxito:

img

Caso 3: Utilize os métodos GetRobotList e GetRobotDetail da API estendida para realizar o monitoramento e a exibição de dados de robôs.

Da mesma forma, vamos primeiro olhar para as descrições de parâmetros dos dois métodos seguintes GetRobotList ((offset, comprimento, robotStatus, rótulo):

Nome do parâmetro Tipo Significado
deslocamento int Número de página da consulta
comprimento int Duração dos dados da página de consulta
robotEstado int Passe para dentro - 1 para obter tudo
etiqueta Corda Etiquetas personalizadas podem filtrar todos os robôs com esta tag

GetRobotDetail ((RobotId):

Nome do parâmetro Tipo Significado
RobotId int Identificação do robô
  1. Obter a lista de Robôs através do método GetRobotList
//Get robot list information
var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
var robotList = robotListJson.data.result.robots;
  1. Obter informações detalhadas do robô
//Get robot detail information
var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
var robotDetail = robotDetailJson.data.result.robot;
  1. Dados da tabela de saída do console
function getLogPrient(infoArr){
    return table = {
            type: 'table',
            title: 'Oak Quant robot display',
            cols: [''Robot ID', 'Robot name', 'Strategy name', 'Next deduction time', 'Consumed time ms', 'Consumed amount CNY', 'Latest active time', 'Publish or not'],
            rows: infoArr
        };
}
  1. Em resumo, o seguinte código está disponível: Endereço do código fonte:Use a API estendida para obter informações sobre o robô e exibi-lo
var URL = "https://www.fmz.com/api/v1?";
var AK = "b3a53d3XXXXXXXXXXXXXXXXXXX866fe5";//Replace here with your own AccessKey
var SK = "1d9ddd7XXXXXXXXXXXXXXXXXXX85be17";//Replace here with your own SecretKey
var OFF_SET = 0;//Page number subscript of query
var PAGE_LENGTH = 5;//Data length of the query page

function main() {
    LogReset();
    while(true){
        //Get robot list information
        var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
        //Get the robot list information
        var robotList = robotListJson.data.result.robots;
        //Create an array to display robot information
        var infoArr = new Array();
        var infoArr_index = 0;
        for (index = 0; index < robotList.length; index++) {
            var robot = robotList[index];
            //Get the robot ID of the current loop
            var robotId = robot.id;
            //Get robot detail information
            var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
            var robotDetail = robotDetailJson.data.result.robot;
            //Convert details to array objects
            var arr = getLogPrientItem(robotDetail);
            infoArr[infoArr_index] = arr;
            infoArr_index++;
        }
        Log("infoArr:",infoArr);
        LogStatus('`' + JSON.stringify(getLogPrient(infoArr)) + '`');
        Sleep(30000);
    }
}

function getLogPrient(infoArr){
    return table = {
            type: 'table',
            title: 'Oak Quant robot display',
            cols: [''Robot ID', 'Robot name', 'Strategy name', 'Next deduction time', 'Consumed time ms', 'Consumed amount CNY', 'Latest active time', 'Publish or not'],
            rows: infoArr
        };
}

//Get API information by parameters
function getAPIInfo(method,dateInfo){
    //Get 5 basic parameter objects
    var param = getParam("1.0.0",AK,method,dateInfo);
    //Log("param:",param);
    //Get the result after md5 encryption of splicing parameters
    var md5Result = md5(param);
    //Assign the encryption result to the basic parameter object
    param.sign = md5Result;
    //Get the URL of the request api
    var finalUrl = getFinalUrl(param);
    //Log("finalUrl:",finalUrl);
    //Execute the request and print the results
    var info = HttpQuery(finalUrl);
    //Log("info:",info);
    return JSON.parse(info);
}

//Get the object of the basic 5 parameters
function getParam(version,ak,method,args){
    return {
        'version': version,
        'access_key': ak,
        'method': method,
        'args': JSON.stringify(args),
        'nonce': new Date().getTime()
    }
}

//Execute md5 encryption
function md5(param){
    var paramUrl = param.version+"|"+param.method+"|"+param.args+"|"+param.nonce+"|"+SK
    //Log("paramUrl:",paramUrl);
    return Hash("md5", "hex", paramUrl)
}

//Get the final request URL
function getFinalUrl(param){
    return URL+"access_key="+AK+"&nonce="+param.nonce+"&args="+param.args+"&sign="+param.sign+"&version="+param.version+"&method="+param.method;
}

//The naming method of... args is not supported in js, so the arguments keyword is used instead to obtain the parameter array
function getArgs(){
    return [].slice.call(arguments);
}

//Get the display details object: ['Robot ID', 'Robot Name', 'Strategy Name', 'Next Deduction Time', 'Time Consumed ms', 'Amount Consumed CNY', 'Latest Active Time', 'Whether to Publish'],
function getLogPrientItem(robotDetail){
    var itemArr = new Array();
    var iteArr_index = 0;
    itemArr[iteArr_index++] = robotDetail.id;
    itemArr[iteArr_index++] = robotDetail.name;
    itemArr[iteArr_index++] = robotDetail.strategy_name;
    itemArr[iteArr_index++] = robotDetail.charge_time;
    itemArr[iteArr_index++] = robotDetail.charged;
    itemArr[iteArr_index++] = robotDetail.consumed/1e8;
    itemArr[iteArr_index++] = robotDetail.refresh;
    itemArr[iteArr_index++] = robotDetail.public == 0?"Published":"Unpublished";
    return itemArr;
}

Conclusão

Na extensão real, mais e mais funções interessantes podem ser realizadas. Por exemplo, usando o método CommandRobot, cada robô envia detecção de batimento cardíaco para o robô A. Se o robô A descobrir que uma máquina não tem batimento cardíaco, mas o robô ainda está funcionando, ele pode dar um alarme através do serviço FMZ. Desta forma, alarmes como _C() dead loops que levam a cenários de morte falsos de programação podem ser evitados. Espero que através da minha introdução desta vez, a plataforma FMZ possa ter mais e mais funções interessantes para serem desenvolvidas e abertas. Finalmente, gostaria de agradecer à plataforma FMZ e a todos os grandes homens como Xiaoxiaomeng, o Sr. Zhang e o Sr. Z por seu apoio e ajuda.


Relacionados

Mais.