Элементарный учебник для платформы FMZ Quant Strategy Writing

Автор:Нинабадасс., Создано: 2022-03-18 09:00:46, Обновлено: 2022-04-02 11:48:15

Вы можете использовать Python для записи прямо в базу данных.

function onexit(){
    _G('profit', profit)
}
function main(){
    _G("num", 1); // Set a global variable num, with a value of 1 second 
    _G("num", "ok"); // Change a global variable num, whose value is the string "ok"
    _G("num", null); // Delete the global variable num 
    _G("num"); // Return the value of the global variable num; if it does not exist, return null

    var profit = 0
    if(_G('profit')){
        profit = _G('profit')
    }
}

_N

При размещении заказа, точность цены и объема обычно необходимо контролировать; FMZ встроен в функцию _N для определения десятичных мест, которые должны быть сохранены; например, результат_N(4.253,2)Это 4,25.

_C

Вызов API платформы не может гарантировать, что доступ будет успешным каждый раз, а _C является функцией автоматической повторной попытки. Она всегда будет вызывать указанные функции, пока не вернется успешно (функция будет вновь пытаться, если вернет нуль или ложь); например,_C(exchange.GetTicker), с интервалом повторной попытки по умолчанию 3 секунды, и вы можете вызвать функцию _CDelay для управления интервалом повторной попытки, например _CDelay(1000), что означает изменение интервала повторной попытки функции _C до 1 секунды.GetTicker(), exchange.GetDepth, GetTrade, GetRecords, GetAccount, GetOrdersиGetOrderчтобы предотвратить прерывание программы, вызванное отказом в доступе.

CancelOrderне может использовать функцию _C, потому что есть различные причины неудачи отмены заказа. Если заказ был выполнен, то отмена заказа вернет неудачу, а использование функции _C приведет к повторной попытке все время. Функция _C также может передавать параметры и также используется в пользовательских функциях.

function main(){
    var ticker = _C(exchange.GetTicker)
    var depth = _C(exchange.GetDepth)
    var records = _C(exchange.GetRecords, PERIOD_D1) // Pass in the parameters
}

_D

Звонить._D()directly вернет текущую временную строку, например:2019-08-15 03:46:14. Если он вызван во время обратного теста, время обратного теста будет возвращено. Вы можете использовать функцию _D для оценки времени, например:_D().slice(11) > '09:00:00':. _D(timestamp, fmt), преобразует часовую метку ms в временную строку, например_D(1565855310002). Параметр fmt - это формат времени, и по умолчаниюyyyy-MM-dd hh:mm:ss.

Функции индикатора TA

Для некоторых часто используемых функций показателей, таких как MA\MACD\KDJ\BOLL и другие распространенные показатели, которые были непосредственно встроены в платформу FMZ, и конкретные поддерживаемые показатели можно найти в документе API.

Прежде чем использовать индикаторные функции, лучше всего судить о длине линии K. Когда предыдущая длина линии K не может соответствовать требуемому периоду для расчета, результатnullНапример, если входная длина K-линии равна 100 и период для расчета MA равен 10, то первые 9 значений являются нулевыми, и расчет после формы 9 будет выполняться обычно.

JavaScript также поддерживает полный talib, как библиотеку третьих сторон, с методом вызова, таким какtalib.CCI(records)Пожалуйста, обратитесь кhttp://ta-lib.org/function.html. Для Python вы можете установить библиотеку talib самостоятельно. Из-за необходимости компиляции вы не можете просто использовать pip для установки. Вы можете искать метод установки самостоятельно.

Индикаторные функции могут не только передавать данные K-линии, но и передавать любой массив

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    if (records && records.length > 9) {
        var ma = TA.MA(records, 14)
        Log(ma)
    }
}

Часто используемые функции в JavaScript

Здесь мы представляем некоторые часто используемые функции JavaScript в ботах.

  • Date.now()возвращает текущую дату;
  • parseFloat()переносит строки в числа, такие какparseFloat("123.21");
  • parseInt()переносит строки в целые числа;
  • num.toString()переводит числа в строки с переменной num;
  • JSON.parse()формат Json строки, такие какJSON.parse(exchange.GetRawJSON());
  • JavaScript имеет свои собственные математические функции, такие как общие математические операции, в том числеMath.max(), Math.abs()и так далее; ссылка:https://www.w3school.com.cn/jsref/jsref_obj_math.asp ;
  • Третья математическая библиотека, используемая FMZ; ссылка:https://mathjs.org/ ;
  • Третья сторона подчеркивает библиотеку JavaScript, используемую FMZ, которая рекомендуется иметь знания и которая делает утомительные операции Js более удобными; ссылка:https://underscorejs.org/.

