[TOC]
Что может сделать FMZ Quant Trading Platform?
Платформа FMZ Quant Trading является самым профессиональным количественным сообществом в области количественной торговли. Здесь вы можете изучать, писать, делиться, покупать и продавать количественные стратегии; вы можете проводить онлайн-бактестинг и использовать симуляторные боты для проведения имитированной торговли; вы также можете запускать, публиковать и смотреть прямую торговлю. Мы поддерживаем почти все основные биржи цифровой валюты.
Полная серия учебников
Графические учебники:
Если возникает какая-либо проблема, вы можете в любое время размещать вопросы и обсуждать на форуме, или отправлять билет, или обращаться к администратору в группе Telegram (Телеграмма), в общем, на этот вопрос можно будет быстро ответить.
Поддержка ChatGPT для помощи в целях развития
FMZ Quantitative Trading Platform приняла 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 бота.
Поддерживаемые протоколы
Когда торговые стратегии разрабатываются на платформе 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, зашифрована (не данные простого текста), и только пользователи
RSA KEY
метод аутентификации обмена в качестве примера, чтобы подробно объяснить, как настроить конфиденциальную информацию локально на устройстве, где расположена программа докера.PKCS#8
, существует множество инструментов для создания, таких какopenssl
.RSA KEY
на обмен, и загрузить публичный ключ, созданный вШаг 1во время сотворения.txt
файл, или в других путях в каталоге программы Docker.RSA KEY
созданный обменником в окне редактирования конфигурацииAccess Key
.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
не будет несколько раз продвигать время, когда время перемещается по временной шкале обратного теста (что не вызовет прыжок к следующему моменту данных рынка). Повторяющиеся вызовы к одной из вышеперечисленных функций продвинут время обратного теста, чтобы переместиться по временной шкале обратного теста (прыгнуть к следующему моменту данных рынка). Когда для обратного теста используется реальный уровень рынка, не рекомендуется выбирать более раннее время. В раннем временном периоде могут отсутствовать данные на уровне реального рынка.
В настоящее время реальный рыночный уровень:
Функция оптимизации параметров системы бэкстеста платформы FMZ Quant Trading заключается в установке оптимизации в соответствии с каждым параметром оптимального опциона во время бэкстеста, и варианты показаны следующим образом:
Сгенерировать комбинации параметров, и пройти все эти комбинации для обратного тестирования (то есть обратного тестирования каждой комбинации параметров один раз).НомерТип может быть оптимизирован в системе обратного тестирования.
Например, настроить параметры опции оптимизации на странице backtest:
Обратная проверка режима оптимизации параметров:
На странице редактирования стратегии, в разделении
ВозьмитеJavaScript
стратегию в качестве примера, и нажмите
Есть небольшие различия в 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]]
}
Описание
Поле | Описание |
---|---|
Схема | Он определяет атрибуты столбцов в массиве данных, который чувствителен к буквам и ограничен только |
Данные | Массив, хранящий данные по схеме |
Формат данных
Поле | Описание |
---|---|
просьбы/предложения | [цена, объем...] |
торговля | [время, направление, цена, объем...] |
Предоставление данных о ставках финансирования:
Например, при обратном тестировании 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 +,
чтобы вернуться на страницу Ctrl
Нажмите клавишу.,
.
Ключ к сокращению для стратегии экономии
Используй ключ.Ctrl + s
чтобы сохранить стратегии.
Краткий путь для начала обратного теста стратегии
Используй ключ.Ctrl + b
чтобы включить
Имя функции | Описание |
---|---|
main() |
Это функция входа. |
onexit() |
это функция очистки при нормальном выходе, ее максимальное время выполнения составляет 5 минут, которое может быть оставлено незаявленным; если наступает тайм-аут,прерыватьошибка будет сообщена. |
onerror() |
Это ненормальная функция выхода, ее максимальное время выполнения составляет 5 минут, которое может быть оставлено незаявленным.Python иcpp не поддерживают эту функцию. |
init() |
это функция инициализации, его стратегия программа будет вызвана автоматически, когда он начинает работать, который может быть оставлен незаявленным. |
onerror()
.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()
в начале стратегии для завершения задачи инициализации.
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, работающий как категория кодов торговой стратегии.Библиотека шаблонов, шаблон добавляется на странице
JavaScript
:
Python
:
cpp
:
Функция экспорта
/*
-- 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");
}
Параметры
Настройки параметров библиотеки шаблонов:
Коды библиотеки шаблонов:
$.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());
}
Цитата
После проверки ссылки в столбце шаблона на странице редактирования стратегии сохраните стратегию.
Exchange
Все взаимодействие данных с обменом реализуется через функции в этом объекте.
Добавление объектов обмена в
Добавление обменных объектов на странице
Добавленные обменные объекты соответствуют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
Это необходимо для изменения глобальных переменных в стратегии.
Типы параметров:
Переменная | Описание | Примечания | Тип | Значение по умолчанию | Описание |
---|---|---|---|---|---|
Число | Цифровой тип | Примечания | Номер (номер) | 1 | Стратегия C++ - это тип плавающей запятой |
Строка | строка | Примечания | Строка (строка) | Здравствуйте FMZ | Значение по умолчанию не нужно цитировать. Ввод рассматривается как строка |
Коробка | Комбобокс | Примечания | ComboBox (выбран) | 1|2|3 | Сама переменная combox представляет собой числовое значение, которое представляет индекс колонки, выбранной элементом управления Combobox. |
Буль | Проверка вариантов | Примечания | Булево (правда/ложно) | Истинно | Если проверено, переменная bool является истинной; если не проверено, переменная bool является ложной |
SecretString (Секретная строка) | Зашифрованная строка | Примечания | Зашифрованная строка (строка) | Пароль | При том же использовании, что и строка, зашифрованная строка будет отправлена с помощью шифрования и не будет передаваться в виде простого текста |
number
, string
, combox
, bool
, secretString
.Настройки зависимости параметров:
Один параметр может быть установлен, чтобы позволить другой параметр, чтобы быть отображен и скрыт на основе выбора параметра.numberA
, который является числовым типом.numberA
быть отображены или скрыты на основе того, параметрisShowA
(булевой тип) является истинным или ложным.numberA
на параметрах интерфейса:numberA@isShowA
.
Таким образом, если параметрisShowA
не проверяется, параметрnumberA
Что касается параметров типа управления ComboBox, зависимая часть параметров заключается в том, чтобы судить о том, равняется ли значение параметразначение индексаВ том же порядке, возьмите параметрisShowA
При установке переменных в параметрах запишите:numberA@combox==2
. ПараметрnumberA
будет отображать или скрывать, в зависимости от того, параметрcombox
будет проверена как третий вариант (где индекс 0 соответствует первому варианту, индекс 1 - второму, а индекс 2 - третьему).
Параметры интерфейса стратегии, интерактивные элементы управления и функция группировки параметров на (?First group)
в начале описания параметра, который начинает группировку, как показано на следующей рисунке:
При использовании стратегии параметры отображаются в группах:
Сохранить параметр по умолчанию:
Параметры стратегии показаны на рисунке. Во время обратного теста, если вы хотите сохранить значения по умолчанию параметров стратегии, вы можете нажатьSave settings
кнопку после изменения параметров стратегии.
Вы можете сохранить настройки параметров стратегии в виде кода:
/*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