Oak lehrt Sie, JS zu verwenden, um mit FMZ erweiterte API zu interagieren

Schriftsteller:Lydia., Erstellt: 2022-12-20 13:27:24, Aktualisiert: 2023-09-20 11:12:14

img

Oak lehrt Sie, JS zu verwenden, um mit FMZ erweiterte API zu interagieren

Einleitung

Hallo alle, ich bin Oak Quant.Überwachung des Marktes, die beliebt ist, und es gibt eine synchrone Erinnerung an die Dienstnummer mit dem gleichen Namen, die neuen und alten Benutzern eine neue Referenz beim Beurteilen des Markttrends gibt. Um diese Hitze zu nutzen, haben wir begonnen, die erweiterte API von FMZ zu dokken, um Nachrichtenkommunikation zwischen Robotern zu erreichen und Marktwarnungen direkt an bestimmte Roboter zu senden. Dieser Artikel nimmt zwei Anwendungsszenarien als Beispiele und hofft, dass Sie interessantere Dinge entwickeln können...

In diesem Artikel werden vor allem Folgendes vorgestellt:

  1. Wie interagieren Entwickler mit FMZ erweiterten APIs über die JS-Sprache. (Dieser Artikel verwendet die GetNodeList-Methode als Beispiel.)
  2. Fall 1: Verwenden Sie die CommandRobot-Methode der erweiterten API, um die Nachrichtenkommunikation zwischen dem Überwachungsroboter und anderen Robotern zu realisieren.
  3. Fall 2: Verwenden Sie die GetRobotDetail-Methode der erweiterten API, um die einheitliche Überwachung und Anzeige mehrerer Roboterdaten zu realisieren.

1. Verwenden Sie JS zur Schnittstelle mit der erweiterten API von FMZ

1) Beantragen Sie AccessKey und SecretKey (nachfolgend AK und SK genannt). Wir bewerben uns im Menü [Account] -> [ApiKey] -> [Create New ApiKey] auf der offiziellen FMZ-Website und erhalten und speichern dann eine Gruppe von AK und SK. (AK und SK in FMZ sind sichtbar, wir können die vollständigen Daten von AK und SK im Menü [API Interface] jederzeit anzeigen.)

img

2) Entwickeln nach dem erweiterten API-Dokument Zuerst schauen wir uns die wichtigsten Schritte der Anfrage-API an.

  1. FMZ-API-Schnittstelle:
https://www.fmz.com/api/v1
  1. Grundlegende Parameter des Antrags
{
    '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. Vollständige Anfrage-URLs werden in Form von Fragezeichen und Parameterübergabe zusammengefügt
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. Signaturmethode
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. Zusammenfassend ist folgender Code verfügbar: Quelle-Code-Adresse:[Oak Quant] - JS Docking FMZ erweiterte API Demo
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);
}

Fall 2: Verwendung der CommandRobot-Methode der erweiterten API zur Messagekommunikation zwischen Robotern

Auf der Grundlage des obigen Codes werden wir die CommandRobot-Methode verwenden, um eine Nachrichtenkommunikation zwischen Robotern zu erreichen.

Zunächst werden die beiden Parameter betrachtet, die von der Methode CommandRobot (RobotId, Cmd) benötigt werden:

Name der Parameter Typ Bedeutung
RobotId Inneres Roboter-ID, die mit GetRobotList (...) oder auf der Seite mit Roboterdetails erhältlich ist
Cmd String Nachricht an den Roboter gesendet

Jetzt, da wir die Bedeutung des Parameters kennen, lassen Sie uns die Aufrufmethode implementieren.

  1. Holen Sie sich die Roboter-ID auf der Roboter-Detailseite

  2. Implementieren der Methode zur Erfassung der Cmd-Nachricht

//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. Ändern Sie den Versandcode der Nachricht
//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. Ausführen der Hauptmethode. Nach dem Senden der Nachricht verwenden Sie die GetCommand() Methode, um die Nachricht zu erhalten
function main(){
    while(true) { 
        var cmd = GetCommand()
        if (cmd) { 
            Log(cmd)
        }
        Sleep(1000) 
    }
}

Nachricht erfolgreich gesendet:

img

Nachricht erfolgreich empfangen:

img

Fall 3: Verwenden Sie die Methoden GetRobotList und GetRobotDetail der erweiterten API, um die Datenüberwachung und Anzeige von Robotern zu realisieren.

In ähnlicher Weise schauen wir uns zunächst die Parameterbeschreibungen der nächsten beiden Methoden an. GetRobotList ((verschiebung, Länge, robotStatus, Etikett):

Name der Parameter Typ Bedeutung
Verzögerung Inneres Seitennummer der Abfrage
Länge Inneres Datenlänge der Abfrageseite
RobotStatus Inneres - 1 für alle.
Etikett String Benutzerdefinierte Tags können alle Roboter mit diesem Tag filtern

GetRobotDetail (RobotId):

Name der Parameter Typ Bedeutung
RobotId Inneres Identifizierung des Roboters
  1. Erhalten Sie die Liste der Roboter über die GetRobotList Methode
//Get robot list information
var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
var robotList = robotListJson.data.result.robots;
  1. Holen Sie sich Roboterdetailinformationen.
//Get robot detail information
var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
var robotDetail = robotDetailJson.data.result.robot;
  1. Daten der Ausgabetabelle der Konsole
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. Zusammenfassend ist folgender Code verfügbar: Quelle-Code-Adresse:[Oak Quant] - Verwenden Sie die erweiterte API, um Informationen über den Roboter zu erhalten und es anzuzeigen
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;
}

Schlussfolgerung

In der eigentlichen Erweiterung können immer interessantere Funktionen realisiert werden. Zum Beispiel sendet jeder Roboter mit der CommandRobot-Methode eine Herzschlagerkennung an Roboter A. Wenn Roboter A feststellt, dass eine Maschine keinen Herzschlag hat, aber der Roboter noch läuft, kann er über den FMZ-Dienst einen Alarm auslösen. Auf diese Weise können Alarme wie _C() tote Schleifen, die zu programmierbaren gefälschten Todesszenarien führen, vermieden werden. Ich hoffe, dass die FMZ-Plattform durch meine Einführung dieses Mal immer mehr interessante Funktionen entwickeln und öffnen kann. Abschließend möchte ich mich bei der FMZ-Plattform und allen großen Männern wie Xiaoxiaomeng, Herrn Zhang und Herrn Z für ihre Unterstützung und Hilfe bedanken.


Verwandt

Mehr