Учимся писать эксперты для 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 cci2<cci1 then // условие на закрытие
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),ask,3,Violet);
Exit;
};
};
};
};};
Второй эксперт, с дополнительным условием RSI.
/*[[
Name := CCI2
Author := forextimes.ru
Link := www.forextimes.ru
Lots := 1.00
Stop Loss := 100
Take Profit := 200
Trailing Stop := 0
]]*/
Defines: perCCI(14), perRSI(14),RSIUp(60),RSIDown(40); //периоды CCI, RSI, уровни RSI
var: cnt(0),cci1(0),cci2(0),rsi1(0);
if CurTime-LastTradeTime<8*3600 then exit;
cci1=icci(perCCI,1);
cci2=icci(perCCI,2);
rsi1=irsi(perRSI,1);
if TotalTrades=0 then {
If FreeMargin<1000 then Exit;
if cci2<0 and cci1>0 and cci1<100 and rsi1<RSIDown then {
SetOrder(op_buy,lots,ask,3,bid-stoploss*point,bid+takeprofit*point,blue);
exit;};
if cci2>0 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<cci1 then
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),ask,3,Violet);
Exit;
};
};
};
};};
Компания <Fxtest>
Халхальян Артур
техническая поддержка трейдеров
artur@fxtest.ru