Type/to search
3
Follow
1504
Followers
Базовое руководство по написанию количественной стратегии платформы FMZ (обязательно к прочтению)
Tutorials
Created 2019-08-13 17:47:27  Updated 2026-01-27 17:22:09
 33
 71696

Этот учебник включает в себя начальные знания по написанию стратегий, включая описание API, отзывы, диаграммы и т. Д. После изучения этого базового учебника пользователь сможет мастерски использовать базовые API, писать стабильные стратегии на твердом диске. Перед изучением этого учебника необходимо сначала изучитьВведение в квантовую платформу разработчика FMZ 。

Старая версия:Изобретатели количественное (FMZ.COM) стратегии для написания полностью используется в руководстве 2.0 (учебное пособие)В этом руководстве приведено множество индексов постов, которые рекомендуется просмотреть.

Предварительный план стратегии

Введение в API

Программированная торговля - это использование программ для подключения к API и бирже, для автоматической покупки и продажи в соответствии с заданными целями или для реализации других функций. API называется Application Programming Interface, то есть интерфейс программирования приложений.

В настоящее время существуют два основных протокола интерфейса для цифровых валютных бирж: REST и Websocket. Соглашение REST требует одного посещения для каждого получения данных. Например, API для амуляторной биржи wex.app, открывается непосредственно в браузере https://api.wex.app/api/v1/public/ticker?market=BTC_USDT и получается:

