Это второй пост из серии про основы программирования торговых систем на языке Easy (power) language. На примере простой стратегии я расскажу, как написать условия для входа, выхода из позиции, как поставить стоп лосс и тэйк профит, как при этом выстроить код так, чтобы систему можно было оптимизировать.
Тем, кто не читал, советую первый пост – там про настройку программы Multicharts. Первые шаги, так сказать…
Easy Language дословно переводится «Лёгкий язык». Простота программирования на Изи заключается в его несложной структуре, в интуитивно понятных формах. В принципе, Редактору, встроенному в
Multicharts, достаточно просто по-английский «сказать» то, что вы хотите сделать – и высока вероятность, что программа вас поймет и сделает именно то, что вы хотели.
Конечно, необходимо знать некоторые общие принципы и структуры.
Например, в конце каждой логически завершенной фразы нужно ставить точку с запятой;
Но, это я забегаю немного вперед…
Я думаю, что существует какая-нибудь официальная философия языка – подобно той, что есть у языка Python, например, но лично мне она не попадалась. Поэтому попробую взять некоторые высказывания из философии Python, которые, на мой взгляд, отлично подходят к Easy Language:
— Красивое лучше, чем уродливое.
— Явное лучше, чем неявное.
— Простое лучше, чем сложное.
— Сложное лучше, чем запутанное.
— Разреженное лучше, чем плотное.
— Читаемость имеет значение.
— При этом практичность важнее безупречности.
— Если реализацию сложно объяснить — идея плоха.
— Если реализацию легко объяснить — идея, возможно, хороша.
Когда вы пишете код на Изи, не пытайтесь впихнуть всю свою идею в одну строчку. Упрощайте!
Disclaimer: Понять основы программирования легче всего на примере. В этом посте я взял самое простое и самое первое, что пришло мне в голову. Это НЕ рабочая стратегия. Это просто идея, которая имеет право быть проверенной на исторических данных. Те параметры и значения, которые я использую в ней, даны просто для наглядного примера работы разных элементов структуры кода.
Я работаю больше всего с фьючерсом на индекс РТС, поэтому все примеры я писал, представляя себе именно его. Но всё это с легкостью переносится и на акции, и на валюты.
Итак, поговорим о сложности и простоте. Например, нужно продавать на растущем рынке, при условии, что растет он уже час, поставив стоп в размере 100 пунктов, а тэйкпрофит на 200 пунктов, не забывая о том, что рост меньше, чем на 200 пунктов – таковым не является, а покупать при этом нужно на падающем рынке, даже если сейчас открыта позиция шорт, естественно, с теми же условиями.
Если просто перевести эту фразу на английский язык и поставить в конце точку с запятой, ничего не получится. Нужно упрощать.
Допустим, под растущим рынком мы понимаем растущую часовую свечку. Это значит, что цена закрытия этой свечи будет выше, чем цена её открытия.
А условие, что рынок должен вырасти на 200 пунктов, как записать? По сути, это есть минимальная разница между ценой закрытия свечи и ее открытия.
Так и запишем:
Если закрытие больше открытия, и закрытие минус открытие больше 200 пунктов, то надо продавать немедленно.
Аналогично для лонга:
Если открытие больше закрытия, и открытие минус закрытие больше 200 пунктов, то надо покупать.
Для входа в позицию и выхода из нее, что называется, «по рынку» при историческом тестировании чаще всего используются выражения «по цене закрытия этого бара» или «по цене открытия следующего бара».
Кстати, все знают, что бары и свечки – это одно и тоже, просто разный стиль отрисовки?
Существует несколько способов установить Стоп Лосс для позиции, но самый простой и распространенный – это слово УстановитьСтопЛосс(в скобках значение в пунктах).
Аналогичные действия для тэйк профита — УстановитьПрибыльЦель(в скобках значение в пунктах).
Давайте, картинку нарисуем для нашей идеи, чтоб совсем просто было:
Итак, у нас есть всё, для того, чтобы код начал работать:
Если закрытие больше открытия, и закрытие минус открытие больше 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:
Ну и напоследок – график эквити за 2013 год с оптимальными значениями:) Просто так:)
Это был второй пост из серии про Easy language и Multicharts. В следующем я расскажу об оптимизации, проскальзывании, коснусь ещё немного структуры кода. Самые основы. Наверное, уже на следующей неделе.
Тем, кто только что подключился, рассказываю. Серия постов:
- Установка и настройка программы Multicharts.
- Основы кодинга, структура кода.
- Основы оптимизации и практические примеры в Multicharts.
- Фишки кодинга, решение простых задач.
- Настройка программы Multicharts, часть 2, атака роботов.
- Что-нибудь ещё придумаю, если аудитория довольна останется. Примеры кусков кодов, разбор словаря с наиболее полезными функциями.
Профитов!
If close>open and close-open>200…
Вы же простоту пропагандируете. Почему бы не написать:
If close-open>200...? Это то же самое.
Там можно сложную стратегию за 15 минут написать.
Больше ни для чего не годится, по большом счету.
Если надо закрыть позицию в 22:22, нужно тестировать не на часовиках, а на минутках.
If time=2350 then sell this bar close;
If time=2350 then buy to cover this bar close;
закроет сделку на первом (в идеале) тике следующей торговой сессии, а не вечером.
И второй вопрос. Эта штука при наличии позиции может открыть еще или по умолчанию — нет.
В данном случае, эта штука при наличии позиции еще одну не откроет, такие выставлены настройки. Но программа поддерживает и многоступенчатый вход/выход из позиции, правда, тогда код немного уже посложнее становится
Да, торговать такое нельзя, но строчка об этом не добавит профита тем, кто решит такое торговать без дополнительной проверки, увы.
А там есть, кстати дисклаймер, говорящий о том, что идея тупо с потолка взята
Извините за оффтопик, саму программу берите здесь: http://getanyplatform.com