Блог им. t-trade

Научитесь писать простую стратегию с нуля за 15 минут!

Это второй пост из серии про основы программирования торговых систем на языке Easy (power) language. На примере простой стратегии я расскажу, как написать условия для входа, выхода из позиции, как поставить стоп лосс и тэйк профит, как при этом выстроить код так, чтобы систему можно было оптимизировать.
 
Тем, кто не читал, советую первый пост – там про настройку программы Multicharts. Первые шаги, так сказать…
 
Easy Language дословно переводится «Лёгкий язык». Простота программирования на Изи заключается в его несложной структуре, в интуитивно понятных формах. В принципе, Редактору, встроенному в Multicharts, достаточно просто по-английский «сказать» то, что вы хотите сделать – и высока вероятность, что программа вас поймет и сделает именно то, что вы хотели.

 
Конечно, необходимо знать некоторые общие принципы и структуры.
 
Например, в конце каждой логически завершенной фразы нужно ставить точку с запятой;
 
Но, это я забегаю немного вперед…
 
Я думаю, что существует какая-нибудь официальная философия языка – подобно той, что есть у языка Python, например, но лично мне она не попадалась. Поэтому попробую взять некоторые высказывания из философии Python, которые, на мой взгляд, отлично подходят к Easy Language:
 
— Красивое лучше, чем уродливое.
— Явное лучше, чем неявное.
— Простое лучше, чем сложное.
— Сложное лучше, чем запутанное.
— Разреженное лучше, чем плотное.
— Читаемость имеет значение.
— При этом практичность важнее безупречности.
— Если реализацию сложно объяснить — идея плоха.
— Если реализацию легко объяснить — идея, возможно, хороша.
 
Когда вы пишете код на Изи, не пытайтесь впихнуть всю свою идею в одну строчку. Упрощайте!
 
Disclaimer: Понять основы программирования легче всего на примере. В этом посте я взял самое простое и самое первое, что пришло мне в голову. Это НЕ рабочая стратегия. Это просто идея, которая имеет право быть проверенной на исторических данных. Те параметры и значения, которые я использую в ней, даны просто для наглядного примера работы разных элементов структуры кода.
 
Я работаю больше всего с фьючерсом на индекс РТС, поэтому все примеры я писал, представляя себе именно его. Но всё это с легкостью переносится и на акции, и на валюты.
 
Итак, поговорим о сложности и простоте. Например, нужно продавать на растущем рынке, при условии, что растет он уже час, поставив стоп в размере 100 пунктов, а тэйкпрофит на 200 пунктов, не забывая о том, что рост меньше, чем на 200 пунктов – таковым не является, а покупать при этом нужно на падающем рынке, даже если сейчас открыта позиция шорт, естественно, с теми же условиями.
 
Если просто перевести эту фразу на английский язык и поставить в конце точку с запятой, ничего не получится. Нужно упрощать.
 
Допустим, под растущим рынком мы понимаем растущую часовую свечку. Это значит, что цена закрытия этой свечи будет выше, чем цена её открытия.
 
А условие, что рынок должен вырасти на 200 пунктов, как записать? По сути, это есть минимальная разница между ценой закрытия свечи и ее открытия.
 
Так и запишем:
 
Если закрытие больше открытия, и закрытие минус открытие больше 200 пунктов, то надо продавать немедленно.
 
Аналогично для лонга:
 
Если открытие больше закрытия, и открытие минус закрытие больше 200 пунктов, то надо покупать.
 
Для входа в позицию и выхода из нее, что называется, «по рынку» при историческом тестировании чаще всего используются выражения «по цене закрытия этого бара» или «по цене открытия следующего бара».
 
Кстати, все знают, что бары и свечки – это одно и тоже, просто разный стиль отрисовки?
 
Научитесь писать простую стратегию с нуля за 15 минут! 
 
Существует несколько способов установить Стоп Лосс для позиции, но самый простой и распространенный – это слово УстановитьСтопЛосс(в скобках значение в пунктах).
 
Аналогичные действия для тэйк профита — УстановитьПрибыльЦель(в скобках значение в пунктах).
 
Давайте, картинку нарисуем для нашей идеи, чтоб совсем просто было:
 
 Научитесь писать простую стратегию с нуля за 15 минут!
 
 
Итак, у нас есть всё, для того, чтобы код начал работать:
 
Если закрытие больше открытия, и закрытие минус открытие больше 200 пунктов, то надо продавать по цене открытия следующей свечи;
 
Если открытие больше закрытия, и открытие минус закрытие больше 200 пунктов, то надо покупать;
 
УстановитьСтопЛосс(100);
УстановитьПрибыльЦель(200);
 
Пора переводить на английский.
 
If close>open and close-open>200 then sell short next bar open;
If open>close and open-close>200 then buy next bar open;
SetStopLoss(100);
SetProfitTarget(200);
 
