avatar of 奥克量化 奥克量化
focar em Mensagem privada
6
focar em
185
Seguidores

Oak ensina como usar JS para se conectar à API de extensão FMZ

Criado em: 2020-05-16 18:04:17, atualizado em: 2024-12-10 20:29:45
comments   2
hits   2934

Oak ensina como usar JS para se conectar à API de extensão FMZ

Introdução

Olá a todos, eu sou a “Oak Quantitative”. Por causa do lembrete de tendência de mercado que desenvolvi há algum tempo [Monitoramento do painel】 é amplamente amado por todos, e há lembretes simultâneos da conta de serviço de mesmo nome [Oak Quantitative], que fornece aos investidores novos e antigos uma nova referência para julgar as tendências do mercado. Aproveitando essa popularidade, começamos a nos conectar à API estendida da FMZ para realizar a comunicação de mensagens entre robôs e enviar alertas de mercado diretamente para robôs designados. Este artigo fornece dois cenários de aplicação como exemplos para estimular a discussão. Espero que você possa desenvolver coisas mais interessantes…

Este artigo apresenta principalmente: 1. Como os desenvolvedores se conectam à API estendida da FMZ por meio da linguagem JS? (Este artigo usa o método GetNodeList como exemplo) 2. Caso 1: Use o método CommandRobot da API estendida para implementar a comunicação de mensagens entre o robô de monitoramento e outros robôs. 3. Caso 2: Use o método GetRobotDetail da API estendida para obter monitoramento e exibição unificados de vários dados de robôs.

1. Use JS para conectar-se à API estendida da FMZ

  1. Solicite AccessKey e SecretKey (doravante denominadas AK e SK). Aplicamos no menu [Configurações da conta] -> [Interface da API] -> [Criar nova ApiKey] no site oficial da FMZ e, em seguida, obtemos um conjunto de AK e SK e os registramos. (AK e SK da FMZ não são como exchanges onde eles só são visíveis na primeira vez que são criados. Na FMZ, podemos visualizar os dados completos de nossos AK e SK a qualquer momento no menu [Interface da API]) Oak ensina como usar JS para se conectar à API de extensão FMZ

  2. Desenvolver de acordo com a documentação da API estendida Primeiro, vamos dar uma olhada nas principais etapas da solicitação da API

  3. Interface da API FMZ:

https://www.fmz.com/api/v1
  1. Solicitar parâmetros básicos
{
    'version'   : '1.0',                                //自定义版本号
    'access_key': '8a148320e0bxxxxxxxxxxxxxx19js99f',   //AK
    'method'    : 'GetNodeList',                        //具体调用的方法
    'args'      : [],                                   //具体method算法的参数列表
    'nonce'     : 1516292399361,                        //时间戳,单位毫秒
    'sign'      : '085b63456c93hfb243a757366600f9c2'    //签名(需要根据上面5个参数加密获取,下面有讲)
}
  1. A URL completa da solicitação é concatenada na forma de passagem de parâmetro de ponto de interrogação
以GetNodeList方法为例
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
按照如下顺序进行参数拼接后,使用MD5加密算法加密字符串,并转换为十六进制数据字符串值,该值作为参数sign的值。
version + "|" + method + "|" + args + "|" + nonce + "|" + secretKey
  1. Para resumir, existem os seguintes códigos Endereço do código-fonte:[Oak Quantitative]-JS docking FMZ extensão API Demo
var URL = "https://www.fmz.com/api/v1?";
var AK = "b3a53d3XXXXXXXXXXXXXXXXXXX866fe5";//这里替换成你自己的AccessKey
var SK = "1d9ddd7XXXXXXXXXXXXXXXXXXX85be17";//这里替换成你自己的SecretKey

function main() {
    //获取5个基础参数对象
    var param = getParam("1.0.0",AK,getArgs());
    Log("param:",param);
    //获取拼接参数md5加密后的结果
    var md5Result = md5(param);
    //赋值加密结果到基础参数对象中
    param.sign = md5Result;
    //获取请求api的URL
    var finalUrl = getFinalUrl(param);
    Log("finalUrl:",finalUrl);
    //执行请求并打印结果
    var info = HttpQuery(finalUrl);
    Log("info:",info);
}

//获取基础5个参数的对象
function getParam(version,ak,args){
    return {
        'version': version,
        'access_key': ak,
        'method': 'GetNodeList',
        'args': JSON.stringify(args),
        'nonce': new Date().getTime()
    }
}

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

//获取最终请求URL
function getFinalUrl(param){
    return URL+"access_key="+AK+"&nonce="+param.nonce+"&args="+param.args+"&sign="+param.sign+"&version="+param.version+"&method="+param.method;
}

//js中不支持...args的命名方式,所以改用arguments关键字获取参数数组
function getArgs(){
    return [].slice.call(arguments);
}

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

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

Primeiro, vamos dar uma olhada nos dois parâmetros necessários pelo método CommandRobot(RobotId, Cmd).

Nome do parâmetro tipo significado
RobotId int ID do robô, que pode ser obtido usando GetRobotList(…) ou na página de detalhes do robô
Cmd String Mensagens para o bot

Sabendo o significado dos parâmetros, vamos implementar este método de chamada em seguida.

  1. Obtenha o ID do robô na página de detalhes do robô: Oak ensina como usar JS para se conectar à API de extensão FMZ

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

//获取消息头信息
function getMessageBody(toUserName,msgType,content){
    return ({
        "toUserName":toUserName,//发送给谁
        "fromUserName":AOKE_INFO,//消息来源
        "createTime": new Date().getTime(),//当前时间戳
        "msgType":msgType,//消息类型
        "content":content,//消息内容
        "msgId":Math.random().toString(36).slice(-8)//消息ID
    })
}

//获取消息体趋势信息(消息头content字段的数据)
function getCtaDate(symbol,timeCycle,direction,nowCycleTime){
    return {
        "symbol":symbol,//交易币种
        "timeCycle":timeCycle,//趋势周期
        "direction":direction,//当前进入的方向,0:看空,1:看多
        "createTime":new Date().getTime(),//当前时间戳
        "nowCycleTime":nowCycleTime//当前进入的周期起始时间
    }
}
  1. Modifique o código para envio de mensagens
//发送消息前先获取消息
var sendMessage = getMessageBody("测试对象",'CTARemind',getCtaDate('BTC_USDT','120','0','2020-05-1620:00:00'));

//把机器人ID和消息体通过getArgs()方法获取,并传入基础参数。
var param = getParam("1.0.0",AK,getArgs(17777,sendMessage));
  1. Execute o método principal, envie a mensagem e 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 sucesso: Oak ensina como usar JS para se conectar à API de extensão FMZ Recebeu mensagem com sucesso: Oak ensina como usar JS para se conectar à API de extensão FMZ

Caso 3: Use os métodos GetRobotList e GetRobotDetail da API estendida para monitorar e exibir dados do robô.

Da mesma forma, vamos primeiro olhar para as descrições dos parâmetros dos dois métodos GetRobotList(offset, length, robotStatus, label):

Nome do parâmetro tipo significado
offset int Número da página de consulta
length int Comprimento dos dados da página de consulta
robotStatus int Passe -1 para obter todos
label String As tags personalizadas podem filtrar todos os robôs com esta tag

GetRobotDetail(RobotId):

Nome do parâmetro tipo significado
RobotId int ID do robô
  1. Obtenha a lista de robôs por meio do método GetRobotList
//获取机器人列表信息
var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
var robotList = robotListJson.data.result.robots;
  1. Obtenha detalhes do robô
//获取机器人详情信息
var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
var robotDetail = robotDetailJson.data.result.robot;
  1. O console emite dados da tabela
function getLogPrient(infoArr){
    return table = {
            type: 'table',
            title: '奥克量化的机器人展示',
            cols: ['机器人ID','机器人名称','策略名称','下次扣费时间','已经消耗时间ms','已经消耗金额CNY','最近活跃时间','是否公开'],
            rows: infoArr
        };
}
  1. Para resumir, existem os seguintes códigos Endereço do código-fonte:[OakQuant]-Use a API estendida para obter informações do robô e exibi-las
var URL = "https://www.fmz.com/api/v1?";
var AK = "b3a53d3XXXXXXXXXXXXXXXXXXX866fe5";//这里替换成你自己的AccessKey
var SK = "1d9ddd7XXXXXXXXXXXXXXXXXXX85be17";//这里替换成你自己的SecretKey
var OFF_SET = 0;//查询的页码下标
var PAGE_LENGTH = 5;//查询页的数据长度

function main() {
    LogReset();
    while(true){
        //获取机器人列表信息
        var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
        //取出机器人列表信息
        var robotList = robotListJson.data.result.robots;
        //创建展示机器人信息的数组
        var infoArr = new Array();
        var infoArr_index = 0;
        for (index = 0; index < robotList.length; index++) {
            var robot = robotList[index];
            //取出当前循环到的机器人ID
            var robotId = robot.id;
            //获取机器人详情信息
            var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
            var robotDetail = robotDetailJson.data.result.robot;
            //转换详情为数组对象
            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: '奥克量化的机器人展示',
            cols: ['机器人ID','机器人名称','策略名称','下次扣费时间','已经消耗时间ms','已经消耗金额CNY','最近活跃时间','是否公开'],
            rows: infoArr
        };
}

//通过参数获取API信息
function getAPIInfo(method,dateInfo){
    //获取5个基础参数对象
    var param = getParam("1.0.0",AK,method,dateInfo);
    //Log("param:",param);
    //获取拼接参数md5加密后的结果
    var md5Result = md5(param);
    //赋值加密结果到基础参数对象中
    param.sign = md5Result;
    //获取请求api的URL
    var finalUrl = getFinalUrl(param);
    //Log("finalUrl:",finalUrl);
    //执行请求并打印结果
    var info = HttpQuery(finalUrl);
    //Log("info:",info);
    return JSON.parse(info);
}

//获取基础5个参数的对象
function getParam(version,ak,method,args){
    return {
        'version': version,
        'access_key': ak,
        'method': method,
        'args': JSON.stringify(args),
        'nonce': new Date().getTime()
    }
}

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

//获取最终请求URL
function getFinalUrl(param){
    return URL+"access_key="+AK+"&nonce="+param.nonce+"&args="+param.args+"&sign="+param.sign+"&version="+param.version+"&method="+param.method;
}

//js中不支持...args的命名方式,所以改用arguments关键字获取参数数组
function getArgs(){
    return [].slice.call(arguments);
}

//获取展示详情对象'机器人ID','机器人名称','策略名称','下次扣费时间','已经消耗时间ms','已经消耗金额CNY','最近活跃时间','是否公开'],
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?"已公开":"未公开";
    return itemArr;
}

Exibição de efeito:

Oak ensina como usar JS para se conectar à API de extensão FMZ

Conclusão

Na expansão real, funções mais interessantes podem ser realizadas. Por exemplo, use o método CommandRobot para permitir que cada robô envie uma verificação de pulsação para o robô A. Se o robô A descobrir que uma máquina não tem pulsação, mas o robô ainda estiver em execução, ele pode emitir um alarme por meio do número de serviço FMZ. Dessa forma, alarmes que podem causar travamentos no programa, como loops mortos _C(), podem ser evitados. Espero que, com a minha inspiração desta vez, a plataforma FMZ possa ter cada vez mais funções interessantes desenvolvidas e disponibilizadas de código aberto por todos. Por fim, gostaria de agradecer à plataforma FMZ e a todas as pessoas excelentes, incluindo o Sr. Meng, o Sr. Chao e o Sr. Z, pelo apoio e ajuda. Obrigado~