Специальные параметры стратегий
Стратегия "Spread" и её параметры
Чтобы в списке стратегий терминала Moonbot появилась стратегия Spread нужно активировать платный пакет расширений для Автоторговли.
⚠️ Внимание! Стратегия Spread связана с очень высокими рисками. Используйте её без автопокупки, как детект, чтобы понять как она работает. Только после полного понимания настраивайте на реальную торговлю.
Пример работы стратегии Spread на листинге монеты DODO.
Под спредом понимаем активные торги в зоне между границами ASK и BID, определяемой временем и размахом цены.
Общие параметры
-
TimeInterval: поле для указания интервала времени в полных секундах, на котором производится расчёт (минимальное значение 1 секунда);
-
TradesDensity: поле для указания плотности трейдов по времени, в процентах. Для вычисления плотности трейдов интервал TimeInterval делится на маленькие кусочки по 200мс и считается отношение кусочков, где есть хотя бы 2 трейда с разной ценой, и “пустых” кусочков (без трейдов). Например, плотность трейдов TradesDensity = 100 (%) означает, что трейды с разными ценами есть как минимум каждые 200мс;
-
TradesDensityPrev: поле для указания плотности трейдов перед детектом, которая вычисляется перед детектом за предыдущий интервал времени, так же равному значению TimeInterval. Позволяет отсечь монеты, которые изначально лежали. Для пампов следует в этом параметре устанавливать 0, так как нужны как раз лежачие монеты (с малой волатильностью перед возникновением спреда цены);
-
TradesCountMin: поле для указания минимального значения трейдов каждые 200мс на всем интервале детекта. Если 0, то не применяется. При большом значении этот параметр может сильно зажать детекты, так как будет брать только среды с высокой плотностью трейдов;
-
PriceIntervals: поле для указания количества равных интервалов, на которые поделится TimeInterval для вычисления размаха цены. TimeInterval делится на PriceIntervals частей, на каждой части считается максимальная и минимальная цена и дельта (разница) между ними;
-
PriceIntervalShift: поле для указания целого числа от 0 до 5. Данная настройка отсекает детекты единичных стрел. Принцип расчёта: интервал анализа сдвигается влево на 200мс PricelntervalShift раз. Каждый раз на полученном сдвигом интервале идёт пересчёт условий детекта. Итоговый детект сработает, если условия выполнены на всех сдвинутых интервалах. Если 0, пересчёт не производится;
-
PriceSpread: поле для указания минимальной величины спреда в процентах для детекта. Детект происходит, если на каждой части PriceIntervals размах цены был больше чем PriceSpread;
-
IntervalsForBuySpread: поле для указания количества последних частей из PriceIntervals брать для расчёта минимальной и максимальной цены в спреде. Если 0, то считается на всем TimeInterval;
-
BuyPriceInSpread: поле для указания значения в процентах, на которое следует выставить Buy ордер в спреде. Если лонг, то этот процент отсчитывается от минимальной цены вверх, если шорт, то от максимальной цены вниз.
Примеры: -
Если BuyPriceInSpread = 0 (%), то Buy ордер в лонг установится на минимальную цену в спреде
-
Если BuyPriceInSpread = 50 (%), то Buy ордер в лонг установится посредине спреда
-
Если BuyPriceInSpread = -100 (%), то Buy ордер в шорт установится выше на удвоенное расстояние спреда.
Обратите внимание! Параметр buyPrice из вкладки Buy conditions так же влияет на цену покупки. BuyPriceInSpread в этом случае определяет “базовую цену”, от которой уже отсчитывается buyPrice. -
SellPriceInSpread: поле для указания значения в процентах, на которое следует выставить Sell ордер в спреде. Аналогично параметру BuyPriceInSpread, но только уже предопределенная цена продажи в зависимости от спреда. В отличие от BuyPriceInSpread, цена продажи берётся как одна максимальная или из SellPrice, или из цены продажи по спреду. Иначе говоря, если SellPrice меньше спреда, например SellPrice=0, то продажа ставится по спреду. Если больше, то продажа ставится по SellPrice. Также на цену продажи влияют модификаторы;
-
BuyOrderReduce: поле для указания интервала в миллисекундах, на котором считать средний объем торгов. Стратегия выставит ордер размером не больше, чем средний объём. По умолчанию BuyOrderReduce = 100 (мс). Если 0, то не применяется.
Объём считается так: суммируется объём всех сделок покупки + продажи (BV + SV) на интервале TimeInterval и делится на BuyOrderReduce. Например, если TimeInterval = 5 (сек.), то есть 5000 мс, BuyOrderReduce = 100 (мс), объём всех сделок за 5 сек. был 10 000$, то средний объем за 100 мс будет равен 10000 / 5000мс * 100мс = 200$. В этом случае стратегия выставит Buy ордер не более 200$.
Иначе говоря, смотрим какой же был средний объем за 100 (мс) / 10мс / 5мс, это и есть наш максимальный ордер, который выставит стратегия.
Работу функции уменьшения ордера можно увидеть в логе по такой записи:
IOTA: [1] (40) Buy order reduced: 1000.00$ => 23$ (Vol: 23$)
В этом логе OrderSize в стратегии стоял 1000$, но средний объем торгов за 100 мс составил всего 23$, поэтому стратегия выставила Buy ордер размером 23$. -
MinReducedSize: поле для указания минимального значения размера Buy ордера в USDT, после применения параметра BuyOrderReduce, ниже которого Buy ордер не выставляется. Например, MinReducedSize = 50 (USDT), после применения параметра BuyOrderReduce посчитано, что можно выставить Buy ордер только на 23$, но это меньше 50$ и Buy ордер на 23$ выставлен не будет. Если 0, то не применяется;
-
SpreadRepeatIfProfit: поле для указания относительного процента от цены покупки до цены продажи, когда стратегии разрешается повторное выставление Buy ордера в течение 1 секунды после детекта (не позже). То есть повторный Buy ордер может быть выставлен, если текущая цена выросла и стала больше продажи больше цены покупки на SpreadRepeatIfProfit процентов и в течение 1 секунды после детекта. Если 0, то повторные ордера не ставятся.
Например, если SpreadRepeatIfProfit = 100 (%), то текущая цена должна достичь цены Sell ордера и позиция была продана, тогда стратегии разрешено выставить повторный Buy ордер.
Если SpreadRepeatIfProfit = 50 (%), то текущая цена должна достичь половины расстояния между ценой покупки и ценой Sell ордера и тогда стратегии будет разрешено выставить повторный Buy ордер.
Повторных Buy ордеров в стратегии Spread разрешено выставлять не более 5 из-за внутреннего ограничения в коде. -
SpreadFlat: галочка YES/NO. Если YES, то стратегия будет пытаться определять спред в горизонтальном канале;
-
Spread_BV_SV_Time: поле для указания интервала в миллисекундах для анализа. Если 0, то не применяется;
-
Spread_BV_SV_Max: поле для указания максимального отношения покупок (BV) к продажам (SV). Если 0, то не применяется;
-
Spread_BV_SV_Min: поле для указания минимального отношения покупок (BV) к продажам (SV). Если 0, то не применяется.
Если в стратегии стоит шорт, то отношение переворачивается автоматически, то есть для шорта считается отношение продаж (SV) к покупкам (BV).
Пример: Spread_BV_SV_Time = 1500 (полторы секунды).
За последние полторы секунды было Buy трейдов на 500$ и Sell трейдов на 1000$
Отношение BV/SV будет 500/1000 = 0.5 для лонга или 1000/500 = 2 для шорта соответственно. -
SpreadPolarityMin: поле для указания минимальной границы диапазона полярности спреда;
-
SpreadPolarityMax: поле для указания максимальной границы диапазона полярности спреда.
Полярность спреда - это направление, численная мера направления может быть от -100 (строго вниз) до +100 (строго вверх).
Пример стратегии Spread
TimeInterval = 5 (сек.)
TradesDensity = 100
PriceIntervals = 5
PriceSpread = 0.3 (%)
IntervalsForBuySpread = 2
BuyPriceInSpread = 5 (%)
SellPriceInSpread =100 (%)
BuyOrderReduce = 100 (мс)
Для этих параметров нужно, чтобы за последние 5 секунд каждую секунду имело место колебание цены выше 0.3%. Для расчёта Buy и Sell ордера будут выбираться последние 2 интервала (IntervalsForBuySpread=2), Buy ордер будет выставляться на относительные +5% от минимального значения спреда, а Sell ордер на относительные +100%, то есть на максимум спреда.
При этом, если приведённый объём за 100мс будет меньше, чем размер Buy ордера, указанный в параметре OrderSize стратегии, то будет выставлен Buy ордер, равный этому приведённому объёму за 100мс.
1. ОЧЕНЬ важно использовать фильтры по Latency в стратегии Spread, поскольку значения цен для детекта спреда берутся по трейдам (крестикам на графике). Если цены поступают с задержкой, то детект может сработать, когда цена уже резко выросла!
2. При частичном заполнении Buy ордера стратегия снимает его, и весь исполненный объём выставляет на продажу, аналогично как и в стратегии MoonShot.
3. Пересчёт условий детекта производится раз в полсекунды.
4. Стратегия учитывает модификаторы детекта (модификатор влияет на PriceSpread).
5. Рекомендуется эту стратегию использовать с коротким EMA фильтром, например EMA(30,2) для определения роста или падения цены и выставления высокого Sell ордера на шорт или лонг соответственно.
6. Если в терминале Moonbot включено несколько стратегий Spread, то детекты и выставление ордеров будут по каждой из них, так как у стратегии Spread на вкладке Main всегда включён параметр IndependentSignals = YES.
7. На графиках монет можно смотреть параметры детекта стратегии Spread. Для этого нужно на вкладке Настройки → Специальные → System включить галочку Extended Debug Mode.
TD: плотность трейдов
dP: размах цены на всём интервале TimeInterval
Vol: приведенный объём
Spread: фактический спред, в процентах
N: число отрезков, на которых выявлен спред (последние два на графике появляются только в момент детекта)
Так же эти значения есть в строке с детектом в отчёте: