avatar of 奥克量化 奥克量化
fokus pada mesej peribadi
6
fokus pada
185
Pengikut

Oak mengajar anda cara menggunakan JS untuk menyambung ke API sambungan FMZ

Dicipta dalam: 2020-05-16 18:04:17, dikemas kini pada: 2024-12-10 20:29:45
comments   2
hits   2934

Oak mengajar anda cara menggunakan JS untuk menyambung ke API sambungan FMZ

pengenalan

Hello semua, saya “Oak Quantitative”. Kerana peringatan arah aliran pasaran yang saya bangunkan suatu ketika dahulu [Memantau papan pemuka】 disukai secara meluas oleh semua orang, dan terdapat peringatan serentak daripada akaun perkhidmatan dengan nama yang sama [Oak Quantitative], yang menyediakan rujukan baharu kepada pelabur baharu dan lama untuk menilai arah aliran pasaran. Mengambil kesempatan daripada populariti ini, kami mula menyambung ke API lanjutan FMZ untuk merealisasikan komunikasi mesej antara robot dan terus menolak makluman pasaran kepada robot yang ditetapkan. Artikel ini memberikan dua senario aplikasi sebagai contoh untuk merangsang perbincangan saya harap anda boleh membangunkan lebih banyak perkara yang menarik…

Artikel ini terutamanya memperkenalkan: 1. Bagaimanakah pembangun menyambung ke API lanjutan FMZ melalui bahasa JS? (Artikel ini mengambil kaedah GetNodeList sebagai contoh) 2. Kes 1: Gunakan kaedah CommandRobot API lanjutan untuk melaksanakan komunikasi mesej antara robot pemantauan dan robot lain. 3. Kes 2: Gunakan kaedah GetRobotDetail API lanjutan untuk mencapai pemantauan bersepadu dan paparan berbilang data robot.

1. Gunakan JS untuk menyambung ke API lanjutan FMZ

  1. Mohon AccessKey dan SecretKey (selepas ini dirujuk sebagai AK dan SK). Kami memohon dalam menu [Tetapan Akaun] -> [Antara Muka API] -> [Buat ApiKey Baharu] di tapak web rasmi FMZ, dan kemudian dapatkan satu set AK dan SK dan merekodkannya. (AK dan SK FMZ bukan seperti pertukaran di mana ia hanya kelihatan pada kali pertama ia dicipta. Dalam FMZ, kita boleh melihat data penuh AK dan SK kita pada bila-bila masa dalam menu [Antara Muka API]) Oak mengajar anda cara menggunakan JS untuk menyambung ke API sambungan FMZ

  2. Membangunkan mengikut dokumentasi API lanjutan Mula-mula, mari kita lihat langkah-langkah utama untuk meminta API

  3. Antara muka API FMZ:

https://www.fmz.com/api/v1
  1. Minta parameter asas
{
    'version'   : '1.0',                                //自定义版本号
    'access_key': '8a148320e0bxxxxxxxxxxxxxx19js99f',   //AK
    'method'    : 'GetNodeList',                        //具体调用的方法
    'args'      : [],                                   //具体method算法的参数列表
    'nonce'     : 1516292399361,                        //时间戳,单位毫秒
    'sign'      : '085b63456c93hfb243a757366600f9c2'    //签名(需要根据上面5个参数加密获取,下面有讲)
}
  1. URL permintaan lengkap digabungkan dalam bentuk lulus parameter tanda soal
以GetNodeList方法为例
https://www.fmz.com/api/v1?
access_key=8a148320e0bxxxxxxxxxxxxxx19js99f&
nonce=1516292399361&
args=%5B%5D&
sign=085b63456c93hfb243a757366600f9c2&
version=1.0&
method=GetNodeList
  1. Kaedah tandatangan
按照如下顺序进行参数拼接后,使用MD5加密算法加密字符串,并转换为十六进制数据字符串值,该值作为参数sign的值。
version + "|" + method + "|" + args + "|" + nonce + "|" + secretKey
  1. Sebagai kesimpulan, terdapat kod berikut Alamat kod sumber:[Kuantitatif Oak]-Demo API sambungan FMZ sambungan JS
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);
}

