Ok Hands dạy bạn cách sử dụng JS để ghép nối FMZ API

Tác giả:Phân tích, Tạo: 2020-05-16 18:04:17, Cập nhật: 2023-10-24 21:39:10

img

Địa chỉ

Xin chào, tôi là Liu Ok Quantitative Makeup.Kiểm tra ổ đĩa lớnPhong cách này, bắt đầu bắt đầu ghép nối API mở rộng của FMZ, để thực hiện giao tiếp tin nhắn giữa các robot, và trực tiếp đẩy lời nhắc giao dịch vào các robot được chỉ định. Ví dụ trong bài viết này là hai tình huống ứng dụng, nhờ đó, tôi hy vọng mọi người có thể phát triển nhiều hơn để vui chơi Đông Đông...

Bài viết này nói về: Một, làm thế nào để các nhà phát triển liên kết FMZ với API mở rộng bằng ngôn ngữ JS. Trường hợp 1: Sử dụng phương pháp CommandRobot với API mở rộng để giám sát giao tiếp tin nhắn giữa robot lớn và các robot khác. Trường hợp 2: Sử dụng phương pháp GetRobotDetail của API mở rộng để thực hiện giám sát và hiển thị dữ liệu thống nhất của nhiều robot.

Một, sử dụng API mở rộng của JS để ghép nối FMZ

1) Ứng dụng AccessKey và SecretKey (sau đây chúng tôi gọi tắt là AK, SK). Chúng tôi đặt các ứng dụng trong menu của API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API-> API->img

2) Được phát triển dựa trên tài liệu của API mở rộng Trước tiên, hãy xem một vài bước quan trọng của việc yêu cầu API. 1, FMZ API:

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

2, yêu cầu tham số cơ bản

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

3, URL yêu cầu hoàn chỉnh được đánh vần dưới dạng thông báo số câu hỏi

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

4. Cách ký

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

5, tổng hợp, có các mã sau: Địa chỉ mã nguồn:Quac Quantify-JS Pairing FMZ Extension 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);
}

Trường hợp 2: Sử dụng phương pháp CommandRobot với API mở rộng để thực hiện giao tiếp tin nhắn giữa các robot

Dựa trên mã trên, chúng tôi đã sử dụng phương pháp CommandRobot để thực hiện giao tiếp tin nhắn giữa các robot.

Trước tiên, chúng ta hãy xem hai tham số cần thiết cho phương thức CommandRobot (RobotId, Cmd).

Tên tham số Loại Ý nghĩa
RobotId int ID robot, có thể được lấy bằng GetRobotList ((...) hoặc trên trang chi tiết robot
Cmd Dòng Tin nhắn gửi đến robot

Khi biết được ý nghĩa của các tham số, chúng ta sẽ thực hiện phương pháp gọi này.

Một, truy cập vào ID robot trên trang chi tiết robot:img

2, Thực hiện cách truy cập tin nhắn 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, thay đổi mã gửi tin nhắn

//发送消息前先获取消息
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, thực hiện phương thức main, sau khi gửi tin nhắn, sử dụng phương thức GetCommand))) để lấy tin nhắn

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

Tin nhắn đã được gửi thành công:imgNhận được tin nhắn thành công:img

Trường hợp 3: Theo dõi và hiển thị dữ liệu của robot bằng cách sử dụng phương pháp GetRobotList và GetRobotDetail của API mở rộng.

Cũng vậy, chúng ta hãy xem xét các thông số của hai phương pháp này. GetRobotList ((offset, length, robotStatus, label):

Tên tham số Loại Ý nghĩa
bù đắp int Mã trang được truy vấn
chiều dài int Chiều dài dữ liệu của trang truy vấn
robotStatus int Giao tiếp 1 cho tất cả
nhãn Dòng Các thẻ tùy chỉnh, bạn có thể lọc tất cả các robot có thẻ đó

GetRobotDetail ((RobotId):

Tên tham số Loại Ý nghĩa
RobotId int ID robot

1, Nhận danh sách robot bằng phương pháp GetRobotList

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

2/ Nhận thông tin chi tiết về robot

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

3, Console xuất dữ liệu biểu mẫu

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

4, tổng hợp, có các mã sau: Địa chỉ mã nguồn:Quantify Java - sử dụng API mở rộng để thu thập thông tin và hiển thị cho robot

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

Những tác dụng được thể hiện:

img

Lời kết thúc

Trong phần mở rộng thực tế, nhiều tính năng thú vị hơn cũng có thể được thực hiện. Ví dụ, bằng cách sử dụng phương pháp CommandRobot để mỗi robot gửi phát hiện nhịp tim đến robot A, nếu robot A phát hiện ra một máy không có nhịp tim, nhưng robot vẫn đang hoạt động, nó có thể báo động bằng số dịch vụ FMZ. Tôi hy vọng rằng thông qua bài viết của tôi, nền tảng FMZ có thể có nhiều tính năng hơn, thú vị hơn, được phát triển và mở nguồn. Cuối cùng, xin cảm ơn nền tảng FMZ và sự hỗ trợ và giúp đỡ của tất cả các vị thần lớn như Dream Team, Super Team, Z.


Có liên quan

Thêm nữa

Nhà phát minh số 1sòng

Đúng rồi.Thu thập, học hỏi