리소스 로딩... 로딩...

오크의 손잡이가 JS와 FMZ 확장 API를 연결하는 방법을 알려줍니다.

저자:오크 정량화, 2020-05-16 18:04:17, 업데이트: 2023-10-24 21:39:10

img

자막

안녕하세요, 저는 오크 쿼티 메이크업입니다.감시 대장가방은 많은 사람들의 사랑을 받았으며, 오크 양자化 같은 이름의 서비스 번호와 동시 알림이 있습니다. 새로운 양배추는 시장 추세를 판단하는 데 새로운 참조를 가지고 있습니다. 이 열기를 통해 FMZ의 확장 API를 연결하기 시작하여 로봇 간의 메시지 통신을 구현하고 지정된 로봇에 직접 시장 알림을 밀어 넣습니다. 이 문서의 예시 두 가지 응용 시나리오는 유동 유동 유동 유동 유동 유동 유동 유동 유동 유동 유동 유동 유동 유동 유동...

이 글의 내용은 다음과 같습니다. 1. 개발자가 JS 언어를 사용하여 FMZ의 확장 API를 연결하는 방법;; (이 문서에서는 GetNodeList 방법을 예로 들어) 두 번째, 사례 1: 확장 API의 CommandRobot 방법을 사용하여 대장용 로봇과 다른 로봇 사이의 메시지 통신을 모니터링하는 것을 구현합니다. 사례 2: 확장 API의 GetRobotDetail 방법을 사용하여 여러 로봇 데이터의 통합 모니터링 및 표시를 구현합니다.

1) JS를 사용하여 FMZ를 연결하는 확장 API

1), AccessKey와 SecretKey를 신청합니다. 우리는 FMZ의 공식 계정에서 ->API 인터페이스 -> 새로운 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 방법을 사용하여 로봇 간의 메시지 통신을 구현했습니다.

먼저 CommandRobot (RobotId, Cmd) 메소드가 필요한 두 개의 매개 변수를 살펴봅시다.

변수 이름 유형 의미
로봇Id int 로봇 아이디는 GetRobotList (...에서 얻을 수 있으며, 또는 로봇 세부 페이지에서 얻을 수 있습니다.
Cmd 문자열 로봇에게 보내는 메시지

이 함수의 의미를 알고 나면 다음으로 이 호출 방법을 구현할 수 있습니다.

1., 로봇 세부 페이지에서 로봇 아이디를 얻으십시오: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、 메인 메소드를 실행하고, 메시지를 보낸 후, GetCommand (() 메소드를 사용하여 메시지를 얻는다.

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

이 글은 이쪽에서 보내졌습니다.img이 글은 이쪽에서 읽었습니다.img

사례 3: 확장 API의 GetRobotList 및 GetRobotDetail 방법을 사용하여 로봇의 데이터 모니터링 및 표시를 수행합니다.

이 두 가지 방법의 매개 변수 설명에 대해 먼저 살펴보겠습니다. GetRobotList ((오프셋, 길거리, 로봇국가, 레이블):

변수 이름 유형 의미
오프셋 int 검색 페이지 코드
길이가 int 쿼리 페이지의 데이터 길이
로봇상황 int 1번은 모든 것을 가져옵니다.
라벨 문자열 사용자 지정 태그, 이 태그를 가진 모든 로봇을 필터링할 수 있습니다.

GetRobotDetail (로봇번호)

변수 이름 유형 의미
로봇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 (dead loop) 와 같은 프로그램 모형 사상 현상을 초래하는 경보를 피할 수 있다. 저는 이번의 제보를 통해 FMZ 플랫폼에 더 많은 기능이 개발되고, 더 재미있게 사용할 수 있기를 바랍니다. 마지막으로 FMZ 플랫폼과 드림 총, 슈퍼 총, Z 대장 등 모든 대신들의 지원과 도움에 감사드립니다.


관련

더 많은

발명가 1위

수집하고 배우세요.