Учимся писать эксперты для MetaTrader. Урок №16 - 28 Декабря 2009 - FOREX 21
ФОРЕКС 21 Воскресенье, 11.12.2016, 01:19
Главная | Регистрация | Вход Приветствую Вас Гость | RSS
Меню сайта

Главная » 2009 » Декабрь » 28 » Учимся писать эксперты для MetaTrader. Урок №16
Учимся писать эксперты для MetaTrader. Урок №16
20:50
Учимся писать эксперты для MetaTrader. Урок №16 Обучение MQL II. Урок №16 Здравствуйте дорогие читатели. Сегодня мы напишем, эксперт по алгоритму, который прислал мне Aleksei Prokofew. Вот цитаты из его писем. "Наилучший инструмент для торговли по валютной паре EUR/USD в течение дня - торговая система Oscillator + CCI. Позиции в этой системе открываются при пересечении осциллятором нулевой линии (для 4-часовых и часовых графиков). Сигналом на закрытие позиции служит обратное пересечение осциллятором отметки 100 (длинные позиции) или отметки -100 (короткие позиции). Хотел бы увидеть в рассмотрении этот эксперт на страницах журнала..." Я спросил, о каком осцилляторе идет речь. "Ответ на вопрос: RSI, при пересечении средней линии - открытие. Закрытие соответственно значения 70 и 30..." Ну что же, попробуем все это формализовать. Алгоритм Я думаю, имеет смысл написать несколько экспертов. Первый эксперт будет работать только на CCI. Вход в лонг будет осуществлять после пересечения нулевой линии снизу вверх. Выход по пересечению сверху вниз значения 100. Вход в шорт будет осуществляться после пересечения нулевой линии сверху вниз. Выход пересечению снизу вверх значения -100. Все пересечения учитываем на прошлом баре, входим по открытию нового бара. Во втором эксперте мы добавим RSI. Я думаю открывать и закрывать позиции по пересечению RSI 70 и 30 особого смысла нет, да и из письма не понятно как увязать два индикатора. Поэтому предлагаю RSI сделать фильтром и разрешать входить в рынок от сигналов CCI при "правильных" значениях RSI. Т.е. при входе в лонг RSI должно быть как минимум меньше 50, при входе в шорт как минимум больше 50. Пределы <правильных> значений выложим во внешние переменные. Заключение Первый эксперт (без фильтра RSI), при тестировании на исторических данных EUR/USD Н4 показал неудовлетворительные результаты. Поэтому для торговли однозначно не пригоден. Второй эксперт на тех же исторических данных показал лучшие результаты, за 3 года +261 пункт, на 15 сделок, 221 пункт максимального дродауна. Правда при более "мягких" значениях уровней RSI количество сделок увеличивается, но результат оказывается не удовлетворительным. Возможно, я не до конца правильно понял алгоритм эксперта, поэтому возможно в следующем выпуске система будет модернизирована. /*[[ Name := CCI Author := forextimes.ru Link := www.forextimes.ru Lots := 1.00 Stop Loss := 100 Take Profit := 200 Trailing Stop := 0 ]]*/ Defines: per(14); var: cnt(0),cci1(0),cci2(0); if CurTime-LastTradeTime<8*3600 then exit; // ограничение на количество частоту открытия сделок (для Н4 2 бара) cci1=icci(per,1); //значение cci cci2=icci(per,2); if TotalTrades=0 then { If FreeMargin<1000 then Exit; if cci2<0 and cci1>0 and cci1<100 then { SetOrder(op_buy,lots,ask,3,bidstoploss* point,bid+takeprofit*point,blue); exit;}; if cci2>0 and cci1<0 and cci1>-100 then { SetOrder(op_sell,lots,bid,3,ask+stoploss*point,ask-takeprofit*point,red); exit;}; }; //условия на вход, введены дополнительное условия cci1<100, cci1>-100, для того, что бы условие на открытие не совпало с условием закрытия if TotalTrades>0 then // открытых позиций нет { for cnt=1 to TotalTrades { if OrderValue(cnt,VAL_TYPE)<=OP_SELL and OrderValue(cnt,VAL_SYMBOL)=Symbol then { If OrderValue(cnt,VAL_TYPE)=OP_BUY then // открыт лонг { //if cci2>100 and cci1<100 then if cci2>100 and cci2>cci1 then // условие на закрытие { CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet); Exit; }; }; If OrderValue(cnt,VAL_TYPE)=OP_SELL then // открыт шорт { //if cci2<-100 and cci1>-100 then if cci2<-100 and cci20 and cci1<100 and rsi10 and cci1<0 and cci1>-100 and rsi1>RSIUp then { SetOrder(op_sell,lots,bid,3,ask+stoploss*point,ask-takeprofit*point,red); exit;}; }; if TotalTrades>0 then { for cnt=1 to TotalTrades { if OrderValue(cnt,VAL_TYPE)<=OP_SELL and OrderValue(cnt,VAL_SYMBOL)=Symbol then { If OrderValue(cnt,VAL_TYPE)=OP_BUY then { if cci2>100 and cci1<100 then //if cci2>100 and cci2>cci1 then { CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet); Exit; }; }; If OrderValue(cnt,VAL_TYPE)=OP_SELL then { if cci2<-100 and cci1>-100 then //if cci2<-100 and cci2
Просмотров: 190 | Добавил: forex21 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Календарь новостей
«  Декабрь 2009  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031

Поиск

Друзья сайта


Статистика

Copyright MyCorp © 2016 Бесплатный конструктор сайтов - uCoz