Пакет расширений для Автоторговли

Пакет состоит из следующих дополнений:


  • Стратегия Spread
  • EMA фильтр и EMA стратегия
  • Доп. параметры в стратегии MoonShot для настройки повторных сработок
  • Набор параметров для управления сессиями

Пакет расширений для Автоторговли активируется дополнительно за кредиты.

Чтобы открыть меню кредитов, нажмите надпись PRO Version в нижнем правом углу, или надпись "MoonCredits" в "Настройках - вкладка ПРО" (доступно только если у вас есть кредиты). Без активации функции из этого пакета работают только в режиме Эмулятора, включенного через Меню бота.

Стратегия Spread

Под спредом понимаем активные торги в зоне, определяемой временем и размахом цены.

Пример работы стратегии Spread на листинге монеты DODO

Параметры стратегии:

  

TimeInterval: Ширина зоны по времени, сек, в которой производится расчет.

TradesDensity: Плотность трейдов по времени, проценты. Для вычисления интервал делится на маленькие кусочки по 200мс и считается отношение кусочков, где есть хотя бы 2 трейда с разной ценой, и “пустых” кусочков (без трейдов). Т.е. 100% плотность - значит трейды с разными ценами есть как минимум каждые 200мс.

TradesDensityPrev: Плотность трейдов перед детектом. Позволяет отсечь монеты, которые изначально лежали. Для пампов ставить этот параметр в 0! (ибо нужны как раз лежачие монеты).

TradesCountMin: Каждые 200мс на всем интервале детекта есть как минимум столько трейдов. По умолчанию 0; этот параметр сильно зажмет детекты, будет брать только высокую плотность трейдов.

PriceIntervals: На сколько равных интервалов делить TimeInterval для вычисления размаха цены. Общий интервал делится на PriceIntervals кусков, на каждом куске считается макс. и мин. цена и дельта (разница) между ними.     

       

PriceSpread: Спред (в процентах) для детекта. Детект происходит, если на каждом куске из пункта выше размах цены был больше чем PriceSpread.

IntervalsForBuySpread: Сколько последних отрезков из PriceIntervals брать для расчета мин. и макс. цен в спреде. Если 0 , то считается на всем TimeInterval.

BuyPriceInSpread: на сколько процентов в спреде ставить покупку. Если лонг - то этот процент отсчитывается от мин. цены вверх, если шорт - то от макс. цены вниз. Примеры: 0% лонг поставится на мин. цену в спреде; 50% поставится посредине: -100% шорт поставится выше на удвоенное расстояние спреда

Обратите внимание! Параметр BuyPrice из общего раздела BuyOrder так же влияет на цену покупки. BuyPriceInSpread в этом случае определяет “базовую цену”, от которой уже отсчитывается BuyPrice.

SellPriceInSpread: Аналогично BuyPriceInSpread, предопределенная цена продажи в зависимости от спреда. В отличие от BuyPriceInSpread, цена продажи берется как максимальная из SellPrice и цены продажи по спреду. Иначе говоря, если SellPrice меньше спреда (например SellPrice=0) - продажа ставится по спреду. Если больше - продажа ставится по SellPrice. (Также на цену продажи влияют модификаторы).

BuyOrderReduce: задает интервал (в мс) на котором считать средний объем торгов. Стратегия выставит ордер размером не больше, чем средний объем. По умолчанию 100 (мс). Как считается объем: суммируется объем всех сделок (покупки и продажи) на интервале TimeInterval и делится на BuyOrderReduce. Например, если TimeInterval = 5 сек (5000 мс), BuyOrderReduce = 100мс, объем за 5 сек был 10 000$, то средний объем за 100мс будет равен 10000/5000мс*100мс=200$. В этом случае стратегия поставит ордер не более 200$

Иначе говоря, смотрим какой же был средний объем за 100 (мс)/ 10мс/ 5мс, это и есть наш максимальный ордер какой выставит стратегия.

