В процессе загрузки ресурсов... загрузка...

Oak учит использовать JS для интерфейса с расширенным API FMZ

Автор:FMZ~Lydia, Создано: 2022-12-20 13:27:24, Обновлено: 2023-09-20 11:12:14

img

Oak учит использовать JS для интерфейса с расширенным API FMZ

Введение

Здравствуйте, я Оук Квант.следить за рынкомДля того, чтобы воспользоваться этой жарой, мы начали докировать расширенный API FMZ для достижения связи сообщений между роботами и отправлять оповещения о рынке непосредственно назначенным роботам.

В статье в основном представлены:

  1. Как разработчики взаимодействуют с расширенными API FMZ через язык JS. (В этой статье используется метод GetNodeList в качестве примера.)
  2. Случай 1: Использование метода CommandRobot расширенного API для реализации сообщения общения между мониторинговым роботом и другими роботами.
  3. Случай 2: Используйте метод GetRobotDetail расширенного API для реализации единого мониторинга и отображения нескольких данных робота.

1. Используйте JS для интерфейса с расширенным API FMZ

1) Подать заявку на получение AccessKey и SecretKey (далее именуемые AK и SK). Мы применяем в меню [Учетная запись] -> [ApiKey] -> [Создать новый ApiKey] на официальном сайте FMZ, а затем получаем и записываем группу AK и SK. (AK и SK в FMZ видны, мы можем просматривать полные данные AK и SK в меню [API Interface] в любое время.)

img

2) Разработка в соответствии с расширенным документом API Во-первых, давайте посмотрим на ключевые этапы API запроса.

  1. Интерфейс API FMZ:
https://www.fmz.com/api/v1
  1. Основные параметры запроса
{
    'version'   : '1.0',                                //Custom version number
    'access_key': '8a148320e0bxxxxxxxxxxxxxx19js99f',   //AK
    'method'    : 'GetNodeList',                        //The specific method to call
    'args'      : [],                                   //List of parameters for the specific method algorithm
    'nonce'     : 1516292399361,                        //Timestamp, in milliseconds
    'sign'      : '085b63456c93hfb243a757366600f9c2'    //Signature (need to be encrypted according to the above 5 parameters to obtain, as discussed below)
}
  1. Полные URL запроса скрещиваются в виде вопросительного знака и передачи параметров
Take the GetNodeList method as an example:
https://www.fmz.com/api/v1?
access_key=8a148320e0bxxxxxxxxxxxxxx19js99f&
nonce=1516292399361&
args=%5B%5D&
sign=085b63456c93hfb243a757366600f9c2&
version=1.0&
method=GetNodeList
  1. Способ подписи
After the parameters are spliced in the following order, the MD5 encryption algorithm is used to encrypt the string and convert it to a hexadecimal data string value, which is used as the value of the parameter sign.
version + "|" + method + "|" + args + "|" + nonce + "|" + secretKey
  1. В общем, доступен следующий код: Адрес исходного кода[Oak Quant] - JS стыковки FMZ расширенный API демо
var URL = "https://www.fmz.com/api/v1?";
var AK = "b3a53d3XXXXXXXXXXXXXXXXXXX866fe5";//Replace here with your own AccessKey
var SK = "1d9ddd7XXXXXXXXXXXXXXXXXXX85be17";//Replace here with your own SecretKey

function main() {
    //Get 5 basic parameter objects
    var param = getParam("1.0.0",AK,getArgs());
    Log("param:",param);
    //Get the result after md5 encryption of splicing parameters
    var md5Result = md5(param);
    //Assign the encryption result to the basic parameter object
    param.sign = md5Result;
    //Get the URL of the request api
    var finalUrl = getFinalUrl(param);
    Log("finalUrl:",finalUrl);
    //Execute the request and print the results
    var info = HttpQuery(finalUrl);
    Log("info:",info);
}

//Get 5 basic parameter objects
function getParam(version,ak,args){
    return {
        'version': version,
        'access_key': ak,
        'method': 'GetNodeList',
        'args': JSON.stringify(args),
        'nonce': new Date().getTime()
    }
}

