OK Handshake lehrt Sie, wie man FMZ mit der JS-Pairing-API erweitert

Schriftsteller:Ock-Quantität, Erstellt: 2020-05-16 18:04:17, Aktualisiert: 2023-10-24 21:39:10

img

Lebenslauf

Hallo, ich bin Liu Ok Quantitative Make-up.Überwachung der FestplatteDie neue Linie ist eine neue Referenz für die Beurteilung der Markttrends. Mit dieser Hitze begann man, die Erweiterung API von FMZ zu verknüpfen, um Nachrichten zwischen Robotern zu vermitteln und die Marktmeldungen direkt in die angegebenen Roboter zu schieben.

Der Artikel handelt hauptsächlich von: 1. Wie können Entwickler FMZ-Erweiterungs-APIs mit der JS-Sprache verknüpfen? 2. Fall 1: Mit Hilfe der CommandRobot-Methode mit einer erweiterten API kann die Nachrichtenkommunikation zwischen einem Laufwerkroboter und anderen Robotern überwacht werden. 3. Fall 2: Einheitliche Überwachung und Darstellung von Daten von mehreren Robotern mit Hilfe der GetRobotDetail-Methode der erweiterten API.

Erstens, mit einer erweiterten API für JS-Pairing FMZ

1. Ein Antrag auf den AccessKey und den SecretKey (nachfolgend AK, SK genannt) Wir setzen die Anmeldung in den Menüs der FMZ-Webseiten-Key-Konten ein - > API-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key-Key.img

2) Entwickelt auf Basis der Dokumentation für die Erweiterungs-API Zunächst einige wichtige Schritte zur Anfrage-API. 1. FMZ-API-Schnittstelle:

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

2. Anfordern von Grundparametern

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

3. Vollständige Anfrage-URLs in Form von Anfragezeichen

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

4. Unterzeichnungsart

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

5. Zusammengefasst, mit folgenden Codes: Die Quelle ist:Qualitätslösung für JS-Paarungen FMZ-Erweiterung 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);
}

Fall 2: Messaging zwischen Robotern mit der CommandRobot-Methode mit einer erweiterten API

Auf der Grundlage des oben genannten Codes haben wir die Messaging-Kommunikation zwischen Robotern mit der CommandRobot-Methode realisiert.

Zuerst schauen wir uns die beiden Parameter an, die die Methode CommandRobot (RobotId, Cmd) benötigt.

Name der Parameter Typ Bedeutungen
RobotId Inneres Die Roboter-ID kann mit der GetRobotList (..) oder auf der Roboter-Details-Seite abgerufen werden.
Cmd String Nachrichten an Roboter

Wenn wir wissen, was die Parameter bedeuten, dann können wir diese Anrufmethode als Nächstes umsetzen.

1. Auf der Bots-Details-Seite finden Sie die Bots-ID:img

2. Implementierung der Methode zum Zugriff auf cmd-Nachrichten

//获取消息头信息
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. Ändern des Versandcodes

//发送消息前先获取消息
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. Die Main-Methode wird ausgeführt und nach dem Versenden der Nachricht mit der GetCommand-Methode abgerufen.

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

Die Nachricht ist erfolgreich gesendet:imgErfolgreich empfangen:img

Fall 3: Die Methode GetRobotList und GetRobotDetail mit der erweiterten API ermöglicht die Datenüberwachung und Darstellung von Robotern.

Also, wir sehen uns die Parameter für die beiden Methoden an. GetRobotList ((Offset, length, robotStatus, label)):

Name der Parameter Typ Bedeutungen
Verzögerung Inneres Seitenkode für die Anfrage
Länge Inneres Datenlänge der Abfrage
RobotStatus Inneres Übertragen-1 erhält alles.
Etikett String Ein benutzerdefiniertes Label, das alle Roboter mit diesem Tag filtern kann

GetRobotDetail ((RobotId):

Name der Parameter Typ Bedeutungen
RobotId Inneres Roboter-ID

1. Erhalten Sie eine Roboterliste mit der GetRobotList-Methode

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

2. Erhalten Sie Informationen über die Roboter

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

3. Das Controller liefert Daten aus Tabellen

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

4. Zusammengefasst, die folgenden Codes: Die Quelle ist:Qualitäts-Quantifizierung von VOCs - Erfassung und Darstellung von Bots mit Hilfe einer erweiterten API

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

Die Ergebnisse zeigen:

img

Abschluss

In der tatsächlichen Erweiterung können noch mehr und mehr Spaßfunktionen realisiert werden. So kann beispielsweise mit der CommandRobot-Methode jeder Roboter eine Herzschlagmessung an Roboter A senden. Wenn Roboter A feststellt, dass eine Maschine keinen Herzschlag hat, aber der Roboter noch läuft, kann er mit der FMZ-Dienstnummer alarmieren. Ich hoffe, dass die FMZ-Plattform durch meine Anregung mehr und mehr Funktionen haben kann, die von allen entwickelt werden können und die Open Source sind. Zum Schluss möchte ich mich bei der FMZ-Plattform sowie bei allen Göttern wie Dreamz, Superz, Z und anderen für ihre Unterstützung und Hilfe bedanken.


Verwandt

Mehr

Erfinder Nr. 1Schwanger

- Ich weiß nicht.Sammeln und lernen