Образец

Есть много ситуаций, которые необходимо учитывать при написании функции стратегии бота. Например, простую функцию, такую как покупка 5 монет, мы должны учитывать: достаточно ли текущего баланса? Сколько стоит цена заказа? Какова точность? Нужно ли разделять заказы, чтобы избежать влияния на рынок? Как справиться с незавершенными заказами? И некоторые подобные детали. В разных стратегиях эти функции одинаковы, поэтому вы можете сделать их шаблоном. Следуя официальным шаблонам, пользователи также могут писать свои собственные стратегии шаблонов. Здесь мы представим несколько очень часто используемых библиотек классов шаблонов, официально выпущенных FMZ, чтобы пользователи могли быстро писать свои собственные стратегии.

Библиотека торговли криптовалютами JavaScript и библиотека торговли товарными фьючерсами встроены по умолчанию и не нуждаются в копировании.https://www.fmz.com/square/20/1) Копируйте и сохраняйте библиотеку шаблонов и проверьте библиотеку, которую вы хотите использовать при создании собственной стратегии.

Функции шаблона JavaScript начинаются с$, в то время как Python все начинаются сext.

Библиотека торговли криптовалютами

Адрес исходного кодаhttps://www.fmz.com/strategy/10989Специфическая реализация функции может напрямую ссылаться на исходный код.

Получить аккаунт:

$.GetAccount(e)

Log($.GetAccount()); // Obtain the account information, with fault tolerance function 
Log($.GetAcccount(exchanges[1]));

Заказ и отмена:

$.Buy/Sell(e, amount)
$.Buy(0.3); // The main platform buys 0.3 coin
$.Sell(0.2); // The main platform sells 0.2 coin
$.Sell(exchanges[1], 0.1); // The secondary platform sells 0.1 coin
$.CancelPendingOrders(e, orderType)

$.CancelPendingOrders(); // Cancel all entrusted orders of the main platform 
$.CancelPendingOrders(ORDER_TYPE_BUY); // Cancel all buy orders of the main platform
$.CancelPendingOrders(exchanges[1]); // Cancel all orders of the secondary platform
$.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // Cancel all sell orders of the secondary platforom 

Суди крест:

$.Cross(periodA, periodB) / $.Cross(arr1, arr2);

var n = $.Cross(15, 30);
var m = $.Cross([1,2,3,2.8,3.5], [3,1.9,2,5,0.6])
If n = 0, it means that the current prices of exactly 15-period EMA and 30-period EMA are equal. 
If n > 0, such as 5, it means that the 15-period EMA up-crosses the 30-period EMA by 5 periods (Bar)
If n < 0, such as -12, it means that the 15-period EMA down-crosses the 30-period EMA by 12 periods (Bar)
If it is not an array passed to the Cross, the function automatically obtains the K-line for moving average calculation.
If an array is passed to Cross, compare directly.

Функция $.withdraw ((e, валюта, адрес, сумма, плата, пароль):

$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")

Библиотека торговли товарными фьючерсами

Для использования товарная фьючерсная торговая библиотека очень стабильна, рекомендуется.https://www.fmz.com/strategy/12961Специфическая реализация функции может напрямую ссылаться на исходный код.

Библиотека CTA

  • Бот автоматически отображает индекс к основному непрерывному контракту;
  • Он будет автоматически обрабатывать движение;
  • вы можете указать отображение для обратного теста, например rb000/rb888, которое должно отображать k-линию индекса rb для торговли основным непрерывным контрактом;
  • Он также может быть привязан к другим контрактам; например, rb000/MA888 следует рассматривать на K-линии индекса rb для торговли основным непрерывным контрактом MA.
function main() {
    $.CTA("rb000,M000", function(r, mp) {
        if (r.length < 20) {
            return
        }
        var emaSlow = TA.EMA(r, 20)
        var emaFast = TA.EMA(r, 5)
        var cross = $.Cross(emaFast, emaSlow);
        if (mp <= 0 && cross > 2) {
            Log("Golden cross period", cross, "the moment position", mp);
            return 1
        } else if (mp >= 0 && cross < -2) {
            Log("Death cross period", cross, "the moment position", mp);
            return -1
        }
    });
}

Призыв Пример библиотеки

function main() {
    var p = $.NewPositionManager();
    p.OpenShort("MA609", 1);
    p.OpenShort("MA701", 1);
    Log(p.GetPosition("MA609", PD_SHORT));
    Log(p.GetAccount());
    Log(p.Account());
    Sleep(60000 * 10);
    p.CoverAll("MA609");
    LogProfit(p.Profit());
    Log($.IsTrading("MA609"));
    // Multiple varieties use the trading queue to complete the non-blocking trading task
    var q = $.NewTaskQueue();
    q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) {
        Log(task.desc, ret)
    })
    while (true) {
        // Call "poll" to execute the unfinished tasks in the spare time
        q.poll()
        Sleep(1000)
    }
}

