avatar of 奥克量化 奥克量化
Seguir Mensajes Privados
6
Seguir
185
Seguidores

Oak te enseña cómo usar JS para conectarte a la API de extensión FMZ

Creado el: 2020-05-16 18:04:17, Actualizado el: 2024-12-10 20:29:45
comments   2
hits   2934

Oak te enseña cómo usar JS para conectarte a la API de extensión FMZ

Introducción

Hola a todos, soy “Oak Quantitative”. Debido al recordatorio de tendencias del mercado que desarrollé hace algún tiempo [Monitoreo del tablero de instrumentos】 es ampliamente querido por todos, y hay recordatorios simultáneos de la cuenta de servicio del mismo nombre [Oak Quantitative], que proporciona a los inversores nuevos y antiguos una nueva referencia para juzgar las tendencias del mercado. Aprovechando esta popularidad, comenzamos a conectarnos a la API extendida de FMZ para realizar la comunicación de mensajes entre robots y enviar alertas de mercado directamente a los robots designados. En este artículo se ofrecen dos casos prácticos de aplicación como ejemplos para estimular el debate. Espero que puedas desarrollar más cosas interesantes…

Este artículo presenta principalmente: 1. ¿Cómo se conectan los desarrolladores a la API extendida de FMZ a través del lenguaje JS? (Este artículo toma el método GetNodeList como ejemplo) 2. Caso 1: Utilice el método CommandRobot de la API extendida para implementar la comunicación de mensajes entre el robot de monitoreo y otros robots. 3. Caso 2: Utilice el método GetRobotDetail de la API extendida para lograr un monitoreo y visualización unificados de múltiples datos de robots.

1. Utilice JS para conectarse a la API extendida de FMZ

  1. Solicitar AccessKey y SecretKey (en adelante denominadas AK y SK). Aplicamos en el menú de [Configuración de cuenta] -> [Interfaz API] -> [Crear nueva ApiKey] en el sitio web oficial de FMZ, y luego obtenemos un conjunto de AK y SK y los grabamos. (Los AK y SK de FMZ no son como los exchanges donde solo son visibles la primera vez que se crean. En FMZ, podemos ver los datos completos de nuestros AK y SK en cualquier momento en el menú [Interfaz API]) Oak te enseña cómo usar JS para conectarte a la API de extensión FMZ

  2. Desarrollar de acuerdo con la documentación de la API extendida Primero, veamos los pasos clave para solicitar la API

  3. Interfaz 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. La URL de solicitud completa se concatena en forma de paso de parámetros con signo de interrogación.
以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 firma
按照如下顺序进行参数拼接后,使用MD5加密算法加密字符串,并转换为十六进制数据字符串值,该值作为参数sign的值。
version + "|" + method + "|" + args + "|" + nonce + "|" + secretKey
  1. En resumen, existen los siguientes códigos Dirección del código fuente:[Oak Quantitative] - Demostración de la API de la extensión FMZ de acoplamiento JS
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: Uso del método CommandRobot de la API extendida para implementar la comunicación de mensajes entre robots

Basándonos en el código anterior, utilicemos el método CommandRobot para implementar la comunicación de mensajes entre robots.

Primero, veamos los dos parámetros requeridos por el método CommandRobot(RobotId, Cmd).

Nombre del parámetro tipo significado
RobotId int ID del robot, que se puede obtener usando GetRobotList(…) o en la página de detalles del robot
Cmd String Mensajes al bot

Conociendo el significado de los parámetros, implementemos este método de llamada a continuación.

  1. Obtenga el ID del robot en la página de detalles del robot: Oak te enseña cómo usar JS para conectarte a la API de extensión FMZ

  2. Implementar el método para obtener el mensaje 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. Modificar el código para enviar mensajes
//发送消息前先获取消息
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. Ejecute el método principal, envíe el mensaje y use el método GetCommand() para obtener el mensaje.
function main(){
    while(true) { 
        var cmd = GetCommand()
        if (cmd) { 
            Log(cmd)
        }
        Sleep(1000) 
    }
}

Mensaje enviado exitosamente: Oak te enseña cómo usar JS para conectarte a la API de extensión FMZ Recibir mensaje exitosamente: Oak te enseña cómo usar JS para conectarte a la API de extensión FMZ

Caso 3: Utilice los métodos GetRobotList y GetRobotDetail de la API extendida para monitorear y mostrar datos del robot.

De manera similar, veamos primero las descripciones de los parámetros de los dos métodos. GetRobotList(offset, length, robotStatus, label):

Nombre del parámetro tipo significado
offset int Consultar número de página
length int Longitud de los datos de la página de consulta
robotStatus int Pasa -1 para obtener todo
label String Las etiquetas personalizadas pueden filtrar todos los robots con esta etiqueta

GetRobotDetail(RobotId):

Nombre del parámetro tipo significado
RobotId int Identificación del robot
  1. Obtenga la lista de robots a través del método GetRobotList
//获取机器人列表信息
var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
var robotList = robotListJson.data.result.robots;
  1. Obtenga detalles del robot
//获取机器人详情信息
var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
var robotDetail = robotDetailJson.data.result.robot;
  1. La consola genera datos de la tabla.
function getLogPrient(infoArr){
    return table = {
            type: 'table',
            title: '奥克量化的机器人展示',
            cols: ['机器人ID','机器人名称','策略名称','下次扣费时间','已经消耗时间ms','已经消耗金额CNY','最近活跃时间','是否公开'],
            rows: infoArr
        };
}
  1. En resumen, existen los siguientes códigos Dirección del código fuente:[OakQuant]-Utilice la API extendida para obtener información del robot y mostrarla
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;
}

Visualización de efectos:

Oak te enseña cómo usar JS para conectarte a la API de extensión FMZ

Conclusión

En la expansión real, se pueden realizar funciones más interesantes. Por ejemplo, utilice el método CommandRobot para permitir que cada robot envíe una verificación de latido al robot A. Si el robot A descubre que una máquina no tiene latido, pero el robot sigue funcionando, puede emitir una alarma a través del número de servicio FMZ. De esta manera, se pueden evitar alarmas que pueden provocar bloqueos del programa, como bucles muertos _C(). Espero que a través de mi inspiración esta vez, la plataforma FMZ pueda tener cada vez más funciones interesantes desarrolladas y de código abierto por todos. Por último, me gustaría agradecer a la plataforma FMZ y a todas las grandes personas, incluido el Sr. Meng, el Sr. Chao y el Sr. Z por su apoyo y ayuda. Gracias~