[TOC]

Основные инструкции

Начало

Что может сделать FMZ Quant Trading Platform?

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

Полная серия учебников

Графические учебники:

Если возникает какая-либо проблема, вы можете в любое время размещать вопросы и обсуждать на форуме, или отправлять билет, или обращаться к администратору в группе Telegram (Телеграмма), в общем, на этот вопрос можно будет быстро ответить.

Поддержка ChatGPT для помощи в целях развития

FMZ Quantitative Trading Platform приняла ChatGPT в качестве инструмента помощи в развитии, к которому можно получить доступ, нажав ChatGPT в панели ярлыков в Dashboard, чтобы перейти кСтраница вспомогательного инструмента ChatGPT.

Какие языки программирования доступны для реализации моих стратегий?

FMZ Quant Trading платформа поддерживает использованиеJavaScript, TypeScript, Python, C++, Pine MylanguageиBlockly Visualizationнаписать и разработать стратегии.

Он поддерживаетTypeScriptязык, все еще установить его наJavaScriptстратегия когда мы создаем стратегии, то мы пишем// @ts-checkв начале кода стратегии или нажмите кнопкуTypeScriptв правом верхнем углу области редактирования стратегии перейти наTypeScriptПлатформа распознает код какTypeScriptавтоматически и предоставить вам соответствующую поддержку сборки и проверки типа для:

  • Безопасность типа:TypeScriptФункция статической проверки типа может помочь вам найти потенциальные ошибки при написании кода и улучшить качество кода.
  • Автоматическое заполнение кода:TypeScriptСистема типов позволяет быстрее найти атрибуты и методы, необходимые при написании кода, повышая эффективность разработки.
  • Более четкая структура кода:TypeScript, вы можете лучше организовать и поддерживать свой код, делая его легким для чтения и понимания.
  • Мощные функции объектно-ориентированного программирования:TypeScriptпредоставляет мощные объектно-ориентированные функции программирования, такие как интерфейсы, классы, генерики и так далее, помогая вам писать более надежный и многоразовый код стратегии.

Вам нужно только овладеть одним из этих языков. В дополнение к поддержке способа разработки стратегий путем написания кода, вы также можете создавать стратегии с использованием визуальных модулей (Blockly). Визуализация модуля сплайсинг и строительство стратегии, без кодирования, принимает более интуитивно понятный способ разработки стратегий, что очень подходит для развития интереса к разработке стратегии, чтобы быстро начать программирование и количественную торговлю.

BlocklyУрок визуализации:

УстановитеPythonпереводчик, используемыйPythonСтратегическая программа

Стратегии, написанные вPython, при обратном тестировании или живой торговле, если окружающая среда системы докера имеетPython2иPython3установлены, вы можете установитьPythonверсии, которая должна быть запущена во время выполнения на первой строке стратегии, например:#!python3и#!python2Вы также можете указать абсолютный путь, например:#!/usr/bin/python3.

Что такое Docker?

Docker может быть понят как исполнитель вашей торговой стратегии, ответственный за сложные запросы данных, прием данных, сетевые ссылки, регистрационный постбэк и так далее. Docker работает на вашем сервере, даже если у веб-сайта платформы FMZ Quant Trading есть сбой сети, это не повлияет на работу вашего докера. Docker может работать наЛинукс, Окна, Mac OS, Android, Raspberry Pi ARM Linuxи другие системы.Страница Docker, Инсталляция и обновление Linux Docker. Боты и журналы, управляемые докером, хранятся в каталоге/logs/storageФайл - этоSqliteфайл базы данных сdb3, который может быть отредактирован непосредственноSqliteДля файла с расширениемdb3В реальной базе данных ботов, имя файла - это ID бота.

Поддерживаемые протоколы

  • Блокчейн-активы: более 50 основных блокчейн-активов (криптовалют) теперь поддерживаются на нашей платформе.
  • Общий протокол доступа:Общий протокол

Стратегия безопасности

Когда торговые стратегии разрабатываются на платформе FMZ Quant Trading, содержимое стратегии видно только владельцам счетов FMZ. А на платформе FMZ Quantitive Trading вы можете достичь полной локализации кода стратегии.PythonПакет, который загружается в код стратегии, так что локализация контента стратегии может быть реализована.

БезопасностьPythonкод: Потому что...Pythonявляется языком с открытым исходным кодом, который чрезвычайно легко декомпилировать, если стратегия не для личного использования, а для аренды, вы можете запустить стратегию на собственном развернутом докере и арендовать его в виде подсчета или полного управления докером, если вы беспокоитесь о утечке стратегии.

