Les ressources ont été chargées... Je charge...

Les ouvriers vous apprennent à utiliser l'API de couplage JS pour étendre FMZ

Auteur:Quantitatif de l'oc, Créé: 2020-05-16 18:04:17, Mis à jour: 2023-10-24 21:39:10

img

Nom de famille

Bonjour, je suis le personnage de la marque de maquillage Qualitatif de Vaucluse.Surveillance du disqueLa chaleur a commencé à faire le lien avec l'API d'extension de FMZ, pour réaliser la communication de messages entre les robots, et de pousser directement les rappels de marché dans les robots spécifiés. Cet exemple de deux scénarios d'application, en jetant le jeton, espérons que vous pouvez développer plus de jeux amusants.

Ce billet est principalement consacré à: Comment les développeurs peuvent-ils utiliser le langage JS pour créer une extension de l'API FMZ? Deuxièmement, le premier cas: l'utilisation de la méthode CommandRobot avec une API étendue pour surveiller la communication de messages entre un robot de disque dur et d'autres robots. Troisième cas: l'utilisation de l'API étendue GetRobotDetail pour réaliser une surveillance et une présentation unifiées des données de plusieurs robots.

Premièrement, l'API étendue utilisée par JS pour coupler FMZ

1)  Appliquer une clé d'accès et une clé secrète (ci-après dénommée AK, SK)  Nous avons configuré le menu de l'API API API API API API API API API API API API API API API API API API pour créer une nouvelle API API, puis nous avons accédé à un ensemble d'AK, SK et enregistré.img

2) Le développement est basé sur la documentation de l'API d'extension Tout d'abord, quelques étapes essentielles pour demander une API. L'interface de l'API FMZ:

https://www.fmz.com/api/v1

2, demandez les paramètres de base

{
    'version'   : '1.0',                                //自定义版本号
    'access_key': '8a148320e0bxxxxxxxxxxxxxx19js99f',   //AK
    'method'    : 'GetNodeList',                        //具体调用的方法
    'args'      : [],                                   //具体method算法的参数列表
    'nonce'     : 1516292399361,                        //时间戳,单位毫秒
    'sign'      : '085b63456c93hfb243a757366600f9c2'    //签名(需要根据上面5个参数加密获取,下面有讲)
}

3° Une URL de demande complète, étiquetée comme une référence par le biais d'un numéro de question.

以GetNodeList方法为例
https://www.fmz.com/api/v1?
access_key=8a148320e0bxxxxxxxxxxxxxx19js99f&
nonce=1516292399361&
args=%5B%5D&
sign=085b63456c93hfb243a757366600f9c2&
version=1.0&
method=GetNodeList

4/ Comment signer

按照如下顺序进行参数拼接后,使用MD5加密算法加密字符串,并转换为十六进制数据字符串值,该值作为参数sign的值。
version + "|" + method + "|" + args + "|" + nonce + "|" + secretKey

5, en résumé, avec les codes suivants L'adresse du code source:Démo de l'API étendue FMZ de couplage quantifié de JS-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);
}

Exemple 2: Communication de messages entre les robots grâce à la méthode CommandRobot avec une API étendue

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

Tout d'abord, nous allons voir les deux paramètres nécessaires à la méthode CommandRobot (RobotId, Cmd).

Nom du paramètre Le type Signification
RobotId int L'ID du robot peut être obtenu à l'aide de GetRobotList (...), ou sur la page de détail du robot.
Cmd Chaîne Les messages envoyés aux robots

Une fois que nous connaissons la signification des paramètres, nous allons ensuite implémenter cette méthode d'appel.

1° accéder à l'ID du robot sur la page de détail du robot:img

2° Mettre en œuvre la méthode d'accès aux messages 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//当前进入的周期起始时间
    }
}

3 Modifier le code de l'envoi du message

//发送消息前先获取消息
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));

4、 Exécuter la méthode main, après l'envoi du message, utiliser la méthode GetCommand( pour obtenir le message

function main(){
    while(true) { 
        var cmd = GetCommand()
        if (cmd) { 
            Log(cmd)
        }
        Sleep(1000) 
    }
}

Les messages ont été envoyés avec succès:imgLe message a été reçu:img

Exemple 3: La méthode GetRobotList et GetRobotDetail de l'API étendue est utilisée pour la surveillance et l'affichage des données du robot.

Donc nous allons voir les paramètres de ces deux méthodes. Le site Web de l'entreprise est actuellement en cours de développement.

Nom du paramètre Le type Signification
décalage int Le code de la page demandée
longueur int La longueur des données de la page de requête
robotStatus int Transfert 1 représente l'ensemble.
étiquette Chaîne Une balise personnalisée qui permet de filtrer tous les robots avec cette balise

Je suis désolée.

Nom du paramètre Le type Signification
RobotId int Identifiant du robot

1° Obtenir une liste de robots avec la méthode GetRobotList

//获取机器人列表信息
var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
var robotList = robotListJson.data.result.robots;

2° Obtenir des détails sur le robot

//获取机器人详情信息
var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
var robotDetail = robotDetailJson.data.result.robot;

3, le tableau d'affichage de la console

function getLogPrient(infoArr){
    return table = {
            type: 'table',
            title: '奥克量化的机器人展示',
            cols: ['机器人ID','机器人名称','策略名称','下次扣费时间','已经消耗时间ms','已经消耗金额CNY','最近活跃时间','是否公开'],
            rows: infoArr
        };
}

4°, en résumé, avec les codes suivants: Le code source est:Quantification de l'aluminium de Vaucluse - utilise une API étendue pour obtenir des informations du robot et les afficher

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;
}

Les résultats:

img

Le mot de la fin

Dans les extensions réelles, des fonctionnalités encore plus amusantes peuvent être réalisées. Par exemple, en utilisant la méthode CommandRobot, chaque robot peut envoyer une détection de pouls à A. Si A détecte qu'une machine n'a pas de pouls, mais que le robot est toujours en marche, il peut alors alerter par le numéro de service FMZ. J'espère qu'avec mon lancer, la plateforme FMZ aura plus de fonctionnalités, plus amusantes, développées et open source. Enfin, merci pour le soutien et l'aide de la plateforme FMZ ainsi que de tous les grands dieux comme Dream Team, Super Team, Z.


Relationnée

Plus de

L'inventeur n°1le choucang

Je ne sais pas.La collecte et l'apprentissage