Вы можете использовать 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')
}
}
При размещении заказа, точность цены и объема обычно необходимо контролировать; FMZ встроен в функцию _N для определения десятичных мест, которые должны быть сохранены; например, результат_N(4.253,2)
Это 4,25.
Вызов 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()
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
.
Для некоторых часто используемых функций показателей, таких как 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 в ботах.
Date.now()
возвращает текущую дату;parseFloat()
переносит строки в числа, такие какparseFloat("123.21")
;parseInt()
переносит строки в целые числа;num.toString()
переводит числа в строки с переменной num;JSON.parse()
формат Json строки, такие какJSON.parse(exchange.GetRawJSON())
;Math.max()
, Math.abs()
и так далее; ссылка:https://www.w3school.com.cn/jsref/jsref_obj_math.asp ;Есть много ситуаций, которые необходимо учитывать при написании функции стратегии бота. Например, простую функцию, такую как покупка 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
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, которую можно увидеть на странице редактирования стратегии; если библиотека еще не встроена, пользователям необходимо скопировать и сохранить, чтобы проверить и использовать библиотеку в стратегии.
Адрес копии библиотеки чертежей версии 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)
}
}
В рамках
Это очень легко понять и тип строки и тип числа. которые являются очень часто используемыми типами. Комбайн покажет опции в поле на интерфейсе параметров. Например, вы можете установить параметр SYMBOL какBTC|USDT|ETH
в комбинационном поле; если вы выберете USDT в поле на странице, значение SYMBOL в стратегии является индексом USDT 1. Проверка опций относится к опциональному отметке; проверка означает true, а отсутствие проверки означает false.
Есть больше параметров для настроек; ссылка:https://www.fmz.com/api.
Когда квантование стратегии завершено, вы можете протестировать ее по данным истории, чтобы проверить ситуацию прибыли стратегии в историческую дату. Конечно, результат бэкстеста является только справочным. Платформа FMZ Quant поддерживает бэкстесты криптовалют спота и фьючерсов, вечного контракта BitMEX, товарных фьючерсов, в которых поддерживаются только основные криптовалюты. Javascript backtest выполняется в браузере; Python backtest выполняется на докере, а наша платформа предоставляет публичные докеры для пользователей.
Механизм 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(10)
, чтобы не застрять.
Инженер обратного тестирования сопоставит цену ордера, размещенного пользователем, и рыночную цену в момент обратного тестирования. Если цена покупки выше, чем цена продажи, то цена продажи будет выполнена. Если торговля не может быть выполнена, будет сгенерирован ожидаемый ордер. Для обеспечения торговли необходимо добавить скольжение. Если позиция не может быть открыта или закрыта во время обратного тестирования, проверьте, не заморожена ли позиция из-за незавершенных заказов.
GetRecords()
функция; вы также можете указать параметр периода в коде;Как мы упоминали ранее, Использование интерфейса 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")