ШифрованиеPythonкод стратегии: По умолчанию,Pythonкод стратегии не шифруется при использовании автором и шифруется при аренде другим. Изменив следующий код в началеPythonВы можете указать, хотите ли вы шифровать код стратегии для личного использования или аренды.Pythonверсии, поддерживающие шифрование кодов стратегии, следующие:Python 2.7, Python 3.5иPython 3.6.

  • Авторы стратегии запускают его сами и шифруют код стратегии для использования другими через регистрационный код: Уточнить#!pythonкак версия интерпретатора Python, а затем использовать,чтобы держать в стороне; введите команду шифрованияencryptЕсли вы не указали версиюPython, добавить#!,encrypt directly.
 #!python,encrypt

Или...

  #!encrypt
  • Он не будет шифровать коды стратегии, когда авторы стратегии работают для собственного использования и делиться с другими через регистрационный код:
  #!python, not encrypted

Или...

  #!not encrypted

Использовать кодos.getenv('__FMZ_ENV__')чтобы определить, является ли код шифрования действительным; возвращение строки"encrypt"Он действителен только в реальном боте, и обратный тест не будет шифроватьPythonстратегические коды.

#!encrypt
def main():
    ret = os.getenv('__FMZ_ENV__')
    # If the print variable ret is the string "encrypt" or ret == "encrypt" is true, that means the encryption is valid. 
    Log(ret, ret == "encrypt")

Ключевая безопасность

Все конфиденциальные данные, такие как информация о счете и зашифрованные строки в параметрах стратегии, настроенных на платформе FMZ Quant Trading, зашифровываются в веб-браузере. Вся информация, хранящаяся на платформе FMZ Quant Trading, зашифрована (не данные простого текста), и только пользователи частные устройства могут расшифровать и использовать информацию, что значительно повышает безопасность конфиденциальных данных. Пожалуйста, не раскрывайте или не продавайте стратегии, если другая конфиденциальная информация включена в код стратегии, настройки параметров и описания стратегии и т. Д.

  • Наша платформа поддерживает локализованную конфигурацию конфиденциальной информации, такой как информация обмена счетов и секретный ключ На странице, где платформа настраивает информацию обмена, все зашифрованные текстовые полевые элементы управления с масками поддерживают способ настройки пути файла для загрузки локального файла dockers.RSA KEYметод аутентификации обмена в качестве примера, чтобы подробно объяснить, как настроить конфиденциальную информацию локально на устройстве, где расположена программа докера.
  1. Например, создать публичные и частные ключи в форматеPKCS#8, существует множество инструментов для создания, таких какopenssl.
  2. СоздатьRSA KEYна обмен, и загрузить публичный ключ, созданный вШаг 1во время сотворения.
  3. Сохранить закрытый ключ, созданный вШаг 1в том же каталоге докера в форматеtxtфайл, или в других путях в каталоге программы Docker.
  4. При настройке обмена на платформе FMZ заполнитеRSA KEYсозданный обменником в окне редактирования конфигурацииAccess Key.
  5. При настройке обмена на платформе FMZ, заполните путьtxtфайл размещен в одном и том же уровне каталога докера вШаг 3в окне редактирования конфигурацииSecret Key. Например, если имя файла помещено:rsaKey.txt, и файл и докер заполнены в одном каталоге уровня:file:///rsaKey.txt. Если файл находится в каталоге рядом с каталогом программы докераrsa_key, заполнить:file:///rsa_key//rsaKey.txtЕсли вы поместитеrsaKey. txtгде-либо еще на вашем компьютере или сервере следуйте этим инструкциям соответственно, следует отметить, что этот файл может быть размещен только в каталогах того же уровня или подкаталогах в отношении Docker.

Это делает его более безопасным для локализации и сохранения частного ключа, вы можете обратиться квидео объяснениедля подробного процесса.

Система обратных испытаний

Что такое система обратного теста и для чего она используется?

После того, как вы закончили разработку количественной торговой стратегии, как вы можете знать основную ситуацию вашей стратегии, такую как логика стратегии и направление прибыли стратегии? Конечно, мы не можем использовать реальные деньги непосредственно для запуска стратегии на реальном торговом рынке, но мы можем использовать исторические данные для проверки вашей стратегии и знать прибыль вашей стратегии в исторических данных.

Точны ли данные системы обратного теста и как насчет точности результатов обратного теста?

Платформа FMZ Quant Trading делит систему бэкстеста науровень реального рынкаиуровень моделированияРеальный рыночный уровень должен быть полностью проверен в соответствии с полными историческими данными; в то время как на уровне симуляцииtickОни оба основаны на реальных исторических данных, но реальные данные на уровне рынка более точны и результаты более достоверны.Описание механизма обратной проверки FMZ. Однако, бэкстестинг - это просто выполнение стратегии в соответствии с историческими данными. Исторические данные не могут полностью представлять будущий рынок. Исторический рынок может повториться, или он также может привести к Черному лебедя. Поэтому результаты бэкстеста должны рассматриваться рационально и объективно.

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

