Это «второйсполовиной» пост из серии про основы программирования торговых систем на языке Easy (power) language. Он является логическим продолжением второго, но также может рассматриваться и отдельно от остальных. Здесь я рассказываю о работе над простейшими ошибками в коде, а также показываю, как включить учет проскальзывания в программе Multicharts. Кроме того, я затрону тему даты и времени в языке Easylanguage.
На самом деле, этот пост был частью следующего, про оптимизацию. Но текст получился таким длинным, что пришлось разбивать на части…
В прошлом топике из этой серии мы рассмотрели процесс создания простой торговой системы.
Напомню: (уже с оптимальными параметрами)
«Нужно продавать на растущем рынке, при условии, что растет он уже час, поставив стоп в размере 400 пунктов, а тэйкпрофит на 250 пунктов, не забывая о том, что рост меньше, чем на 200 пунктов – таковым не является, а покупать при этом нужно на падающем рынке, даже если сейчас открыта позиция шорт, естественно, с теми же условиями.»
«И последнее, что я хотел бы добавить… запретим программе переносить позицию «через ночь»»
Вот такой получился код:
Inputs:
MinForLong(
200),
MinForShort(
200),
SL(
400),
TP(
250);
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);
И вот такая получилась картинка за 2013 год:
В конце поста я честно признался, что допустил несколько ошибок. И обещал про них рассказать.
Поехали.
Итак, ошибка номер один. Мы хотели избежать овернайтов. Возможно, нам это получилось. Однако, на рынке может возникнуть такая ситуация, при которой позиция откроется на открытии первой свечки (в теории) следующего дня. Это невозможно исполнить простым смертным практически, так что первый импульс нового дня принято как раз-таки считать гэпом.
Для выключения переносов мы закрываем все открытые позиции в последний час торгов. Казалось бы, всё хорошо, но если этот же последний час удовлетворит нашим условиям для сигнальной свечки, то сделка снова откроется. Очевидное решение – запретить входить в рынок, если время сигнальной свечи 23:50.
Дополнительное условие можно было бы записать так: If time<>2350… Тогда на свечке, которой соответствует время 23:50, расчеты вообще производиться не будут.
Ошибка номер два. То, о чем я писал в
посте про выбор таймфрейма: если на свечке могли исполнится как стоп лосс, так и тэйк профит – как узнать, что исполнится первым? В реальной торговли всё просто, но при историческом тестировании могут возникнуть накладки.
Поэтому надо переписать код так, чтобы его можно было использовать на минимальном таймфрейме — минутках, торгуя при этом часовики.
Первое, что приходит в голову – сравнивать текущую минуту с той, что была 60 минут (периодов) назад. Однако, таким образом, мы будем не только открываться по итогам очередного часа, но и внутри него. Ведь необходимое условие может возникнуть в любой момент, когда движение за последний час составило минимальное значение.
Возможно, это и не плохо. Но мы в самом начале ограничили нашу систему часовым таймфреймом (что также является оптимизируемым параметром, но об этом – в следующем посте), поэтому и теперь будем открываться лишь по итогам «классического» часа.
Для этого будем искать сигнал только в последнюю минуту часа. Есть специальное слово в языке Easy language, позволяющее получить номер минуты текущей свечки. У этого слова свой формат данных, поэтому конструкция немножко сложнее, чем все, что до этого здесь было:
If MinutesFromDateTime(ELDateToDateTime(date)+ELtimetodatetime(time))=
59
Лирическое отступление:
MinutesFromDateTime(значение в цифровом формате) – эта формула дает числовое выражение минуты той даты и времени, которые мы запрашиваем.
Вообще изи лэнгвич представляет дату и время в следующем формате: 2259 для 10 часов вечера 59 минут. И 991001 для 1999 года 10 месяца (октября) 01 числа.
Формула MinutesFromDateTime требует конвертации этого формата в числовой (тоже ещё один формат данных). Для этого мы конвертируем данные и прибавляем время к дате. Получаем результат.
Кстати, Изи Ленгвичский формат дат позволяет пользоваться математическими сравнениями больше/меньше, например. Ведь 25 февраля 2013 года – это больше, чем 14 июня 2010:
1130225>1100614 – и достаточно просто сравнить два числа, которые образуют эти даты.
Для операций со временем тоже есть свои удобства. Например: 1405 + 100 = 1505. Однако, тут есть и свои тонкости, о которые требуют отдельного разговора…
Итак, всё готово, можно записать код.
Inputs:
MinForLong(
200),
MinForShort(
200),
SL(
400),
TP(
250);
If MinutesFromDateTime(ELDateToDateTime(date)+ELtimetodatetime(time))=
59 and close-open[
59]>MinForShort then sell short next bar open;
If MinutesFromDateTime(ELDateToDateTime(date)+ELtimetodatetime(time))=
59 and open[
59]-close>MinForLong then buy next bar open;
If time=
2349 then sell this bar close;
If time=
2349 then buy to cover this bar close;
SetStopLoss(SL);
SetProfitTarget(TP);
Если вы не хотите пропускать ни одного часа торгов, придется вспомнить, что вечерний клиринг начинается в 1845. Поэтому для последнего часа основной сессии нужна своя строчка:
If time=1844 and close-open[44]>MinForShort then sell short next bar open;
Аналогично для лонга.
2359 уже торгов нет, поэтому овернайт ни одной сделки открытой не останется благодаря дополнительному условию для выхода из позиций в последнюю минуту торгов (23:49, в 50 минут биржа уже закрыта).
Ну и ещё одна ошибка – отсутствие учета потерь на проскальзывании. Для того, чтобы открыть настройки тестирования стратегии, следуйте краткой графической инструкции ниже. Я поставил минимальное проскальзывание 10 пунктов за сделку.
Здесь же, кстати, устанавливается параметр MaxBarsBack, о котором ещё пойдет речь в следующих постах. Конкретно для сегодняшней системы он должен быть не меньше 59 — именно на такое количество баров назад должна смотреть система, проверяя условия для сигнальной свечки. У меня стоит 300...
Ну вот, все ошибки исправлены, посмотрим на эквити. Слева без учета проскальзывания, а справа – с ним, с родименьким.
Бывает, напишешь код и не понимаешь – почему не работает. Сначала ошибку ищешь долго. Но затем с каждым новым кодом начинаешь понимать, где «просчитался». С опытом всё это приходит. Но даже опытным трейдерам не следует бросать только что написанный код сразу «в бой». Проверка на минимальных объемах как раз-таки позволяет выявить бОльшую часть ошибок. Ну и просмотр сделок на истории не повредит – часто именно анализируя, где программа вошла БЫ в позицию, и сравнивая это с тем, где необходимо было БЫ войти по изначальному условию, находишь самые неожиданные ошибки.
Я продолжаю готовить посты из этой серии. И на самом деле, есть очень много моментов, о которых нужно рассказать – целый учебник получается. Кроме того, сколько бы я ни рассказывал – всё равно никто не застрахован от ошибок при написании первых строк. Я буду продолжать эту серию, но, по мере сил, будет создан расширенный курс, который позволит его слушателям глубже изучить этот язык.
Честно говоря, у меня и раньше были мысли об обучении. И сейчас, при подготовке этих постов (а также разгребая присланные мне идеи), я столкнулся с тем, что очень сложно будет осветить в этом формате все особенности языка.
С одной стороны, примитивного подхода более, чем достаточно. И я буду продолжать делиться им так, что вы сможете, приложив усилия, самостоятельно освоить язык. С другой стороны, как я уже сказал, будет создан крутой курс, в котором я расскажу не только всё, что знаю про легкий язык изи-ленгвич, но также поделюсь своим подходом к поиску идей и программированию стратегий.
Тем, кто только что подключился, рассказываю. Серия постов:
1.
Установка и настройка программы Multicharts.
2. Основы кодинга, структура кода.
2,5. Исправление ошибок. Дата и время. Проскальзывание.
3. Основы оптимизации и практические примеры в Multicharts.
4. Фишки кодинга, решение простых задач.
5. Настройка программы Multicharts, часть 2, атака роботов.
6. Что-нибудь ещё придумаю, если аудитория довольна останется. Примеры кусков кодов, разбор словаря с наиболее полезными функциями.
Профитов!
P.S. Редкий читатель
долетит до середины Днепра сможет прочитать весь этот многабукаф. Редкий читатель, не забудь поставить «хорошо», если считаешь, что это было хорошо. Афтар долго мучил свою клавиатуру, создавая этот текст.
P.P.S. А про оптимизацию в понедельник текст выложу! Он уже почти готов! Там поинтереснее будет…
Если отсутствует у кого-то MultiCharts, взяьт временную лицензию можно здесь: http://getanyplatform.com
Есть и другие платформы.