BuyOrderReduce=0 - параметр отключен

Работу функции уменьшения ордера можно увидеть в логе по такой записи:

IOTA: [1] (40) Buy order reduced: 1000.00$ => 23.32$ (Vol: 23.32$)

В этом логе OrderSize в стратегии стоял 1000$, но средний объем торгов за 100мс составил всего 23$, поэтому стратегия выставила ордер на покупку размером 23$.

SpreadRepeatIfProfit: Повторное выставление бай ордеров в течении 1 сек после детекта (не позже). Повторный ордер ставится, если текущая цена приблизилась к цене продажи больше, чем на SpreadRepeatIfProfit процентов. Если 0, повторные ордера не ставятся. Если 100, ставятся только после продажи селла (не более 5 повторных ордеров, внутреннее ограничение).

SpreadFlat: если YES, то бот будет пытаться определять спред в горизонтальном канале.

Spread_BV_SV_Time: интервал (в миллисек) для анализа. Если 0, эти параметры не учитываются.

Spread_BV_SV_Max: Отношение покупок к продажам не больше, чем это значение. Если 0, не учитываются.

Spread_BV_SV_Min: Отношение покупок к продажам не меньше, чем это значение.

Если в стратегии стоит шорт, то отношение переворачивается автоматически! (т.е. для шорта считается отношение продаж к покупкам).

Пример: Spread_BV_SV_Time = 1500 (полторы секунды)

За последние полторы сек. было бай трейдов на 500$ и селл трейдов на 1000$

Отношение bv/sv будет 500/1000 = 0.5 для лонга, 1000/500 = 2 для шорта.

Пример

TimeInterval =5 сек. 

TradesDensity=100

PriceIntervals = 5 

PriceSpread = 0.3%

IntervalsForBuySpread=2

BuyPriceInSpread=5

SellPriceInSpread=100

BuyOrderReduce = 100

Это значит, что последние 5 сек. каждую секунду имело место колебание цены на 0.3% (или выше). Для расчета бай и селл ордера берем последние 2 интервала (IntervalsForBuySpread=2), устанавливаем бай ордер +5% от минимального значения, а селл ордер на максимум (100%).При этом, если приведенный объем за 100мс меньше, чем OrderSize стратегии, то будет выставлен ордер, равный объему

Внимание! Стратегия Спреда связана с очень высокими рисками. Используйте ее без автопокупки, как детект, чтобы понять как она работает. Только после полного понимания настраивайте на реальную торговлю.

