avatar of 奥克量化 奥克量化
fokus pada Pesan pribadi
6
fokus pada
185
Pengikut

Oak mengajarkan Anda cara menggunakan JS untuk terhubung ke API ekstensi FMZ

Dibuat di: 2020-05-16 18:04:17, diperbarui pada: 2024-12-10 20:29:45
comments   2
hits   2934

Oak mengajarkan Anda cara menggunakan JS untuk terhubung ke API ekstensi FMZ

Perkenalan

Halo semuanya, saya “Oak Quantitative”. Karena pengingat tren pasar yang saya kembangkan beberapa waktu lalu [Memantau dasbor】 sangat disukai semua orang, dan ada pengingat simultan dari akun layanan dengan nama yang sama [Oak Quantitative], yang menyediakan referensi baru bagi investor baru dan lama untuk menilai tren pasar. Memanfaatkan popularitas ini, kami mulai terhubung ke API FMZ yang diperluas untuk mewujudkan komunikasi pesan antara robot dan langsung mengirimkan peringatan pasar ke robot yang ditunjuk. Artikel ini memberikan dua skenario aplikasi sebagai contoh untuk merangsang diskusi. Saya harap Anda dapat mengembangkan hal-hal yang lebih menarik…

Artikel ini terutama memperkenalkan: 1. Bagaimana pengembang terhubung ke API FMZ yang diperluas melalui bahasa JS? (Artikel ini menggunakan metode GetNodeList sebagai contoh) 2. Kasus 1: Gunakan metode CommandRobot dari API yang diperluas untuk mengimplementasikan komunikasi pesan antara robot pemantau dan robot lainnya. 3. Kasus 2: Gunakan metode GetRobotDetail dari API yang diperluas untuk mencapai pemantauan dan tampilan terpadu dari beberapa data robot.

1. Gunakan JS untuk terhubung ke API FMZ yang diperluas

  1. Ajukan permohonan AccessKey dan SecretKey (selanjutnya disebut AK dan SK). Kita terapkan di menu [Pengaturan Akun] -> [Antarmuka API] -> [Buat ApiKey Baru] pada website resmi FMZ, kemudian kita peroleh satu set AK dan SK lalu kita rekam. (AK dan SK FMZ tidak seperti bursa yang hanya terlihat saat pertama kali dibuat. Di FMZ, kita dapat melihat data lengkap AK dan SK kita kapan saja di menu [Antarmuka API]) Oak mengajarkan Anda cara menggunakan JS untuk terhubung ke API ekstensi FMZ

  2. Kembangkan sesuai dengan dokumentasi API yang diperluas Pertama, mari kita lihat langkah-langkah utama dalam meminta API

  3. Antarmuka API FMZ:

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

Kasus 2: Menggunakan metode CommandRobot dari API yang diperluas untuk mengimplementasikan komunikasi pesan antar robot

Berdasarkan kode di atas, mari gunakan metode CommandRobot untuk mengimplementasikan komunikasi pesan antar robot.

Pertama, mari kita lihat dua parameter yang dibutuhkan oleh metode CommandRobot(RobotId, Cmd).

Nama parameter jenis arti
RobotId int ID Robot, yang dapat diperoleh menggunakan GetRobotList(…) atau di halaman detail robot
Cmd String Pesan ke bot

Mengetahui arti parameter, mari kita terapkan metode pemanggilan ini selanjutnya.

  1. Dapatkan ID robot di halaman detail robot: Oak mengajarkan Anda cara menggunakan JS untuk terhubung ke API ekstensi FMZ

  2. Terapkan metode mendapatkan pesan 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 kode untuk mengirim pesan
//发送消息前先获取消息
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 metode utama, kirim pesan, dan gunakan metode GetCommand() untuk mendapatkan pesan
function main(){
    while(true) { 
        var cmd = GetCommand()
        if (cmd) { 
            Log(cmd)
        }
        Sleep(1000) 
    }
}

Pesan berhasil terkirim: Oak mengajarkan Anda cara menggunakan JS untuk terhubung ke API ekstensi FMZ Terima pesan berhasil: Oak mengajarkan Anda cara menggunakan JS untuk terhubung ke API ekstensi FMZ

Kasus 3: Gunakan metode GetRobotList dan GetRobotDetail dari API yang diperluas untuk memantau dan menampilkan data robot.

Demikian pula, mari kita lihat dulu deskripsi parameter dari kedua metode tersebut GetRobotList(offset, length, robotStatus, label):

Nama parameter jenis arti
offset int Nomor halaman kueri
length int Kueri panjang data halaman
robotStatus int Lulus -1 untuk mendapatkan semuanya
label String Tag khusus dapat menyaring semua robot dengan tag ini

GetRobotDetail(RobotId):

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

Tampilan efek:

Oak mengajarkan Anda cara menggunakan JS untuk terhubung ke API ekstensi FMZ

Kesimpulan

Dalam perluasan sesungguhnya, fungsi yang lebih menarik dapat diwujudkan. Misalnya, gunakan metode CommandRobot untuk mengizinkan setiap robot mengirim pemeriksaan detak jantung ke robot A. Jika robot A mendapati bahwa mesin tidak memiliki detak jantung, tetapi robot masih berjalan, robot dapat mengeluarkan alarm melalui nomor layanan FMZ. Dengan cara ini, alarm yang dapat menyebabkan program hang, seperti dead loop _C(), dapat dihindari. Saya berharap melalui inspirasi saya kali ini, platform FMZ dapat memiliki lebih banyak lagi fungsi menarik yang dikembangkan dan dijadikan sumber terbuka bagi semua orang. Akhirnya, saya ingin mengucapkan terima kasih kepada platform FMZ dan semua orang hebat termasuk Tuan Meng, Tuan Chao, dan Tuan Z atas dukungan dan bantuan mereka. Terima kasih~