JSでFMZ拡張APIを学ぶ

作者: リン・ハーンオーク量化, 作成日:2020-05-16 18:04:17, 更新日:2023-10-24 21:39:10

img

履歴書

こんにちは,私はオークの量化粧水です. 前回,私が開発した市場トレンドがを警告しました.監視ディスク広はみんなの好みで,またオーク量化粧水同名のサービス番号の同期通知があるので,新老菜菜は市場の傾向を判断する新しい参照を持っています. この熱さを使って,FMZの拡張APIを接続し,ロボット間のメッセージ通信を実現し,直接指定されたロボットに市場リモinderをプッシュし始めます. この記事では,2つのアプリケーションのシナリオを例として,これを使って引引玉を投げる.

この記事の記事一覧 開発者がJS言語でFMZの拡張APIを接続する方法. ケース1:拡張APIのCommandRobot方法を使用して,大盤ロボットと他のロボットの間のメッセージ通信を監視する. ケース2:拡張APIのGetRobotDetail方法を使用して,複数のロボットのデータの統一監視と表示を実現する.

1 JSでFMZを接続する拡張API

1) ・アクセスキーとシークレットキー (以下,AK,SK) を申請する. FMZのウェブサイトのキーのアカウントを設定すると,キーのメニューでアプリケーションを作成し,AK,SKのセットにアクセスして記録します. (FMZのAK,SKは,取引所として初めて作成されるものとは異なり,FMZでは,APIキーのメニューでいつでもAK,SKの全データを閲覧することができます.)img

2) 拡張APIのドキュメントに基づいて開発 まず,APIの要求のいくつかの重要なステップを見てみましょう. 1 FMZ API インターフェース:

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

2 基本的なパラメータを要求する

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

3, 完全な要求URLは,質問番号の送信形式で拼写されます

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

4 署名方法

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

5, 合計すると,次のコードがあります. ソースアドレス:ワオク量化-JSペアリング FMZ拡張API デモ

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

ケース2:拡張APIのCommandRobot方法を使用してロボット間のメッセージ通信を実現

上のコードに基づいて,私たちはCommandRobot方法を使ってロボット間のメッセージ通信を実現しました.

この方法の2つのパラメータを見てみましょう.

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

参数の意味が分かれば,この呼び方を実行します.

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

2, 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 メッセージ送信コードを変更する

//发送消息前先获取消息
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、 main メソッドを実行し,メッセージを送信した後,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 を使ってロボットリストを取得する

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

2 ロボットの詳細を入手する

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

3 コントロールは表のデータを出力します

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

4 総括すると,次のコードがあります. ソースアドレス:ワオーク量化 - 拡張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;
}

効果を表示する:

img

結論

実用的な拡張では,さらに多くの楽しい機能も実現できます.例えば,CommandRobotの方法を使って,各ロボットがAロボットに心拍数を送信し,Aロボットが特定の機械が心拍数がなく,しかしロボットがまだ動作していることを発見した場合,FMZサービス番号で警鐘を鳴らすことができます.このようにして,_C (_C) 死サイクルなどのプログラム死模擬シーンを引き起こす警報を回避できます. この機会に,FMZのプラットフォームは,もっと楽しく,もっと多くの機能が開発され,オープンソース化されていきたいと思います. 最後に,FMZのプラットフォームと,Dream Sum,Super Sum,Z大等皆さんのサポートと助けに感謝します.


関連性

もっと

発明者1ショウカン

ほら ほら収集し,学びなさい