Замечания:

  1. ОЧЕНЬ важно использовать фильтры по Latency в стратегии, поскольку значения цен для детекта спреда берутся по трейдам (крестикам на графике). Если цены поступают с задержкой, то детект может сработать, когда цена уже улетела!
  2. При частичном заполнении buy ордера стратегия снимает его и весь исполненный объем выставляет на продажу, аналогично МунШотам. 
  3. Пересчет условий детекта производится раз в полсекунды.
  4. Стратегия учитывает модификаторы детекта (модификатор влияет на PriceSpread).
  5. Рекомендуется эту стратегию использовать с EMA фильтром, коротким (например EMA(30,2) для определения роста или падения и выставления высокого селла на шорт или лонг соответственно (как настраивать EMA читайте ниже).
  6. Как смотреть параметры детекта на графике: Настройки - Специальные, включить галку Extended Debug.
  7. Если у вас включено несколько стратегий "Спред", то детект и ордер будет по каждой из них (в отличие от остальных типов стратегий, где детект только по первой подходящей в списке).

Обозначения:

TD: плотность трейдов

dP: размах цены на всем интервале TimeInterval 

Vol: приведенный объем

Spread: фактический спред, в процентах

N: число отрезков, на которых выявлен спред (последние два на графике появляются только в момент детекта)

Так же эти значения есть в строке с детектом в отчете: 

EMA фильтр и стратегия

Новый параметр в стратегии CustomEMA реализует идею задания произвольного фильтра, построенного на сравнении цен.

В параметре в строку пишется набор функций для сравнения в виде

EMA(X,Y) > A AND EMA(p,q) < B AND … любое кол-во формул, разделенное словами AND или OR (порядок применения - алгебраический: сначала между собой все AND, потом OR Пример: A AND B OR C AND D означает одно из двух: (A AND B) или (C AND D))

Типы формул:

EMA(X,Y) > или < A: Сравнение цен за EMA X секунд, минут или часов назад и EMA Y секунд, минут или часов назад (допустимые значения X=1s...300s или 5m...90m или 1h...42h, Y=1s...300s или 2m...90m или 1h...42h).

MAX(X,Y) > или < A: Сравнение максимальной цены за X минут или часов назад (это точное значение на момент детекта максимальной цены, которая имела место на момент детекта) и EMA Y секунд, минут или часов назад (допустимые значения X=5m...90m или 1h...42h, Y=1s...300s или 2m...90m или 1h...42h). При этом часовые максимумы обновляется по 5м свечам, поэтому в них не входят последние 5-10 минут.

MIN(X,Y) > или < A: Сравнение минимальной цены за X минут или часов назад (это точное значение на момент детекта минимальной цены, которая имела место на момент детекта) и EMA Y секунд, минут или часов назад (допустимые значения X=5m...90m или 1h...42h, Y=1s...300s или 2m...90m или 1h...42h). При этом часовые минимумы обновляется по 5м свечам, поэтому в них не входят последние 5-10 минут.

BTC(X, Y) > или < A: Сравнение цен BTC/USDT за EMA X секунд, минут или часов назад и EMA Y секунд, минут или часов назад (допустимые значения X=1s...300s или 5m...90m или 1h...42h, Y=1s...300s или 2m...90m или 1h...42h).

MAvg(X,Y) > или < A: Сравнение средних цен всего рынка(маркета) за EMA X секунд, минут или часов назад и EMA Y секунд, минут или часов назад (допустимые значения X=1s...300s или 5m...90m или 1h...42h, Y=1s...300s или 2m...90m или 1h...42h).

На расчет средней цены рынка(маркета) влияют 2 настройки:

1) Настройки - Основные, "ЧС исключить из дельт" - если галка стоит, в средней цене рынка исключены маркеты ЧС

2) Настройки - Специальные, "Weighted mAvg" - если галка стоит, то цена маркета в среднем берется с весом, равным суточному объему

Иначе говоря, чем меньше сут. объем на монете, тем меньше она влияет на среднее.

Расчет можно сравнить с капитализацией: это сумма (цена * объем)


Каждая формула (X, Y) > или < A означает:

1) X,Y - время: число, после которого есть буква s или m или h (секунды, минуты, часы соотв.) или нет буквы (тогда число считается секундами)

2) Знак больше или меньше

3) A - с чем сравнивать (в процентах)

Принцип расчета: средняя цена Y секунд назад сравнивается со средней ценой X сек. назад:  

Цена(Y) / Цена(X) > 1 + A / 100

Иначе говоря, Цена(Y) больше чем Цена(X) на A процентов (или меньше, если в формуле знак <)

Методика расчета и ограничения:

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

  1. Набор секундных средних от текущей цены (1 сек) до 300 сек. назад. Считаются как классич. EMA (Pслед = (Pпред * N + Pтекущ) ./ (N + 1)
  2. Минутные средние от 2 минут назад до 90 минут назад. Считаются как просто средняя цена за минуту
  3. Часовые средние от 1 часа назад до примерно 42 часов назад (ограничение биржи на свечи по которым считаются часовые средние) (считается как средняя цена за час по 5м свечам)Исходя из этого, параметры X,Y в формуле EMA могут быть: 1s..300s или 2m..90m или 1h..42h
  4. Если Y ставить 1s то будет сравнение с текущей ценой, при указании секунд s можно не ставить.

Вывести эти цены на график можно кнопкой в панели управления, см. рис ниже,

Обратите внимание! Это не индикатор, а всего лишь наглядное представление о том, как считается новый EMA фильтр. По причинам, изложенным выше, синяя линия средней цены может иметь разрывы - это места, где 300s заканчивается, где начинается 2m и заканчивается 90m

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

Примеры что писать в поле CustomEMA:

1) EMA(15m,3s)< -1 and EMA(5s,1s) > 0.1