Важно: для того, чтобы закрыть длинную позицию используется просто слово sell. Но для того, чтобы инициировать новую короткую позицию, нужно добавить слово short, sell short.
 
Для открытия лонга используется обычное buy. Но если мы просто хотим закрыть шортовую позицию, не открывая при этом лонг, то нужно написать buy to cover.
 
В нашем примере стратегия либо закрывается по стопу или тэйку, либо «переворачивается» в обратную сторону, поэтому пока что отдельных фраз на закрытие позиций без открытия при этом новых нет, но позже я добавлю и такие.
 
Внимательный читатель заметил, что в этом коде есть как минимум 4 параметра, которые можно оптимизировать: размер сигнальной свечи для шорта, размер сигнальной свечи для лонга, размера стопа и размер тэйка.
 
Для того, чтобы Multicharts дал возможность вам автоматически совершить несколько «прогонов» стратегии на истории с разными параметрами, все эти числовые значения нужно заменить на буквенные переменные, предварительно рассказав программе, что мы под этим подразумеваем.
 
Есть такой раздел в структуре – называется Inputs. Это помните: в школе решали задачки и перед каждым решением писали в тетрадке «Дано: площадь=10м2, сторона А=5м»? Inputs так и переводится – вводные.
 
Так вот, после этого слова мы объявляем программе о переменных, которые будем использовать в коде. Все переменные, о которых мы напишем после слова Inputs, появятся затем в оптимизаторе стратегий.
 
Итак, введем 4 переменные. Минимум для лонга, минимум для шорта, SL – сокращенно от Stop Loss и TP – от Take Profit. В скобках нужно указать значение, которое программа должна использовать по умолчанию – на тот случай, если мы будем прогонять стратегию на истории без использования оптимизатора.
 
Inputs: MinForLong(200), MinForShort(200), SL(100), TP(200);
 
Заметьте, фраза не закончена, пока не поставлена точка с запятой. А после слова Inputs стоит двоеточие – важно!
 
Ну, вот и все, осталось заменить в коде числовые значения на наши буквенные переменные, и программа станет сама подставлять нужные значения в указанных местах.
 
И последнее, что я хотел бы добавить в этот замечательный уникальный код. Давайте запретим программе переносить позицию «через ночь». Для этого нужно закрыть все позиции на последней свечке торгов:
 
If time=2350 then sell this bar close;
If time=2350 then buy to cover this bar close;
 
Эти две фразы только закрывают позиции, не открывая при этом новых. Я об этом упоминал уже выше по тексту.
 
Вот и всё. Финальный код для Easy Language:
Inputs:
MinForLong(200),
MinForShort(200),
SL(100),
TP(200);
 
If close>open and close-open>MinForShort then sell short next bar open;
If open>close and open-close>MinForLong then buy next bar open;
 
If time=2350 then sell this bar close;
If time=2350 then buy to cover this bar close;
 
SetStopLoss(SL);
SetProfitTarget(TP);
 
После написания кода не забудьте его «скомпилировать» — нажмите F3.
 
Как запустить тест стратегии на графике я уже рассказывал в предыдущем посте.
 
Как работать с оптимизатором – думаю, разберетесь. В любом случае, пару слов про него расскажу в следующем посте.
 
В качестве Домашнего задания подумайте сами, какой косяк допущен в этом коде? Их даже 2 при беглом осмотре. Внешне всё выглядит хорошо, но на рынке могут возникать такие ситуации, которые код не учитывает, и всё будет идти немножко не так, как мы предполагали… Если что, это я не про проскальзывание. О нем – в следующем посте!
 
Пост получился длинным, тем не менее, я, конечно же, не смог в нем рассмотреть все особенности и возможности языка Easy Language. Несмотря на своё название и простоту в использовании, на этом языке можно решить очень много различных задач, главное – правильно сформулировать.
 
Если уровень английского языка позволяет, советую почитать встроенный в Multicharts словарь формул и зарезервированных слов. Для этого войдите в PowerLanguage Editor и там выберите справа вкладку dictionary:
 
 Научитесь писать простую стратегию с нуля за 15 минут!
 
 
Ну и напоследок – график эквити за 2013 год с оптимальными значениями:) Просто так:)
 
 Научитесь писать простую стратегию с нуля за 15 минут!          
 
Это был второй пост из серии про Easy language и Multicharts. В следующем я расскажу об оптимизации, проскальзывании, коснусь ещё немного структуры кода. Самые основы. Наверное, уже на следующей неделе.
 
Тем, кто только что подключился, рассказываю. Серия постов:
 
  1. Установка и настройка программы Multicharts.
  2. Основы кодинга, структура кода.
  3. Основы оптимизации и практические примеры в Multicharts.
  4. Фишки кодинга, решение простых задач.
  5. Настройка программы Multicharts, часть 2, атака роботов.
  6. Что-нибудь ещё придумаю, если аудитория довольна останется. Примеры кусков кодов, разбор словаря с наиболее полезными функциями.
 