Библиотека рисунков

Поскольку сырые функции для рисования очень сложны, которые будут представлены в следующем уроке, мы рекомендуем новичкам использовать библиотеку рисования, чтобы рисовать очень простые линейные диаграммы и k-линейные диаграммы и т. д. Простая библиотека рисования была построена в FMZ, которую можно увидеть на странице редактирования стратегии; если библиотека еще не встроена, пользователям необходимо скопировать и сохранить, чтобы проверить и использовать библиотеку в стратегии.

img

Адрес копии библиотеки чертежей версии JavaScript:https://www.fmz.com/strategy/27293Адрес копии библиотеки рисунков версии Python:https://www.fmz.com/strategy/39066

Конкретный пример:

function main() {
    while (true) {
        var ticker = exchange.GetTicker()
        if (ticker) {
            $.PlotLine('Last', ticker.Last) // You can draw two lines at the samw time, "Last" is the name of the line
            $.PlotLine('Buy', ticker.Buy)
        }
        Sleep(6000)
    }
}

Настройки параметров стратегии

В рамках Edit Strategy существуют параметры настройки стратегии, которые равны глобальным переменным стратегии и могут быть доступны в любом месте кода. Параметры стратегии могут быть изменены на странице бота, и они будут действительны после перезагрузки. Поэтому некоторые переменные могут быть установлены на параметры, и параметры могут быть изменены без изменения стратегии.
img

  • Имя переменной: а именно число, строка и комбайн и т.д. на вышеприведенном изображении, которые можно использовать непосредственно в группе стратегии.
  • Описание: название параметра на стратегическом интерфейсе, более удобное для пользователей для понимания значения параметра.
  • Примечание: подробное объяснение параметра, которое будет отображаться соответствующим образом, когда мышь будет находиться над параметром.
  • Тип: тип параметра, который будет представлен подробно позже.
  • По умолчанию: параметр a по умолчанию.

Это очень легко понять и тип строки и тип числа. которые являются очень часто используемыми типами. Комбайн покажет опции в поле на интерфейсе параметров. Например, вы можете установить параметр SYMBOL какBTC|USDT|ETHв комбинационном поле; если вы выберете USDT в поле на странице, значение SYMBOL в стратегии является индексом USDT 1. Проверка опций относится к опциональному отметке; проверка означает true, а отсутствие проверки означает false.

Есть больше параметров для настроек; ссылка:https://www.fmz.com/api.

Стратегическая обратная проверка

Когда квантование стратегии завершено, вы можете протестировать ее по данным истории, чтобы проверить ситуацию прибыли стратегии в историческую дату. Конечно, результат бэкстеста является только справочным. Платформа FMZ Quant поддерживает бэкстесты криптовалют спота и фьючерсов, вечного контракта BitMEX, товарных фьючерсов, в которых поддерживаются только основные криптовалюты. Javascript backtest выполняется в браузере; Python backtest выполняется на докере, а наша платформа предоставляет публичные докеры для пользователей.

Механизм Baktest

Механизм Onbar Backtest основан на K-линии, то есть каждая K-линия будет генерировать одну точку в времени для backtest. В то время вы можете получить информацию, включая открытые, закрытые, самые высокие и самые низкие цены и объем торговли текущей K-линии, а также информацию о истории K-линии до точки. Недостатки такого типа механизма очень очевидны: только одна покупка может быть генерирована на одной K-линии; обычно указанная цена является ценой закрытия thr K-линии. Кроме того, одна K-линия может получить только четыре цены, а именно закрытые, открытые, самые высокие и самые низкие цены; информацию, включая изменение цен в одной K-линии и изменение ценовой котировки или самой низкой цены, нельзя получить.

