Turtle: Тест первый – Robo.trading

Turtle: Тест первый

В оригинальной книге вообще не было никаких глав про создание стратегий как эта. То есть вся эта глава написана переводчиком. Мы тут не будем сразу же пытаться применить все правила оригинальной стратегии Turtle, иначе получилось бы слишком сложно для понимания. А мы пойдем по пути от простого к сложному.

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

 

Реверсивная?

Есть в трейдинге такое понятие — реверсивная торговая стратегия (или система). Реверсивная от слова реверс (переворот). То есть у такой стратегии нет тейк-профитов и стоп-лоссов вообще, и даже нет их смысловых заменителей. Такая стратегия не бывает «вне рынка» (без позиций) и всё время находится в рынке, то есть всё время имеет открытую позицию, длинную или короткую. Если закрывается длинная позиция, то тут же открывается короткая. И наоборот, когда закрывается короткая, то сразу же открывается длинная -«Переворачивается» из длинной в короткую и обратно. Автор книги уже сказал нам как открывать длинные и короткие позиции, а для создания реверсивной торговой системы это уже достаточно. Если идеи книги вообще рабочие, то реверсивная система должна оказаться хоть немного, но прибыльной. Впрочем, если окажется убыточной, то это пока еще не проблема, так как бэктесты бесплатные, а правила мы тут применим не все ведь. То есть будет рано судить.

 

Дополнительные идеи

Не удивляйтесь, мы так же проверим некоторые дополнительные идеи. «Не отходя от кассы». То есть интересно как стратегия поведет себя не на дневном таймфрейме, а на другом? Возможно на более мелком-быстром таймфрейме, часовом, сделок будет просто больше и чаще, из-за чего прибыль может стать больше. Разумеется, тестировать будем с учетом комиссий и проскальзывания. А еще хотелось бы проверить с другими периодами, почему именно 20 и 55? Может другие периоды окажутся лучше? И напомню что автор книги предлагал входить в сделку после того как цена пройдет хотя бы 1 тик за пределы канала, а как показывает мне моя практика это не всегда хорошая идея, «касание» часто работает лучше. Но мы просто проверим оба варианта, да и сравним

 

Комиссии и проскальзывание

Тестировать будем опять же на сервисе TradingView.com, с использованием языка PineScript 4-ой версии, потому что на момент написания этого текста это последняя версия. Тестировать будем XBT/USD, на криптовалютной бирже Bitmex.com, так как предположительно там и будем торговать. Комиссия на бирже на данный момент составляет 0,075% для этой пары. Нам не интересно какой была комиссия в прошлом, возможно она была другой и была больше, но мы в прошлом торговать не планируем. Какая в будущем будет комиссия нам интересно, но никак не узнать. Размер проскальзывания сильно уж зависит от суммы, которой будет торговать трейдер. Получается что у разных трейдеров процент проскальзывания будет разным, из-за того что у них разная сумма просто. Допустим в среднем проскальзывание не превысит 0,025%. А для удобства всех расчетов мы заложим проскальзывание в комиссии как бы «с запасом». То есть мы будем тестировать с комиссией 0,100%, а не 0,075%, понимая что проскальзывания будут нам мешать (и уж точно не помогать). Ну а для тех кто планирует (ну или мечтает просто) торговать ордерами по миллиону долларов — им нужно будет ставить комиссию еще больше.

 

Элементарная стратегия

Тут наша первая задача создать не максиально правильную или максимально доходную стратегию, а создать максимально простую стратегию — элементарную стратегию, которую проще всего понять, и проще запрограммировать. А потом будем усложнять. От простого к сложному. Разберем каждую строчку стратегии на PineScript. Зачем эта строчка нужна, и почему она именно такая, а не другая. Пустые строчки, которые тут «для красоты» (чтобы отделить блоки) я описывать не буду.

//@version=4
strategy(«Turtle Strategy Test-1», overlay = true)

//Рассчитаем линии канала Дончана
high_line = highest(high, 20)
low_line = lowest(low, 20)

//Нарисуем поверх гракика обе линии канала Дончяна
plot(high_line, offset = 1)
plot(low_line, offset = 1)

//Откроем сделки по ценам, которые равны цене линии канала
if high_line > 0

strategy.entry(«Long», strategy.long, stop = high_line)
strategy.entry(«Short», strategy.short, stop = low_line)

//@version=4

