
سب کو ہیلو، میں “اوک مقداری” ہوں۔ مارکیٹ کے رجحان کی یاد دہانی کی وجہ سے میں نے کچھ عرصہ پہلے تیار کیا تھاڈیش بورڈ کی نگرانی】 ہر کسی کی طرف سے وسیع پیمانے پر پیار کیا جاتا ہے، اور اسی نام [Oak Quantitative] کے سروس اکاؤنٹ سے بیک وقت یاد دہانیاں ہیں، جو نئے اور پرانے سرمایہ کاروں کو مارکیٹ کے رجحانات کا اندازہ لگانے کے لیے ایک نیا حوالہ فراہم کرتی ہیں۔ اس مقبولیت کا فائدہ اٹھاتے ہوئے، ہم نے FMZ کے توسیعی API سے رابطہ قائم کرنا شروع کر دیا تاکہ روبوٹس کے درمیان میسج کمیونیکیشن کو محسوس کیا جا سکے اور مارکیٹ الرٹس کو براہ راست نامزد روبوٹس تک پہنچایا جا سکے۔ یہ مضمون بحث کو متحرک کرنے کے لیے ایپلیکیشن کے دو منظر نامے دیتا ہے مجھے امید ہے کہ آپ مزید دلچسپ چیزیں تیار کر سکتے ہیں…
یہ مضمون بنیادی طور پر متعارف کرایا جاتا ہے: 1. ڈویلپرز JS زبان کے ذریعے FMZ کے توسیعی API سے کیسے جڑتے ہیں؟ (یہ مضمون ایک مثال کے طور پر GetNodeList طریقہ لیتا ہے) 2. کیس 1: مانیٹرنگ روبوٹ اور دوسرے روبوٹس کے درمیان میسج کمیونیکیشن کو لاگو کرنے کے لیے توسیعی API کا CommandRobot طریقہ استعمال کریں۔ 3. کیس 2: متعدد روبوٹ ڈیٹا کی متحد نگرانی اور ڈسپلے حاصل کرنے کے لیے توسیعی API کا GetRobotDetail طریقہ استعمال کریں۔
AccessKey اور SecretKey کے لیے درخواست دیں (اس کے بعد AK اور SK کہا جاتا ہے)۔
ہم FMZ کی آفیشل ویب سائٹ پر [اکاؤنٹ سیٹنگز] -> [API انٹرفیس] -> [Create New ApiKey] کے مینو میں درخواست دیتے ہیں، اور پھر AK اور SK کا ایک سیٹ حاصل کرکے انہیں ریکارڈ کرتے ہیں۔ (FMZ کے AK اور SK تبادلے کی طرح نہیں ہیں جہاں وہ صرف پہلی بار بنائے جانے پر نظر آتے ہیں۔ FMZ میں، ہم [API انٹرفیس] مینو میں کسی بھی وقت اپنے AK اور SK کا مکمل ڈیٹا دیکھ سکتے ہیں)