Бактэст на FMZ содержит два вида, а именно бактэст на уровне симуляции и бактэст на уровне реального рынка.Тем не менее, реальный рыночный уровень backtest будет фактически собирать клик, каждые несколько секунд, и теперь он поддерживает реальную глубину (включая 20 уровней), и реальные исполнения торговли по tarde.Объем даты довольно большой, и скорость бэкстеста очень медленная, поэтому бэкстест не может быть запущен в течение длительного времени. Механизм бэкстеста FMZ может реализовать несколько сделок стартегии на одной K-линии, чтобы предотвратить ситуацию, когда торговля может быть выполнена только по цене закрытия, а также все больше ориентироваться и заботиться о скорости бэкстеста.https://www.fmz.com/bbs-topic/9126.

Фреймворк backtest и бота одинаков, оба бесконечные петли. Поскольку backtest должен переходить на разные точки backtest, backtest может быть выполнен без использования Sleep, и он автоматически перейдет на следующую точку времени, когда одна петля закончится. Однако Python, из-за механизма программы, нуждается в ограничении:Sleep(10), чтобы не застрять.

Совпадение с обратным тестом

Инженер обратного тестирования сопоставит цену ордера, размещенного пользователем, и рыночную цену в момент обратного тестирования. Если цена покупки выше, чем цена продажи, то цена продажи будет выполнена. Если торговля не может быть выполнена, будет сгенерирован ожидаемый ордер. Для обеспечения торговли необходимо добавить скольжение. Если позиция не может быть открыта или закрыта во время обратного тестирования, проверьте, не заморожена ли позиция из-за незавершенных заказов.

Настройки страницы для обратного тестирования

img

  • 1.выбор страницы Backtest, слева от которой находится страница Edit Strategy;
  • 2.время начала и окончания обратного тестирования; для данных, которые могут быть неполными, обратное тестирование может начаться непосредственно с момента существования данных;
  • 3.продолжительный период обратного тестированияGetRecords()функция; вы также можете указать параметр периода в коде;
  • 4.выбор механизма обратного тестирования;
  • 5.показать или скрыть больше настроек обратного тестирования;
  • 6.максимальные значения записей в журнале, записей в журнале прибыли и записей в журнале графиков, чтобы предотвратить сбои в браузере, вызванные огромным объемом данных;
  • 7. период, вырабатываемый подслойным тиком по линии K;
  • 8.точка скольжения;
  • 9.устойчивость к ошибкам, которая будет имитировать ситуацию, когда запрос API ошибочен, и проверять способность стратегии к устойчивости к ошибкам;
  • Если в обратном тесте используется функция индикатора TA, функция автоматически отображается на графике, а также отмечаются покупки и продажи;
  • 11.установление платы за услуги;
  • 12.добавление платформ - торговые пары и активы;
  • 13. настройки параметров обратного теста; если параметры являются числами и также поддерживают оптимизацию с одной клавиатурой, параметры автоматически пересекаются в определенном диапазоне в обратном тесте.

Различия между ботом и обратным тестом

  • 1. единственные действительные рыночные котировки в обратном тесте являются только от GetTicker и GetRecords; другие, такие как GetDepth и GetTrades, не являются реальными (объем данных огромен, и хотя обратный тест на уровне реального рынка теперь поддерживает данные уже, он поддерживает только последние данные);
  • 2.Платформы, добавленные в ходе обратного теста, все являются обособленными счетами; прямое переключение торговых пар не поддерживается; следовательно, вы не можете использовать две торговые пары на одном счете;
  • 3.просьба networkwrok не может быть использована в обратном тесте;
  • 4.IOрасширение не может быть использовано при обратном тестировании, и могут использоваться только базовые API;
  • 5.в обратном тесте могут быть получены только стандартные данные, а данных, таких как Info, связанных с ботом, не существует;
  • 6.отсрочка может не быть выполнена при обратном тестировании, и обратить внимание на ситуацию с замороженными заказами;
  • 7.inВ случае обратной проверки товарных фьючерсов, рыночный порядок не поддерживается.

Стратегия "Терпимость к ошибкам" и распространенные ошибки

Как мы упоминали ранее, Использование интерфейса API в бота может не получить доступ и вернутьсяnull; если вы все еще используете его данные, будет сообщена ошибка, и бот остановится.

Обычные способы терпимости к ошибкам

Частые причины:

  • Ошибка сети доступа к API; временной предел доступа к интерфейсу возвращает nunll, и будет сообщена ошибка.

  • Ошибка ограничения платформы, такая как ограничение IP, точность заказов, частота доступа, ошибка параметров, дефицит активов, неудача торговли на рынке, отмена исполненных заказов и т. д.; подробности можно запросить в документе API в соответствии с неправильными кодами.

  • Ошибка возвращения данных платформы; это случается иногда, например, возвращение нулевой глубины, задержка информации о счете и задержка статуса заказа и т. Д.

  • Логическая ошибка программы.

