資源の読み込みに... 荷物...

オークはJSを使って FMZ拡張APIとインタフェースすることを教えます

作者: リン・ハーンFMZ~リディア作成日:2022年12月20日 13:27:24 更新日:2023年9月20日 11:12:14

img

オークはJSを使って FMZ拡張APIとインタフェースすることを教えます

紹介

皆様,こんにちは 私はオーク・クォントです.市場を監視この熱さを利用するために,我々はFMZの拡張APIをドックし,ロボット間のメッセージ通信を達成し,指定されたロボットに直接市場アラートをプッシュし始めました. この記事は2つのアプリケーションシナリオを例として取り,より興味深いものを開発できることを望みます...

この記事では主に以下について紹介します.

  1. 開発者はJS言語を通じて FMZ拡張 API とどのようにインタフェースするか. (この記事ではGetNodeList メソッドを例として参照します.)
  2. ケース1: 監視ロボットと他のロボット間のメッセージ通信を実現するために拡張APIのCommandRobot方法を使用する.
  3. ケース2: 拡張APIのGetRobotDetailメソッドを使用して,複数のロボットデータの統一監視と表示を実現します.

JS を FMZ の拡張 API とインタフェースに使う

1) AccessKey と SecretKey (以下 AK と SK) を申請する. [アカウント] ->[APIKey] ->[新しいAPIKeyを作成]のメニューでFMZの公式ウェブサイトで申請し,その後AKとSKのグループを取得して記録します. (FMZのAKとSKは可視で, [APIインターフェイス]メニューでAKとSKの完全なデータをいつでも表示できます.)

img

2) 拡張されたAPI文書に従って開発 まず,リクエスト API の重要なステップを見てみましょう.

  1. FMZ API インターフェース:
https://www.fmz.com/api/v1
  1. 要求の基本パラメータ
{
    '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. 完全なリクエスト URL は,質問符とパラメータのパス形式でスペイルされます.
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. 署名方法
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. 概要として,次のコードが利用できます. ソースコードアドレス:JSドッキング FMZ拡張API デモ
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);
}

ケース2: ロボット間のメッセージ通信を達成するために拡張APIのCommandRobot方法を使用

上記のコードに基づいて,ロボット間のメッセージ通信を達成するために CommandRobot 方法を使用します.

まず,CommandRobot (RobotId,Cmd) メソッドが要求する2つのパラメータを見てみましょう.

パラメータ名 タイプ 意味
ロボットId int ロボットIDは,GetRobotList (...) またはロボット詳細ページで取得できます.
Cmd 文字列 ロボットに送信されたメッセージ

パラメータの意味を知ったので,呼び出しメソッドを実装しましょう.

  1. ロボットの詳細ページでロボットのIDを取得

  2. 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. 送信メッセージコードを変更する
//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. メインメソッドを実行します. メッセージを送信した後,GetCommand() メソッドを使用してメッセージを取得します
function main(){
    while(true) { 
        var cmd = GetCommand()
        if (cmd) { 
            Log(cmd)
        }
        Sleep(1000) 
    }
}

メッセージは成功しました:

img

メッセージは成功しました:

img

ケース3:拡張APIのGetRobotListとGetRobotDetailメソッドを使用して,ロボットのデータモニタリングと表示を実現します.

次に2つのメソッドのパラメータ説明を見てみましょう. GetRobotList ((オフセット,長さ,ロボット 状態,ラベル):

パラメータ名 タイプ 意味
オフセット int クエリのページ番号
長さ int クエリページのデータ長さ
ロボット 状態 int 1 を入れると全部を得る
ラベル 文字列 カスタマイズされたタグは,このタグを使用するすべてのロボットをフィルタリングすることができます.

ロボット詳細を入手する

パラメータ名 タイプ 意味
ロボットId int ロボットID
  1. GetRobotList メソッドでロボットの一覧を取得
//Get robot list information
var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
var robotList = robotListJson.data.result.robots;
  1. ロボットの詳細情報を取得
//Get robot detail information
var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
var robotDetail = robotDetailJson.data.result.robot;
  1. コンソール出力表データ
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. 概要として,次のコードが利用できます. ソースコードアドレス:ロボットに関する情報を取得し,それを表示するために拡張APIを使用
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;
}

結論

本来の拡張では,ますます興味深い機能が実現できる.例えば,CommandRobot方法を使用して,各ロボットはロボットAに心拍検を送信します.ロボットAが機械が心拍がないことを発見しても,ロボットがまだ動いている場合は,FMZサービスを通じてアラームを出すことができます.この方法で,プログラム偽死シナリオにつながる _C() デッドループなどのアラームを回避できます. この機会に紹介することで FMZプラットフォームが より多くの面白い機能を開発し 開くことができるようになることを願っています 最後に,FMZのプラットフォームと,Xiaoxiaomeng,Zhangさん,Zさんといった偉人たちへの支援に感謝します.


関連性

もっと