EMA(15m,3s)< -1 = означает, что было падение: цена 3 сек. назад на -1% меньше цены 15 минут назад.

EMA(5s,1s) > 0.1 = означает, что был рост: цена текущая больше на 0.1% чем цена 5 сек назад

Вместе эти условия означают, что детект произойдет после падения, за которым следует рост

2) Max(1h, 1s) > 0.1 = означает перехай: текущая цена стала больше, чем макс. за последний час

3) Max(1h, 1s) < -5 = означает падение на 5% от хая за посл. час

4) Max(1h, 1s) < -5 AND Min(1h, 1s) < 0.1 AND Min(1h, 1s) > -0.1 = означает падение на 5% от хая, при этом находимся возле дна

Для простоты тестирования добавлена новая стратегия EMA, в которой нет своих параметров, она построена исключительно на детекте по условию фильтра CustomEMA . То бишь, детект происходит в момент, когда выполняются условия фильтров, поэтому используйте осторожно! Возможны неограниченные покупки, ставьте NextDetect пенальти

Замечания:

  1. Важно использовать фильтры по Latency в стратегии, поскольку значения цен EMA зависят от цен трейдов; если цены поступают с задержкой, то расчет EMA будет неточен.
  2. Линии EMA сохраняются в отчете на момент детекта, а для муншотов - на момент срабатывания бай ордера (если в стратегии был включен EMA фильтр).

Дополнительные параметры в стратегии MoonShot

В дополнение к основным параметрам добавляются несколько новых, расширяющих алгоритм работы MoonShot, теперь стратегия может выставить повторно шот на той же монете не дожидаясь продажи первого sell ордера :

MShotRepeatAfterBuy: Ставить повторный МунШот после покупки и выставления селла

MShotRepeatIfProfit: %, условие на текущую цену для повторного шота: цена должна быть выше чем цена покупки на этот процент

MShotRepeatWait: время в сек, в течении которого может выставиться повторный шот при выполнении условия MShotRepeatIfProfit

MShotRepeatDelay: время в сек, ожидание перед выставлением повторного шота

Повторный шот ставится только если текущая цена стала больше чем цена покупки на MShotRepeatIfProfit процентов в течении MShotRepeatWait секунд.

Значения по умолчанию MShotRepeatIfProfit = 0, MShotRepeatWait = 5 означают:

"Выставление повторного шота если текущая цена стала больше цены покупки в течении 5 сек после покупки"

Параметры-"триггеры" в стратегии: сработка одной стратегии запускает другие.

TriggerKey: Ключ активации других стратегий по триггеру (от 1 до 50, если 0 то не учитывается). Работает только в модуле "AutoTrader" или с включенном в меню Эмулятором. Как это работает: муншоты включают триггер по факту покупки, остальные стратегии - по факту сигнала (даже без автопокупки). Триггер включается на том маркете, на котором был сигнал. Пример: стратегия спред с ключом 5. При сработке этой стратегии в ключ 5 прописывается текущее время. После этого все другие стратегии, где TriggerByKey = 5 начинают проходить по фильтрам в течении след. TriggerSeconds секунд.

TriggerOnProfit: Стратегия включит триггер на заданном ключе TriggerKey только если сделка была закрыта с профитом

TriggerOnLoss: Стратегия включит триггер на заданном ключе TriggerKey только если сделка была закрыта с убытком

Если хотя бы одна из этих галок включены (TriggerOnProfit, TriggerOnLoss), то сигнал и покупка муншотом не будут являться триггерами. Галки можно включить одновременно, тогда любое закрытие сделки в плюс или минус будет являться триггером