//Execute md5 encryption
function md5(param){
    var paramUrl = param.version+"|"+param.method+"|"+param.args+"|"+param.nonce+"|"+SK
    Log("paramUrl:",paramUrl);
    return Hash("md5", "hex", paramUrl)
}

//Get the final request URL
function getFinalUrl(param){
    return URL+"access_key="+AK+"&nonce="+param.nonce+"&args="+param.args+"&sign="+param.sign+"&version="+param.version+"&method="+param.method;
}

//The naming method of... args is not supported in js, so the arguments keyword is used instead to obtain the parameter array
function getArgs(){
    return [].slice.call(arguments);
}

Случай 2: Использование метода CommandRobot расширенного API для достижения связи сообщений между роботами

На основе вышеуказанного кода мы будем использовать метод CommandRobot для достижения сообщения между роботами.

Во-первых, давайте посмотрим на два параметра, требуемых методом CommandRobot (RobotId, Cmd):

Наименование параметра Тип Значение
Робот ID Инт Идентификатор робота, который можно получить с помощью GetRobotList (...) или на странице деталей робота
Cmd Строка Сообщение отправлено роботу

Теперь, когда мы знаем значение параметра, давайте реализуем метод вызова.

  1. Получите идентификатор робота на странице деталей робота

  2. Реализовать метод получения сообщения Cmd

//Get message header information
function getMessageBody(toUserName,msgType,content){
    return ({
        "toUserName":toUserName,//Who to send to
        "fromUserName":AOKE_INFO,//Source
        "createTime": new Date().getTime(),//Current timestamp
        "msgType":msgType,//Message Type
        "content":content,//Message content
        "msgId":Math.random().toString(36).slice(-8)//Message ID
    })
}

//Get message body trend information (data of message header content field)
function getCtaDate(symbol,timeCycle,direction,nowCycleTime){
    return {
        "symbol":symbol,//Trading currency
        "timeCycle":timeCycle,//Trend cycle
        "direction":direction,//Current entry direction, 0: berish, 1: bullish
        "createTime":new Date().getTime(),//Current timestamp
        "nowCycleTime":nowCycleTime//Start time of current cycle
    }
}
  1. Изменить код отправки сообщения
//Get messages before sending them
var sendMessage = getMessageBody("Test object",'CTARemind',getCtaDate('BTC_USDT','120','0','2020-05-1620:00:00'));

//Get the robot ID and message body through the getArgs() method, and pass in the basic parameters.
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: Используйте методы GetRobotList и GetRobotDetail расширенного API для мониторинга и отображения данных роботов.