Профитов!
★59
27 комментариев
А на cme на мультичартсе будет бот робить?
avatar
churinga, да. Они вообще больше под Америку заточены, хотя последнее время и рускоязычная техподдержка тоже радует
Спасибо. Слежу)
avatar
Вот много где уже встречаю конструктив типа:
If close>open and close-open>200…
Вы же простоту пропагандируете. Почему бы не написать:
If close-open>200...? Это то же самое.
avatar
anatolyutkin, с одной стороны — да. С другой стороны так более последовательно в моем мозгу ложится.
Зачем все это варварство делать, если есть версия для .net?

Там можно сложную стратегию за 15 минут написать.
avatar
Spekyl, язык-то уже другой.
Spekyl, программисту не сложно видимо на .net, но как писал автор это же изи ланглич для простых смертных;)
avatar
Spekyl, Эта «сложная» стратегия пишется на Easy L. за 1 минуту. Функциональность та же. Смысл переплачивать временем?
avatar
Denoy.ru, разберешься с c# — и сможешь писать свои стратегии на чем угодно, хоть на экзеле или квике через внешнее приложение. А изи ленгвич это для обратной совместимости с тем барахлом, что уже за 10 лет понаписали для трейдстешн.
Больше ни для чего не годится, по большом счету.
avatar
А как записать, если в определенное время требуется закрыть позицию имеющуюся if поза and time=2222 then close this bar типо)) хочу вникнуть, тут все же проще несложные вещи написать и протестировать как я погляжу)
avatar
StrJ, честно говоря, я не совсем понял вопрос:)

Если надо закрыть позицию в 22:22, нужно тестировать не на часовиках, а на минутках.
Иван Коваль-Зайцев, Да, в 22:22 если есть открытая позиция — закрыть.
avatar
StrJ, условие «если есть открытая позиция» не требуется. Просто if time=XXXX then sell this bar close. для лонга. Для шорта buy to cover. Если позиция есть, программа её закроет. Если нет — то ничего не произойдет.
Иван Коваль-Зайцев, Спасибо, что просвещаете народ. Хочу прояснить ситуацию (для того же народа :)), что выражение:
If time=2350 then sell this bar close;
If time=2350 then buy to cover this bar close;
закроет сделку на первом (в идеале) тике следующей торговой сессии, а не вечером.
avatar
Denoy.ru, это Вы говорите про живую торговлю. А я про бэктестинг. При бэктестировании будет именно клоуз. А для робота — да, нужно понимать, что закрывать позицию в конце дня на последней свечке нужно по-другому, иначе попадаем на овернайт
Иван Коваль-Зайцев, поясните, график в пунктах или в долларах, а если в долларах, то сколько фьючей открывалось.
И второй вопрос. Эта штука при наличии позиции может открыть еще или по умолчанию — нет.
avatar
SergeyJu, график в пунктах, это я недовыставлял настройки в программе. В расчете на 1 контракт без реинвестирования.

В данном случае, эта штука при наличии позиции еще одну не откроет, такие выставлены настройки. Но программа поддерживает и многоступенчатый вход/выход из позиции, правда, тогда код немного уже посложнее становится
Иван Коваль-Зайцев, тогда результат на сделку очень маленький. Такой грааль может легко оказаться ловушкой. Хорошо бы сей факт выделить более выпукло.
avatar
SergeyJu, А ещё здесь не учтено проскальзывание, которое при минимальных значениях сожрет больше половины прибыли. А ещё не проведен анализ инсэмпл-аутофсэмпл. А ещё эта стратегия не имеет под собой никакой логики. А ещё, вполне возможно, нужно ограничить размер сигнальной свечи с другой стороны. А ещё код не учитывает всех особенностей рынка, поэтому данные могут быть искаженными.

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

А там есть, кстати дисклаймер, говорящий о том, что идея тупо с потолка взята
Иван Коваль-Зайцев, вот!
avatar
Иван Коваль-Зайцев, 2 min тоже сгодится :)
avatar
тоже начинаю писать роботов, из всего списка прог выбрал именно мультичартс — мне нравится) жду продолжения)
avatar
слышал, что есть проблемы при установке на 64-разрядные оси
avatar
_sg_, Ставил на 64 разрядный винд 64-разрядный Мульт. Проблем не выявлено
Спасибо)
avatar
>> Тем, кто не читал, советую первый пост – там про настройку программы Multicharts

Извините за оффтопик, саму программу берите здесь: http://getanyplatform.com
avatar

теги блога Иван Коваль-Зайцев

....все тэги



UPDONW
Новый дизайн