Kes 2: Menggunakan kaedah CommandRobot API lanjutan untuk melaksanakan komunikasi mesej antara robot

Berdasarkan kod di atas, mari gunakan kaedah CommandRobot untuk melaksanakan komunikasi mesej antara robot.

Mula-mula, mari kita lihat dua parameter yang diperlukan oleh kaedah CommandRobot(RobotId, Cmd).

Nama parameter taip maksudnya
RobotId int ID Robot, yang boleh diperoleh menggunakan GetRobotList(…) atau pada halaman butiran robot
Cmd String Mesej kepada bot

Mengetahui maksud parameter, mari laksanakan kaedah panggilan ini seterusnya.

  1. Dapatkan ID robot pada halaman butiran robot: Oak mengajar anda cara menggunakan JS untuk menyambung ke API sambungan FMZ

  2. Laksanakan kaedah mendapatkan mesej 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. Ubah suai kod untuk menghantar mesej
//发送消息前先获取消息
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. Jalankan kaedah utama, hantar mesej dan gunakan kaedah GetCommand() untuk mendapatkan mesej
function main(){
    while(true) { 
        var cmd = GetCommand()
        if (cmd) { 
            Log(cmd)
        }
        Sleep(1000) 
    }
}

Mesej berjaya dihantar: Oak mengajar anda cara menggunakan JS untuk menyambung ke API sambungan FMZ Terima mesej berjaya: Oak mengajar anda cara menggunakan JS untuk menyambung ke API sambungan FMZ

Kes 3: Gunakan kaedah GetRobotList dan GetRobotDetail API lanjutan untuk memantau dan memaparkan data robot.

Begitu juga, mari kita lihat dulu perihalan parameter kedua-dua kaedah GetRobotList(offset, length, robotStatus, label):

Nama parameter taip maksudnya
offset int Nombor halaman pertanyaan
length int Panjang data halaman pertanyaan
robotStatus int Lulus -1 untuk mendapatkan semua
label String Teg tersuai boleh menapis semua robot dengan teg ini

GetRobotDetail(RobotId):

Nama parameter taip maksudnya
RobotId int ID robot
  1. Dapatkan senarai Robot melalui kaedah GetRobotList
//获取机器人列表信息
var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
var robotList = robotListJson.data.result.robots;
  1. Dapatkan butiran robot
//获取机器人详情信息
var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
var robotDetail = robotDetailJson.data.result.robot;
  1. Konsol mengeluarkan data jadual
function getLogPrient(infoArr){
    return table = {
            type: 'table',
            title: '奥克量化的机器人展示',
            cols: ['机器人ID','机器人名称','策略名称','下次扣费时间','已经消耗时间ms','已经消耗金额CNY','最近活跃时间','是否公开'],
            rows: infoArr
        };
}
  1. Sebagai kesimpulan, terdapat kod berikut Alamat kod sumber:[OakQuant]-Gunakan API lanjutan untuk mendapatkan maklumat robot dan memaparkannya
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;
}

Paparan kesan:

Oak mengajar anda cara menggunakan JS untuk menyambung ke API sambungan FMZ

Kesimpulan

Dalam pengembangan sebenar, fungsi yang lebih menarik boleh direalisasikan. Sebagai contoh, gunakan kaedah CommandRobot untuk membenarkan setiap robot menghantar pemeriksaan degupan jantung kepada robot A. Jika robot A mendapati bahawa mesin tidak mempunyai degupan jantung, tetapi robot itu masih berjalan, ia boleh mengeluarkan penggera melalui nombor perkhidmatan FMZ. Dengan cara ini, penggera yang boleh menyebabkan program hang, seperti gelung mati _C(), boleh dielakkan. Saya berharap melalui inspirasi saya kali ini, platform FMZ dapat mempunyai lebih banyak fungsi menarik yang dibangunkan dan sumber terbuka oleh semua orang. Akhir sekali, saya ingin mengucapkan terima kasih kepada platform FMZ dan semua orang yang hebat termasuk En. Meng, En. Chao, dan En. Z atas sokongan dan bantuan mereka. Terima kasih~