При разработке первичных стратегий количественной торговли криптовалютами часто возникает множество различных стратегических потребностей, которые возникают в разных ситуациях, независимо от языка и платформы. Например, иногда требуется многообразие оборотов, иногда требуется многообразие хеджировок, иногда требуется многообразие параллельных операций и т. Д. Ниже мы поделимся некоторыми опытами разработки при реализации стратегических потребностей. Учебные платформы по-прежнему используют квантовые торговые платформы изобретателей.https://www.fmz.com), рынок выбирает рынок цифровых валют.
Такие ситуации требуют написания многообразной стратегии тренда, многообразной стратегии решетки и т. д. Обычно дизайн выглядит так:
function Process (symbol) {
exchange.IO("currency", symbol)
var ticker = _C(exchange.GetTicker)
Log("已经切换交易对,按照策略逻辑处理交易对 :", symbol, "行情:", 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.
Название объекта биржи - "ОКЕКС Тест V3", на странице конфигурации биржи в Центре управления:В этом случае мы не будем делать никаких ошибок.
Измените код, потому что в этот раз мы добавили боту несколько обменных объектов, в том числе обменные объекты BTC_USDT, LTC_USDT, ETH_USDT.
function Process (e) {
var ticker = _C(e.GetTicker)
Log("交易所", e.GetName(), "按照策略逻辑处理交易对 :", e.GetCurrency(), "行情:", 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()) // 打印第一个 交易所对象的账户资产信息,即火币期货 这个交易所的资产信息。
Log(exchanges[1].GetAccount()) // ... 打印Bit-Z这个交易所的资产信息
}
Конечно, я могу также настроить обменную конфигурацию для второго или третьего аккаунта на одной бирже.
Поскольку многие биржи находятся в одном и том же конфигурации, они являются одной и той же биржей.
Например, мы добавили счет для торгового фьючерса.
Как видите, так настраиваются счета двух "токенных фьючерсов".
При создании стратегии в опции "Изменить конфигурацию" бота появляется еще один объект для выбора.
Например, это позволяет двум аккаунтам использовать одну стратегию покупки-продажи-начальника ("вверх") и одну стратегию покупки-продажи-начальника ("вниз").
Вот разница между конфигурацией нескольких объектов на бирже на роботе и "один и тот же счет на бирже конфигурирует нескольких объектов на бирже для робота":
На первый взгляд, этот пример похож на пример, описанный выше: "Один и тот же торговый счет конфигурирует роботам несколько торговых объектов", но с некоторыми отличиями. Разница заключается в том, что приведенный выше пример представляет собой конфигурацию биржи, то есть:
Всегда используются следующие объекты при конфигурации роботов:Эта конфигурация.
Это просто добавление объекта биржи, и транзакция настраивается по-разному. Если вызвать функцию GetAccount, то всегда будет доступна вся информация о активах в одном и том же счете.
Однако:Два токенов, конфигурированных таким образом, являются объектами фьючерсных бирж, хотя и являются токенными фьючерсами.
Иногда при реализации стратегии хеджирования контрактов цифровых валют, для того чтобы воспользоваться мгновенными торговыми возможностями, многие сценарии требуют одновременного отправления контрактов. Однако, поскольку контракты различны, необходимо переключаться на соответствующий контракт при получении рынка, при выполнении операции с заказами. При использовании функции exchange.Go одновременное выполнение функций с заказами или при получении рынков не бывает быстрым из-за проблем с синхронизацией.
Конечно, есть способ! Мы можем добавить к боту два объекта биржи, как мы говорили выше: "Одна и та же учетная запись на бирже может быть настроена для бота с несколькими объектами биржи".Затем используйте эту конфигурацию для добавления объекта обмена. В этом случае появляется поле подсказок!Конфигурация счета биржи не позволяет добавлять обменные объекты с одинаковой валютой.
Как это сделать? Не кажется ли, что можно сделать тактический робот с двумя объектами биржи и связать объекты биржи с одним кодом счета? Но есть и другие варианты!
Мы добавили конфигурацию фьючерсной биржи OKEX в "Контроль-центр" - "Биржа".
Нажмите "Сохранить" для конфигурации.
Что вы получаете от этого? Конечно, когда дело доходит до написания стратегии, дизайн простой!
function main(){
exchanges[0].SetContractType("quarter") // 设置第一个添加的交易所对象 当前的合约为季度合约
exchanges[1].SetContractType("this_week") // 设置第二个添加的交易所对象,当前的合约为当周合约
while (true) {
var beginTime = new Date().getTime() // 记录这次获取行情时起始的时间戳。
var rA = exchanges[0].Go("GetTicker") // 创建并发 线程去获取 第一个交易所对象,也就是季度合约的行情数据。
var rB = exchanges[1].Go("GetTicker") // 创建并发 线程去获取 第二个交易所对象,也就是当周合约的行情数据。
var tickerA = rA.wait() // 并发的两个线程各自执行自己的任务,这里等待获取数据,A 等待时,B任务也在执行。
var tickerB = rB.wait() // 所以这里看似是顺序执行,实际在底层是并发的。只不过获取的时候是顺序先获取A,在获取B。
var endTime = new Date().getTime() // 记录并发获取两个合约行情结束时的时间戳。
if (tickerA && tickerB) { // 如果获取的数据没有问题,执行以下逻辑。
var diff = tickerA.Last - tickerB.Last // 计算差价
$.PlotLine("diff", diff) // 使用画线类库把差价画在图表上。
if (diff > 500) { // 如果差价大于500, 对冲套利(当然设置500 的差价是比较大的,很少见。)
// 对冲
rA = exchanges[0].Go("Sell", tickerA.Buy, 1) // 并发线程创建 季度合约下卖单
rB = exchanges[1].Go("Buy", tickerB.Sell, 1) // 并发线程创建 当周合约下买单
var idA = rA.wait() // 等待 返回下单结果,返回的是订单ID
var idB = rB.wait() // ...
}
// ...
}
LogStatus(_D(), "并发获取两个合约行情耗时:", endTime - beginTime, "毫秒。") // 显示在状态栏上时间,以便知道程序在执行。
Sleep(500)
}
}
Подобная стратегия дизайна кажется нам очень простой и ясной.
Диск работает:
Как видите, каждое одновременное получение двух контрактов занимает около 50 миллисекунд.
Стремиться к количествуИ последнее решение было бы очень хорошим.
БвксяокУдивительно, это очень помогло!