Type/to search
7
Follow
197
Followers
Oak에서는 JS를 사용하여 FMZ 확장 API에 연결하는 방법을 알려줍니다.
Discussions
Created 2020-05-16 18:04:17  Updated 2024-12-10 20:29:45
 2
 3280

img

소개

안녕하세요 여러분, 저는 "오크 퀀티터티브"입니다. 얼마전에 제가 개발한 시장 동향 알림 때문에 [대시보드 모니터링】는 누구나 널리 사랑받고 있으며, 동명의 서비스 계정[오크퀀티터티브]에서 동시 알림이 제공되며, 신규 및 기존 투자자에게 시장 동향을 판단하는 새로운 참고 자료를 제공합니다. 이러한 인기를 이용하여, 우리는 FMZ의 확장 API에 연결하여 로봇 간 메시지 통신을 실현하고 지정된 로봇에 시장 알림을 직접 푸시하기 시작했습니다. 이 글에서는 토론을 자극하기 위해 두 가지 응용 시나리오를 예로 들어 설명합니다. 여러분이 더 흥미로운 것들을 개발할 수 있기를 바랍니다...

이 기사에서는 주로 다음을 소개합니다.

  1. 개발자는 JS 언어를 통해 FMZ의 확장 API에 어떻게 연결합니까? (이 문서에서는 GetNodeList 메서드를 예로 들어 설명합니다.)
  2. 사례 1: 확장 API의 CommandRobot 메서드를 사용하여 모니터링 로봇과 다른 로봇 간의 메시지 통신을 구현합니다.
  3. 사례 2: 확장 API의 GetRobotDetail 메서드를 사용하여 여러 로봇 데이터에 대한 통합 모니터링 및 표시를 구현합니다.

1. JS를 사용하여 FMZ의 확장된 API에 연결

  1. AccessKey와 SecretKey(이하 AK, SK라 함)를 신청합니다.
    FMZ 공식 홈페이지에서 [계정 설정] -> [API 인터페이스] -> [새로운 ApiKey 생성] 메뉴에서 신청을 한 뒤, AK와 SK 세트를 얻어서 등록해 둡니다. (FMZ의 AK와 SK는 처음 생성될 때만 보이는 거래소와 다릅니다. FMZ에서는 [API 인터페이스] 메뉴에서 언제든지 AK와 SK의 전체 데이터를 볼 수 있습니다.)
    img

  2. 확장 API 문서에 따라 개발
    먼저 API 요청의 주요 단계를 살펴보겠습니다.

  1. FMZ API 인터페이스:
https://www.fmz.com/api/v1
  1. 기본 매개변수 요청
{ 'version' : '1.0', //自定义版本号 'access_key': '8a148320e0bxxxxxxxxxxxxxx19js99f', //AK 'method' : 'GetNodeList', //具体调用的方法 'args' : [], //具体method算法的参数列表 'nonce' : 1516292399361, //时间戳,单位毫秒 'sign' : '085b63456c93hfb243a757366600f9c2' //签名(需要根据上面5个参数加密获取,下面有讲) }
  1. 전체 요청 URL은 물음표 매개변수 전달 형태로 연결됩니다.
以GetNodeList方法为例 https://www.fmz.com/api/v1? access_key=8a148320e0bxxxxxxxxxxxxxx19js99f& nonce=1516292399361& args=%5B%5D& sign=085b63456c93hfb243a757366600f9c2& version=1.0& method=GetNodeList
  1. 서명방법
按照如下顺序进行参数拼接后,使用MD5加密算法加密字符串,并转换为十六进制数据字符串值,该值作为参数sign的值。 version + "|" + method + "|" + args + "|" + nonce + "|" + secretKey
  1. 요약하자면 다음과 같은 코드가 있습니다.
    소스 코드 주소:[OakQuant]-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) 메서드에 필요한 두 개의 매개변수를 살펴보겠습니다.

매개변수 이름유형의미
RobotIdintGetRobotList(...)를 사용하거나 로봇 세부 정보 페이지에서 얻을 수 있는 로봇 ID
CmdString봇에게 보내는 메시지

매개변수의 의미를 알았으니 다음으로 이 호출 메서드를 구현해 보겠습니다.

  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//当前进入的周期起始时间 } }
  1. 메시지 전송을 위한 코드 수정
//发送消息前先获取消息 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));
  1. 메인 메서드를 실행하고 메시지를 보내고 GetCommand() 메서드를 사용하여 메시지를 가져옵니다.
function main(){ while(true) { var cmd = GetCommand() if (cmd) { Log(cmd) } Sleep(1000) } }

메시지가 성공적으로 전송되었습니다:
img
메시지를 성공적으로 받았습니다:
img

사례 3: 확장 API의 GetRobotList 및 GetRobotDetail 메서드를 사용하여 로봇 데이터를 모니터링하고 표시합니다.

마찬가지로 먼저 두 가지 방법의 매개변수 설명을 살펴보겠습니다.
GetRobotList(offset, length, robotStatus, label):

매개변수 이름유형의미
offsetint쿼리 페이지 번호
lengthint쿼리 페이지 데이터 길이
robotStatusint모두 얻으려면 -1을 전달하세요
labelString사용자 정의 태그는 이 태그가 있는 모든 로봇을 필터링할 수 있습니다.

GetRobotDetail(RobotId):

매개변수 이름유형의미
RobotIdint로봇 ID
  1. GetRobotList 메서드를 통해 로봇 목록을 가져옵니다.
//获取机器人列表信息 var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1)); var robotList = robotListJson.data.result.robots;
  1. 로봇 세부 정보 얻기
//获取机器人详情信息 var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId)); var robotDetail = robotDetailJson.data.result.robot;
  1. 콘솔은 테이블 데이터를 출력합니다.
function getLogPrient(infoArr){ return table = { type: 'table', title: '奥克量化的机器人展示', cols: ['机器人ID','机器人名称','策略名称','下次扣费时间','已经消耗时间ms','已经消耗金额CNY','最近活跃时间','是否公开'], rows: infoArr }; }
  1. 요약하자면 다음과 같은 코드가 있습니다.
    소스 코드 주소:[OakQuant]-확장 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() 데드 루프와 같이 프로그램 중단을 일으킬 수 있는 알람을 피할 수 있습니다.
이번 영감을 통해 FMZ 플랫폼에 더욱 흥미로운 기능이 추가되고 모두가 개발하고 오픈 소스화할 수 있기를 바랍니다.
마지막으로 FMZ 플랫폼과 Meng 씨, Chao 씨, Z 씨를 비롯한 모든 훌륭한 분들께 지원과 도움에 감사드리고 싶습니다. 고맙습니다~

Related Recommendations
Comment
All comments (2)

    shoucang

    5 years ago

    收藏,学习下

    5 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)