Аналогичным образом, давайте сначала посмотрим на описания параметров следующих двух методов GetRobotList ((оффсет, длина, robotСтатус, этикетка):

Наименование параметра Тип Значение
сдвиг Инт Номер страницы запроса
длина Инт Длина данных страницы запроса
роботСтатус Инт Передай - 1, чтобы получить все.
маркировка Строка Настраиваемые теги могут отфильтровывать всех роботов с этим тегом

GetRobotDetail ((Робот Идентификатор):

Наименование параметра Тип Значение
Робот ID Инт Идентификатор робота
  1. Получить список роботов по методу GetRobotList
//Get robot list information
var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
var robotList = robotListJson.data.result.robots;
  1. Получить подробную информацию о роботе
//Get robot detail information
var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
var robotDetail = robotDetailJson.data.result.robot;
  1. Данные выходной таблицы консоли
function getLogPrient(infoArr){
    return table = {
            type: 'table',
            title: 'Oak Quant robot display',
            cols: [''Robot ID', 'Robot name', 'Strategy name', 'Next deduction time', 'Consumed time ms', 'Consumed amount CNY', 'Latest active time', 'Publish or not'],
            rows: infoArr
        };
}
  1. В общем, доступен следующий код: Адрес исходного кодаИспользуйте расширенный API, чтобы получить информацию о роботе и отобразить его
var URL = "https://www.fmz.com/api/v1?";
var AK = "b3a53d3XXXXXXXXXXXXXXXXXXX866fe5";//Replace here with your own AccessKey
var SK = "1d9ddd7XXXXXXXXXXXXXXXXXXX85be17";//Replace here with your own SecretKey
var OFF_SET = 0;//Page number subscript of query
var PAGE_LENGTH = 5;//Data length of the query page

function main() {
    LogReset();
    while(true){
        //Get robot list information
        var robotListJson = getAPIInfo('GetRobotList',getArgs(OFF_SET,PAGE_LENGTH,-1));
        //Get the robot list information
        var robotList = robotListJson.data.result.robots;
        //Create an array to display robot information
        var infoArr = new Array();
        var infoArr_index = 0;
        for (index = 0; index < robotList.length; index++) {
            var robot = robotList[index];
            //Get the robot ID of the current loop
            var robotId = robot.id;
            //Get robot detail information
            var robotDetailJson = getAPIInfo('GetRobotDetail',getArgs(robotId));
            var robotDetail = robotDetailJson.data.result.robot;
            //Convert details to array objects
            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: 'Oak Quant robot display',
            cols: [''Robot ID', 'Robot name', 'Strategy name', 'Next deduction time', 'Consumed time ms', 'Consumed amount CNY', 'Latest active time', 'Publish or not'],
            rows: infoArr
        };
}

//Get API information by parameters
function getAPIInfo(method,dateInfo){
    //Get 5 basic parameter objects
    var param = getParam("1.0.0",AK,method,dateInfo);
    //Log("param:",param);
    //Get the result after md5 encryption of splicing parameters
    var md5Result = md5(param);
    //Assign the encryption result to the basic parameter object
    param.sign = md5Result;
    //Get the URL of the request api
    var finalUrl = getFinalUrl(param);
    //Log("finalUrl:",finalUrl);
    //Execute the request and print the results
    var info = HttpQuery(finalUrl);
    //Log("info:",info);
    return JSON.parse(info);
}

//Get the object of the basic 5 parameters
function getParam(version,ak,method,args){
    return {
        'version': version,
        'access_key': ak,
        'method': method,
        'args': JSON.stringify(args),
        'nonce': new Date().getTime()
    }
}

//Execute md5 encryption
function md5(param){
    var paramUrl = param.version+"|"+param.method+"|"+param.args+"|"+param.nonce+"|"+SK
    //Log("paramUrl:",paramUrl);
    return Hash("md5", "hex", paramUrl)
}

//Get the final request URL
function getFinalUrl(param){
    return URL+"access_key="+AK+"&nonce="+param.nonce+"&args="+param.args+"&sign="+param.sign+"&version="+param.version+"&method="+param.method;
}

//The naming method of... args is not supported in js, so the arguments keyword is used instead to obtain the parameter array
function getArgs(){
    return [].slice.call(arguments);
}

//Get the display details object: ['Robot ID', 'Robot Name', 'Strategy Name', 'Next Deduction Time', 'Time Consumed ms', 'Amount Consumed CNY', 'Latest Active Time', 'Whether to Publish'],
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?"Published":"Unpublished";
    return itemArr;
}

Заключение

В самом расширении можно реализовать все более интересные функции. Например, используя метод CommandRobot, каждый робот отправляет обнаружение сердечного ритма роботу А. Если робот А обнаруживает, что у машины нет сердечного ритма, но робот все еще работает, он может подать тревогу через службу FMZ. Таким образом, можно избежать сигналов тревоги, таких как _C() мертвые петли, которые приводят к программированию фальшивых сценариев смерти. Я надеюсь, что через мое введение на этот раз, платформа FMZ может иметь все больше и больше интересных функций, которые могут быть разработаны и открыты. Наконец, я хотел бы поблагодарить платформу FMZ и всех великих людей, таких как Сяосяоменг, Чжан и Зи за поддержку и помощь.


Связанные

Больше