توسیعی API کی دستاویزات کے مطابق تیار کریں۔ سب سے پہلے، آئیے API کی درخواست کرنے کے اہم مراحل کو دیکھتے ہیں۔
FMZ API انٹرفیس:
https://www.fmz.com/api/v1
{
'version' : '1.0', //自定义版本号
'access_key': '8a148320e0bxxxxxxxxxxxxxx19js99f', //AK
'method' : 'GetNodeList', //具体调用的方法
'args' : [], //具体method算法的参数列表
'nonce' : 1516292399361, //时间戳,单位毫秒
'sign' : '085b63456c93hfb243a757366600f9c2' //签名(需要根据上面5个参数加密获取,下面有讲)
}
以GetNodeList方法为例
https://www.fmz.com/api/v1?
access_key=8a148320e0bxxxxxxxxxxxxxx19js99f&
nonce=1516292399361&
args=%5B%5D&
sign=085b63456c93hfb243a757366600f9c2&
version=1.0&
method=GetNodeList
按照如下顺序进行参数拼接后,使用MD5加密算法加密字符串,并转换为十六进制数据字符串值,该值作为参数sign的值。
version + "|" + method + "|" + args + "|" + nonce + "|" + secretKey
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);
}
مندرجہ بالا کوڈ کی بنیاد پر، آئیے روبوٹس کے درمیان میسج کمیونیکیشن کو نافذ کرنے کے لیے CommandRobot طریقہ استعمال کریں۔
سب سے پہلے، آئیے CommandRobot(RobotId، Cmd) طریقہ کے لیے درکار دو پیرامیٹرز کو دیکھیں۔
| پیرامیٹر کا نام | قسم | معنی |
|---|---|---|
| RobotId | int | روبوٹ ID، جسے GetRobotList(…) کا استعمال کرتے ہوئے یا روبوٹ کی تفصیلات کے صفحہ پر حاصل کیا جا سکتا ہے۔ |
| Cmd | String | بوٹ کو پیغامات |
پیرامیٹرز کے معنی جانتے ہوئے، آئیے آگے کال کرنے کے اس طریقہ کو لاگو کریں۔
روبوٹ کی تفصیلات کے صفحہ پر روبوٹ ID حاصل کریں:

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//当前进入的周期起始时间
}
}
//发送消息前先获取消息
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));
function main(){
while(true) {
var cmd = GetCommand()
if (cmd) {
Log(cmd)
}
Sleep(1000)
}
}
پیغام کامیابی سے بھیج دیا گیا:
پیغام کامیابی سے موصول ہوا:

اسی طرح، آئیے پہلے دو طریقوں کے پیرامیٹر کی وضاحت کو دیکھیں GetRobotList(offset, length, robotStatus, label):
| پیرامیٹر کا نام | قسم | معنی |
|---|---|---|
| offset | int | سوال صفحہ نمبر |
| length | int | سوال کے صفحے کے ڈیٹا کی لمبائی |
| robotStatus | int | سب حاصل کرنے کے لیے -1 پاس کریں۔ |
| label | String | حسب ضرورت ٹیگ اس ٹیگ کے ساتھ تمام روبوٹس کو فلٹر کر سکتے ہیں۔ |
GetRobotDetail(RobotId):
| پیرامیٹر کا نام | قسم | معنی |
|---|---|---|
| RobotId | int | روبوٹ ID |
//获取机器人列表信息
var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
var robotList = robotListJson.data.result.robots;
//获取机器人详情信息
var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
var robotDetail = robotDetailJson.data.result.robot;
function getLogPrient(infoArr){
return table = {
type: 'table',
title: '奥克量化的机器人展示',
cols: ['机器人ID','机器人名称','策略名称','下次扣费时间','已经消耗时间ms','已经消耗金额CNY','最近活跃时间','是否公开'],
rows: infoArr
};
}
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;
}

اصل توسیع میں، زیادہ دلچسپ افعال کو محسوس کیا جا سکتا ہے. مثال کے طور پر، کمانڈروبوٹ کا طریقہ استعمال کریں تاکہ ہر روبوٹ کو روبوٹ A کو دل کی دھڑکن کی جانچ کرنے کی اجازت دی جائے۔ اگر روبوٹ A کو پتہ چلتا ہے کہ مشین میں دل کی دھڑکن نہیں ہے، لیکن روبوٹ اب بھی چل رہا ہے، تو یہ FMZ سروس نمبر کے ذریعے الارم جاری کر سکتا ہے۔ اس طرح، الارم جو پروگرام ہینگ کا سبب بن سکتے ہیں، جیسے _C() ڈیڈ لوپس، سے بچا جا سکتا ہے۔ میں امید کرتا ہوں کہ اس بار میری حوصلہ افزائی کے ذریعے، FMZ پلیٹ فارم زیادہ سے زیادہ دلچسپ فنکشنز تیار کر سکتا ہے اور ہر کسی کی طرف سے اوپن سورس کیا جا سکتا ہے۔ آخر میں، میں FMZ پلیٹ فارم اور تمام عظیم لوگوں بشمول مسٹر مینگ، مسٹر چاو، اور مسٹر Z کا ان کی حمایت اور مدد کے لیے شکریہ ادا کرنا چاہوں گا۔ شکریہ ~