Строка начинается с двух слешей, а это, как и во многих других языках программирования, означает что это комментарий. То есть строка, которая ничего не делает в программе, а нужна только лишь для того, чтобы кто-то прочёл комментарий. Комментарии обычно поясняют зачем нужны какие-то команды. Потому что иногда непонятно даже профессиональному программисту, зачем другой программист добавил тут эту фигню. Однако, в PineScript есть одно исключение: если после двух слешей стоит собачка и написано версия, то этот комментарий всё же «работает» и влияет на остальную программу скрипта. Тут казывается какая это будет версия языка. Четвертая.

strategy(«Turtle Strategy Test-1», overlay = true)

Тут мы объявили что это у нас именно стратегия (strategy), а не просто индикатор (study). Третьего кстати не дано, либо стратегия, либо индикатор, одно из двух. И в самом начале скрипта (после версии языка) мы должны объявить что это у нас такое тут. В кавычках название «Turtle Strategy Test-1» — по этому названию мы сможем найти найти наш скрипт. Или даже сможет найти кто-то другой, если мы наш скрипт опубликуем для остальных пользователей TradingView (а так можно). Название это наш первый аргумент. Все аргументы перечисляются через запятую. Запятая будет не нужна если аргумент только один. Но у нас их два. Во втором аргументе overlay = true, не обязательном, мы объявляем что всякие линии/стрелочки скрипта должны рисоваться поверх графика цены, а не под графиком.

high_line = highest(high, 20)

Здесь мы объявляем нашу первую переменную, которую обозвали «high_line» (верхняя линия). Рассчитывать значение этой переменной будет специальная команда языка highest, которая просто рассчитывает максимальное значение. У неё есть 2 обязательных аргумента (как всегда перечисляются аргументы тоже через запятую): первый аргумент должен указывать из каких значений вообще она должна искать максимальное, а второй аргумент указывает количество интервалов времени (свечей, то есть) за которое надо искать максимальное значение. Так мы указываем high и 20 свечей. Буквально: «Рассчитай нам сам высокий high свечи за последние 20 свечей».

low_line = lowest(low, 20)

Здесь всё аналогично. Объявляем уже вторую нашу переменную low_line (нижняя линия). Знак подчеркивания («_» или «земля») в названии переменной нам нужен, так как в переменных вообще нельзя использовать пробелы. Иначе с пробелами «нас не поймут». А «_» не плохой заменитель пробелов, просто похоже. Команда lowest работает аналогично предыдущей команде highest, только вычисляет самое маленькое значение. Буквально: «Рассчитай нам самый низкий low свечи за последние 20 свечей».

plot(high_line, offset = 1)

Теперь у нас рассчитываются 2 нужных нам переменных, но пользователю они никак не показываются. А раз он их не видит, то и понять не сможет даже правильно он сделал или нет — нам нужна обратная связь, чтобы понимать. Команда plot рисует линию, и может принимать много разных аргументов. Нам пока достаточно будет двух аргументов. В первом аргументе мы указаваем какую переменную вообще надо рисовать, а именно переменную high_line, а во втором аргументе offset = 1 мы указываем что нарисованную линию надо еще и сдвинуть на 1 свечу вправо. Если бы хотели сдвинуть влево то написали бы -1 (отрицательное число). Буквально: «Нарисуй нам переменную high_line (верхнюю линию), но еще и сдвинь её на 1 свечку вправо».

plot(low_line, offset = 1)

Тут полностью аналогично, но нарисуй нижнюю.

if high_line > 0

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

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

strategy.entry(«Long», strategy.long, stop = high_line)

А здесь еще один тонкий нюанс: последующие строки кода у нас сдвинуты вправо символом табуляции (либо просто сделать по 4 пробела перед командой). Это не случайно, это нужно. Команды, которые сдвинуты табуляцией вправо теперь зависят от предыдущего нашего условия (проверки). То есть эти команды будут «работать» только если выполняется условие. Буквально: «Если переменная high_line больше нуля (рассчиталась), то выполняй эти команды (торгуй), ну а если не рассчиталась — то не выполняй (пока не торгуй)».

Команда strategy.entry тоже может принимать много разных аргументы (и все аргументы опять как всегда через запятую), но нам пока хватит только трёх. Команда делает вход в позицию, то есть открывает сделку.