TriggerAllMarkets: Если YES, то триггер действует сразу на все маркеты; если No, только на маркет, где был сигнал

TriggerByKey: По какому ключу должен быть сигнал, чтобы стратегия запустилась (0 - не учитывается)

TriggerSeconds: На сколько секунд запустить стратегию после появления сигнала триггера. Пример: TriggerByKey = 5, TriggerSeconds = 60. Стратегия будет запущена на 60 сек. тогда, когда любая другая стратегия с TriggerKey=5 даст сигнал

TriggerKeysBL: Строка с номерами ключей (через пробел). Если на одном из этих ключей был сигнал на монете, то стратегия не будет работать на монете TriggerSecondsBL секунд

TriggerSecondsBL: Если на одном из ключей TriggerKeysBL был сигнал на монете, то стратегия не будет работать на монете TriggerSecondsBL секунд

Набор параметров для управления сессиями

Описание общей механики:

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

Общие замечания:

  • Настройки сессии учитываются раздельно по маркетам и стратегиям. Каждая стратегия имеет свое уникальное значение сессии на каждом маркете.
  • Сессия всегда учитывается в USDT, в т.ч. на BTC ботах.
  • Изменение сессии происходит в момент закрытия (исполнения селл ордеров).
  • Ручной сброс общей сессии через меню также сбрасывает новые сессии по маркетам.
  • Посмотреть значения сессий на графике можно, включив “фильтры на графике”. При этом будут показаны только те стратегии, где IgnoreSession = NO.
  • Продажа по выходу из фильтров не действует по настройкам сессий (т.е. SellByFilters к сессиям не имеет отношения).
  • Настройки сессий работают вне зависимости от IgnoreFilters. Т.е. даже если вы включили игнор фильтров, но на монете стоит пенальти сессий, ордер не будет выставлен.
  • Сессии в объединенном ордере учитываются во всех стратегиях, которые вошли в объединение (т.е. все стратегии, которые сработали на покупку, и стратегия, по которой идет продажа, изменят сессию после закрытия объединенного ордера на величину суммарного профита).
  • Информация об изменении фактического размера ордера (согласно настройкам SessionReduceOrder, SessionIncreaseOrder) есть в отчете в комментарии (если ордера не объединялись)

Описание параметров:

IgnoreSession: YES \ NO - если YES, игнорировать все настройки сессий (по умолчанию).

SessionLevelsUSDT: (YES\NO) если YES, то SessionStratMax и SessionStratMin задаются в USDT (по умолчанию YES), если NO, то SessionStratMax и SessionStratMin задаются в процентах от OrderSize.

SessionStratMax: Порог профита (в USDT), например 200$. Когда стратегия наберет +200$, увеличится счетчик плюсовых сессий, сбросится счетчик минусовых сессий, текущее значение профита обнулится, стратегия продолжит работать с увеличенным ордером. 

SessionStratIncreaseMax: Процент увеличения порога профита SessionStratMax. Значение порога будет автоматически увеличиваться с каждой плюсовой сессией, начиная с SessionPlusCount. Если SessionStratIncreaseMax = 0 или SessionPlusCount = 0, то игнорируется.

Например, порог 200$, процент увеличения = 20%, SessionPlusCount = 3. Тогда после третьей плюсовой сессии порог профита будет увеличен на 20% и равен 240$.

Порог увеличивается линейно, по формуле: SessionStratMax * ( 1 + (Counter - SessionPlusCount + 1) * SessionStratIncreaseMax / 100).

Например, SessionStratIncreaseMax = +20%, SessionPlusCount = 2, и идет 5-я положительная сессия, тогда порог увеличится на +200+20% * (5 - 2 + 1 = 4)= 200 + 80% = 360$.

