В процессе загрузки ресурсов... загрузка...

FMZ количественная платформа стратегии написания начальных уроков ((обязательно смотреть))

Автор:Трава, Создано: 2019-08-13 17:47:27, Обновлено: 2021-08-06 10:29:46

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

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

Первоначальное описание стратегии

Введение API

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

В настоящее время на цифровых валютных биржах существуют два основных протокола интерфейса: REST и Websocket. Протокол REST требует одного доступа для каждого доступа к данным.

{"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. Websocket - это режим подписки, после отправки требуемого контента, биржа отправляет обновленные данные программе, не требуя повторного посещения каждый раз, поэтому более эффективно.

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

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

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

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

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

Рекомендации ресурсов

  • В этом уроке не будет подробно описано каждое из интерфейсов, но можно ознакомиться с ними:https://www.fmz.com/api
  • Если вы хотите получить сигналы от TradingView, чтобы разместить свой заказ на FMZ, обратитесь к следующей статье:https://www.fmz.com/digest-topic/5533
  • Является одним из ведущих разработчиков программного обеспечения в мире, который занимается разработкой программных продуктов для компьютеров.https://www.fmz.com/bbs-topic/382 https://www.fmz.com/bbs-topic/417
  • Маэльский язык - это очень удобное место для трендовых стратегий.https://www.fmz.com/bbs-topic/2569
  • Пример вызова C++ для тех, кто интересуется C++, но не рекомендуется использовать его, так как он не является интерпретационным языком.https://www.fmz.com/strategy/61533
  • NetEasy Cloud Classroom Currency Quantitative Trading Currency Quantitative Trading Currency, официальный продукт FMZ, всего 20 юаней, содержание полное деталей, от поверхности до глубины, подходит для новичков.Ссылки на курсы
  • Некоторые методы обучения, подходящие для раннего вступления и основных методов обучения при написании:https://www.fmz.com/square/s:tag:教学/1
  • Подробное описание стратегии:https://www.fmz.com/bbs/s:tag:源码解析/1

Инструменты для дебютирования

FMZ Quantum Platform предоставляет инструменты для дешифровки интерфейсов API.https://www.fmz.com/m/debug; дешифровка инструмента поддерживает только JavaScript, может выполняться только в течение некоторого времени, без создания диска можно дешифровать интерфейс биржи; данные return будут возвращены в качестве результатов, код дешифровки инструмента не будет сохранен. В этом уроке можно одновременно экспериментировать с дешифровкой инструмента.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)
    }
}

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

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, которые могут работать одновременно с одной и другой биржей.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)
}

ПолучитьГлубину

Получить информацию о глубине заказов. Хотя в 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-линии, если не указать, означает, что будет использоваться дефолтный цикл при добавлении реального диска. Длина K-линии не может быть указана, она будет увеличиваться с течением времени, увеличиваясь до 2000 штук, при первом вызове около 200 штук (разные биржи возвращаются по-разному). Последняя K-линия является последней 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)После обновления новейший хозяин поддерживает настройки циклов, прямое передача циклов в секунды в качестве параметров, настройки на уровне минут синтезируются на основе K-линий в 1 минуту и менее K-линий с помощью GetTrades (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))Обратите внимание, что в этом учебном пособии можно найти и другие подобные вещи.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-KEY.

GetAccount Получить аккаунт

Получение информации об аккаунте ─ один из наиболее часто используемых интерфейсов, который требует вызова перед последующим заказом, чтобы избежать недостаточного баланса ─ возвращает результаты, такие как:{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}; где Stocks - это доступный баланс торговой валюты в торговой паре, FrozenStocks - это баланс заморозки невыполненных заказов, Balance - это доступный баланс ценовой валюты, FrozenBalance - это баланс заморозки в торговой паре.BTC_USDTВ этом случае акции обозначают BTC, а баланс - 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 - это дополнительная строка, которая может быть показана в журнале реального диска, а не обязательна.null, который используется для поиска статуса заказа.

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

Требования к точности всех цен и количеств частичных сделок доступны_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')
}

Продать

Перепродажи. Параметры одинаковые с Buy. Параметры перепродажи.exchange.Sell(-1, 0.2)В результате, в результате продажи, 0,2 ETH были проданы по рыночной цене.

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