Прежде чем использовать возвращенные данные API, вы должны судить, являются ли данные нулевыми, и общие методы представлены следующим образом:

//1.judge the data is null and handle 
var ticker = exchange.GetTicker();
while(ticker == null){
     Log('ticker obtain error');
     ticker = exchange.GetTicker();
 }
 Log(ticker.Last);
 // 2. judge the data is not null, and use 
 var ticker = exchange.GetTicker();
 if(!ticker){
     Log(ticker.Last);
 }
 // 3.retry _C() function 
 var ticker = _C(exchange.GetTicker);
 Log(ticker.Last);
 // 4.try cache fault tolerance
 try{
     var ticker = exchange.GetTicker();
     Log(ticker.Last);
 }
 catch(err){
     Log('ticker obtain error');
 } 

Если вы хотите получить информацию об ошибках, вы можете использоватьGetLastError(), и строки информации об ошибке последнего времени будут возвращены, и ошибки могут обрабатываться по различиям.

Часто задаваемые вопросы

Общие ошибки в верхних сообщениях форумов:https://www.fmz.com/bbs-topic/9158. Здесь мы представляем его вкратце; вы можете использовать Ctrl + F для поиска, когда у вас есть проблемы.

Как развернуть докер?

Есть подробное введение об этом в разделе добавления докера.

Могу я попросить кого-нибудь написать мне стратегии?

наhttps://www.fmz.com/markets, есть некоторые люди, которые предоставляют услуги написания стратегий для других, или вы можете спросить в группах чата; обратите внимание, что такие услуги должны быть связаны с вами, и вы должны знать, что риск также должен нести себя.

Все интерфейсы просят отключить при доступе

Это означает, что интерфейс платформы, к которой можно получить доступ, перестает работать; если перерыв случается время от времени, это не проблема; если перерыв происходит постоянно, это означает, что доступ к всем сетям невозможен и нужен зарубежный сервер.

ERR_INVALID_POSITION

Если в обратном тесте сообщается ошибка, это, как правило, ошибка в написании; когда вы пытаетесь разместить ордер на закрытие позиции, когда нет позиции или объема позиции недостаточно, будет сообщена ошибка.

Символ не установлен

В коде нет контракта, который устанавливается в ходе обратных тестов фьючерсных платформ.

BITMEX 429error,{error:{message:Rate limit exceeded retry in 1 seconds......}}

Частота доступа к интерфейсу платформы слишком высока.

{status:6004, msg: timestamp is out of range} {status:6004, msg:

Временная метка сервера превышает промежуток времени обновления сервера, и превышенное время не может быть слишком длинным.

GetOrder ((455284455)): Ошибка: недействительный идентификатор заказа или заказ отменен.

Если заказ платформы отменяется, платформа больше не будет хранить информацию о заказах, поэтому информацию невозможно получить.

GetOrders: 400: {код:-1121,msg:Недействительный символ.}

Недействительная торговая пара; проверьте, не ошибочна ли установка торговой пары.

Дешифровка секретного ключа не удалась

Если пароль FMZ был изменен после настройки APIKEY, попробуйте добавить страницу платформы на FMZ и переконфигурировать платформу APIKEY.

Подпись недействительна: недействительное время подачи или неправильный формат времени

Предлагаю вам использовать сервер Linux, или установить программное обеспечение для синхронизации времени на этих системах Windows, где возникает эта проблема.

Почему докер все еще не может получить доступ к API платформы, когда установлен глобальный прокси?

Из-за проблемы с задержкой лучше всего развернуть докер зарубежного сервера.

Как сохранить стратегию локально, а не загрузить ее в FMZ?

Используя Python, вы можете импортировать локальные файлы, сохранить стратегию, обычно написанную FMZ API в виде файла и поместить ее в путь исполнения на вашем собственном сервере, и вы можете напрямую прочитать и выполнить его.

#!python2.7

def run(runfile):
      with open(runfile,"r") as f:
            exec(f.read())
            
def main():
    run('my.py')

Как проверить сеть платформы или как изменить адрес базы API?

Используйте exchange.SetBase() для непосредственного переключения на соответствующий адрес API. Например:

exchange.SetBase("https://www.okex.me")

Больше