Начните заработывать на Forex прямо сейчас! Регистрация займёт не больше минуты!

Учимся писать эксперты для MetaTrader. Урок №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 количество сделок увеличивается, но результат оказывается не удовлетворительным.

Возможно, я не до конца правильно понял алгоритм эксперта, поэтому возможно в следующем выпуске система будет модернизирована.


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.


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>
Халхальян Артур
техническая поддержка трейдеров
[email protected]

Все материалы рубрики Трейдеру Forex

Forex журнал на subscribe.ru