В предыдущей статье мы говорили о запрограммированных торговых сценариях. На самом деле, стратегия торговли - это программа с торговым сценарием. В статье в основном говорится о необходимости аппаратного носителя для программы с торговым сценарием (где работает программа), и программа с торговым сценарием может быть написана на этом языке программирования компьютера (перечисляя три языка программирования, используемые в FMZ Quant Trading Platform; конечно, вы можете использовать любой язык программирования для реализации стратегий в запрограммированной торговле).
Тип торговой стратегии Новички, которые знакомы с программируемой торговлей и количественной торговлей, могут быть сбиты с толку различными терминами, такими как стратегия тренда, стратегия арбитража, стратегия высокой частоты, стратегия сетки и т. Д. Фактически, общие типы стратегий в программируемой торговле и количественной торговле просто в нескольких направлениях.
Стратегия арбитража Проще говоря, стратегия, которая в основном держит длинные позиции, в то время как держит короткие позиции, может быть классифицирована как стратегия арбитража.
Стратегия развития Проще говоря, это стратегия отслеживания тренда и размещения одной позиции, такой как двойная скользящая средняя, MACD и другие стратегии.
Стратегия возврата Например, стратегия сети, получение прибыли от колебаний цен на волатильных рынках.
Стратегия высокой частоты Проще говоря, это стратегия проведения высокочастотного трейдинга с помощью некоторых алгоритмов для обнаружения микроструктуры рынка, правил, возможностей и т. Д.
Вышеперечисленные типы классифицируются с точки зрения торговой стратегии; с точки зрения разработки стратегии на FMZ Quant, стратегии также можно разделить на:
стратегия с одним символом Это означает, что стратегия может работать только с одним символом, таким как торговля BTC или торговля ETH.
многосимвольная стратегия Проще говоря, это работа с несколькими символами по одной логике стратегии.
многосчетная стратегия Проще говоря, это конфигурирование нескольких обменных объектов на боте (концепция платформы была представлена в предыдущей статье, а обменный объект, сконфигурированный с API-ключом, представляет собой учетную запись платформы).
многологическая стратегия Например, стратегия MACD, стратегия скользящей средней, стратегия сетки и т. д. разрабатываются одновременно на боте (конечно, это для работы с различными объектами биржи, а объекты биржи с одной и той же операцией зависят от того, является ли конкретная стратегия логически противоречивой)
Интерфейс API платформы
Как запрограммированный торговый скрипт управляет аккаунтом платформы?
Итак, какие типы интерфейсов открыты для платформ? В предыдущей статье мы говорили о том, что платформы обычно имеют интерфейсы REST и Websocket в разделе
Интерфейсы, не требующие проверки
Как правило, они называются API KEY
(если вы не помните, что такое API KEY, вы можете обратиться к предыдущей статье). Этот тип интерфейса, как правило, является рыночным интерфейсом, таким как запрос глубинных котировок рынка, данных K-линии, ставок финансирования, информации о торговых символах, временных метках сервера платформы и т. д.
Проще говоря, интерфейс, который в основном не связан с вашей учетной записью, может быть примерно определен как общедоступный интерфейс (не требуется проверка).
На платформе FMZ Quant Trading при вызове непроверенной функции API (включающей непроверенный интерфейс платформы; публичный интерфейс), даже если конфигурация API KEY неверна, данные, возвращенные интерфейсом, могут быть получены нормально (не требуется проверка).
Интерфейсы, требующие проверки Проще говоря, это интерфейсы, которые должны быть проверены (API KEY). Этот тип интерфейса называется частным интерфейсом. Этот тип интерфейса обычно связан с некоторыми операциями или информацией вашей учетной записи, такими как запрос активов учетной записи, позиции учетной записи, ожидаемые заказы, переводы, конвертация валюты, корректировка рычага и настройка режима позиций и т. Д. Эти операции должны быть проверены.
На FMZ Quant при вызове функций API, которые требуют проверки (частные интерфейсы, которые инкапсулированы и требуют проверки платформы). Если конфигурация API KEY неверна, вызов этого типа функции сообщит об ошибке и вернет null.
Итак, как использовать эти интерфейсы на FMZ Quant Trading Platform?
FMZ Quant Trading Platform включает в себя интерфейсы платформы с унифицированными действиями и определениями (например, K-линейные интерфейсы, интерфейсы глубинного рынка, интерфейсы запроса текущего актива, интерфейсы заказов, интерфейсы отмены заказов и т. Д.). Эти интерфейсы называются на FMZ Quant Trading Platform. Функции API FMZ можно просмотреть, запросив документацию API: (https://www.fmz.com/api).
Итак, как использовать некоторые платформенные интерфейсы без унифицированных действий и определений на FMZ Quant?
Эти платформенные интерфейсы включают: передачу активов, условный заказ, пакетный заказ, отмену партийного заказа, изменение заказа и т. Д. Некоторые платформы имеют эти интерфейсы, некоторые платформы нет, а функции и детали использования могут быть совершенно разными, поэтому к этим интерфейсам можно получить доступ черезexchange.IO
Функция на FMZ Quant (подробности см. в документации API торговой платформы FMZ Quant:https://www.fmz.com/api#exchange.io..Существуют также некоторые практические примеры стратегий IO в
Могут ли все функции API в документации FMZ API выполнять сетевой запрос?
Мы должны сказать, что API платформы имеют ограничение частоты доступа (например, 5 раз в 1 секунду). Доступ не может быть слишком частым, иначе будет сообщена ошибка http 429, и доступ будет отклонен (большинство платформ сообщают 429). Поэтому вызов инкапсулированных интерфейсов платформы на FMZ Quant также имеет ограничение, но вызов функций API, которые не делают сетевых запросов, не имеет такого ограничения.
Не все функции API на FMZ Quant могут выполнять сетевые запросы; некоторые функции API на FMZ изменяют только некоторые локальные настройки, такие как установка текущей торговой пары, код контракта и функция расчета индикатора, а также получение имени объекта обмена и т. Д.
В основном, с использованием функции a, вы можете определить, будет ли выполняться сетевой запрос; до тех пор, пока это будет приобретать данные платформы или управлять учетной записью платформы, будет выполняться сетевой запрос; все эти интерфейсы должны обращать внимание на частоту вызова.
Давайте поговорим о нескольких распространенных проблемах и опыте использования функций API на FMZ Quant.
Разрешение на ошибку Это наиболее распространенная ошибка, которая беспокоит бесчисленное множество новичков. Часто, обратный тест стратегии хорош, и все нормально. Почему бот работает ненормально после того, как бот работает некоторое время (что может быть задействовано в любое время)?
При написании стратегии, для данных, возвращенных интерфейсом, необходимо проверить. Например, код получения тикера на FMZ Quant (что то же самое, что писать свою собственную программу для прямого доступа к интерфейсу платформы):var ticker = exchange.GetTicker()
Если мы должны использовать данныеLast
(последняя цена) в переменнойticker
(вы можете обратиться к структуре возврата функции GetTicker), нам нужно получить данные (что такое newPrice? new: последнее; Price: price; that
Теперь, это хорошо, если функцияGetTicker()
возвращает нормальные данные; если есть запрос на время выключения, сетевой ошибки, платформы оттягивания кабеля, кабелей сломать, копая, или дети выключают электрический выключатель, функцияGetTicker()
Вернется.null
На данный момент стоимостьticker
этоnull
; когда я получаю доступ кLast
Из этого, стратегическая программа будет остановлена исключением программы.
Из этого следует, что неудача вызова интерфейса (призыв GetTicker не удается и возвращает null) не является прямой причиной остановки бота стратегии (прямая причина заключается в том, что атрибутnull
Ситуация, когда неудача вызова интерфейса сообщает об ошибке, не приведет к остановке бота (подчерк здесь).
Итак, что нам делать, чтобы избежать ненормальной остановки бота?
Ответ заключается в том, чтобы сделать пропускную способность к ошибкам процесса к данным, возвращенным интерфейсами; это очень просто, и вам нужно только судить, являются ли возвращенные данныеnull
(взять JavaScript в качестве примера, для других языков похожи).
Напишите небольшой сегмент кода (который предназначен только для инструкций и не может быть напрямую запущен!)
var ticker = exchange.GetTicker()
if (ticker) {
var newPrice = ticker.Last
Log("Print the latest price:", newPrice)
} else {
// data is null, so no operation will make no problem
}
Не толькоGetTicker
интерфейс должен выполнять отказоустойчивую обработку, но интерфейс с сетевыми запросами должен выполнять отказоустойчивую обработку значения возврата (если вы используете значение возврата функции)
Существует множество методов терпимости к ошибкам._C()
функция (см. документацию FMZ API) для написания собственной отказоустойчивой функции и разработки собственного отказоустойчивого механизма и логики.
Что касается использования_C()
Учитывая, что параметры_C()
Функция - это ссылка на функцию, а не вызов функции._C(funcName, param1, param2)
; вызов правильный; funcName не имеет скоб, а параметры param1 и param2 являются параметрами, которые должны быть импортированы в функцию funcName._C(funcName(param1, param2))
; вызов ошибочен; обычно, если новичок не читает документацию FMZ API внимательно, она будет написана так.
Сумма ордера на покупку на спотовом рынке
Как упоминалось в предыдущей статье, сумма ордера ордера покупки на спотовом рынке обычно составляет сумму денег (только у нескольких платформ могут быть другие настройки, и, как правило, эти специальные настройки платформы будут объяснены в документации API FMZ).
Установите торговую пару как:LTC_USDT
function main() {
exchange.IO("simulate", true) // switch to OKEX simulated bot
exchange.Buy(-1, 1) // the price is -1, representing the placed order is market order; the amount of 1 means the order amount of 1 USDT
}
Поскольку платформы, как правило, имеют лимит на сумму заказа, заказы с суммой, меньшей, чем лимит, не будут размещены (например, Binance Spot требует, чтобы только заказы с суммой, превышающей 5USDT, могли быть размещены успешно).
error Buy(-1, 1): map[code:1 data:[map[clOrdId: ordId: sCode:51020 sMsg:Order amount should be greater than the min available amount. tag:]] msg:]
Направление фьючерсного ордера
При разработке фьючерсных стратегий начинающие часто делают ошибки в направлении заказа.https://www.fmz.com/api#exchange.setdirection...
Потому что функция размещения заказов имеет толькоBuy
иSell
Тем не менее, фьючерсы (конечно, нет никаких проблем для спота, для спота есть только купить и продать) имеет направления открытия длинный, закрытие длинный, открытие короткий, и закрытие короткий, так что, очевидно, exchange.SetDirection()
определения направлений торговли фьючерсами.
На FMZ,exchange.SetDirection("buy")
(который сначала устанавливает направление в первую очередь) используется вместе сexchange.Buy
, что означает, что размещенный ордер является ордером на открытие длинных позиций.
И так далее:
Использованиеexchange.SetDirection("sell")
иexchange.Sell
вместе, что представляет собой размещенный ордер - это ордер на открытие коротких позиций.
Использованиеexchange.SetDirection("closebuy")
иexchange.Sell
вместе, что представляет собой размещенный ордер - это ордер на закрытие длинных позиций.
Использованиеexchange.SetDirection("closesell")
иexchange.Buy
вместе, что представляет собой размещенный ордер - это ордер на закрытие коротких позиций.
Новички, как правило, используютexchange.SetDirection("sell")
иexchange.Buy
Затем будет сообщена ошибка (ошибка не может быть сообщена в обратном тесте, но это, очевидно, логическая ошибка, которую не могут игнорировать люди с навязчивыми навязчивыми навязчивыми навязчивыми навязчивыми навязчивыми навязчивыми навязчивыми навязчивыми навязчивыми навязчивыми навязчивыми).
Вот еще одна ошибка, которую обычно допускают новички.
function main() {
exchange.SetContractType("quarter") // set the current contract to a quarterly contract
exchange.SetDirection("sell")
var id = exchange.Sell(-1, 1)
Log("placed market order, executed, get positions", exchange.GetPosition())
exchange.SetDirection("closebuy") // use closebuy and Sell together, yes, no problem
exchange.Sell(-1, 1)
}
Когда дело доходит до этого, вы можете спросить: "У меня есть позиции, и я использую closebuy и Sell вместе, так почему ошибка сообщается, и я не могу закрыть позиции?"
Более того, ошибка может быть в другой ситуации: установка направления близкого положения правильна, использование функции размещения заказа также правильно, и вы также держите позиции в направлении, но ошибка все равно сообщается.
Причина может быть следующая: ваша программа разместила много заказов, заказы вначале не выполняются, а заказы закрытых позиций сейчас находятся на рынке и ждут исполнения.
Экспорт и торговая информация в журнале
Проектирование и написание запрограммированных и количественных торговых стратегий неотделимы от проектирования взаимодействий между человеком и компьютером, таких как print
- Да, конечно.
Использование JavaScriptconsole.log
- Да, конечно.
Использование голангаfmt.Println()
- Да.
Использование C++cout
.
Давайте поговорим о информационном дисплее на FMZ. На FMZ Quant существует в основном два места для отображения информации.
Строка состояния После запуска бота страница бота отображается следующим образом:
Часть отображения представляет собой информацию о строке состояния. Строка состояния в основном используется для отображения некоторых изменяющихся данных в режиме реального времени (поскольку изменения в режиме реального времени должны наблюдаться в режиме реального времени и не могут быть напечатаны в виде журнала каждый раз, поэтому этот тип данных может отображаться в строке состояния. Если напечатать журнал каждого из них, будет много бессмысленных повторяющихся данных, влияющих на запрос).
Данные, отображаемые на строке состояния, используютLogStatus
Подробности см. в документации FMZ API.
Лодка Он также находится на странице бота, как показано на следующем изображении:
Часть отображения представляет собой панель журналов, которая в основном используется для постоянной записи определенных данных в определенное время или записи операции определенной стратегии в определенное время. Дневники делятся на различные типы:
exchange.Sell
/exchange.Buy
в стратегии FMZ автоматически выводит запись в журнале.exchange.CancelOrder
используется в стратегии FMZ, и журнал отмены автоматически выводится в журнале.Среди функций FMZ API, функции, которые могут генерировать выход журналов, такие как Log ((...), exchange.Buy ((Price, Amount), exchange.CancelOrder ((Id), и т. д., могут быть сопровождаться некоторыми дополнительными параметрами вывода после необходимых параметров, таких как: exchange. CancelOrder ((orders[j].Id, orders[j]); это дополнительно выводить информацию о заказе, когда порядок заказов[j] отменяется.
function main() {
Log("data1", "data2", "data3", "...")
var data2 = 200
var id = exchange.Sell(100000, 0.1, "additional data1", data2, "...")
exchange.CancelOrder(id, "additional data1", data2, "...")
LogProfit(100, "additional data1", data2, "...")
}
Использование функций показателей Прежде чем говорить о функции индикатора, давайте сначала поймем, что такое индикатор. Проще говоря, это линия, такая как скользящая средняя, MACD или ATR.
Вопрос: Как создаются эти показатели? О: они, конечно, создаются с помощью вычислений.
Вопрос: На чем они рассчитываются? А: данные по К-линии.
В: Можете привести пример? Ответ: Если взять в качестве примера простейший индикатор скользящей средней. Если мы используем данные ежедневной K-линии (то есть линия ян или линия инь представляет день) в качестве источника данных для расчета индикатора. Параметр индикатора скользящей средней равен 10, то рассчитанный индикатор скользящей средней равен 10-дневной скользящей средней.
Вопрос: если число К-линий BAR меньше 10, можно ли рассчитать показатель скользящей средней?
A: Не только индикатор скользящей средней не может быть рассчитан, но любой индикатор не может рассчитать эффективное значение индикатора, когда количество данных K-линии BAR не соответствует параметру периода индикатора, и соответствующее положение рассчитанного массива будет заполнено пустыми значениями, такими какnull
отображается, когдаJavaScript
стратегия печатает вычисленные данные показателей.
На площади есть поучительный пример:https://www.fmz.com/strategy/125770Проверьте эту стратегию на примере обучения, и вы увидите график, созданный системой обратного теста и 10-периодным скользящим средним:
По стратегии пользовательский рисунок, нарисованная линия K и скользящая средняя диаграмма:
Вопрос: Что, если я хочу использовать 10-часовую скользящую среднюю? A: используйте данные K-линии часового периода.
Проще говоря, K-линия, которую мы видим - это массив после его оцифровки (если вы не понимаете концепцию массива, вы можете искать его на Baidu), и каждый элемент массива - это K-линейная строка, которая расположена в порядке. Обычно последний штрих данных K-линии является штрихом текущего периода, который изменяется в реальном времени и не завершается (вы можете наблюдать изменения, вошедшись на страницу платформы и наблюдая за ее K-линией). Вычисленные показатели также соответствуют одному к одному с K-линейными штрихами. В приведенном выше примере вы можете видеть, что значение индикатора соответствует K-линейной штрихе. Обратите внимание, что последний K-линейный штрих меняется в реальном времени, и рассчитанный индикатор также изменится с изменением K-линейной штрихи.
На платформе FMZ Quant Trading вы можете использовать библиотеку TA (библиотека, реализованная FMZ, интегрированная в докер и может использоваться непосредственно на различных языках) или talib (старая известная библиотека индикаторов
function main() {
var records = exchange.GetRecords()
var ma = TA.MA(records, 10)
Log(ma) // print average
}
Используйте талиб:
function main() {
var records = exchange.GetRecords()
var ma = talib.MA(records, 10)
Log(ma) // print average
}
Вычисленный индекс данных ma представляет собой массив, и каждый элемент соответствует K-линейному массиву (записи) один за другим, то есть,ma[ma.length -1]
соответствуетrecords[records.length - 1]
, и так далее.
То же самое касается и других более сложных индикаторов, и вам нужно обратить внимание на такие индикаторы, как MACD.
var macd = TA.MACD(records) // In this way, only the K-line data is passed in, and no indicator parameters are passed in. The indicator parameters use the default values, and that is the same for other indicator functions
В это время переменная macd является двумерным массивом (вы можете использовать Baidu, если вы не понимаете концепцию).
Вопрос: почему данные MACD-индикатора являются двумерным массивом? Ответ: Поскольку индикатор macd состоит из двух линий (линия диф и линия dea) и множества столбцов объема (данные столбца объема macd, на самом деле, также могут рассматриваться как линия).
var dif = macd[0]
var dea = macd[1]
var macdbar = macd[2]
Вот еще один готовый пример обучения; если вы заинтересованы, вы можете изучить его:https://www.fmz.com/strategy/151972