ROBO_Trading

Война с округлениями цен

Ausbildung
ROBO_Trading Aktualisiert   
BITMEX:XBTUSD.P   Bitcoin
Всем кто кодит стратегии на PineScript обязательно к прочтению. Остальным будет не интересно.

Несмотря на то что я делаю тут стратегии более года, я всё время делал ошибку, которую не знал как исправить. Вы её тоже делаете (и не факт что Вы это понимаете). Из-за этой ошибки скрипт стратегии считает не совсем точно. Иногда бывают отклонения. Впрочем, отклонения не всегда незапланированный убыток, в половине случаев это незапланированная прибыль тоже. Поэтому бедой я это не считал. Но позже это стало бедой.

Позже я стал получать регулярно сообщения вот таких двух видов:
1) "Почему мой робот * по твой стратегии открыл сделку, хотя по скрипту не должен?"
2) И наоборот: "Почему мой робот по твоей стратегию сделку на открыл, хотя сигнал был?"

* Насчет "Мой робот" - это может быть что угодно, некоторые подписчики умеют программировать и создали роботов по моим стратегиям.

Суть проблемы

Возьмём самый простой для понимания пример - простую скользящую среднюю (SMA). Допустим Ваша стратегия должна закрыть сделку, когда цена коснётся SMA. Но если Вы сделаете эту SMA в своём скрипте без плясок с бубнами (о них ниже), то значение SMA может быть например таким: 3500,1563

Чем же это плохо? В редких случаях будет происходить такая ситуация: цена на бирже вообще может быть или 3500,00 или 3500,50. Допустим цена сходила до 3500,00 и пошла вниз, так и не коснулась Вашей SMA. По скрипту стратегии у Вас НЕ будет сигнала. Однако, у Вас же там бегает какой-то робот, который выставляет ордеры, и ордер с ценой 3500,1563 он выставлять не будет. Биржа такой запрос с неправильной ценой отклонит, и Вы это знаете. Поэтому Вы сделаете тоже самое что и все - сделаете округление цены так, как это бирже нужно. Тогда Ваш ордер в Вашем роботе будет 3500,00, а в Вашем скрипте стратегии он же будет по цене 3500,1563. А раз уже цена сходила до 3500,00 и не выше, то у робота будет сделка, а в скрипте Вашем сделки не будет. Вот Вам и расхождение. Конечно, такие случаи не частый, допустим типа один на сотню, но они будут. Так расчеты стратегии бектестом становятся чуть менее точными, но не становятся совсем уж не верными.

Однако, на практике проблема больше чем кажется. Почему сигнал скрипта был, а робот ничего не сделал - и вот в этот момент сжимается пятая точка от страха, а всё ли правильно там работает.

Решение проблемы

Для решения проблемы сначала нужно эти цены как-то вытащить, чтобы их можно было увидеть. К сожалению некоторые койны стоят что-то около 300 сатош, а сервис TradingView округляет цены в значениях индикаторов максимум до 4 знаков после запятой - так Вы цены не увидите. Решение тут хоть и кривое, но зато просто и рабочее. Сделайте еще одну переменную, умножьте её на 100 миллионов, и выводите эту переменную через команду plot. Тогда появится линия во много-много раз выше Вашего графика, и график станет не читабельным, но в настройках стиля можно отключить эту Вашу линию, сделать невидимой. После этого график снова станет нормальным и читабельным, а в значениях индикатора, Вы увидите Вашу переменную как нужно.

К примеру я так сделал в скрипте Robot WhiteBox ShiftMA - там есть галка, называется X100000000, если её поставить то эти умноженные в 100 миллионов раз линии появляются. Далее я их отключаю в стиле, и всё что мне нужно я вижу. Но это было лишь о том как посмотреть цены, а не про решение проблемы.

Оказывается команда для округления (round) тут почему-то не принимает отрицательные значения. Поэтому округлять на -2 (то есть это типа 3500,11) мы не можем. В документации ничего нашлось. Как решать эту проблему мне было уже известно благодаря опыту программирования в других областях. Если переменную нельзя округлить на отрицательное значение, значит её надо сначала умножить, потом округлить, а потом разделить обратно. Если это это у меня реализовано в строках 38 и 39 того же скрипта.

Но тогда нам нужен какой множитель (далее буду называть mult), на который мы сначала должны умножить, потом округлить до целого числа, а потом разделить на этот множитель. Конечно, можно сделать криво - создать параметр с imput и пусть юзер сам вводит количество знаков после запятой у пары. Но это ему лишний гимор. Да и себе тоже. Поэтому можно сделать поумнее.

У PineScript есть служебная переменная syminfo.mintick - отсюда можно вытащить размер минимального шага цены на выбранной паре. Но это не совсем то, это же не множитель. Но множитель можно получить через деление. То есть надо просто 1 разделить на эту переменную и получим нужное количество миллионов :) Получим правильный mult, как раз такой, какой нужен для нашей торговой пары. Это всё реализовано в строке кода 25.

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

Так что если Вы кодите стратегию с лимитными ордерами и весь этот гимор не сделаете, то Ваш скрипт стратегии будет рассчитывать бектест не совсем точно.

Кстати говоря, именно на битмексе на паре к доллару (это биток/доллар и эфир/доллар) это приём не сработает :) Потому что у него там округления до 3500.50 бывают, и TradingView считает что тут минимальный шаг цены (tickSize) это 0.1, хотя на самом деле он 0.5. Но это уже косяк кодеров TradingView, которые не учли такую ситуацию. Я с этим ничего поделать не смогу. Хотя может быть что-то придумается. На всех остальных парах битмекса это решение отлично сработало.
Kommentar:
TradingView недавно обновили, и теперь на вкладке "Стиль" есть параметр "Точность", где можно выбрать 8 знаков после запятой для отображения значений индикаторов. Так что уже не нужно делать х100000000 для параметров. Стало проще.
Kommentar:
Оказалось что сервис тут 1.5 округляет в меньшую сторону до 1, а не до 2. Обычно принято округлять в большую сторону.

Haftungsausschluss

Die Informationen und Veröffentlichungen sind nicht als Finanz-, Anlage-, Handels- oder andere Arten von Ratschlägen oder Empfehlungen gedacht, die von TradingView bereitgestellt oder gebilligt werden, und stellen diese nicht dar. Lesen Sie mehr in den Nutzungsbedingungen.