[TOC] Этот учебник включает в себя начальные знания по написанию стратегий, включая описание API, отзывы, диаграммы и т. Д. После изучения этого базового учебника пользователь сможет мастерски использовать базовые API, писать стабильные стратегии на твердом диске. Перед изучением этого учебника необходимо сначала изучитьВведение в квантовую платформу разработчика FMZ 。
Старая версия:Изобретатели количественное (FMZ.COM) стратегии для написания полностью используется в руководстве 2.0 (учебное пособие)В этом руководстве приведено множество индексов постов, которые рекомендуется просмотреть.
Программированная торговля - это использование программ для подключения к 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)
}
}
ФМЗ Quantum Platform предоставляет инструмент для дебютирования API интерфейса, http://www.fmz.com/m/debug 。 инструмент поддерживает только JavaScript, может выполняться только в течение некоторого времени, а для дебютирования биржевого интерфейса не требуется создания реального диска。 возвращенные данные возвращаются в качестве результатов, код инструмента для дебютирования не сохраняется。 в этом учебном пособии можно одновременно использовать инструмент для тестирования.

Особенностью стратегии, как и обычной программы, является то, что она выполняется в последовательности по коду, но должна иметь основную функцию. Поскольку стратегия должна работать непрерывно, в большинстве случаев требуется один цикл плюс время покоя. Поскольку частота доступа ко всем API для транзакций ограничена, необходимо соответствующее время покоя.
Другие специальные функции:
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, связанного с биржей, необходимо указать биржу и торговую пару.exchangeНапример:exchange.GetTicker()Полученный будет тикер курса этой биржи - торговой пары.
Платформа FMZ поддерживает одновременное добавление нескольких биржевых пар, например, BTC и ETH, которые могут одновременно работать на одном и том же биржевом счету, могут одновременно работать на BTC и ETH на одном и том же бирже. Обратите внимание, что одновременно могут быть добавлены различные счета на одном и том же бирже, которые различаются в зависимости от ярлыка, добавленного на веб-сайте FMZ.exchangesАреал представлен следующим образом, в зависимости от того, в каком порядке был создан диск:exchanges[0]、exchanges[1]… и так далее. Формат сделки:BTC_USDT, где BTC является валютой для торговли, а USDT - валютой для ценообразования.

Очевидно, что если мы будем работать с большим количеством торговых пар, этот способ будет проблематичным, и мы можем использовать 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, используя данные из них, возникают ошибки и приводят к остановке жесткого диска, поэтому терпимость очень важна.
Получение текущей ситуации на рынке, вероятно, является наиболее часто используемым интерфейсом, можно найти информацию о последних торговых ценах, ценах на покупку и продажу, последних торговых объемах и т. д.{"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)
}
Получить информацию о глубине привязки. Хотя в 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)
}
Получение 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
}
Получить данные о сделках за определенный промежуток времени (не собственные данные о сделках), некоторые биржи не поддерживают. Нечасто используется, более подробное описание можно найти в документации API.
Поскольку эти интерфейсы связаны с учетными записями и не могут быть получены напрямую, они требуют использования подписи API-KEY. Платформа FMZ была автоматизирована в фоновом режиме и может быть использована напрямую.
Получить информацию о счете. Один из наиболее часто используемых интерфейсов, который необходимо вызвать перед заказом, чтобы избежать недостаточного баланса.{"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.
Получение информации о заказе по идентификатору заказа.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)
}
}
}
}
Получить текущую сделку для всех незавершенных заказов. Если нет незавершенных заказов, возвращается пустой матрица. Список заказов является конкретным результатом, таким как 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)
}
}
Отмена заказа в соответствии с id.exchange.CancelOrder(OrderId)。 отмена успешная возвращает true, в противном случае возвращает false。 обратите внимание, что если заказ был полностью выполнен, то отмена будет провальной。
Фьючерсные сделки в цифровой валюте отличаются от торговли наличными деньгами. Вышеуказанные функции для торговли наличными деньгами также применяются к фьючерсным сделкам. Перед проведением процедурных торгов в цифровой валюте необходимо ознакомиться с основными концепциями, такими как открытие позиции, уменьшение позиции, полное уменьшение позиции, уменьшение позиции, рычаг, уменьшение позиции, убыток, плавающая прибыль, гарантия и т. Д., а также с соответствующими формулами расчета.
Контракт на постоянное время похож на контракт на будущее, но отличается тем, что не имеет концепции одновременного владения свободным местом.
Если биржа поддерживает одновременно фьючерсные наличные, такие как OKEX и Huobi Futures, необходимо отдельно в интерфейсе биржи выбрать фьючерсный ящик OKEX и фьючерсный ящик Huobi. Фьючерсный ящик Huobi должен быть добавлен, чтобы рассматриваться в FMZ как иная биржа, чем наличные.
Первым шагом в торговле фьючерсами является настройка контракта для торговли, например, фьючерсы 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官网。
Получить список информации о текущем положении, OKEX(OKCOIN) фьючерсы могут быть переданы в параметр, указывающий тип контракта, который нужно получить. Если нет положения, возвращается пустой список[]│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
| Типы данных | Имя переменной | проиллюстрировать |
|---|
Обратная структура обмена object number Margin Level Rod Size OKCoin 10 или 20, Future Forex Forex Forex Forex Forex Forex Forex Forex “Amount” означает количество депозитов, “OKCoin” означает количество контрактов (всего числа, больше 1), “OKCoin” означает количество контрактов (всего числа, больше 1) “Нумер, цена и средняя цена на акции”. “Намбер иджад Маргин иджад иджад замороженная гарантия” Профицит фьючерсов OKCoin при полном запасе означает прибыль, а не убыток, а снижение позиции означает убыток) const 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”) и переключитесь обратно на обычный режим учетной записи.
Поддерживаемые биржи:
Торговля товарными фьючерсами и торговля цифровыми валютами имеет большое различие. Во-первых, сроки торговли товарными фьючерсами коротки, цифровые валюты торгуются 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, все сделки и сделки с ордерами уведомляются только после изменения, а запросы на заказы, счета и позиции являются активными запросами. Поэтому подходит для написания высокочастотных стратегий, управляемых событиями.GetTicker、GetDepth、GetRecordsВсе данные имеют кэширование, чтобы получить последние данные, а если нет данных, они будут ждать до тех пор, пока есть данные, поэтому стратегия может не использовать Sleep. Когда ситуация меняется, тикер, глубина и записи обновляются, в это время вызов любого из интерфейсов возвращается немедленно, состояние интерфейса, которое было вызвано, помещается в режим ожидания обновления, в следующий раз, когда будет вызван тот же интерфейс, будет ждать, пока не вернутся новые данные.
Если мы хотим, чтобы каждый раз, когда мы получаем информацию, мы получали данные, даже старые данные, мы могли бы переключиться на режим “немедленного обновления информации”.exchange.IO("mode", 0)❚ В этом случае стратегия не мож