Oak vous apprend à utiliser JS pour l'interface avec FMZ API étendue

Auteur:Je ne sais pas., Créé: 2022-12-20 13:27:24, Mis à jour: 2023-09-20 11:12:14

img

Oak vous apprend à utiliser JS pour l'interface avec FMZ API étendue

Introduction au projet

Bonjour tout le monde, je suis Oak Quant, à cause du rappel de tendance du marché que j'ai développé il y a quelque tempssurveiller le marché, qui est populaire, et il y a un rappel synchrone du numéro de service du même nom, ce qui donne aux nouveaux et anciens utilisateurs une nouvelle référence pour juger de la tendance du marché.

Cet article présente principalement:

  1. Comment les développeurs interagissent-ils avec les API étendues FMZ via le langage JS. (Cet article prend la méthode GetNodeList à titre d'exemple.)
  2. Cas 1: utiliser la méthode CommandRobot de l'API étendue pour réaliser la communication de message entre le robot de surveillance et les autres robots.
  3. Cas 2: utiliser la méthode GetRobotDetail de l'API étendue pour réaliser la surveillance et l'affichage unifiés de plusieurs données robot.

1. Utilisez JS pour interfacer avec l'API étendue de FMZ

1) Demander les clés AccessKey et SecretKey (ci-après dénommées AK et SK). Nous appliquons dans le menu de [Compte] -> [ApiKey] -> [Créer une nouvelle ApiKey] sur le site officiel de FMZ, puis obtenons et enregistrons un groupe de AK et SK. (AK et SK dans FMZ sont visibles, nous pouvons afficher les données complètes de AK et SK dans le menu [API Interface] à tout moment.)

img

2) Développer selon le document API étendu Tout d'abord, examinons les étapes clés de l'API de demande.

  1. Interface de l'API FMZ:
https://www.fmz.com/api/v1
  1. Paramètres de base de la demande
{
    '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. Les URL de requête complètes sont épissées sous forme de point d'interrogation et de paramètre de passage
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éthode de signature
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. En résumé, le code suivant est disponible: Adresse du code source:- JS accostage FMZ étendue API démo
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);
}

Cas 2: Utilisation de la méthode CommandRobot de l'API étendue pour obtenir une communication de messages entre robots

Sur la base du code ci-dessus, nous utiliserons la méthode CommandRobot pour réaliser la communication de messages entre robots.

Tout d'abord, examinons les deux paramètres requis par la méthode CommandRobot (RobotId, Cmd):

Nom du paramètre Le type Signification
RobotId int Robot ID, qui peut être obtenu avec GetRobotList (...) ou sur la page des détails du robot
Cmd Chaîne Message envoyé au robot

Maintenant que nous connaissons la signification du paramètre, mettons en œuvre la méthode d'appel.

  1. Obtenez l'ID du robot sur la page des détails du robot

  2. Mettre en œuvre la méthode d'obtention du message 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. Modifier le code d'envoi du message
//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. Exécuter la méthode principale. Après avoir envoyé le message, utiliser la méthode GetCommand() pour obtenir le message
function main(){
    while(true) { 
        var cmd = GetCommand()
        if (cmd) { 
            Log(cmd)
        }
        Sleep(1000) 
    }
}

Message envoyé avec succès:

img

Message reçu avec succès:

img

Cas 3: Utilisez les méthodes GetRobotList et GetRobotDetail de l'API étendue pour réaliser le suivi et l'affichage des données des robots.

De même, regardons d'abord les descriptions des paramètres des deux méthodes suivantes GetRobotList ((décalage, longueur, robotStatus, étiquette):

Nom du paramètre Le type Signification
décalage int Numéro de page de la requête
longueur int Longueur de page de requête
robotStatus int Passer dans - 1 pour obtenir tout
étiquette Chaîne Les balises personnalisées peuvent filtrer tous les robots avec cette balise

Vous avez un problème?

Nom du paramètre Le type Signification
RobotId int Identifiant du robot
  1. Obtenez la liste des robots via la méthode GetRobotList
//Get robot list information
var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
var robotList = robotListJson.data.result.robots;
  1. Obtenez des informations détaillées sur le robot.
//Get robot detail information
var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
var robotDetail = robotDetailJson.data.result.robot;
  1. Données de la table de sortie de la 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. En résumé, le code suivant est disponible: Adresse du code source:Utilisez l'API étendue pour obtenir des informations sur le robot et l'afficher
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;
}

Conclusion

Dans l'extension réelle, de plus en plus de fonctions intéressantes peuvent être réalisées. Par exemple, en utilisant la méthode CommandRobot, chaque robot envoie une détection des battements cardiaques au robot A. Si le robot A constate qu'une machine n'a pas de battement cardiaque, mais que le robot est toujours en marche, il peut donner une alarme via le service FMZ. De cette façon, des alarmes telles que _C() boucles mortes qui conduisent à des scénarios de mort fausses peuvent être évitées. J'espère que grâce à mon introduction cette fois, la plateforme FMZ pourra avoir de plus en plus de fonctions intéressantes à développer et à ouvrir. Enfin, je tiens à remercier la plateforme FMZ et tous les grands hommes comme Xiaoxiaomeng, M. Zhang et M. Z pour leur soutien et leur aide.


Relationnée

Plus de