Новичок, проверьте это Возьмём вас на криптовалютный количественный трейдинг (2)

Автор:Нинабадасс., Создано: 2022-04-19 16:46:53, Обновлено: 2022-04-20 16:56:43

Новичок, проверьте это Возьмём вас на криптовалютный количественный трейдинг (2)

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

Программированный торговый сценарий

  • Тип торговой стратегии Новички, которые знакомы с программируемой торговлей и количественной торговлей, могут быть сбиты с толку различными терминами, такими как стратегия тренда, стратегия арбитража, стратегия высокой частоты, стратегия сетки и т. Д. Фактически, общие типы стратегий в программируемой торговле и количественной торговле просто в нескольких направлениях.

    • Стратегия арбитража Проще говоря, стратегия, которая в основном держит длинные позиции, в то время как держит короткие позиции, может быть классифицирована как стратегия арбитража.

    • Стратегия развития Проще говоря, это стратегия отслеживания тренда и размещения одной позиции, такой как двойная скользящая средняя, MACD и другие стратегии.

    • Стратегия возврата Например, стратегия сети, получение прибыли от колебаний цен на волатильных рынках.

    • Стратегия высокой частоты Проще говоря, это стратегия проведения высокочастотного трейдинга с помощью некоторых алгоритмов для обнаружения микроструктуры рынка, правил, возможностей и т. Д.

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

    • стратегия с одним символом Это означает, что стратегия может работать только с одним символом, таким как торговля BTC или торговля ETH.

    • многосимвольная стратегия Проще говоря, это работа с несколькими символами по одной логике стратегии.

    • многосчетная стратегия Проще говоря, это конфигурирование нескольких обменных объектов на боте (концепция платформы была представлена в предыдущей статье, а обменный объект, сконфигурированный с API-ключом, представляет собой учетную запись платформы).

    • многологическая стратегия Например, стратегия MACD, стратегия скользящей средней, стратегия сетки и т. д. разрабатываются одновременно на боте (конечно, это для работы с различными объектами биржи, а объекты биржи с одной и той же операцией зависят от того, является ли конкретная стратегия логически противоречивой)

  • Интерфейс API платформы Как запрограммированный торговый скрипт управляет аккаунтом платформы? Итак, какие типы интерфейсов открыты для платформ? В предыдущей статье мы говорили о том, что платформы обычно имеют интерфейсы REST и Websocket в разделе Platform. Здесь мы добавляем некоторые концепции из аспекта процедур стратегии. Интерфейсы платформы разделены в зависимости от того, является ли он проверенным (как 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 в Square FMZ Quant.

Могут ли все функции API в документации FMZ API выполнять сетевой запрос?

Мы должны сказать, что API платформы имеют ограничение частоты доступа (например, 5 раз в 1 секунду). Доступ не может быть слишком частым, иначе будет сообщена ошибка http 429, и доступ будет отклонен (большинство платформ сообщают 429). Поэтому вызов инкапсулированных интерфейсов платформы на FMZ Quant также имеет ограничение, но вызов функций API, которые не делают сетевых запросов, не имеет такого ограничения.
Не все функции API на FMZ Quant могут выполнять сетевые запросы; некоторые функции API на FMZ изменяют только некоторые локальные настройки, такие как установка текущей торговой пары, код контракта и функция расчета индикатора, а также получение имени объекта обмена и т. Д. В основном, с использованием функции a, вы можете определить, будет ли выполняться сетевой запрос; до тех пор, пока это будет приобретать данные платформы или управлять учетной записью платформы, будет выполняться сетевой запрос; все эти интерфейсы должны обращать внимание на частоту вызова.

  • Давайте поговорим о нескольких распространенных проблемах и опыте использования функций API на FMZ Quant.

    • Разрешение на ошибку Это наиболее распространенная ошибка, которая беспокоит бесчисленное множество новичков. Часто, обратный тест стратегии хорош, и все нормально. Почему бот работает ненормально после того, как бот работает некоторое время (что может быть задействовано в любое время)?

      img

      При написании стратегии, для данных, возвращенных интерфейсом, необходимо проверить. Например, код получения тикера на FMZ Quant (что то же самое, что писать свою собственную программу для прямого доступа к интерфейсу платформы):var ticker = exchange.GetTicker()Если мы должны использовать данныеLast(последняя цена) в переменнойticker(вы можете обратиться к структуре возврата функции GetTicker), нам нужно получить данные (что такое newPrice? new: последнее; Price: price; thats right, combine them up!)

      Теперь, это хорошо, если функция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...

      img

      Потому что функция размещения заказов имеет толькоBuyиSellТем не менее, фьючерсы (конечно, нет никаких проблем для спота, для спота есть только купить и продать) имеет направления открытия длинный, закрытие длинный, открытие короткий, и закрытие короткий, так что, очевидно, 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)
      }
      

      img
      Когда дело доходит до этого, вы можете спросить: "У меня есть позиции, и я использую closebuy и Sell вместе, так почему ошибка сообщается, и я не могу закрыть позиции?" Более того, ошибка может быть в другой ситуации: установка направления близкого положения правильна, использование функции размещения заказа также правильно, и вы также держите позиции в направлении, но ошибка все равно сообщается. Причина может быть следующая: ваша программа разместила много заказов, заказы вначале не выполняются, а заказы закрытых позиций сейчас находятся на рынке и ждут исполнения.

    • Экспорт и торговая информация в журнале Проектирование и написание запрограммированных и количественных торговых стратегий неотделимы от проектирования взаимодействий между человеком и компьютером, таких как выставка данных и экспорт журналов операций. Например: Python используетprint- Да, конечно. Использование JavaScriptconsole.log- Да, конечно. Использование голангаfmt.Println()- Да. Использование C++cout.

      Давайте поговорим о информационном дисплее на FMZ. На FMZ Quant существует в основном два места для отображения информации.

      • Строка состояния После запуска бота страница бота отображается следующим образом:

        img

        Часть отображения представляет собой информацию о строке состояния. Строка состояния в основном используется для отображения некоторых изменяющихся данных в режиме реального времени (поскольку изменения в режиме реального времени должны наблюдаться в режиме реального времени и не могут быть напечатаны в виде журнала каждый раз, поэтому этот тип данных может отображаться в строке состояния. Если напечатать журнал каждого из них, будет много бессмысленных повторяющихся данных, влияющих на запрос). Данные, отображаемые на строке состояния, используютLogStatusПодробности см. в документации FMZ API.

      • Лодка Он также находится на странице бота, как показано на следующем изображении:

        img

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

        1. common log; стратегия FMZ использует функцию Log для вывода и печати в журнале стратегии.

        img

        1. Журнал заказов; с использованиемexchange.Sell/exchange.Buyв стратегии FMZ автоматически выводит запись в журнале.

        img

        1. Журнал отмены;exchange.CancelOrderиспользуется в стратегии FMZ, и журнал отмены автоматически выводится в журнале.

        img

        1. Журнал ошибок; когда стратегия FMZ запускается, и интерфейс для сетевого запроса имеет ошибку вызова, и исключение бросается (например, заявление throw), журнал ошибок будет автоматически выводиться в журнале.

        img

      Среди функций 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-периодным скользящим средним:

      img

      По стратегии пользовательский рисунок, нарисованная линия K и скользящая средняя диаграмма:

      img

      Вопрос: Что, если я хочу использовать 10-часовую скользящую среднюю? A: используйте данные K-линии часового периода.

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

      На платформе FMZ Quant Trading вы можете использовать библиотеку TA (библиотека, реализованная FMZ, интегрированная в докер и может использоваться непосредственно на различных языках) или talib (старая известная библиотека индикаторов talib, интегрированная в JS, C ++; Python необходимо установить дополнительно). Например, расчет среднего в приведенном выше примере: Используйте библиотеку FMZ TA:

      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

      img


Больше