Получить информацию о заказах по идентификатору заказа.exchange.GetOrder(OrderId),OrderId - это ID заказа, который возвращается при заказе.Обратите внимание на тип заказа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 Отзыв

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

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

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

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

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

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

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

Существующие контракты на Bitcoin, OKEX, HuobiDM и другие контракты на Bitcoin и USDT должны быть различены при добавлении контрактов на диске. Конкретные параметры указаны ниже.

//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) фьючерсы могут быть переданы в параметр, который указывает тип контракта, который нужно получить. Если нет хранения, возвращается пустой список[]⇒ Информация о хранении возвращается следующим образом: много конкретной информации, требующей совмещения с конкретным анализом сделки.

Типы данных Имя переменной Объяснение
объект Информация Первоначальная структура биржи возвращается
Номер Уровень маржи Размер плеча, OKCoin 10 или 20, OK фьючерсный режим полного хранения возвращается на фиксированное 10, поскольку коренный API не поддерживает
Номер Сумма Объем хранения, OKCoin указывает на количество контрактов ((целые числа и больше чем 1)
Номер Замороженная сумма Количество заморозки позиции
Номер Цена Удельные цены
Номер Маржинальная сумма Заморозить гарантии
Номер Прибыль Коммерческие фьючерсы: убытки на рынке хеджирования, цифровые валюты: ((Единицы цифровой валюты: BTC/LTC, традиционные фьючерсы: RMB, Примечание: OKCoin фьючерсы означают реализацию профицита в случае полного хеджирования, а не убыток на рынке хеджирования, в зависимости от хеджирования)
конст Тип PD_LONG для многоголовых позиций (в CTP с закрытым покупком сегодня), PD_SHORT для пустых позиций (в CTP с закрытым продажей сегодня), PD_LONG_YD для многоголовых позиций (в CTP-фьючерсах) (в CTP-фьючерсах) (в CTP-фьючерсах) PD_LONG_YD для многоголовых позиций вчера (в CTP с закрытым покупком), PD_SHORT_YD для пустых позиций вчера (в CTP с закрытым продажей)
строка Тип контракта Фьючерсы на товары как код контракта, акции как код биржи _ коды акций как код биржи, конкретные параметры 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)В этом случае, 10 - это 10-кратный уровень левериджа, а размер левериджа, который поддерживает конкретная биржа, - это размер левериджа, который вы используете, чтобы оценить уровень левериджа на соответствующей бирже.Обратите внимание, что рычаг должен быть установлен на бирже, и в коде должен соответствовать установке биржи, иначе произойдет ошибка.‒ Вы можете отключить его и использовать рычаг по умолчанию. Затем настроить направление сделки, вызов:exchange.SetDirection(Direction)В отличие от фьючерсов, если постоянный контракт не имеет концепции одновременного хранения множества свободных позиций, то есть не разрешает хранения отдельных позиций, то открытие большего количества свободных позиций будет автоматически сглаживаться, все необходимо только установить.buyиsellЕсли поддерживается двустороннее хранение, необходимо установитьclosebuy,closebuy◦** Конкретные отношения:

Операция Параметры SetDirection Функции подчиненного
Очень много. Обмен.Установка направления ((купить) Обмен.Купить ((()
Плоская многоуровневая Обмен.Установка направления ((closebuy) Обмен.Продажа.
Открытый склад Обмен.Установка направления ((продажа) Обмен.Продажа.
Пустое помещение Обмен.Установка направления ((закрытие продажи) Обмен.Купить ((()

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

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; торговые частоты и количество заказов на товарные фьючерсы ограничены, а цифровые валюты очень свободны и т. д. Поэтому торговля товарными фьючерсами имеет много мест, требующих особого внимания, поэтому рекомендуется иметь богатый опыт работы с ручными операциями.https://www.fmz.com/bbs-topic/325‒ Коммерческие фьючерсные компании добавляют:https://www.fmz.com/bbs-topic/371

Коммерческие фьючерсы и в июне 2019 года внедрены прозрачные регулирование, индивидуальные программированные индивидуальные пользователи требуют, чтобы фьючерсы подали заявку на лицензионный код (конкретные шаблоны необходимой информации для конкретного заявления можно найти в группе WeChat или QQ), обычно требуется 4-5 дней, шаги более громоздкие. FMZ количественная платформа как программированный поставщик торговли подает заявку на лицензионный код программного обеспечения для различных фьючерс-сервисов, пользователи могут использовать его без необходимости подать заявку напрямую.https://www.fmz.com/bbs-topic/3860‒ Если ваш фьючерс больше не в списке, вы можете подать заявку самостоятельно, или снова открыть аккаунт у поддерживаемого трейдера, что обычно занимает 2 дня. ‒ FMZ имеет глубокие партнерские отношения с некоторыми поставщиками, такими как Гонконг Тайцзюань Макрон Фьючерс, который купил институциональную версию платформы FMZ, доступную для пользователей, открывающий автоматически становится VIP, а процедурные расходы минимальны. ‒ Ссылка на:https://www.fmz.com/bbs-topic/506

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

Стратегические рамки

Во-первых, поскольку это не 24-часовая транзакция и требует приземления, необходимо определить состояние ссылки до совершения транзакции.exchange.IO("status")ДляtrueЕсли вы не успели войти в систему, нажмите на кнопку "Sleep ((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)
        }
    }
}

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

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Все данные хранятся в кэше, чтобы получить последние данные, и при отсутствии данных будут ждать, пока будут данные, поэтому стратегия может быть использована без сна. Когда происходит изменение рынка, тикеры, глубина и записи обновляются, при этом любой интерфейс, который был вызван, возвращается сразу, состояние вызванного интерфейса ставится в ожидании обновления, и следующий раз, когда будет вызван тот же интерфейс, будет ждать, пока будут возвращены новые данные.

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

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

Посмотрите, что происходит с этими людьми.{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"): возвращает подписанные контракты на рынке, в том же формате, поддерживает только реальные диски.

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

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

Открытие сделки

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

Операция Параметры SetDirection Функции подчиненного
Очень много. Обмен.Установка направления ((купить) Обмен.Купить ((()
Плоская многоуровневая Обмен.Установка направления ((closebuy) Обмен.Продажа.
Открытый склад Обмен.Установка направления ((продажа) Обмен.Продажа.
Пустое помещение Обмен.Установка направления ((закрытие продажи) Обмен.Купить ((()

Следующий пример является конкретной функцией тиража, и обратите внимание, что этот пример слишком прост, но также учитывает ряд вопросов, таких как нахождение в момент торговли, как перепробовать заказы, сколько максимального объема заказов, является ли частота слишком высокой, а именно, скользкая цена или расчетный показатель.Например, если вы хотите, чтобы ваш сайт был более открытым, вы можете использовать его, чтобы открыть свой сайт.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 действителен в тот же день
  • gtd действителен до указанной даты
  • gtc действует до отмены THOST_FTDC_TC_GTC
  • gfa Сборная оферты действительны THOST_FTDC_TC_GFA

Простой интерфейс

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

Протоколы EASY CUSTOMIZE предлагают следующие типы заказов:

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

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

Log Log и WeChat

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

Цвета журналов также могут быть настроеныLog('这是一个红色字体的日志 #ff0000')#ff0000Для 16-ти элементарных цветов RGB

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

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 является функцией, которая автоматически повторяется._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-платформа имеет прямой встроенный индикатор.

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

JavaScript также поддерживает полный талиб, который поддерживается в качестве сторонней библиотеки.talib.CCI(records)Ссылка:http://ta-lib.org/function.htmlДля Python можно самостоятельно устанавливать талиб-либиру, из-за необходимости компиляции, не может быть простой установки с использованием 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.max(),Math.abs()Ссылки на другие математические операции:https://www.w3school.com.cn/jsref/jsref_obj_math.asp
  • ФМЗ ссылается на JavaScript третьей математической библиотеки, ссылки:https://mathjs.org/
  • FMZ ссылается на JavaScript третьей стороны подчеркивает библиотеку, рекомендуется узнать, что облегчает много сложных Js, см.:https://underscorejs.org/

Лаборатория шаблонов

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

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

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

Категория цифровых валют

Ссылка на исходный код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(exchange, "btc", "0x.........", 1.0, 0.0001, "***")

Категория товарных фьючерсов

Ссылка: http://www.commodityfutures.com/index.php?title=Category:Commodity Futures_Trading&oldid=105128https://www.fmz.com/strategy/12961⇒ Встроенный, не требует копирования.

CTA библиотека

  • Физический диск автоматически отображает индексы в основную последовательность.
  • Автоматическая обработка переводов
  • Рекомендации могут быть выполнены, например, rb000/rb888 или rb88.
  • Также можно отобразить другие контракты, например, 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-линии и т. д. FMZ имеет встроенную простую библиотеку классов, которую можно увидеть на странице редактирования политики, если нет встроенной, пользователь должен сам скопировать и сохранить, чтобы выбрать ссылку в политике.

img

Является одним из ведущих авторов фильма "Компьютерный мир".https://www.fmz.com/strategy/27293Напишите адрес копирования класса Python для печатных линий:https://www.fmz.com/strategy/39066

Конкретный пример:

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

Установка параметров политики

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

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

Типы строк и цифр просты в понимании и являются наиболее распространенными типами. Снизу в интерфейсе параметров отображаются опциональные снизу, например, можно установить значение параметра SYMBOL снизу.BTC|USDT|ETHЕсли вы выбрали USDT в выводе параметров, значение SYMBOL в политике будет индексом 1 USDT.

Есть много параметров, которые можно настроить.https://www.fmz.com/bbs-topic/1306

Стратегическая рецензия

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

Механизмы отбора

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


Больше

ГаоэнчерАпи

НаукаКак реализовать политику в локальном режиме? Я написал простое заявление на выпуск Log и сделал следующее действие в конце текста. Первый шаг - использовать ноутбук в качестве сервера и запустить программу администратора. Второй шаг - написать простую программу test.py для вывода информации Log (API-интерфейс FMZ); Третий шаг, как и в конце текста, написать runfile, который будет выполняться с помощью run.py с вызовом test.py.

гипп9Я купил курс по количественному трейдингу в облаке, но теперь я не могу найти его.

МонуРажакмного

МонуРажакЗдравствуйте.

БрюссельУчиться

ВкйЕсть небольшая ошибка в тексте, GetAccount получает аккаунт. В описании FrozenStocks должно быть замороженный баланс, а не доступный баланс.

Капитан Файя.getorder outtime получение заказа задержки, биржа okx, что делать

Удивительное дело.Недоступны ли гарантийные ставки, до 0% будут вынуждены балансировать гарантии.

Shifeng2020Я смотрю на 1-минутный к-строевой график, так что время сна мертвого цикла Python может быть настроено на 0.1s, то есть sleep ((100).

Восточный ветерexchange.SetDirection (("closebuy"); // если это постоянный контракт, сразу настроим exchange.SetDirection (("sell") Здесь я попробовал ОКекс постоянный контракт, если вы настроите его на продажу, он сразу же откроется, и это не так просто.

Восточный ветерexchange.SetDirection (("closebuy"); // если это постоянный контракт, сразу настроим exchange.SetDirection (("sell") Здесь я попробовал ОКекс постоянный контракт, если вы настроите его на продажу, он сразу же откроется, и это не так просто.

Восточный ветерВ коде GetOrders есть две орфографические ошибки. Одна из них - function, написанная как fuction, а другая - в условиях цикла for.

Восточный ветерЭто я ошибся. exchange.Buy ((-1, 0.5)), торговая пара ETH_BTC, которая представляет собой покупку ETH на 0.5BTC. exchange.Buy ((price, 0.5)), если это ограничительная цена, то это означает, что вы покупаете 0.5ETH по цене price.

Восточный ветерexchange.Buy ((-1, 0.5), торговая пара ETH_BTC, которая представляет собой покупку ETH за 0.5BTC по рыночной цене Это должно быть кукуруза для покупки кукурузы по рыночной цене 0.5 ETH.

гипп9Спасибо.

ТраваВсегда доступен в Интернете https://study.163.com/course/courseMain.htm?share=2&shareId=400000000602076&courseId=1006074239&_trace_c_p_k2_=c3f5d238efc3457d93c8b92c0398d2b2

ТраваДобавьте вкладку "WeChat" на страницу, чтобы привлечь вас в группу.

ВкйУ меня проблемы с вопросами, есть ли у нас официальная группа обмена?

ТраваИзменены

ТраваДоступ снова

ТраваС помощью GetRawJSON или просмотра информации в поле Info

Восточный ветерОчень хорошо, и администратор отвечает. Я обнаружил много орфографических ошибок в коде.

ТраваО, это было исправлено, спасибо, что указали на ошибку.

ТраваНекоторые постоянные контракты позволяют двустороннее хранение, требуя установки баланса.