SessionStratMin: Порог убытков (в USDT) отрицательное значение, например -100$. Когда стратегия наберет -100$, увеличится счетчик минусовых сессий, сбросится счетчик плюсовых сессий, текущее значение профита обнулится, стратегия будет остановлена на время пенальти SessionPenaltyTime.

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

SessionStratReduceMin: процент уменьшения порога убытков SessionStratMin (положительное значение). Значение порога будет автоматически уменьшаться с каждой убыточной сессией, начиная с SessionMinusCount.

Например, процент уменьшения порога = 30%, SessionMinusCount = 3, SessionStratMin = -100$. Если поймали третий раз подряд минусовую сессию, порог убытков уменьшится до SessionStratMin =-100 / 30%=-77$.

Уменьшение порога считается по формуле: SessionStratMin / ( 1 + (MinusCounter - SessionMinusCount + 1) * SessionStratReduceMin / 100);

Например при SessionStratReduceMin = 30% и базовом SessionStratMin = -100$, после четвертой минусовой сессии порог станет 100 / (1 + 2 * 0.3) = 100 / 1.6 = 62.5

Если SessionStratReduceMin = 0, то игнорировать снижение.

Текущие фактические пороги можно посмотреть на графике при включенных “фильтрах на графике”, значения sMin и sMax.

SessionResetOnMinus: YES \ NO. - если YES, то сбрасывать текущий профит сессии на 0 после минусовой сделки (если профит в текущей сессии положительный и убыток минусовой сделки больше SessionStratMin/10).

SessionPenaltyTime: Время в сек, в течении которого стратегия не работает после минусовой сессии.

SessionPlusCount: Счетчик плюсовых сессий подряд, начиная с которого увеличивать ордер (согласно параметру SessionIncreaseOrder) и порог сессии (согласно параметру SessionStratIncreaseMax). Если была минусовая сессия, счетчик сбрасывается до нуля.

SessionMinusCount: Счетчик убыточных сессий подряд, начиная с которого уменьшать ордер (согласно параметру SessionReduceOrder) и порог сессии (согласно параметру SessionStratReduceMin). Если была плюсовая сессия, счетчик сбрасывается до нуля.

SessionIncreaseOrder: Процент увеличения ордера с ростом количества плюсовых сессий, начиная с сессии номер SessionPlusCount (положительное значение). Если SessionPlusCount = 0 или SessionIncreaseOrder = 0 , то не применяется. 

Например, SessionPlusCount = 5, SessionIncreaseOrder = 10. Тогда начиная с пятой плюсовой сессии ордер будет увеличен на 10%.

Размер ордера увеличивается по экспоненте: на 1 шаге +10% от 100, на втором +10% от 110, и тд. Посмотреть фактическое увеличение ордера можно в логе по записи: LINK: [1] (28) OrderSize increased by 33.10%: 100.00$ => 133.10$  

SessionIncreaseOrderMax: Предел максимального увеличения ордера в процентах от исходного OrderSize (умолчанию 500% = в 5 раз)

SessionReduceOrder: Процент уменьшения ордера с ростом количества убыточных сессий, начиная с сессии номер SessionMinusCount (положительное значение). Размер ордера уменьшается по экспоненте, делением на процент.

На 1 шаге новый ордер = 100 / (1 + 20%) = 83.3$. На втором шаге новый ордер = 83.3 / (1 + 20%) = 69.4$, и тд. Посмотреть фактическое увеличение ордера можно в логе по записи: LINK: [1] (28) OrderSize reduced by 20.0%: 100.00$ => 83.3$  

SessionReduceOrderMin: Предел максимального уменьшение ордера в процентах от исходного OrderSize (умолчанию 500% = в 5 раз)

SessionResetTime: Интервал (в сек.), через который производится авто-сброс счетчиков сессии. Раз в SessionResetTime сек. счетчики плюсовых и минусовых сессий уменьшаются на 1, а значение профита уменьшается на 10%. (т.е. Если стратегия не работает на монете, то со временем сессия на ней обнуляется).