Когда новичок разрабатывает стратегию количественной торговли криптовалютой, часто возникают различные требования к функциям. Независимо от языков программирования и платформ, все они будут сталкиваться с различными требованиями к проектированию. Например, иногда требуется несколько торговых сортов ротации, иногда требуется хеджирование на нескольких платформах, а иногда требуется одновременное использование различных торговых сортов.
Учебная платформа по-прежнему использует торговую платформу FMZ Quant (https://www.fmz.com), и рынок выбран как рынок криптовалют.
Большинство из этих ситуаций спроса подготовлены для стратегий тренда и сетки мультикриптовалют, которые должны быть выполнены на рынке с помощью различных методов итерации торговли.
Обычно дизайн такой:
function Process (symbol) {
exchange.IO("currency", symbol)
var ticker = _C(exchange.GetTicker)
Log("has switched trading pairs, processing trading pairs according to strategy logic:", symbol, "quotes: ", ticker)
// ...
// ..
// .
}
function main(){
var symbols = ["BTC_USDT", "LTC_USDT", "ETH_USDT"]
while (true) {
for (var i = 0 ; i < symbols.length; i++) {
Process(symbols[i])
Sleep(500)
}
}
}
Мы настраиваем робота:
Можно видеть, что это понимает, что обменный объект настроен на роботе, и торговая пара переключается; рынок различных торговых пар получается, и многоторговый рынок разнообразия выполняется; и он выполняется в соответствии с логикой стратегии.
Можно видеть, что три торговых пары, которые мы определяем: BTC_USDT, LTC_USDT, ETH_USDT, в петле, итеративно получают рыночную котировку, и после получения информации, он может специально обнаружить рынок и запустить логику торговли, разработанную стратегией.
Некоторые читатели могут спросить:
Действительно, есть и другие варианты дизайна, которые мы представим ниже.
Рыночные данные различных торговых пар получаются с помощью нескольких обменных объектов и выполняются в логике итеративной стратегии.
Например, настроить робота, настроив три обменных объекта для робота. Торговые пары установлены на BTC_USDT, LTC_USDT и ETH_USDT соответственно.
Название объекта обмена
Всё сделано.
Мы немного изменили этот код, потому что на этот раз мы добавили несколько обменных объектов в робот, которые являются обменными объектами торговой пары BTC_USDT, LTC_USDT, ETH_USDT.
function Process (e) {
var ticker = _C(e.GetTicker)
Log("exchange", e.GetName(), "Process trading pairs according to strategy logic:", e.GetCurrency(), "Quotes:", ticker)
// ...
// ..
// .
}
function main(){
while (true) {
for (var i = 0 ; i < exchanges.length; i++) {
Process(exchanges[i])
Sleep(500)
}
}
}
Запустите робота:
Пример, который мы описали выше, будь то переключение торговых пар или добавление объекта торговли для нескольких различных торговых пар конфигурационного счета.
Как использовать несколько счетов в одной стратегии?
Некоторые стратегии, такие как многобиржевое перекрестное хеджирование рынка, стратегии с несколькими счетами в рамках одной биржи.
Например, мы сконфигурировали 2 обмена на панели управления -> Обмен -> Добавление обмена страницы.
мы можем получить доступ к информации о активах счетов, конфигурированных этими двумя биржами в стратегии.
function main(){
Log(exchanges[0].GetAccount()) // Print the account asset information of the first exchange object.
Log(exchanges[1].GetAccount()) // ... Print the asset information of the Bit-Z exchange
}
Конечно, я также могу добавить вторую и третью конфигурацию обмена счетов в обмен.
Например, мы добавляем еще один счет для Huobi Futures.
Как видите, это конфигурирует счета двух
Когда стратегия создается, объект Huobi Futures Exchange появляется в опции Robot
Например, это позволяет двум счетам продавать сначала, а затем покупать с типичной сетевой стратегией (вверх) или покупать сначала, а затем продавать (вниз).
В двух приведенных выше примерах
Вот разница между настройкой нескольких обменных объектов на роботе и настройкой нескольких обменных объектов для одного и того же обменного счета для робота:
Этот яркий и упомянутый выше пример
Разница заключается в том, что приведенный выше пример представляет собой конфигурацию обмена, то есть:
Когда робот настраивает объект обмена, он всегда использует:
Эта конфигурация.
Просто когда вы добавляете обменный объект, настройки торговых пар отличаются.
При вызове функции GetAccount доступ к информации о активе на том же счете всегда осуществляется.
однако:
Два фьючерсных обменных объекта, конфигурированных таким образом, хотя все они являются фьючерсными фьючерсами, представляют собой разные обменные счета.
Иногда в стратегии хеджирования контракта криптовалюты, для того чтобы воспользоваться мимолетными торговыми возможностями, необходимо одновременно разместить много сценариев. Однако, поскольку контракт отличается, вам нужно переключиться на соответствующий контракт, когда вы получаете рыночную котировку и размещаете заказ.exchange.Go
И дизайн контракта переключения также делает логику не так просто. есть ли лучший способ?
Конечно, есть, мы можем добавить два обменных объекта к роботу, следуя
Затем используйте эту конфигурацию обмена для добавления другого объекта обмена.
Появится поле с указанием!
Конфигурация обменного счета, вы не можете добавлять обменные объекты одной валюты или торговой пары.
Что мне делать? Кажется, что робот стратегии не может использовать два обменных объекта, и обменный объект связан с номером обменного счета?
Есть еще выход!
Давайте перейдем к
Нажмите Сохранить при настройке.
Таким образом у нас есть две конфигурации обмена, но используется одна и та же информация конфигурации API KEY.
Какие преимущества это приносит?
Когда вы пишете стратегию, дизайн будет очень простым!
function main(){
exchanges[0].SetContractType("quarter") // Set the first added exchange object. The current contract is a quarterly contract.
exchanges[1].SetContractType("this_week") // Set the second added exchange object, the current contract is the current week contract
while (true) {
var beginTime = new Date().getTime() // Record the timestamp from which this time the market quote was taken.
var rA = exchanges[0].Go("GetTicker") // Create a concurrent thread to get the first exchange object, which is the market data for the quarterly contract.
var rB = exchanges[1].Go("GetTicker") // Create a concurrent thread to get the second exchange object, which is the market data for the weekly contract.
var tickerA = rA.wait() // The two threads executing each other perform their own tasks, waiting to get the data. When A waits, the B task is also executing.
var tickerB = rB.wait() // So it seems to be sequential execution, actually at the bottom of the concurrency. Only when you get the order is to get A first, and get B.
var endTime = new Date().getTime() // Record the timestamp at the end of the two contract quotes.
if (tickerA && tickerB) { // If there is no problem with the data obtained, execute the following logic.
var diff = tickerA.Last - tickerB.Last // calculate the difference
$.PlotLine("diff", diff) // Use the line drawing library to plot the difference on the chart.
if (diff > 500) { // If the spread is greater than 500, hedge arbitrage (of course, the difference of 500 is relatively large, rarely seen.)
// Hedging
rA = exchanges[0].Go("Sell", tickerA.Buy, 1) // Concurrent threads create a selling order under the quarterly contract
rB = exchanges[1].Go("Buy", tickerB.Sell, 1) // Concurrent thread create a buying order under the weekly contract
var idA = rA.wait() // Waiting for the return of placing order results, returning the order ID
var idB = rB.wait() // ...
}
// ...
}
LogStatus(_D(), "Concurrently get two contract quotes taking time:", endTime - beginTime, "millisecond.") // Shows the time on the status bar to know that the program is executing.
Sleep(500)
}
Эта стратегия дизайна гораздо проще и понятнее?
Реальная рыночная операция:
Как видите, требуется всего около 50 миллисекунд, чтобы получить цену на два контракта каждый раз.