Обратный тестJavaScriptиC++торговые стратегии проводится в браузере, и реальный рынок бота илиWexAppЭмулируемый обменный реальный рынок (т.е.WexAppemulated exchange of FMZ Quant Trading platform) работает без установки любого другого программного обеспечения, библиотек или модулей. Обратный тестПитонЭто может быть выполнено на публичном сервере, добавленном платформой FMZ Quant Trading, а также может быть выполнено на собственном докере пользователя.ПитонЕсли некоторые библиотеки необходимы, они должны быть установлены вручную (только общие библиотеки поддерживаются на общедоступных серверах).

Данные обратного тестирования в системе

Существует два типа фмз квантовая торговая платформа backtest: симуляция уровень backtest и реальный рынок уровень backtest.tickКаждый период K-линии будет генерировать 12 временных точек обратного тестирования; однако реальный уровень рынка собираетticksФМЗ позволяет торговой стратегии торговать несколько раз на одной K-линии, избегая ситуации, когда торговля может быть выполнена только по цене закрытия. Это более точно, учитывая скорость бэкстеста. Для более подробных объяснений, пожалуйста, обратитесь кСсылка.

Метод DEBUG стратегии в системе обратного тестирования

Отлаживание JavaScript-стратегии для обратного тестирования в Chrome DevTools

Обмены, поддерживаемые в системе обратного тестирования

  • Зашифрованная валюта (криптовалюта)

    Имя Тип Инструкция
    Bitfinex объект спотового обмена поддержка ограниченных торговых пар, таких как:BTC_USD, ETH_USDиLTC_USD, и т. д. (примечание: валюта котировки торговых парUSDв долларах США)
    Binance объект спотового обмена поддержка ограниченных торговых пар, таких как:BTC_USDT, ETH_USDT, ETH_BTCиLTC_BTC, и т.д.
    ОКX объект спотового обмена поддержка ограниченных торговых пар, таких как:BTC_USDT, ETH_USDT, ETH_BTCиLTC_BTC, и т.д.
    Хьюби объект спотового обмена поддержка ограниченных торговых пар, таких как:BTC_USDT, ETH_USDT, ETH_BTCиLTC_BTC, и т.д.
    Фьючерсы OKX Объект биржи фьючерсов поддержка ограниченных торговых пар, таких как:BTC_USDиETH_USD, и т. д. валютой котировки торговых пар являетсяUSD; после установки конкретного кода контракта (см. функциюexchange.SetContractType), контракт является контрактом с криптомаржировкой; поддержаны коды контрактов:this_week, next_week, quarterиswap
    HuobiDM Объект биржи фьючерсов HuobiDM - Huobi Futures (Huobi Contract), поддерживающий ограниченные торговые пары, такие как:BTC_USDиETH_USD, и т.д.; валюта котировки торговых пар:USD; после установки конкретного кода контракта (см. функциюexchange.SetContractType), контракт является контрактом с криптомаржировкой; поддержаны коды контрактов:this_week, next_week, quarterиswap.
    BitMEX Объект биржи фьючерсов торговая пара:XBT_USD; после установки конкретного кода контракта (см. функциюexchange.SetContractType), контракт является контрактом с криптомаржировкой; код поддерживаемого контракта:XBTUSD
    Фьючерсы Binance Объект биржи фьючерсов поддержка ограниченных торговых пар, таких как:BTC_USDTиETH_USDT, и т. д. валютой котировки торговых пар являетсяUSD; после установки конкретного кода контракта (см. функциюexchange.SetContractType), договор являетсяUSDT- контракт с маржой; код поддерживаемого контрактаswap
    Дерибитные опционы Объект биржи фьючерсов торговые пары:BTC_USDиETH_USD; после установки конкретного кода контракта (см. функциюexchange.SetContractType), контракт является контрактом с криптомаржировкой; необходимо установить конкретные коды контрактов опционов

    Для фьючерсных обменных объектов в системе backtest изменение торговых пар временно не поддерживается в кодах стратегии.

Уровень моделирования

Бактэст на уровне симуляции основан на базовых данных K-линии системы бактестов, имитируя данные тика в рамках цены на самую высокую, самую низкую цену, цену открытия и цену закрытия заданной базовой K-линии в соответствии с определенным алгоритмом.tickданные при запросе интерфейса.Описание механизма обратных испытаний на уровне квантовой моделирования FMZ.

Уровень реального рынка

Реальный рыночный уровеньtickДля стратегий, основанных наtickВ реальной рыночной системе обратного теста,tickданные - это реальные записанные данные, а не имитируемые. Он поддерживает глубинные данные, воспроизведение данных записи рыночных сделок, пользовательскую глубину и каждые отдельные торговые данные. Максимальный размер реального рыночного уровня данных backtest составляет до максимум 50MB, без ограничения на временной диапазон backtest в пределах верхнего предела набора данных. Если вам нужно максимально увеличить временной диапазон backtest, вы можете уменьшить значение настройки глубины и не использовать каждый отдельный торговый данный для увеличения временного диапазона backtest.GetDepth,GetTradesВ момент, когда данные рынка на временной шкале, звонокGetTicker,GetTrades, GetDepthиGetRecordsне будет несколько раз продвигать время, когда время перемещается по временной шкале обратного теста (что не вызовет прыжок к следующему моменту данных рынка). Повторяющиеся вызовы к одной из вышеперечисленных функций продвинут время обратного теста, чтобы переместиться по временной шкале обратного теста (прыгнуть к следующему моменту данных рынка). Когда для обратного теста используется реальный уровень рынка, не рекомендуется выбирать более раннее время. В раннем временном периоде могут отсутствовать данные на уровне реального рынка.