{"data:{"buy":"11351.73","high":"11595.77","last":"11351.85","low":"11118.45","open":"11358.74","quoteVol":"95995607137.00903936","sell":"11356.02","time":1565593489318,"vol":"3552.5153"}}

Это позволяет увидеть, что происходит с BTC_USDT, и что происходит с каждым обновлением.market=Затем следуют конкретные параметры торговой пары, которые можно изменить, чтобы получить данные о других торговых параметрах. Для открытых интерфейсов, таких как рыночная торговля, все могут получить доступ, поэтому не требуется аутентификация, в то время как некоторые интерфейсы, такие как заказы и учетные записи для получения, требуют идентификации пользователя, в этом случае необходимо использовать API-KEY для подписания.

Платформа квантовой торговли FMZ упакована в REST-интерфейс для различных бирж, использует единый способ вызова и формат данных, что делает программирование стратегий более простым и универсальным. На платформе FMZ может быть удобна поддержка Websocket, о которой будет рассказано подробно в следующем уроке.

Различные языки программирования

ФМЗ платформа API документация в основном с использованием JavaScript в качестве примера, но из-за упаковки, различные языки почти не отличаются, только нужно обратить внимание на грамматические проблемы. C ++ немного особенный, в будущем учебник будет специальное введение. Поскольку Js относительно прост и не имеет проблем с совместимостью, рекомендуется для новичков.

Поскольку существуют различные версии Python, их можно указать в начале программы, например:#!Python2,#!Python3Внимание: JavaScript недавно был обновлен в ES6 и может быть использован для определения специфических случаев использования Python. Ниже представлен код Python и Javascript, которые выполняют те же функции, но с различными грамматическими особенностями.

#python代码 def main(): while True: Log(exchange.GetAccount().Balance) Sleep(2000) #相应的Js代码 function main(){ while(true){ Log(exchange.GetAccount().Balance) Sleep(2000) } }

Рекомендуемые ресурсы

  • Документация API для платформы FMZ, в данном руководстве не будет подробно описываться каждый интерфейс. Документация доступна по ссылке: https://www.fmz.com/api
  • Если вы хотите получить сигналы от Tradingview, чтобы совершить торговлю на FMZ, обратитесь к этой статье: https://www.fmz.com/digest-topic/5533
  • Быстрое введение в Javascript, Python, написание простых стратегий не требует сложного грамматики, достаточно владеть некоторыми основными концепциями, чтобы научиться программированию, изучая этот учебник: https://www.fmz.com/bbs-topic/382 https://www.fmz.com/bbs-topic/417
  • Документация на языке Mac, очень удобная для трендовых стратегий.
  • Пример вызова в C++, который можно посмотреть, если вы заинтересованы в C++, но дебютировать его трудно, так как он не является интерпретационным языком, и его использование не рекомендуется: https://www.fmz.com/strategy/61533
  • Курс количественной торговли цифровой валютой в классе NetEase Cloud, официальный продукт FMZ, стоит всего 20 юаней, содержание подробное, от мелкого до глубокого, подходит для новичков.Ссылки на курсы
  • Некоторые стратегии обучения, подходящие для раннего вступления в обучение, а также основные стратегии по краеведению: https://www.fmz.com/square/s:tag:教学/1
  • Подробное описание стратегии: https://www.fmz.com/bbs/s: tag: %E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/1

Инструменты отладки

ФМЗ Quantum Platform предоставляет инструмент для дебютирования API интерфейса, http://www.fmz.com/m/debug 。 инструмент поддерживает только JavaScript, может выполняться только в течение некоторого времени, а для дебютирования биржевого интерфейса не требуется создания реального диска。 возвращенные данные возвращаются в качестве результатов, код инструмента для дебютирования не сохраняется。 в этом учебном пособии можно одновременно использовать инструмент для тестирования.
img

Архитектура программы стратегии

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

Другие специальные функции:

  • onexit ((() для нормального выхода из процедуры зачистки хвоста, максимальное время выполнения составляет 5 минут, можно не заявлять, что если время будет превышено, будет сообщено ошибка interrupt. Можно сохранить некоторые результаты при выходе из процедуры.
  • onerror() Функция выхода в качестве исключения, максимальное время выполнения - 5 минут, может быть не заявлена。
  • init() Для функций инициализации, программа политики вызывается автоматически при запуске, но не декларируется.
function onTick(){ var ticker = exchange.GetTicker() var account = exchange.GetAccount() //在这里写策略逻辑,将会每6s调用一次 } function main(){ while(true){ onTick() Sleep(6000) } }

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

function onTick(){ var ticker = exchange.GetTicker() var account = exchange.GetAccount() //在这里写策略逻辑,将会每6s调用一次 } function main(){ try{ while(true){ onTick() Sleep(6000) } }catch(err){ Log(err) } }

Введение в API биржи

Схемы биржи и торговой пары

При вызове любого API, связанного с биржей, необходимо указать биржу и торговую пару.exchangeНапример:exchange.GetTicker()Полученный будет тикер курса этой биржи - торговой пары.

Платформа FMZ поддерживает одновременное добавление нескольких биржевых пар, например, BTC и ETH, которые могут одновременно работать на одном и том же биржевом счету, могут одновременно работать на BTC и ETH на одном и том же бирже. Обратите внимание, что одновременно могут быть добавлены различные счета на одном и том же бирже, которые различаются в зависимости от ярлыка, добавленного на веб-сайте FMZ.exchangesАреал представлен следующим образом, в зависимости от того, в каком порядке был создан диск:exchanges[0]exchanges[1]... и так далее. Формат сделки:BTC_USDT, где BTC является валютой для торговли, а USDT - валютой для ценообразования.

img

Очевидно, что если мы будем работать с большим количеством торговых пар, этот способ будет проблематичным, и мы можем использовать SetCurrency для обмена торговыми парами, например,exchange.SetCurrency("BTC_USDT")В это время,exchangeВ результате сделки, в которой была заключена сделка,BTC_USDTНапример, если вы хотите изменить валютную пару, вы можете сделать это в следующий раз, когда будет вызвана новая валютная пара.Примечание: обновление поддерживает переключение парыВот конкретный пример.

var symbols = ["BTC_USDT", "LTC_USDT", "EOS_USDT", "ETH_USDT"] var buyValue = 1000 function main(){ for(var i=0;i<symbols.length;i++){ exchange.SetCurrency(symbols[i]) var ticker = exchange.GetTicker() var amount = _N(buyValue/ticker.Sell, 3) exchange.Buy(ticker.Sell, amount) Sleep(1000) } }

Открытый интерфейс, доступ к информации и т.д.

Как показано выше, интерфейсы торгов обычно являются открытыми и доступными для всех. Обычные интерфейсы торгов включают в себя: получение тикеров торгов, получение глубины, получение K-линейных записей, получение записей сделок. Торговля является основой для стратегии и заключения сделок.

В интерфейсах обычно естьInfoПоле, указывающее на строку исходных данных, возвращенных биржей, может быть использовано для дополнения дополнительной информации, которая ранее была необходима для анализа, используется JavaScriptJSON.parse()В Python используется библиотека json.TimeПоле показывает время запроса, которое может быть использовано для определения задержки.

При использовании API-интерфейса на реальном диске возможен отказ от доступаnullPython возвращается.None, используя данные из них, возникают ошибки и приводят к остановке жесткого диска, поэтому терпимость очень важна.

GetTicker

Получение текущей ситуации на рынке, вероятно, является наиболее часто используемым интерфейсом, можно найти информацию о последних торговых ценах, ценах на покупку и продажу, последних торговых объемах и т. д.{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}

function main() { var ticker = exchange.GetTicker() Log(ticker) //在调试工具中 return ticker 。可以看到具体的结果。 Log('上次成交价: ',ticker.Last, '买一价: ', ticker.Buy) }

GetDepth

Получить информацию о глубине привязки. Хотя в GetTicker содержится список покупок и продаж, но если вы хотите более глубокого запроса, вы можете использовать этот интерфейс, обычно вы можете найти следующие 200 привязки. Вы можете использовать этот интерфейс, чтобы рассчитать ударную цену.

{ "Info":null, "Asks":[ {"Price":5866.38,"Amount":0.068644}, {"Price":5866.39,"Amount":0.263985}, ...... ] "Bids":[ {"Price":5865.13,"Amount":0.001898}, {"Price":5865,"Amount":0.085575}, ...... ], "Time":1530241857399 }

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

function main() { var depth = exchange.GetDepth() Log('买一价个: ', depth.Bids[0].Price, '卖一价格: ', depth.Asks[0].Price) }

GetRecords

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

**exchange.SetMaxBarLen(Len)Можно установить количество K-линий, полученных впервые (поддерживается некоторыми биржами), и установить максимальное количество K-линий.**Например:exchange.SetMaxBarLen(500)

GetRecords может задавать периоды: PERIOD_M1:1 минут, PERIOD_M5:5 минут, PERIOD_M15:15 минут, PERIOD_M30:30 минут, PERIOD_H1:1 час, PERIOD_D1:1 день.exchange.GetRecords(PERIOD_M1)。 После обновления новейшего хоста будет поддерживаться пользовательский цикл, в качестве параметров будет использоваться число секунд непосредственного цикла передачи, на уровне минуты пользователи будут синтезироваться на основе 1 минутной K-линии, на уровне минуты K-линия будет синтезироваться через GetTrades (((), товарные фьючерсы будут синтезироваться на основе tick, 。Внимание, вы можете увидеть что-то подобное в руководстве.PERIOD_M1Эти переменные, которые являются глобальными переменными по умолчанию в FMZ, могут быть зарегистрированы сами.

Возвращаем пример данных:

[ {"Time":1526616000000,"Open":7995,"High":8067.65,"Low":7986.6,"Close":8027.22,"Volume":9444676.27669432}, {"Time":1526619600000,"Open":8019.03,"High":8049.99,"Low":7982.78,"Close":8027,"Volume":5354251.80804935}, {"Time":1526623200000,"Open":8027.01,"High":8036.41,"Low":7955.24,"Close":7955.39,"Volume":6659842.42025361}, ...... ]

Пример иероглифа K:

function main(){ var close = [] var records = exchange.GetRecords(PERIOD_H1) Log('total bars: ', records.length) for(var i=0;i<records.length;i++){ close.push(records[i].Close) } return close }

GetTrades

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

Доступ к счету для совершения сделок

Поскольку эти интерфейсы связаны с учетными записями и не могут быть получены напрямую, они требуют использования подписи API-KEY. Платформа FMZ была автоматизирована в фоновом режиме и может быть использована напрямую.

Получить GetAccount

Получить информацию о счете. Один из наиболее часто используемых интерфейсов, который необходимо вызвать перед заказом, чтобы избежать недостаточного баланса.{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}❚ где Stocks - это имеющийся в наличии остаток валюты для сделки с торговой парой, FrozenStocks - это замороженный остаток нереализованных заказов, Balance - это имеющийся остаток валюты для счета, FrozenBalance - это замороженный остаток. Если торговая параBTC_USDTВ случае, если вы используете USDT, то это будет USDT, а в случае, если вы используете USDT, то это будет USDT.

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

На одном из дисков постоянно печатается общая стоимость текущей торговой пары:

function main(){ while(true){ var ticker = exchange.GetTicker() var account = exchange.GetAccount() var price = ticker.Buy var stocks = account.Stocks + account.FrozenStocks var balance = account.Balance + account.FrozenBalance var value = stocks*price + balance Log('Account value is: ', value) LogProfit(value) Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed //when run in debug tool, add a break here } }

Покупать

Приобретите следующую плату.exchange.Buy(Price, Amount)илиexchange.Buy(Price, Amount, Msg),Price - цена, Amount - количество, Msg - дополнительная строка, которая может быть показана в реальной журнале, но не обязательно. Этот способ является закладкой, если не удастся сразу же полностью сдать, то будет создано невыполненное заказ, заказ успешно возвращается в результате заказа id, не удалосьnull, используется для поиска статуса заказа.

Если мы хотим купить по цене, то Price - 1, а Amount - стоимость заказа.exchange.Buy(-1, 0.5)Сделка была сделана.ETH_BTC, покупает ETH по рыночной цене за 0.5BTC. Некоторые биржи не поддерживают рыночную цену, а также не поддерживают фьючерсную ретроспективность.

Все цены и количественные требования к точности части сделки, доступные_N()Функция точности для управления. Для фьючерсной торговли Buy и Sell имеют дополнительное значение, которое будет описано отдельно.

Пример покупки по цене:

function main(){ while(true){ var ticker = exchange.GetTicker() var price = ticker.Sell if(price >= 7000){ exchange.Buy(_N(price+5,2), 1, 'BTC-USDT') break } Sleep(3000)//Sleep 3000ms } Log('done') }

Продавать или продавать

Продажа по цене. Параметры одинаковы для покупки.exchange.Sell(-1, 0.2), означает продажу по рыночной цене в 0.2 ETH.

GetOrder получает заказы

Получение информации о заказе по идентификатору заказа.exchange.GetOrder(OrderId),OrderId - это идентификатор заказа, который возвращается при заказе.**Обратите внимание на тип заказаTypeПоля и состояние заказаStatusФактические значения являются цифрами, представляющими различные значения, но не способствуют запоминанию, FMZ представляет эти значения в виде глобальных констант, таких как невыполненные заказыStatusЭто равно 0.ORDER_STATE_PENDINGВсе эти глобальные константы можно посмотреть в документации.**◦ Возвращение результатов:

{ "Id":125723661, //订单id "Amount":0.01, //订单数量 "Price":7000, //订单价格 "DealAmount":0, //已成交数量 "AvgPrice":0, //成交均价 "Status":0, // 0:未完全成交, 1:已成交, 2:已撤单 "Type":1,// 订单类型,0:买单, 1:卖单 "ContractType":"",//合约类型,用于期货交易 "Info":{} //交易所返回原始信息 } }

Стратегия покупки определенного количества монет:

function main(){ while(true){ var amount = exchange.GetAccount().Stocks var ticker = exchange.GetTicker() var id = null if(5-amount>0.01){ id = exchange.Buy(ticker.Sell, Math.min(5-amount,0.2)) }else{ Log('Job completed') return //return the main function, bot will stop } Sleep(3000) //Sleep 3000ms if(id){ var status = exchange.GetOrder(id).Status if(status == 0){ //这里也可以用 status == ORDER_STATE_PENDING 来判断。 exchange.CancelOrder(id) } } } }

GetOrders не выполнил заказ

Получить текущую сделку для всех незавершенных заказов. Если нет незавершенных заказов, возвращается пустой матрица. Список заказов является конкретным результатом, таким как GetOrder.

Пример аннулирования текущей сделки для всех заказов:

function CancelAll(){ var orders = exchange.GetOrders() for(var i=0;i<orders.length;i++){ exchange.CancelOrder(orders[i].Id) // cancel order by orderID } } function main(){ CancelAll() while(true){ //do something Sleep(10000) } }

CancelOrder (отменить приказ)

Отмена заказа в соответствии с id.exchange.CancelOrder(OrderId)。 отмена успешная возвращает true, в противном случае возвращает false。 обратите внимание, что если заказ был полностью выполнен, то отмена будет провальной。

Фьючерсы и долгосрочные контракты

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

Контракт на постоянное время похож на контракт на будущее, но отличается тем, что не имеет концепции одновременного владения свободным местом.

Если биржа поддерживает одновременно фьючерсные наличные, такие как OKEX и Huobi Futures, необходимо отдельно в интерфейсе биржи выбрать фьючерсный ящик OKEX и фьючерсный ящик Huobi. Фьючерсный ящик Huobi должен быть добавлен, чтобы рассматриваться в FMZ как иная биржа, чем наличные.

SetContractType Настройка контракта

Первым шагом в торговле фьючерсами является настройка контракта для торговли, например, фьючерсы OKEX, выберите торговую пару BTC при создании фиксированного диска или ретроспекции, а также необходимо настроить в коде контракт на текущую неделю, на следующую неделю или на квартал.invalid contract type。**В отличие от наличных торговых пар, фьючерсные контракты обычно подкрепляются валютами, такими как BTC, а торговые пары с добавлением BTC обычно представляют собой торговые пары BTC_USD, подкрепленные BTC. Если есть фьючерсы, подкрепленные USDT, это требует создания фиксированной пары с добавлением BTC_USDT.**После установки торговой пары необходимо установить конкретные типы контрактов, такие как постоянные, текущие, еженедельные и т. д. После установки контракта можно производить операции по получению информации, покупке и продаже.

Контракты, существующие на криптовалюте и USDT, такие как Binance, OKEX, HuobiDM, требуют разграничения при добавлении контрактов настройки на диске. Конкретные настройки следующие:

//OKEX期货 exchange.SetContractType("swap") // 设置为永续合约 exchange.SetContractType("this_week") // 设置为当周合约 exchange.SetContractType("next_week") // 设置为次周合约 exchange.SetContractType("quarter") // 设置为季度合约 //HuobiDM exchange.SetContractType("this_week") // 设置为当周合约 exchange.SetContractType("next_week") // 设置为次周合约 exchange.SetContractType("quarter") // 设置为季度合约 exchange.SetContractType("swap") // 设置为永续合约 //币安期货 exchange.SetContractType("swap") // 设置为永续合约,注意币本位和USDT本位都存在永续 exchange.SetContractType("quarter") // 设置为当季合约 exchange.SetContractType("next_quarter") // 设置为次季合约 //BitMEX exchange.SetContractType("XBTUSD") // 设置为永续合约 exchange.SetContractType("XBTM19") // 具体某个时间结算的合约,详情登录BitMEX查询各个合约代码 //GateIO exchange.SetContractType("swap") // 设置为永续合约,不设置默认为swap永续合约。 //Deribit exchange.SetContractType("BTC-27APR18") // 具体某个时间结算的合约,详情参看Deribit官网。

GetPosition - держать позиции

Получить список информации о текущем положении, OKEX(OKCOIN) фьючерсы могут быть переданы в параметр, указывающий тип контракта, который нужно получить. Если нет положения, возвращается пустой список[]│ │ │ │ │ │ │ │ │ │ │ │ │ │ │

Типы данныхИмя переменнойпроиллюстрировать

Обратная структура обмена object
<unk>number <unk>Margin <unk>Level <unk>Rod Size <unk> OKCoin <unk>10 или <unk>20, <unk>Future <unk>Forex <unk>Forex <unk>Forex <unk>Forex <unk>Forex <unk>Forex <unk>Forex <unk>Forex <unk>
"Amount" означает количество депозитов, "OKCoin" означает количество контрактов (всего числа, больше 1), "OKCoin" означает количество контрактов (всего числа, больше 1)
<unk> <unk> <unk> <unk> <unk>
"Нумер, цена и средняя цена на акции".
"Намбер иджад Маргин иджад иджад замороженная гарантия"
Профицит фьючерсов OKCoin при полном запасе означает прибыль, а не убыток, а снижение позиции означает убыток)
<unk> const <unk> <unk> <unk> <unk> <unk> <unk> <unk> PD_LONG для позиций с большим количеством позиций ((в CTP closebuy_today), PD_SHORT для позиций с большим количеством позиций (в CTP closesell_today), PD_LONG_YD для позиций с большим количеством позиций (в CTP futures), PD_SHORT_YD для позиций с большим количеством позиций (в CTP closebuy), PD_SHORT_YD для позиций с большим количеством позиций (в CTP closesell)
string jpgContractType jpg Фьючерсный код контракта, Фьючерсный код биржи, Фьючерсный код биржи, Фьючерсный код биржи, Фьючерсный код биржи, Конкретный параметр SetContractType

function main(){ exchange.SetContractType("this_week"); var position = exchange.GetPosition(); if(position.length>0){ //特别要注意引用前要先判断position长度再引用,否则会出错 Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:", position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,"ContractType:", position[0].ContractType) } }

Фьючерсные позиции

Для начала необходимо установить размер рычага и способ его вызова:exchange.SetMarginLevel(10)Если вы хотите узнать, сколько либерально-демократических партий в стране, то посмотрите на соответствующие биржи, чтобы узнать, сколько либерально-демократических партий в стране.Обратите внимание, что рычаг должен быть установлен на бирже, и код должен соответствовать установленным на бирже, в противном случае будет ошибка│ │ │ │ │ │ │ │ │
Затем настроить направление сделки, вызов:exchange.SetDirection(Direction) В ответ на открытие и ликвидацию позиций,**В отличие от фьючерсов, если пожизненные контракты не имеют одновременной свободной позиции, то есть не разрешают держать отдельные позиции, то свободное время автоматически очищает позиции, и все, что требуется, это настройкаbuyиsellПри поддержке двунаправленного хранения необходимо установитьclosebuy,closebuy。**Конкретные отношения:

УправлениеПараметры SetDirectionФункция заказа
Открытие позицииexchange.SetDirection("buy")exchange.Buy()
Пиндо-ходжонexchange.SetDirection("closebuy")exchange.Sell()
Открытые позицииexchange.SetDirection("sell")exchange.Sell()
Пустые позицииexchange.SetDirection("closesell")exchange.Buy()

Наконец, конкретный код открытия и закрытия позиции, следующий заказ различается в зависимости от биржи, например, фьючерсы huobi рассчитаны на количество позиций, одна из которых составляет 100 долларов США. Обратите внимание, что фьючерсная обратная оценка не поддерживает рыночную цену.

function main(){ exchange.SetContractType("this_week") // 举例设置 为OKEX期货 当周合约 price = exchange.GetTicker().Last exchange.SetMarginLevel(10) //设置杠杆为10倍 exchange.SetDirection("buy") //设置下单类型为做多 exchange.Buy(price+10, 20) // 合约数量为20下单 pos = exchange.GetPosition() Log(pos) Log(exchange.GetOrders()) //查看是否有未成交订单 exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell") exchange.Sell(price-10, 20) }

Ниже приведен конкретный пример стратегии полного плава

function main(){ while(true){ var pos = exchange.GetPosition() var ticker = exchange.GetTicekr() if(!ticker){ Log('无法获取ticker') return } if(!pos || pos.length == 0 ){ Log('已无持仓') return } for(var i=0;i<pos.length;i++){ if(pos[i].Type == PD_LONG){ exchange.SetContractType(pos[i].ContractType) exchange.SetDirection('closebuy') exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount) } if(pos[i].Type == PD_SHORT){ exchange.SetContractType(pos[i].ContractType) exchange.SetDirection('closesell') exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount) } } var orders = exchange.Getorders() Sleep(500) for(var j=0;j<orders.length;j++){ if(orders[i].Status == ORDER_STATE_PENDING){ exchange.CancelOrder(orders[i].Id) } } } }

Леверинговые сделки с цифровыми валютами

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

Используйте exchange.IO (("trade_margin") для переключения на режим учетных записей, чтобы заказать и получить активы учетных записей, которые будут доступны в интерфейсе биржи.
Используйте exchange.IO ((("trade_normal") и переключитесь обратно на обычный режим учетной записи.

Поддерживаемые биржи:

  • OKEX V3: Пары с использованием левередж-аккаунтов отличаются от обычных, некоторые пары могут не иметь левереджа.
  • Биткойн: Леверинговые пары отличаются от обычных, а некоторые пары могут не иметь.
  • ZB: средства могут быть переведены только в качестве QC, используются в торговом сегменте, независимость между различными торговыми парами, то есть количество монет QC в торговой паре ETH_QC, не видное в BTC_QC
  • FCoin
  • Binance (англ.) (недоступная ссылка)

Фьючерсные сделки с товарами

Торговля товарными фьючерсами и торговля цифровыми валютами имеет большое различие. Во-первых, сроки торговли товарными фьючерсами коротки, цифровые валюты торгуются 24 часа в сутки; соглашения о товарных фьючерсах также не являются обычным REST API; частота торговли товарными фьючерсами и ограничение количества заявок, а цифровые валюты очень свободны и т. д. Поэтому торговля товарными фьючерсами имеет много мест, требующих особого внимания, рекомендуется иметь богатый опыт ручного управления.

Фьючерсы на товары в июне 2019 года ввели регулирование в виде просмотра, индивидуальный пользователь запрограммировал личный пользователь, который открыл счет для лицензирования фьючерсного провайдера. (Стандартные данные для конкретной заявки можно найти в группе WeChat или группе QQ), как правило, требуют 4-5 дней, шаги более сложные. В качестве программированного поставщика торговых платформ FMZ, поставщик торговых платформ запросил лицензию на программное обеспечение у различных фьючерсных сервисов, пользователь может использовать его без необходимости подавать заявку напрямую.

Благодаря преимуществам архитектуры платформы FMZ, пользователи также могут добавлять несколько учетных записей фьючерсных торговцев и реализовывать некоторые функции, которые не могут быть выполнены другими программными средствами для программирования торговли товарными фьючерсами, такими как синтез высокочастотных тиков, см. https://www.fmz.com/bbs-topic/1184

Рамки политики

Во-первых, поскольку это не 24-часовая транзакция и требует операций по вхождению в систему, перед совершением транзакции необходимо определить состояние ссылки.exchange.IO("status")дляtrueЕсли вы не успели войти в систему, вызовите API, и вам не будет предложено "не войти в систему". Вы можете спать после начала стратегии (((2000), дать определенное время для входа в систему. Вы также можете попробовать повторно подписаться._C(exchange.SetContractType,"MA888")Это гарантирует успешную посадку.

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

function main(){ _C(exchange.SetContractType,"MA888") //没登陆成功是无法订阅合约的,最好重试一下 while(true){ if(exchange.IO("status")){ var ticker = exchange.GetTicker() Log("MA888 ticker:", ticker) LogStatus(_D(), "已经连接CTP !")//_D获取事件 } else { LogStatus(_D(), "未连接CTP !") Sleep(1000) } } }

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

function main() { // 使用了商品期货类库的CTA策略框架 $.CTA(Symbols, function(st) { var r = st.records var mp = st.position.amount var symbol = st.symbol /* r为K线, mp为当前品种持仓数量, 正数指多仓, 负数指空仓, 0则不持仓, symbol指品种名称 返回值如为n: n = 0 : 指全部平仓(不管当前持多持空) n > 0 : 如果当前持多仓,则加n个多仓, 如果当前为空仓则平n个空仓,如果n大于当前持仓, 则反手开多仓 n < 0 : 如果当前持空仓,则加n个空仓, 如果当前为多仓则平n个多仓,如果-n大于当前持仓, 则反手开空仓 无返回值表示什么也不做 */ if (r.length < SlowPeriod) { return } var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod)); if (mp <= 0 && cross > ConfirmPeriod) { Log(symbol, "金叉周期", cross, "当前持仓", mp); return Lots * (mp < 0 ? 2 : 1) } else if (mp >= 0 && cross < -ConfirmPeriod) { Log(symbol, "死叉周期", cross, "当前持仓", mp); return -Lots * (mp > 0 ? 2 : 1) } }); }

Модуль получения данных CTP

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

Если мы хотим, чтобы каждый раз, когда мы получаем информацию, мы получали данные, даже старые данные, мы могли бы переключиться на режим "немедленного обновления информации".exchange.IO("mode", 0)❚ В этом случае стратегия не может быть написана как движущаяся событием, необходимо добавить событие SLeep, чтобы избежать быстрого цикла смерти. ❚ Некоторые нечасто используемые стратегии могут использовать эту модель, и их конструкция проста.exchange.IO("mode", 1)Можно отключить режим кэширования по умолчанию.

При работе с отдельными контрактами можно использовать режим по умолчанию. Однако, если это несколько контрактов, возможно, что один контракт не обновляется, что приводит к блокировке интерфейса получения информации, а другие контракты не могут получить информацию. Чтобы решить эту проблему, можно использовать режим немедленного обновления, но без написания высокочастотной стратегии.exchange.IO("wait")Если добавлено несколько биржевых объектов, что редко бывает в товарных фьючерсах, можно использоватьexchange.IO("wait_any")Индекс, возвращаемый в этот момент, будет указывать индекс возвращаемой биржи.

Продвижение изменений в tick{Event:"tick", Index:交易所索引(按实盘上交易所添加顺序), Nano:事件纳秒级时间, Symbol:合约名称}
Заказ отправлен: {Event:"order", Index:交易所索引, Nano:事件纳秒级时间, Order:订单信息(与GetOrder获取一致)}

На этом этапе структуру стратегии можно записать следующим образом:

function on_tick(symbol){ Log("symbol update") exchange.SetContractType(symbol) Log(exchange.GetTicker()) } function on_order(order){ Log("order update", order) } function main(){ while(true){ if(exchange.IO("status")){ //判断链接状态 exchange.IO("mode", 0) _C(exchange.SetContractType, "MA888")//订阅MA,只有第一次是真正的发出订阅请求,接下来都是程序切换,不耗时间。 _C(exchange.SetContractType, "rb888")//订阅rb while(true){ var e = exchange.IO("wait") if(e){ if(e.event == "tick"){ on_tick(e.Symbol) }else if(e.event == "order"){ on_order(e.Order) } } } }else{ Sleep(10*1000) } } }

Фьючерсы на товары отличаются от цифровых валют

Следует также отметить, что товарные фьючерсы отличаются от криптовалютных бирж. Например, GetDepth фактически имеет только одну глубину (за 5 глубинных сборов дорого), GetTrades также не получает историю сделок (все они основаны на изменениях позиций, а не на реальных записях сделок).

Настройка контракта

exchange.IO (("instruments"): возвращает список всех контрактов биржи в словарном виде, поддерживает только физические диски.
exchange.IO ((("products"): возвращает список всех продуктов биржи в словарном виде, поддерживает только физические диски.
exchange.IO (("subscribed"): возвращает подписанные контракты в том же формате, что и предыдущие, но поддерживает только физические диски.

Традиционные CTP-фьючерсыContractTypeЭто означает, что контракт ID, отличается от больших и малых букв.exchange.SetContractType("au1506")Успешная настройка контракта с подробной информацией о возвращаемом контракте, например, о минимальной сумме покупки, оплате, сроке доставки и т. д. При подписке на несколько контрактов только первый раз действительно отправляется запрос на подписку, а затем просто переключается на уровне кода, не затрачивая времени. Основные последовательные контракты с кодом 888, такие как MA888, последовательные индексные контракты, такие как MA000, 888 и 000 для виртуальных контрактов поддерживают только обратную измерение, а на реальном диске поддерживают только получение.Но в Mac-языке можно управлять контрактом господства, и программа автоматически меняет позиции, то есть убирает не-государственные позиции и открывает новые позиции на господствующих позициях.

Не удалось установить контракт, но он также немедленно возвращается, поэтому можно попробовать снова с помощью _C, зная, что CTP-логин завершен. После успешной регистрации, повторная установка контракта не будет занимать много времени и не будет создавать реальный доступ к сети.

Открытие позиции

SetDirection"Direction" может быть полученаbuy, closebuy, sell, closesellЧетыре параметра: товарные фьючерсыclosebuy_todayиclosesell_todayЯ думаю, что это неправда.closebuy/closesellДля прошлой и текущей позиций, только в предыдущем периоде разделение на разновидность может повлиять на комиссионные, поэтому необходимо уделять первоочередное внимание прошлой и текущей позициям. Для традиционных CTP-фьючерсов можно установить второй параметр 1 или 2 или 3 копейки, в зависимости от спекулятивной копейки, копейки прибыли, копейки защиты, без установки умолчательной спекуляции.Конкретные операции, такие как покупка и продажа, получение позиции, получение ордера, снятие счета, получение счета, аналогичны цифровым валютным фьючерсным сделкам, см. предыдущую главу.

УправлениеПараметры SetDirectionФункция заказа
Открытие позицииexchange.SetDirection("buy")exchange.Buy()
Пиндо-ходжонexchange.SetDirection("closebuy")exchange.Sell()
Открытые позицииexchange.SetDirection("sell")exchange.Sell()
Пустые позицииexchange.SetDirection("closesell")exchange.Buy()

Приведенный ниже пример - это конкретная функция плавных позиций, обратите внимание, что этот пример слишком прост, также нужно учитывать ряд вопросов, например, находитесь ли вы во время торговли, не полностью сделанная торговля, как закрепить заказ, какова максимальная сумма заказа, слишком ли высока частота, конкретно, скольжение цены или открытая торговля.**Для открытия хранилища на твердом диске рекомендуется использовать кластерные хранилища с упаковкой платформы, https://www.fmz.com/strategy/12961**│ │ │ │ │ │ │ │ │ │

function Cover(contractType, amount, slide) { for (var i = 0; i < positions.length; i++) { if (positions[i].ContractType != contractType) { continue; } var depth = _C(e.GetDepth); if (positions[i].Type == PD_LONG || positions[i].Type == PD_LONG_YD) { exchange.SetDirection(positions[i].Type == PD_LONG ? "closebuy_today" : "closebuy"); exchange.Sell(depth.Bids[0]-slide, amount, contractType, positions[i].Type == PD_LONG ? "平今" : "平昨", 'Bid', depth.Bids[0]); } else { exchange.SetDirection(positions[i].Type == PD_SHORT ? "closesell_today" : "closesell"); exchange.Buy(depth.Asks[0]+slide, amount, contractType, positions[i].Type == PD_SHORT ? "平今" : "平昨", 'Ask', depth.Asks[0]); } } }

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

exchange.SetDirection("buy_ioc"); exchange.SetDirection("sell_gtd-20170111")

Конкретные послесловия:

  • ioc немедленно, иначе аннулировать THOST_FTDC_TC_IOC
  • gfs Этот раздел действителен THOST_FTDC_TC_GFS
  • gfd действителен в этот день THOST_FTDC_TC_GFD
  • gtd действителен до указанной даты THOST_FTDC_TC_GTD
  • gtc действителен до отмены THOST_FTDC_TC_GTC
  • gfa Совокупность цены действительна THOST_FTDC_TC_GFA

Удобный интерфейс

По умолчанию в товарных фьючерсных трейдерах открывается CTP-интерфейс, при необходимости его можно поменять на Ease of Doing Interface. Через упаковку FMZ, вызов одинаковый. Разница в том, что учетные записи, заказы, хранилища - это режимы проталкивания, поэтому хранитель поддерживает эти данные локально, а при вызове соответствующего интерфейса они сразу же возвращаются, фактически не отправляя запрос.

Типы заказов, которые могут быть заказаны по протоколу, следующие:

  • gfd действителен на данный момент TAPI_ORDER_TIMEINFORCE_GFD
  • gtc действителен до отмены TAPI_ORDER_TIMEINFORCE_GTC
  • gtd действителен до указанной даты
  • fak частично завершена, остальные части аннулированы TAPI_ORDER_TIMEINFORCE_FAK
  • ioc выполняется немедленно, иначе аннулируется TAPI_ORDER_TIMEINFORCE_FAK
  • TAPI_ORDER_TIMEINFORCE_FOK не удалось завершить сделку

Общие глобальные функции

Журнал Log и рассылка по WeChat

В интерфейсе реликтового диска Log - журнал, после строки добавляется @-символ, чтобы сообщение попало в очередь отправки, а после связывания с WeChat или Telegram оно было отправлено непосредственно.Log('推送到微信@')

Также можно настроить цвет журнала.Log('这是一个红色字体的日志 #ff0000')#ff000016-кратное представление цвета RGB

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

LogProfit печатает прибыль

Записывается прибыль, и на интерфейсе диска рисуется кривая прибыли, которая может быть сохранена после перезагрузки диска.LogProfit(1000)Внимание.LogProfitПараметры не обязательно должны быть прибылью, они могут быть любыми числами, которые необходимо заполнить самостоятельно.

LogStatus показывает таблицу состояния

Фиксированный диск, поскольку журнал сохраняется и постоянно обновляется, может использоваться, если требуется отображение только не сохраненной информации.LogStatusфункция.LogStatusПараметры в виде строки могут быть использованы для представления информации таблицы.

Пример таблицы, показывающей местоположение конкретного состояния диска:

var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}; LogStatus('`' + JSON.stringify(table) + '`'); // JSON序列化后两边加上`字符, 视为一个复杂消息格式(当前支持表格) LogStatus('第一行消息\n`' + JSON.stringify(table) + '`\n第三行消息'); // 表格信息也可以在多行中出现 LogStatus('`' + JSON.stringify([table, table]) + '`'); // 支持多个表格同时显示, 将以TAB显示到一组里 LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // 上下排列显示多个表

Спящий.

Параметры в миллисекундах, например:Sleep(1000)Одна секунда для спячки. Из-за ограничения частоты доступа к всем сделкам, в обычной стратегии необходимо включить время спячки в мертвый цикл.

_G Сохранить данные

После перезагрузки жесткого диска программа запускается заново, и если вы хотите сохранить некоторую информацию, вы можете использовать этот инструмент._GЭто очень удобно и практично, потому что сохраняет серийное содержание JSON._GФункция записана вonexit()Это позволяет автоматически сохранять необходимую информацию при остановке стратегии.
Если вы хотите сохранить больше форматированных данных, то вы можете использовать это приложение._Функция G не очень удобна, её можно написать в базу данных непосредственно с помощью Python.

function onexit(){ _G('profit', profit) } function main(){ _G("num", 1); // 设置一个全局变量num, 值为1 s _G("num", "ok"); // 更改一个全局变量num, 值为字符串ok _G("num", null); // 删除全局变量 num _G("num"); // 返回全局变量num的值,如果不存在返回null var profit = 0 if(_G('profit')){ profit = _G('profit') } }

_Функция точности N

При заказе, часто для контроля цены и точности количества, FMZ имеет встроенную функцию _N, которая определяет сохранение минимальных значений, таких как_N(4.253,2)Результат - 4,25.

_C. Автоматическая повторная попытка

При использовании API-интерфейса для обмена вызовами не может быть гарантировано успешное выполнение каждого запроса._Функция C является функцией автоматической повторной попытки. Она будет вызывать указанную функцию до тех пор, пока она не вернется с успехом (функция возвращает null или false, которая будет повторной попытки), например_C(exchange.GetTicker), интервал перепроверки по умолчанию 3 секунды, можно вызвать функцию_CDelay, чтобы контролировать интервал перепроверки, например, _CDelay(1000), изменение интервала перепроверки функции_C в 1 секунду, рекомендуетсяGetTicker(),exchange.GetDepth,GetTrade,GetRecords,GetAccount,GetOrders, GetOrderВсе они используются с использованием C, чтобы предотвратить сбой в доступе, который может привести к сбоям в работе.

CancelOrderНевозможно использовать функцию_C, поскольку отказ от запроса может быть вызван различными причинами. Если один из модулей уже завершен, то отказ от запроса возвращает отказ, а использование функции_C приводит к постоянной повторной попытке.

_Функции C могут быть переданы в параметры, а также используются для пользовательских функций.

function main(){ var ticker = _C(exchange.GetTicker) var depth = _C(exchange.GetDepth) var records = _C(exchange.GetRecords, PERIOD_D1) //传入参数 }

_Функция D дата

Прямое вызов_D()Возвращает текущую строку времени, например:2019-08-15 03:46:14Если вызов выполняется во время повторного измерения, то возвращается время повторного измерения. Можно использовать функцию _D для определения времени, например: _D().slice(11) > '09:00:00':

_D(timestamp,fmt), переводит время в строку времени, например:_D(1565855310002)。fmt параметр является временным, по умолчаниюyyyy-MM-dd hh:mm:ss

Функция TA

Для некоторых часто используемых индикаторных функций, таких как MA\MACD\KDJ\BOLL и другие, FMZ-платформа встроена непосредственно, конкретные поддерживаемые индикаторы можно найти в документации API.

Прежде чем использовать показательную функцию, лучше определить длину K-линий.null。 Если длина вводимой K-линии равна 100 и рассчитывается MA с периодом 10, то первые 9 значений являются нулевыми, а последующие рассчитываются нормально。

JavaScript также поддерживает полный талиб, как поддержку сторонних библиотек, вызывая такие какtalib.CCI(records)。 Ссылка http://ta-lib.org/function.html 。 Для Python можно самостоятельно установить библиотеку talib, которая не может быть просто установлена с помощью pip из-за необходимости компиляции, можно самостоятельно искать способ установки。

Показательная функция, помимо передачи данных K-линии, может быть передана в произвольные массивы

function main(){ var records = exchange.GetRecords(PERIOD_M30) if (records && records.length > 9) { var ma = TA.MA(records, 14) Log(ma) } }

Часто используемые функции JavaScript

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

  • Date.now()Возвращение к текущему времени
  • parseFloat()Перевести строку в число, например:parseFloat("123.21")
  • parseInt()Перевести строку в целое число
  • num.toString()Переведите число в строку, num в цифровую переменную
  • JSON.parse()Форматирование строки Json, напримерJSON.parse(exchange.GetRawJSON())
  • Функции JavaScript с собственной библиотекой Math следующие:Math.max(),Math.abs()Математические операции и т. д., см. https://www.w3school.com.cn/jsref/jsref_obj_math.asp
  • Третьей стороной является JavaScripts math library, ссылающаяся на FMZ, ссылка: https://mathjs.org/
  • ФМЗ ссылается на JavaScript-серьезную подсказку третьей стороны, которая упрощает работу с большим количеством Js, см. https://underscorejs.org/

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

Для написания реальной стратегии необходимо учитывать очень много обстоятельств, например, купить 5 монет, чтобы иметь в виду: достаточно ли текущего баланса? Какова цена заказа? Какая точность? Не нужно ли разделить заказы, чтобы избежать рыночного удара? Как обрабатывать незавершенные заказы? И т. д.

JavaScript класса торговли цифровой валютой и класса торговли товарными фьючерсами встроены по умолчанию и не требуют копирования. Другие класса шаблонов можно найти на площадке стратегий https://www.fmz.com/square/20/1 ❚ копировать и сохранять класса шаблонов, а также выбирать класса, которые нужно использовать при создании собственной стратегии.

Функции шаблона JavaScript используются в$Начнем с Python.extНачало.

Классификатор цифровых валют

Источник кода: https://www.fmz.com/strategy/10989 , уже встроен, не нужно копировать. Методы реализации конкретных функций можно использовать непосредственно ссылаясь на исходный код.

Доступ к учетной записи:

$.GetAccount(e) Log($.GetAccount()); // 获取账户信息, 带容错功能 Log($.GetAcccount(exchanges[1]));

Отзывы о заказе:

$.Buy/Sell(e, amount) $.Buy(0.3); // 主交易所买入0.3个币 $.Sell(0.2); // 主交易所卖出0.2个币 $.Sell(exchanges[1], 0.1); // 次交易所卖出0.1个币 $.CancelPendingOrders(e, orderType) $.CancelPendingOrders(); // 取消主交易所所有委托单 $.CancelPendingOrders(ORDER_TYPE_BUY); // 取消主交易所所有的买单 $.CancelPendingOrders(exchanges[1]); // 取消第二个交易所所有订单 $.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // 取消第二个交易所所有的卖单

Посмотрите на это с другой стороны.

$.Cross(periodA, periodB) / $.Cross(arr1, arr2); var n = $.Cross(15, 30); var m = $.Cross([1,2,3,2.8,3.5], [3,1.9,2,5,0.6]) 如果 n 等于 0, 指刚好15周期的EMA与30周期的EMA当前价格相等 如果 n 大于 0, 比如 5, 指15周期的EMA上穿了30周期的EMA 5个周期(Bar) 如果 n 小于 0, 比如 -12, 指15周期的EMA下穿了30周期的EMA 12个周期(Bar) 如果传给Cross不是数组, 则函数自动获取K线进行均线计算 如果传给Cross的是数组, 则直接进行比较

$.withdraw(e, currency, address, amount, fee, password) Функция вывода:

$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")

Фьючерсные торговые класса

Коммерческая фьючерсная торговая класса является стабильной и рекомендуется к использованию. Код исходного кода: https://www.fmz.com/strategy/12961 . Встроенная, не требует копирования.

Библиотека CTA

  • Фиксированный диск автоматически отображает индекс в последовательности
  • Автоматизирует перевод
  • Отзыв может быть назначен на мапировку, например, rb000/rb888, то есть на мапировку rb-индексальных сделок на массивную последовательность
  • Также можно отобразить другие контракты, например rb000/MA888 - это K-линия rb-индекса, чтобы торговать последовательностью MA.
function main() { $.CTA("rb000,M000", function(r, mp) { if (r.length < 20) { return } var emaSlow = TA.EMA(r, 20) var emaFast = TA.EMA(r, 5) var cross = $.Cross(emaFast, emaSlow); if (mp <= 0 && cross > 2) { Log("金叉周期", cross, "当前持仓", mp); return 1 } else if (mp >= 0 && cross < -2) { Log("死叉周期", cross, "当前持仓", mp); return -1 } }); }

Пример вызова класса

function main() { var p = $.NewPositionManager(); p.OpenShort("MA609", 1); p.OpenShort("MA701", 1); Log(p.GetPosition("MA609", PD_SHORT)); Log(p.GetAccount()); Log(p.Account()); Sleep(60000 * 10); p.CoverAll("MA609"); LogProfit(p.Profit()); Log($.IsTrading("MA609")); // 多品种时使用交易队列来完成非阻塞的交易任务 var q = $.NewTaskQueue(); q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) { Log(task.desc, ret) }) while (true) { // 在空闲时调用poll来完成未完成的任务 q.poll() Sleep(1000) } }

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

Поскольку первоначальная функция рисования является более сложной, она будет представлена в следующем уроке. Новичкам рекомендуется использовать непосредственно библиотеку рисования, очень простую линейную диаграмму, K-диаграмму и т. Д.

img

Копирование из библиотеки Javascript
Копирование в библиотеке Python

Примеры:

function main() { while (true) { var ticker = exchange.GetTicker() if (ticker) { $.PlotLine('Last', ticker.Last) //可以同时画两条线,Last是这条线的名字 $.PlotLine('Buy', ticker.Buy) } Sleep(6000) } }

Настройка параметров политики

Под редактированием политики есть параметры политики, которые соответствуют глобальным переменным политики и доступны в любом месте в коде. Параметры политики могут быть изменены в интерфейсе реального диска и вступают в силу после перезагрузки. Таким образом, некоторые переменные могут быть установлены в качестве параметров, и параметры могут быть изменены без изменения политики.
img

  • Имя переменной: то есть, число, строка, комбокс и т.д. из приведенной выше диаграммы могут быть использованы непосредственно в группе стратегий.
  • описыватьНазвание параметров в интерфейсе стратегии для понимания их значения.
  • Примечание: подробное описание параметров, которое отображается, когда мышь останавливается на параметре.
  • тип: Тип параметра, подробно описанный ниже.
  • По умолчаниюПо умолчанию для параметра:

Типы строки и цифры легко понятны и являются наиболее часто используемыми типами. В диаграмме параметров в диаграмме параметров в диаграмме параметров будет отображаться диаграмма параметров, в которой параметры SYMBOL могут быть настроены наBTC|USDT|ETH, если вы выбрали USDT в параметрах внизу страницы, то значение SYMBOL в стратегии является индексом 1 USDT. Отметка является выборочным окном, отмеченным как true, в противном случае - false.

Параметры также могут быть настроены по следующим параметрам: https://www.fmz.com/bbs-topic/1306

Стратегия бэктестинга

После того, как вы провели количественную работу над стратегией, вы можете протестировать свою стратегию с помощью исторических данных, чтобы увидеть, как ваша стратегия прибыльна в исторических данных. Конечно, результаты отсчета предназначены только для справки. Количественная платформа FMZ поддерживает отсчет криптовалютных наличных, фьючерсных, долгосрочных контрактов BitMEX и товарных фьючерсов, в которых цифровые валюты поддерживают основные разновидности.
Javascript-отзыв выполняется в браузере, Python-отзыв требуется на хостере, который может быть предоставлен платформой. Отзыв на языке Mac требует дополнительных параметров, см. документацию на языке Mac.

Механизм отклика

Онбарная система отсчета основана на K-линии, то есть каждая K-линия генерирует точку отсчета времени, в которой можно получить информацию о текущих K-линиях, таких как высокая цена открытия и снижения, объем торгов, а также историческую информацию о K-линии до этой точки времени. Недостатки этой системы очевидны: на одной K-линии может быть произведена только одна покупка и продажа, обычно основанная на цене закрытия K-линии.

FMZ-платформа отслеживает два типа отслеживания: аналоговое отслеживание и реальное отслеживание. Аналоговое отслеживание будет генерировать тик, созданный в соответствии с аналогичным периодом нижней K-линии. На каждом нижнем периоде K-линии будет генерироваться 14 точек времени отслеживания.**В то время как реальные диски - это реальные тики, которые собираются примерно раз в несколько секунд, в настоящее время частично поддерживают реальную глубину (включает в себя 20 файлов), реальные тики.**Огромный объем данных, медленная скорость отсчета, поэтому не может отслеживаться особенно долгое время. Механизм отсчета FMZ позволяет стратегии торговать несколько раз на одной линии K, избегая ситуации, когда можно только заключить сделку с закрытой ценой, более точно и с учетом скорости отсчета.

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

Обратная съемка

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

Отображение страницы

img

  • Выбор страницы отслеживания, слева - страница редактирования стратегий.
  • Время начала и окончания отсчета. Поскольку данные неполны, отсчет может начинаться непосредственно с времени, когда есть данные.
    1. Обратная связьGetRecords()По умолчанию функция имеет период, но в коде можно указать и параметр периода.
    1. Выбор механизма отслеживания.
    1. Показать или скрыть настройки с множественным откликом.
    1. Максимальное количество журналов, данных о доходах, графических данных и т. д., чтобы предотвратить избыточный объем данных, приводящий к задержке браузера.
    1. Основные тики генерируются в соответствии с K-линейным периодом.
    1. Скидка сделок.
    1. Терпимость ошибок, которая имитирует ошибки при запросе API, проверяет допустимость ошибок в политике.
    1. будет ли отображаться иконка тренда, если будет использоваться функция индикатора TA, то она будет отображаться на иконке, и торговля будет отмечаться.
    1. Установка комиссионных
    1. Добавление бирж - торговые пары и активы.
  • Настройка параметров обратного измерения, если параметр является цифровым, также поддерживает оптимальные параметры одной клавиши, автоматически проходит обратное измерение параметров в соответствии с определенным диапазоном.

Различие отслеживания от диска

  • Поскольку объем данных слишком велик, фиксированный уровень отсчета в настоящее время поддерживает эти данные, но только последние данные).
    1. Отслеживание добавленные биржи являются отдельными счетами, в настоящее время не поддерживается переключение торговых пар. Поэтому невозможно работать с двумя торговыми парами в одной учетной записи.
    1. Невозможность использования сетевых запросов в обратном отчете.
    1. Отслеживание не может использовать расширения IO, только для работы с наиболее базовыми API.
    1. Отслеживание позволяет получить только стандартные данные, а не такие, как Info, находящиеся на диске.
    1. Возможны неудачи при повторном тестировании, обратите внимание на замораживание заказов.
    1. Фьючерсные отсчета не поддерживают рыночные цены.

Противоположности и ошибки

Как мы уже говорили ранее, в реальном пространстве есть возможность использовать API-интерфейс, чтобы получить доступ и вернуть его, если он потерпит неудачу.nullЕсли вы используете данные, которые вы получили, это может привести к ошибкам и остановке жесткого диска, поэтому вы должны быть терпимы к ошибкам.

Обычно используемые методы допуска ошибок

Часто ошибочные причины:

  • Ошибка доступа к сети API, просрочка доступа к интерфейсу будет возвращена null, в этот момент будет использоваться ошибка.
  • Ошибки ограничения биржи, такие как ограничение ip, точность заказа, частота доступа, ошибки в параметрах, недостаток активов, невозможность торговли на рынке, аннулирование уже выполненных заказов и т. Д. .
  • Обмен возвращает ошибки в данных, которые случаются, например, пустая глубина, задержка информации о счетах, задержка статуса заказов и т. Д.
  • Логическая ошибка программы.

Перед тем, как использовать API для возвращения данных, необходимо определить, является ли он нулевым. Ниже приведены наиболее часто используемые методы концентрации:

//1.判断为null进行处理 var ticker = exchange.GetTicker(); while(ticker == null){ Log('ticker 获取出错'); ticker = exchange.GetTicker(); } Log(ticker.Last); // 2.判断不为null再进行引用 var ticker = exchange.GetTicker(); if(!ticker){ Log(ticker.Last); } // 3._C()函数重试 var ticker = _C(exchange.GetTicker); Log(ticker.Last); // 4. try catch容错 try{ var ticker = exchange.GetTicker(); Log(ticker.Last); } catch(err){ Log('ticker 获取出错'); }

Если вы хотите получить ошибочную информацию, вы можете использоватьGetLastError(), возвращает последнюю строку с ошибкой, которая может быть обработана с помощью дифференциации.

FAQ

В заголовке форума собрано множество общих ошибок: https://www.fmz.com/bbs-topic/1427 。 Здесь приведены некоторые из них, а в случае возникновения вопросов можно перейти к Ctrl+F.

Как назначать опекунов?

Подробнее об этом в разделе "Добавить администратора"

Может быть, кто-то сможет переписать эту стратегию?

На сайте https://www.fmz.com/markets есть люди, которые предоставляют услуги по переписке, или консультируют в группе, но сами должны связаться с ними, но несут риски.

Время задержки для всех интерфейсов

Это означает, что доступ к интерфейсу биржи задерживается, если это случается нечасто, и если постоянно указывается, что сеть недоступна, необходимо использовать зарубежные серверы.

Ошибка ERR_INVALID_POSITION

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

symbol not set

Фьючерсный биржевой отзыв, в коде не установлены контракты, см. Функция exchange.SetContractType

BITMEX 429 error,{"error":{"message":"Rate limit exceeded retry in 1 seconds"...}}

Слишком часто посещают интерфейсы бирж.

{"status":6004,"msg":"timestamp is out of range"}

Время сервера должно быть обновлено, если сервер выходит за пределы временного ряда

GetOrder(455284455): Error: invalid order id or order cancelled.

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

GetOrders: 400: {"code":-1121,"msg":"Invalid symbol."}

Недействительная торговая пара, проверьте, была ли установлена ошибка.

Secret key decrypt failed

Не удалось расшифровать API KEY, если после настройки APIKEY был изменен пароль FMZ, попробуйте добавить страницу биржи в FMZ и переконфигурировать APIKEY.

Signature not valid: Invalid submission time or incorrect time format [[Неверное время отправки или неправильный формат времени]

Рекомендуется использовать Linux-серверы или синхронизирующее программное обеспечение для систем Windows, в которых возникает проблема.

Почему созданы глобальные агенты, а администраторы не могут получить доступ к API?

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

Как сохранить стратегию локально, а не на загруженной FMZ?

Используя Python, можно импортировать локальные файлы, сохранить их в виде файлов, которые обычно пишутся в соответствии с API-стратегией FMZ, и поместить их на свой собственный сервер под путь выполнения, чтобы можно было непосредственно прочитать выполнение.

#!python2.7 def run(runfile): with open(runfile,"r") as f: exec(f.read()) def main(): run('my.py')

Как использовать тестовую сеть или изменить базовый адрес API

Используйте exchange.SetBase () для прямого переключения на соответствующий адрес базы API, например:

exchange.SetBase("https://www.okex.me")
Related Recommendations
Comment
All comments (27)

    api

    3 years ago

    如何在本地实现策略运行呢?我写了一个简单的Log输出语句,并且按照文末的操作。
    第一步,先用一台笔记本作为服务器,运行托管者程序;
    第二步,写一个简单的Log输出信息的test.py程序(FMZ 的API接口函数);
    第三步,按文末那样,写个runfile,通过run.py调用test.py运行。 img

    4 years ago

    我买的网易云量化交易课程怎么没了,现在去哪里看

    5 years ago

    谢谢

    5 years ago

    many

    5 years ago

    hi

    5 years ago

    学习ing

    5 years ago

    有一个小的文字错误,GetAccount 获取账户 介绍中,FrozenStocks应该是冻结余额而不是可用余额吧

    5 years ago

    改了

    5 years ago

    有没有做BTB的实盘教程,

    a year ago

    大佬麻烦问下咱们有官方交流群吗?有时候遇到问题不知道该在哪提问

    5 years ago

    加首页微信,拉你入群

    5 years ago

    加我进群,我的实盘执行不起来

    a year ago

    getorder outtime 获取订单超时,okex的交易所,怎么办

    5 years ago

    再次获取

    5 years ago

    担保资产率获取不到吗,到0%会被强制平仓的担保资产率

    5 years ago

    原始信息里有,可以用GetRawJSON或者查看字段里的info信息

    5 years ago

    我是看1分钟k线图操作的,所以Python死循环的sleep time 可以设置为0.1s,也就是sleep(100)吗,我看你其中写过一个sleep(10),也就是0.1s不会超过huobi HM的API限制吗?

    6 years ago

    exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")

    这儿我试了OKex的永续合约,如果设置成 sell,直接开空了,平不是平多

    6 years ago

    exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")

    这儿我试了OKex的永续合约,如果设置成 sell,直接开空了,平不是平多

    6 years ago

    有些永续合约允许双向持仓的,需要设置平仓。我更新一下,原来只有bitmex

    6 years ago

    不错不错,还有管理回复。。我发现代码里好多拼写错误,哈哈

    6 years ago

    GetOrders 的代码里面有两个拼写错误。。。一个是 function写成了 fuction,另一个是for循环的条件里 ; 打成了 ,

    6 years ago

    嗯嗯,已改正,感谢指出错误

    6 years ago

    是我错了。。。
    exchange.Buy(-1, 0.5),交易对是ETH_BTC,市价单代表买入0.5BTC的ETH
    exchange.Buy(price, 0.5),如果是这种限价单,则代表用price的价格买入 0.5ETH

    6 years ago

    exchange.Buy(-1, 0.5),交易对是ETH_BTC,则代表市价买入0.5BTC的ETH

    这里应该是【代表市价买入0.5ETH】

    6 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)