
Изучите торговую стратегию построения визуальных модулей (вводная глава) и получите концептуальное представление о построении и сращивании визуальных модулей. Затем легко научиться использовать другие модули. Некоторые более сложные функции можно комбинировать.
В предыдущих исследованиях и тестах мы столкнулись с несколькими модулями «транзакционных категорий». Например: Модуль «Биржевые котировки» Модуль «Обмен и получение K-линии» …
Я не буду вдаваться в подробности о тех, которые уже были использованы.

При написании стратегии торговли с помощью робота можно добавить более одного объекта биржи, например, стратегию хеджирования. Или вам необходимо обойти (обход означает посещение каждого объекта по отдельности) объекты биржи, чтобы получить доступ к рыночным условиям. На данный момент вам необходимо использовать модуль для получения количества обменов.
Сначала мы можем использовать простую структуру для вывода количества настроенных в данный момент обменов:

Фактически, это то же самое, что вызвать следующий код политики JavaScript:
function main () {
Log(exchanges.length)
}
Давайте посмотрим на результаты работы этого комбинированного модуля:

Вы можете видеть, что мы добавили 3 объекта обмена, представляющих три разных счета обмена, и результат вывода журнала бэктеста — 3.

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

Давайте заранее изучим модуль условного суждения:
Условие суждения можно записать как:

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

Результаты бэктестинга:

Как и код стратегии JavaScript:
function main () {
for (var i = 1 ; i <= exchanges.length ; i++) {
if (i == 1) {
Log(exchanges[0].GetName())
} else if (i == 2) {
Log(exchanges[1].GetName())
} else {
Log(exchanges[2].GetName())
}
}
}

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

Если вы вызываете код политики JavaScript:
function main () {
var text = exchange.GetCurrency()
Log(text)
}
Этот модуль очень важен и используется для операций заказа. Переменная цены встраивается в первую позицию шипа (паза) для указания цены заказа. Вы также можете напрямую ввести фиксированное значение.
Вторая позиция шипа (точка) встраивает переменную объема заказа, которая используется для указания объема заказа.
Например, мы создадим пример размещения ордера на покупку на основе последней цены текущих тиковых рыночных данных с проскальзыванием в 10 юаней, установим объем ордера на 0,1 монеты и распечатаем идентификатор ордера.

Результаты бэктестинга:

Как в следующем коде политики JavaScript:
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last + 10, 0.1)
Log(id)
}

Этот модуль вернет все незавершенные ордера для текущей торговой пары. Возвращаемая структура представляет собой список (массив), который может быть обработан модулями типа списка (операции обхода и т. д.). Например: мы немного изменим приведенный выше пример модуля заказа [4] и изменим цену в 10 юаней, добавленную при размещении заказа, на вычитание цены в размере 10 юаней. Ордер не будет исполнен немедленно, а будет находиться в ожидании в глубине покупок и продаж (т. е. на определенном уровне между Buy 1, Buy 2 и Buy N), так что ордер находится в отложенном ордере, ожидая исполнения. Затем мы используем модуль «Получить ордер на поручение текущей торговой пары» для получения списка ордеров в состоянии PENDING (ожидание исполнения). Чтобы избежать исполнения ордеров в последующих рыночных условиях и повлиять на окончательное наблюдение бэктеста, после выполнения модуля «Получить ордер на доверительное управление текущей торговой парой» и распечатки списка ордеров мы немедленно используем «Выдать исключение “модуль для остановки программы.

Бэктестинг показывает:

Цена ордера на покупку на 10 юаней ниже последней цены на тот момент, поэтому транзакция не будет завершена немедленно. Затем получите ордера, ожидающие исполнения, и распечатайте их. Наконец, выдается исключение для остановки программы.
Весь собранный модуль подобен вызову стратегии JavaScript:
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last - 10, 0.1)
Log(id)
Log(exchange.GetOrders())
throw "stop"
}

Этот модуль используется для отмены заказа.
Существует множество сценариев, когда это требуется при написании политик:
Отменить все текущие заказы.
Несомненно, это потребует использования «модуля отмены ордера». Изучая модуль отмены ордера, мы можем использовать [5] для получения модуля для текущего ордера на доверительное управление торговой пары и объединить их для достижения этой функции.
Во-первых, чтобы протестировать отмену всех заказов, размещение заказа не очень очевидно, мы начнем с размещения двух заказов с разными ценами и количествами, чтобы различать два заказа.

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

Использование описания политики JavaScript:
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last - 10, 0.1)
Log(id)
var id2 = exchange.Buy(_C(exchange.GetTicker).Last - 12, 0.2)
Log(id2)
var orders = exchange.GetOrders()
Log(orders)
for (var i in orders) {
var order = orders[i]
Log(exchange.CancelOrder(order.Id))
}
}

Этот модуль может возвращать подробную информацию о заказе, подключив модуль переменной идентификатора заказа к положению паза и шипа.

Обратите внимание на порядок, возвращаемый после запуска:

Сравнивая результаты с результатами, полученными в примере [5], можно обнаружить, что напечатанный заказ представляет собой отдельную информацию о заказе.[] Заключено в квадратные скобки.
Поскольку пример [5] возвращает список, этот пример возвращает информацию об одном заказе (полученную на основе модуля переменной ID в позиции шипа, переданной модулем).
Приведенный выше пример эквивалентен выполнению политики JavaScript:
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last - 10, 0.1)
Log(exchange.GetOrder(id))
}
Мы изучаем вышеуказанные модули один за другим и устанавливаем тестовую биржу на товарные фьючерсы.
Настройки бэктестинга:
Следующий пример тестирует эту настройку.

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

Если объект биржи настроен как фьючерсная биржа, и вы не устанавливаете контракт и не получаете рыночную информацию напрямую, будет выдано сообщение об ошибке:

Мы установили контракт на MA909, который в настоящее время является основным контрактом на метанол.
Таким образом, получается последнее значение цены на текущем тиковом рынке контракта MA909.
В модуле порядка выполнения

Направление ордера необходимо указывать, поскольку фьючерсы имеют:
купить: открыть длинную позицию
продажа: открыть короткую позицию
closebuy : закрыть длинную позицию
closesell : закрыть короткую позицию
Четыре направления (у товарных фьючерсов есть еще два направления: closebuy_today закрывает длинные позиции сегодня, closesell_today закрывает короткие позиции сегодня).
Например, если модуль ордера настроен на покупку, то существует два значения: открыть длинную позицию и закрыть короткую позицию, что создает неоднозначность. Поэтому для установки четкого направления ордера необходим модуль «Установка направления ордера для торговли фьючерсами».

Бэктестинг показывает:

Как и код стратегии JavaScript:
function main () {
while (true) {
if (exchange.IO("status")) {
exchange.SetContractType("MA909")
Log(exchange.GetTicker().Last)
exchange.SetDirection("buy")
Log(exchange.Buy(1000, 1))
throw "stop"
} else {
Log("未连接商品期货前置机")
}
Sleep(1000)
}
}
Использование фьючерсов на цифровые валюты в основном такое же, как использование товарных фьючерсов в [8] выше.
На примере OKEX код контракта может быть следующим:
BitMEX :
Настройка модуля кредитного плеча

Используется для установки кредитного плеча для фьючерсов на цифровые валюты.
# 注意 : 回测不支持。
Как в стратегии JavaScript:
function main () {
exchange.SetMarginLevel(10)
}
Пример стратегии визуализации:
Больше стратегий доступно на сайте: https://www.fmz.com/square
Другие статьи этой серии