Главная » Статьи » Форекс Советники |
Рождение форекс эксперта. Стохастическая СистемаВ данной статье я покажу, шаг за шагом, как был написан эксперт для Стохастической системы. Напомню правила торговли по этой системе:
Замечание: в эксперте, который мы будем писать, одновременно будут открываться два одинаковых ордера BUY или SELL. Это сделано для того, чтобы упростить алгоритм работы эксперта. Все дело в том, что при достижении профита в 10 пунктов предполагается, по правилам системы, закрыть часть позиции, а это проще сделать, если у нас открыто 2 одинаковых ордера. В этом случае достаточно закрыть один из ордеров, хотя, даже и этого нам не нужно делать, т.к. он закроется автоматически при достижении профита в 10 пунктов, потому что при открытии этого ордера мы выставим значение TakeProfit равным 10 пунктов. Итак, приступаем к написанию эксперта на MQL4 для MetaTrader4. Я предполагаю, что Вы имеете начальные представления об MQL4. Если нет, то прочитайте справку по MQL4. И вообще, в любом случае начинать изучать язык лучше с прочтения справки по данному языку. Это же касается и языка программирования MQL4. Открываем MetaEditor и создаем нового эксперта. Для этого идем в меню "Файл" -> "Создать…"-> выбираем "Советник". Далее вводим необходимую информацию, при этом поле "параметры" оставляем пустым. Параметры мы добавим по ходу написания эксперта. Жмем кнопку "Готово", и вот, что мы в итоге получим:
Я убрал некоторые закомментированные строки, которые автоматически вставляются редактором, исключительно для экономии места. Система построена на основе Стохастика, поэтому нам потребуется получать значения этого индикатора с помощью встроенной функции iStochastic(). Добавляем три строчки, в которых происходят расчеты значений индикатора:
Так же объявляем внешние переменные, которые задают параметры Стохастика. Это позволит нам менять их во время тестирования:
Для вычислений нам потребуется именно три значения Стохастика т.к. нам нужно будет определять изменение направления в его движении. Причем заметьте, что мы вычисляем значения Стохастика только на 3-х уже сформировавшихся свечах предшествующих текущему, нулевому бару. Это важно, так как текущий бар при реальной торговле будет постоянно меняться, пока не примет окончательную форму с приходом нового бара. Текущее значение Стохастика, которое соответствует текущему, или нулевому бару, постоянно меняется с приходом новых тиков, т.к. сам нулевой бар изменяется. Все остальные свечи уже сформированы, и их можно использовать для расчетов, или же при принятии решений. Так же нам потребуется знать текущий час, чтобы контролировать время входов и выходов:
Все приготовления сделаны, и наш эксперт принимает вид:
Теперь займемся правилами торговли. Реализуем следующее правило, вход в длинную позицию: «Покупаем, когда линия %К, находившаяся ниже уровня 30, пересекает уровень 50». Эту проверку нужно производить только в том случае, если еще не открыто ни одной позиции, т.е. OrdersTotal()<1, и не забываем, что торговля ведется строго с 13.00 по 21.00 CET:
Ну а теперь, внутри этой конструкции, будем проводить проверку на выполнение условия для длинной позиции. Для этого нам потребуется переменная, которая говорила бы нам, что Стохастик находился ниже уровня 30, до того как пересек уровень 50. Добавляем строку, в которой переменная K_level будет приравнена к 30, когда Стохастик опустится ниже уровня 30. Добавим ее в начало функции start(), например, сразу после объявления переменной Hour_curr:
Не забываем добавить объявление переменной K_level. Она должна быть объявлена как глобальная, чтобы ее значение не обнулялось каждый раз при вызове функции start(). Поэтому объявляем ее сразу после внешних переменных:
Теперь, для входа в длинную позицию, достаточно проверить, что K_level = 30 и Стохастик имеет значение больше 50. Это и будет считаться приказом на покупку. На MQL4 это выглядит так:
Функция RefreshRates() в данном случае используется для того, чтобы обновить значение переменной Ask, которая используется в функции OrderSend(…). Этого можно было и не делать, так как в нашем случае, ввиду примитивных вычислений, переменная Ask вряд ли изменится за время проведения вычислений. Все же, я рекомендую использовать функцию RefreshRates() даже в этом случае, потому как вероятность того, что переменная Ask изменится, все же есть. Далее идут подряд две функции OrderSend(…). Первая открывает ту часть совокупной позиции, которая будет закрыта на втором снижении линии %К. Поэтому значения стоплосс и тейкпрофит в этой функции равны нулю. Вторая открывает часть позиции, которая будет закрываться при достижении профита равного 10 (это значение задается внешней переменной TakeProfit). Последней строчкой в этом блоке мы "обнуляем" пременную K_level, присвоив ей значение равное 50. Стохастик должен, теперь, снова опуститься ниже уровня 30, чтобы эксперт получил возможность в будущем совершить сделку. Не забываем объявить две переменные, одну локальную – ticket (объявляется внутри функции start()), другую внешнюю – TakeProfit (объявляется там же где и все внешние переменные). Аналогично добавляем блок для входа в короткую позицию. Он выглядит точно так же за исключением некоторых отличий. Описывать их не буду, потому что все понятно из кода MQL4-программы. На данный момент мы имеем следующий код:
Теперь давайте добавим в эксперта блок закрытия всех сделок в 22.00 CET, т.к. это одно из правил торговой системы, и его проще реализовать на MQL4, нежели другие правила для закрытия сделок:
С условием - Hour_curr>=22 все понятно - проверяем, что текущий час больше или равен 22, т.е. наступило время для закрытия всех сделок. Можно было проверять на строгое равенство 22 часам, но это хуже, так как возможна ситуация, когда ни одной котировки с таким значением времени не окажется. А так, мы и в 22, и в 23 часа сможем закрыть сделки. Если, произойдет так, что в период с 22.00 по 23.59 не придет ни одной котировки, или же, при тестировании на истории, в исторических данных не будет котировок в этот период, то наши сделки перенесутся на следующий день. При реальной торговле этого, в принципе, можно избежать, если добавить в эксперта проверку локального времени с помощью функции TimeLocal(). Но это, к сожалению, не поможет при тестировании эксперта на исторических данных. Далее идет цикл, в котором происходит вызов функции CloseDirect(…), которая закрывает первую позицию в списке открытых ордеров. Закрытие первого в списке ордера мы вынесли в отдельную функцию с той целью, что данная функция нам потребуется еще несколько раз, когда будет реализован алгоритм закрытия ордеров на 2-ом снижении (повышении) линии %К и при обратном движении Стохастика.
Итак, функция CloseDirect(…):
Функция имеет два входных параметра, cntr – порядковый номер открытого ордера, который нужно закрыть и comm. – комментарий, который выводится в журнал для того, чтобы иметь возможность идентифицировать причину закрытия ордера. Алгоритм работы этой функции простой: сначала выбираем ордер с порядковым номером cntr из списка открытых ордеров при помощи функции OrderSelect(…):
Затем, в зависимости от того, ордер какого типа мы будем закрывать, выбираем цену закрытия - Bid для длинной позиции, Ask – для короткой:
И, наконец, закрываем позицию:
| |
Просмотров: 3385 | Комментарии: 3 | Рейтинг: 0.0/0 |
Всего комментариев: 1 | ||
| ||