В настоящее время реальный рыночный уровень:

  • Binance
  • ОКX (ОКX Spot)
  • HuobiDM (Huobi Futures)

Оптимизация параметров системы обратного тестирования

Функция оптимизации параметров системы бэкстеста платформы FMZ Quant Trading заключается в установке оптимизации в соответствии с каждым параметром оптимального опциона во время бэкстеста, и варианты показаны следующим образом:

  • Минимальное значение: ограничить исходное значение параметров.
  • Максимальное значение: ограничить максимальное значение параметров после постепенных изменений.
  • Размер шага: размер дополнительной переменной параметров.

Сгенерировать комбинации параметров, и пройти все эти комбинации для обратного тестирования (то есть обратного тестирования каждой комбинации параметров один раз).НомерТип может быть оптимизирован в системе обратного тестирования.

Например, настроить параметры опции оптимизации на странице backtest:

img

Обратная проверка режима оптимизации параметров:

img

Сохранить настройки обратного тестирования

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

img

ВозьмитеJavaScriptстратегию в качестве примера, и нажмите Сохранить настройки обратного теста в исходном файле:

img

Есть небольшие различия в Сохранить настройки обратного теста в исходном файле междуJavaScript, Python, cppиMylanguage:

/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
'''backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

Мой язык:

(*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*)

Источник данных по назначению

Система используетGETметод запроса пользовательского URL (публично доступный URL) для получения внешнего источника данных для бэкстеста. Дополнительные параметры запроса следующие:

Параметр Значение Объяснение
Символ Имя символа как BTC_USD_OKCoin_EN
Ид Обмены например, OKCoin_EN
Круглый Точность цены например 3, цена в возвращенных данных должна быть умножена на 1000 и округлена
Вокруг Точность количества Например, 2, сумма в возвращенных данных должна быть умножена на 100 и округлена
Период Период штриха (миллисекунды) Например, 60 000 указывает на бар, требующий одну минуту.
Глубина Уровни глубины 1-20
Торговля Необходимо ли разделять данные истинно/ложно
От Время начала Unix временная метка
- Да. Время конца Unix временная метка

Примечание:

Round and V-Round are two parameters designed to avoid losing the precision of floating-point numbers during network transmission. The price data, trading volume and order amount, are all transmitted using integers.

Пример сшитых данных:

http://customserver:80/data?symbol=BTC_USD_OKCoin_EN&eid=OKCoin_EN&round=3&vround=3&period=900000&from=1564315200&to=1567267200

Формат возвращения должен быть одним из следующих двух формат (который будет автоматически распознаваться системой):

Обычный обратный тест на уровне баров

{
    "schema":["time","open","high","low","close","vol"],
    "data":[[1564315200000,9531300,9531300,9497060,9497060,787],[1564316100000,9495160,9495160,9474260,9489460,338]]
}

Данные обратного теста уровня Tick (включая информацию о глубине рынка, массив с форматом глубины [цена, объем]; может быть несколько уровней глубины; asks относится к восходящему порядку цены, а bids относится к обратному порядку цены.)

{
    "schema":["time","asks", "bids","trades","close","vol"],
    "data":[[1564315200000,[[9531300,10]], [[9531300,10]],[[1564315200000,0,9531300,10]],9497060,787]]
}

Описание

Поле Описание
Схема Он определяет атрибуты столбцов в массиве данных, который чувствителен к буквам и ограничен только time, open, high, low, close, vol, asks и bids
Данные Массив, хранящий данные по схеме

Формат данных

Поле Описание
просьбы/предложения [цена, объем...]
торговля [время, направление, цена, объем...]

Предоставление данных о ставках финансирования:

Например, при обратном тестировании Binance Futures необходимо иметь дополнительные данные о ставке финансирования, которые должны быть предоставлены пользовательским источником данных.

{
  "detail": {},
  "symbol": "futures_binance.eth_usdt.funding",
  "schema": ["time", "open", "high", "low", "close", "vol"],
  "data": [
    [1582876800000, 25289, 25289, 25289, 25289, 0],
    [1582905600000, 30522, 30522, 30522, 30522, 0],
    [1582934400000, 40998, 40998, 40998, 40998, 0],
        ...
    [1626652800000, 198, 198, 198, 198, 0],
    [1626681600000, 691, 691, 691, 691, 0],                  // The adjacent periodic interval is 8 hours
    [1626710400000, 310, 310, 310, 310, 0],                  // The funding rate of Binance updates every 8 hours, and why the data of the funding rate turns out to be 310?
    [1626739200000, 310, 310, 310, 310, 0],                  // Like the bars data, to avoid losing the precision of floating-point numbers during network transmission, the data uses integer, so the data needs to be processed according to round parameter; the data, returned to the backtest system after processing, is 310 
    [1626768000000, -41610, -41610, -41610, -41610, 0],      // The funding rate might be a negative value
    [1626796800000, -5125, -5125, -5125, -5125, 0],
        ...   
    [1627977600000, 10000, 10000, 10000, 10000, 0]
  ]
}

Пример запроса данных от системы обратного тестирования:

http://customserver:80/data?symbol=futures_binance.eth_usdt.funding&eid=Futures_Binance&round=8&vround=5&depth=20&trades=1&custom=0&period=3600000&from=1360771200&to=1628006400

Пример источника данных:

Укажите источник данных, URL:http://xxx.xx.x.xx:9090/dataНастроить сервер данных, написанный на голанге:

package main 
import (
    "fmt"
    "net/http"
    "encoding/json"
)

func Handle (w http.ResponseWriter, r *http.Request) {
    // e.g. set on backtest DataSourse: http://xxx.xx.x.xx:9090/data
    // r.URL: /data?depth=20&detail=true&eid=Binance&from=1566820800&period=900000&round=3&symbol=BTC_USDT_Binance&to=1569686400&trades=1&vround=5
    // response
    defer func() {
        // response data
        /* e.g. data
        {
            "schema":["time","open","high","low","close","vol"],
            "data":[
                [1564315200000,9531300,9531300,9497060,9497060,787],
                [1564316100000,9495160,9495160,9474260,9489460,338]
            ]
        }
        */
        ret := map[string]interface{}{
            "schema" : []string{"time","open","high","low","close","vol"},
            "data" : []interface{}{
                []int64{1564315200000,9531300,9531300,9497060,9497060,787},
                []int64{1564316100000,9495160,9495160,9474260,9489460,338},
            },
        }
        b, _ := json.Marshal(ret)
        w.Write(b)
    }()
}

func main () {
    fmt.Println("listen http://localhost:9090")
    http.HandleFunc("/data", Handle)
    http.ListenAndServe(":9090", nil)
}

Стратегия испытаний,JavaScriptПример:

/*backtest
start: 2019-07-28 00:00:00
end: 2019-07-29 00:00:00
period: 1m
platforms: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
*/

function main() {
    var ticker = exchange.GetTicker()
    var records = exchange.GetRecords()
    Log(ticker)
    Log(records)
}

Графики, составленные на основе пользовательских данных системы обратного тестирования:

Информация о стратегии:

Местный двигатель обратного теста

Платформа FMZ Quant Trading является открытым источникомJavaScriptВерсия иPythonверсия локального двигателя обратного тестирования, поддерживающая настройкуПериод базовой линии Kво время обратного тестирования.

Ключи со сжатыми клавишами

  • Ключ к сокращению для переключения между страницей стратегии Редактирование и страницей Назадпроверка

    Используй ключ.Ctrl +,чтобы вернуться на страницу Backtest и страницу Edit Strategy.CtrlНажмите клавишу.,.

  • Ключ к сокращению для стратегии экономии

    Используй ключ.Ctrl + sчтобы сохранить стратегии.

  • Краткий путь для начала обратного теста стратегии

    Используй ключ.Ctrl + bчтобы включить Start Backtest.

Описание кода

Функции входа

Имя функции Описание
main() Это функция входа.
onexit() это функция очистки при нормальном выходе, ее максимальное время выполнения составляет 5 минут, которое может быть оставлено незаявленным; если наступает тайм-аут,прерыватьошибка будет сообщена.
onerror() Это ненормальная функция выхода, ее максимальное время выполнения составляет 5 минут, которое может быть оставлено незаявленным.Pythonиcppне поддерживают эту функцию.
init() это функция инициализации, его стратегия программа будет вызвана автоматически, когда он начинает работать, который может быть оставлен незаявленным.
  • Описание:
    1. Система обратного тестирования не поддерживает функциюonerror().
    1. Если функцияonerror()запускается в боте, функцияonexit()не будет задействована.

Однократный отзыв (((

onexit(), обработка очистных работ, с максимальным временем выполнения 5 минут, которое реализуется пользователем.

function main(){
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)
}

// onexit function implementation
function onexit(){
    var beginTime = new Date().getTime()
    while(true){
        var nowTime = new Date().getTime()
        Log("The program stops counting down..The cleaning starts and has passed:", (nowTime - beginTime) / 1000, "Seconds!")
        Sleep(1000)
    }
}
import time 
def main():
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)

def onexit():
    beginTime = time.time() * 1000
    while True:
        ts = time.time() * 1000
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!")
        Sleep(1000)
void main() {
    Log("Start running, stop after 5 seconds, and execute onexit function!");
    Sleep(1000 * 5);
}

void onexit() {
    auto beginTime = Unix() * 1000;
    while(true) {
        auto ts = Unix() * 1000;
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!");
        Sleep(1000);
    }
}

init()

Пользователь реализует функцию инициализацииinit(), который автоматически выполняет функциюinit()в начале стратегии для завершения задачи инициализации.

function main(){
    Log("The first line of the code executed in the program!", "#FF0000")
    Log("Exit!")
}

// Initialization Function
function init(){     
    Log("Initialization!")
}
def main():
    Log("The first line of the code is executed!", "#FF0000")
    Log("Exit!")

def init():
    Log("Initialization!")
void main() {
    Log("The first line of the code is executed!", "#FF0000");
    Log("Exit!");
}

void init() {
    Log("Initialization!");
}

Ошибка.

Исполнение функцииonerror()Эта функция не поддерживает стратегии, написанные вPythonиcpp.

function main() {
    var arr = []
    Log(arr[6].Close)
}

function onerror() {
    Log("error")
}
# not supported by python 
// not supported by C++ 

Классическая стратегия

В стратегиях, написанных вJavaScript, Pythonиcpp,Sleep()Функция должна быть вызвана в основной петле этих стратегий. Она будет использоваться для управления скоростью обратного отслеживания. В боте она используется для управления интервалами опроса стратегии, а также для управления частотой запроса доступа к интерфейсу API биржи.

  • Основные примеры стратегий криптовалюты:

    function onTick(){
        //Write strategy logic here, and it will be called constantly, such as printing market information
        Log(exchange.GetTicker())
    }
    
    function main(){
        while(true){
            onTick()
            //The function "Sleep" is mainly used to control the polling frequency of cryptocurrency strategies to prevent accessing the exchange API interafce too frequently 
            Sleep(60000)
        }
    }
    
    def onTick():
        Log(exchange.GetTicker())
    
    def main():
        while True:
            onTick()
            Sleep(60000)
    
    void onTick() {
        Log(exchange.GetTicker());
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(60000);
        }
    }
    

    Возьмем самый простой пример, если я хочу размещать ордер на покупку с ценой 100 и количеством 1 на бирже каждую секунду, я могу написать это так:

    function onTick(){
        // It is just an example; for all the assets will be used to place orders fast during backtest or in the bot, do not implement the example in the bot
        exchange. Buy(100, 1)
    }
    
    function main(){
        while(true){
            onTick()
            // The pause period can be customized in millisecond (1 second = 1000 milliseconds)
            Sleep(1000)
        }
    }
    
    def onTick():
        exchange.Buy(100, 1)
    
    def main():
        while True:
            onTick()
            Sleep(1000)
    
    void onTick() {
        exchange.Buy(100, 1);
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(1000);
        }
    }
    

Библиотека шаблонов

Вбиблиотека шаблоновявляется многоразовым модулем кода в платформе FMZ Quant Trading, работающий как категория кодов торговой стратегии.Библиотека шаблонов, шаблон добавляется на странице Стратегия аккаунта, который в настоящее время зарегистрирован на платформе FMZ Quant Trading. После создания больше невозможно изменить категорию на обычную стратегию.

Библиотека шаблонов вJavaScript:

img

Библиотека шаблонов вPython:

img

Библиотека шаблонов вcpp:

img

  • Функция экспорта Библиотеки шаблонов Функция экспорта является интерфейсной функцией Template library, и она может быть вызвана с помощью стратегии, которая относится к Template library.

    /*
    -- This method is called directly with $.Test() after the strategy refers to the template
    -- The "main" function will not be triggered in the strategy, and it is only used as the entry point for template debugging
    */
    $.Test = function() {
        Log('Test')
    }
    
    function main() {
        $.Test()
    }
    
    def Test():
        Log("template call")
    
    # Export "Test" function; the main strategy can be called by ext.Test()
    ext.Test = Test 
    
    // The strategy refers to the template and calls this method directly with ext::Test()
    void Test() {
        Log("template call");
    }
    
  • Параметры библиотеки шаблонов Template library также может устанавливать свои собственные параметры интерфейса, которые используются в виде глобальных переменных в коде Template library.

    Настройки параметров библиотеки шаблонов:

    img

    Коды библиотеки шаблонов:

    $.SetParam1 = function(p1) {
        param1 = p1
    }
    
    $.GetParam1 = function() {
        Log("param1:", param1)
        return param1
    }
    
    def SetParam1(p1):
        global param1
        param1 = p1
    
    def GetParam1():
        Log("param1:", param1)
        return param1
    
    ext.SetParam1 = SetParam1
    ext.GetParam1 = GetParam1
    
    void SetParam1(float p1) {
        param1 = p1;
    }
    
    float GetParam1() {
        Log("param1:", param1);
        return param1;
    }
    

    Ссылка на код стратегии вБиблиотека шаблоновПример, упомянутый выше:

    function main () {
        Log("call $.GetParam1:", $.GetParam1())
        Log("call $.SetParam1:", "#FF0000")
        $.SetParam1(20)
        Log("call $.GetParam1:", $.GetParam1())
    }
    
    def main():
        Log("call ext.GetParam1:", ext.GetParam1())
        Log("call ext.SetParam1:", "#FF0000")
        ext.SetParam1(20)
        Log("call ext.GetParam1:", ext.GetParam1())
    
    void main() {
        Log("call ext::GetParam1:", ext::GetParam1());
        Log("call ext::SetParam1:", "#FF0000");
        ext::SetParam1(20);
        Log("call ext::GetParam1:", ext::GetParam1());
    }
    

    img

  • Цитата Библиотека шаблонов

    После проверки ссылки в столбце шаблона на странице редактирования стратегии сохраните стратегию.

    img

Встроенная структура

Глобальные переменные

Обмен

ExchangeВсе взаимодействие данных с обменом реализуется через функции в этом объекте.

  • Добавление объектов обмена в Backtest

  • Добавление обменных объектов на странице Bot

Добавленные обменные объекты соответствуютexchangeобъекты в коде:

function main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
}
def main():
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
void main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel());
}
Обмены

Это может быть понято как массив, который хранит все обменные объекты, какexchangeобменные объекты, которые могут содержать несколько обменных объектов;exchanges[0]этоexchange.

Добавленные объекты обмена соответствуютexchanges[0], exchanges[1], exchanges[2]...и так далее в коде стратегии.

function main() {
    for(var i = 0; i < exchanges.length; i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
    }
}
def main():
    for i in range(len(exchanges)):
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
void main() {
    for(int i = 0; i < exchanges.size(); i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel());
    }
}
Статус заказа

АтрибутStatusвOrder structure.

Постоянное имя Определение Стоимость
ORDER_STATE_PENDING (Поддерживается) Неоконченный 0
ORDER_STATE_CLOSED (Объединенное управление) закончено 1
ORDER_STATE_CANCELED (Отмененный заказ) отменено 2
ORDER_STATE_UNKNOWN Неизвестно неизвестное состояние (другие состояния) 3

ORDER_STATE_UNKNOWN НеизвестноСтатус может вызватьexchange.GetRawJSON()чтобы получить исходную информацию о состоянии заказа, запросить файл обмена и просмотреть конкретное описание. Константы в форме могут использоваться непосредственно в коде стратегии для сравнения с атрибутомStatusвOrderНапечатать эти постоянные названия покажет, чтопостоянные именаи их соответствующиеценности, и другие постоянные имена ниже работают таким же образом, поэтому не будет более подробных описаний о них.

Тип сделки заказа

АтрибутTypeвOrder structure.

Постоянное имя Определение Стоимость
ORDER_TYPE_BUY Заказ на покупку 0
ORDER_TYPE_SELL Заказ на продажу 1
Тип позиции

АтрибутTypeвPosition structure.

Постоянное имя Определение Описание Применимо Стоимость
PD_LONG Долгая позиция Фьючерсы на криптовалютыexchange.SetDirection("closebuy")чтобы установить направление закрытия позиции, и закрыть этот тип позиций Фьючерсы на криптовалюты 0
PD_SHORT Краткая позиция Фьючерсы на криптовалютыexchange.SetDirection("closesell")чтобы установить направление закрытия позиции, и закрыть этот тип позиций Фьючерсы на криптовалюты 1
Направления открытия и закрытия позиций фьючерсов

АтрибутOffsetвOrder structure.

Постоянное имя Определение Стоимость
ORDER_OFFSET_OPEN Заказы на открытые позиции 0
ORDER_OFFSET_CLOSE Ордеры на закрытие позиций 1
Параметры стратегии

В кодах стратегии торговли параметры стратегии, установленные на интерфейсе стратегии, отражаются в виде глобальных переменных.JavaScriptязык может напрямую получить доступ к значениям параметров, установленным или измененным на интерфейсе стратегии; в то время как в функцияхPythonСтратегии, ключевое словоglobalЭто необходимо для изменения глобальных переменных в стратегии.

Типы параметров:

img

Переменная Описание Примечания Тип Значение по умолчанию Описание
Число Цифровой тип Примечания Номер (номер) 1 Стратегия C++ - это тип плавающей запятой
Строка строка Примечания Строка (строка) Здравствуйте FMZ Значение по умолчанию не нужно цитировать. Ввод рассматривается как строка
Коробка Комбобокс Примечания ComboBox (выбран) 1|2|3 Сама переменная combox представляет собой числовое значение, которое представляет индекс колонки, выбранной элементом управления Combobox.
Буль Проверка вариантов Примечания Булево (правда/ложно) Истинно Если проверено, переменная bool является истинной; если не проверено, переменная bool является ложной
SecretString (Секретная строка) Зашифрованная строка Примечания Зашифрованная строка (строка) Пароль При том же использовании, что и строка, зашифрованная строка будет отправлена с помощью шифрования и не будет передаваться в виде простого текста
  • Параметры интерфейса установлены в разделе параметров стратегии ниже раздела редактирования кода на странице редактирования стратегии.
  • Параметры интерфейса существуют как глобальные переменные в коде стратегии, то есть параметры интерфейса могут быть изменены в коде.
  • Наименования переменных параметров интерфейса в коде стратегии (показаны в вышеуказанной форме):number, string, combox, bool, secretString.
  • Опция описания: названия параметров интерфейса на интерфейсе стратегии.
  • Опция замечания: подробное описание параметров интерфейса; описание будет отображаться, когда мышь будет зависать над параметрами интерфейса.
  • Опция типа: тип параметров интерфейса.
  • Вариант значения по умолчанию: значения параметров интерфейса по умолчанию.

Настройки зависимости параметров: Один параметр может быть установлен, чтобы позволить другой параметр, чтобы быть отображен и скрыт на основе выбора параметра.numberA, который является числовым типом.numberAбыть отображены или скрыты на основе того, параметрisShowA(булевой тип) является истинным или ложным.numberAна параметрах интерфейса:numberA@isShowA.

img

Таким образом, если параметрisShowAне проверяется, параметрnumberAЧто касается параметров типа управления ComboBox, зависимая часть параметров заключается в том, чтобы судить о том, равняется ли значение параметразначение индексаВ том же порядке, возьмите параметрisShowAПри установке переменных в параметрах запишите:numberA@combox==2. ПараметрnumberAбудет отображать или скрывать, в зависимости от того, параметрcomboxбудет проверена как третий вариант (где индекс 0 соответствует первому варианту, индекс 1 - второму, а индекс 2 - третьему).

Параметры интерфейса стратегии, интерактивные элементы управления и функция группировки параметров на Стандарт: Просто добавь.(?First group)в начале описания параметра, который начинает группировку, как показано на следующей рисунке:

img

При использовании стратегии параметры отображаются в группах:

img

Сохранить параметр по умолчанию: Параметры стратегии показаны на рисунке. Во время обратного теста, если вы хотите сохранить значения по умолчанию параметров стратегии, вы можете нажатьSave settingsкнопку после изменения параметров стратегии.

img

img

Вы можете сохранить настройки параметров стратегии в виде кода:

/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/
'''backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
'''
/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/

Структура данных

Некоторые функции будут сопровождаться оригиналомJSONВ данном случае, данные, запрошенные во время звонка.JSONданные хранятся в атрибутеInfoПоскольку backtest не имеет доступа к интерфейсу платформы, возвращенные данные во время backtest не имеют атрибутаInfoНиже приведено описание основных атрибутов каждой структуры данных.

Торговля

Получить всю историю торговли (не саму), возвращенную функциейexchange.GetTrades().

{
    Id      : 9585306,          // Trading record ID; if the exchange interface does not provide order ID, use the timestamp to fill in 
    Time    : 1567736576000,    // Time (Unix timestamp milliseconds)
    Price   : 1000,             // Price
    Amount  : 1,                // Volume
    Type    : 0                 // Order Type; refer to the order type in the constants; 0 is ORDER_TYPE_BUY, meaning the value of ORDER_TYPE_BUY is 0
}
Тикер

Рыночные котировки возвращаются функциейexchange.GetTicker().

{
    Info    : {...},             // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    High    : 1000,              // Highest price; if the platform interface does not provide the 24-hour highest price, use sell price 1 to fill in 
    Low     : 500,               // Lowest price; if the platform interface does not provide the 24-hour lowest price, use buy price 1 to fill in 
    Sell    : 900,               // Sell price 1
    Buy     : 899,               // Buy price 1 
    Last    : 900,               // Last executed price
    Volume  : 10000000,          // Recent trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency  
    Time    : 1567736576000      // Millisecond-level timestamp
}
Запись

СтандартыOHLCФункция K-линий используется для вычисления и анализа показателей процесса.exchange.GetRecords()возвращает массив структуры.Recordструктура представляет собой к-линейную строку, а именно одну к-линиюBAR.TimeвRecordвремя начала периода K-линии.

{
    Time    : 1567736576000,     // A timestamp, accurate to millisecond, in the same format as the result obtained by Javascript's newDate().GetTime()
    Open    : 1000,              // Open price
    High    : 1500,              // Highest price
    Low     : 900,               // Lowest price
    Close   : 1200,              // Close price 
    Volume  : 1000000            // Trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency
}
Порядок

Структура порядка может быть возвращена функциями, включаяexchange.GetOrder()иexchange.GetOrders(). Функцияexchange.GetOrders()возвращает массив или пустой массив структуры (если неттекущий незавершенный заказ, возвращение[], то есть пустой массив).

{
    Info        : {...},         // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    Id          : 123456,        // Unique ide