Сначала у нас аргумент в кавычках «Long» — это просто название, какое захотим. Отображаться оно будет и возле стрелочек поверх графика, и в таблице «Список сделок». Название поможет нам понять а что это было.

В следующем аргументе strategy.long мы объясняем скрипту что позицию нам надо открывать именно длинную, а не короткую. Тут уж третьего тоже не дано.

В аргументе stop = high_line мы указываем каким типом ордеров надо действовать (рыночный стоп-ордер, «по рынку») и по какой цене. Цена у нас не постоянная, а переменная. Переменная high_line содержит цену по какой надо входить.

Буквально: «открывай длинную позицию рыночным стоп-ордером по цене верхней линии (high_line), если цена будет равна или выше».

strategy.entry(«Short», strategy.short, stop = low_line)

Эта строка аналогичная. И она у нас тоже сдвинута вправа табуляцией, так как тоже должна срабатывать только при условии что индикатор уже рассчитался. А значит наша стратегия проигнорирует первые 20 свечек на графике. Она их проигнорирует, так как для расчета индикатора нужно минимум 20 свечей. Назвали мы это соответственно «Short», открывать она будет короткую позицию, так же рыночным стоп-ордером по рынку, но уже по цене другой линии — low_line.

 

Переворот

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

 

Тестируем

Теперь мы уже можем тестировать наш скрипт стратегии на дневном таймфрейме (скрипт тестируется на том же таймфрейме, какой мы указали у графика), и увидим… не совсем то что ожидали. Почему то прибыль крайне мала, а большинство сделок убыточные. Значит, что-то сделано не так. Мы не указали какой суммой будет торговать, и как вообще эта сумма должна рассчитываться. А кроме того не указали ни размер комиссии, ни проскальзывания.

 

Если у Вас настройки скрипта на английском языке, то Вы можете переключить сайт TradingView.com на русский язык.

Тогда сделаем 3 изменения в настройках скрипта:

  • Объём Заявки (ордера) пусть измеряется в % от капитала, а не в контрактах
  • Торговать будем на 100% капитала, а не на 1%
  • Добавим комиссию и проскальзывание, а точнее ставим комиссию 0.1% (обязательно через точку)
  • Пирамидинг оставим 1, потому что 1 это как 0 означает отсутствие пирамидинга позиции

 

Было

 

Стало

 

Как видим, это сильно изменило результаты тестирования. Во много раз увеличилась не только доходность, но и размер просадки тоже (то есть риск увеличился тоже). Что и не удивительно, раз уж мы просто увеличили сумму, которой «торговали на прошлом».

 

Было

 

Стало

 

Сравниваем

Так же было бы не плохо сравнить результаты нашей стратегии с доходностью долгосрочного инвестирования («Buy&Hold», «Купи-и-держи», а в криптовалютном сленге часто пишут «HODL»). Ведь мы же хотим в итоге получить доходность выше рыночной, а не ниже рыночной. Так мы ищем ответ на вопрос: «А что же лучше, торговать по этой стратегии или просто купить биткойны и держать их в долгосрок?». В этом нам поможет вкладка сводка показателей.

 

Подсказки

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

Подсказка 2: сравнивать рыночную доходность с доходностью стратегии БЕЗ учёта размера максимальной просадки было бы не верно. Потому как прибыль генерируется не в вакууме, а с каким то определенном риском. То есть можно сделать 100 долларов прибыли с риском потерять 20 долларов, а можно сделать 100 долларов с риском потерять 5 долларов — и это не одно и тоже. Конечно же предпочтительнее получить доходность с более низкими риском. Рыночная просадка у биткойна за тот же период превышает даже 80%, тогда как максимальная просадка нашей стратегии получилась чуть более 48%, или почти вдвое меньше. И вот это тоже важно учесть, стратегия получает доходность близкую к рыночной, но при этом с гораздо меньшим риском чем Buy&Hold. Кроме того, низкая просадка стратегии (а 48% это не сказать бы что низкая) позволяет увеличить кредитное плечо и получить больше прибыли.

Подсказка 3: если Вы создадите новый скрипт стратегии на TradingView.com, скопируете текста скрипта отсюда и вставите, то возможно он не заработает. Потому что символы кавычек, скорее всего, придется заменить на простые кавычки (удалить фигурные кавычки, и написать вместо них простые), а так же возможно придётся добавить табуляцию перед последними двумя строками.

 

Резюме первого теста

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

/

Robo.Trading

eVe Developer
Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять