Учимся писать эксперты для MetaTrader. Урок №18
Обучение MQL II. Урок 18
Добрый день дорогие читатели! Сегодня мы напишем очень простой эксперт. Но с этой идеей ко мне обращалось уже несколько клиентов. Речь идет о наклоне скользящей средней в тренде.
Алгоритм
Общая идея такая. Скользящая средняя с большим периодом (>50). Берем значение на прошлом баре, это значение считаем текущим. И значение несколько баров назад, например 5. Например, у нас восходящий тренд, и наша МА(70) наклонена вверх. Значит мы имеем, МА- гипотенуза, несколько баров назад (5)-горизонтальный катет, и разница между последним значением МА и значением МА 5 баров назад вертикальный катет, образовавшегося прямоугольного треугольника. И по идее наклон можно назвать угол между МА(гипотенузой) и горизонтальным катетом. Но мы сразу имеем несколько но.
Во-первых, единицы измерения вертикального катета - пункты, а горизонтального бары.
Во-вторых, хоть МА у нас и большого периода, тем не менее это не прямая, поэтому угол между кривой и прямой (горизонтальным катетом) брать не совсем корректно.
Ну и в-третьих, достаточно изменить масштаб графиков, как визуально изменится угол наклона.
Исходя из всего выше перечисленного, я решил оставить углы в градусах, для определения величины наклона МА. Лучшим и более простым способом определения наклона МА я решил выбрать определение величины вертикального катете в пунктах. Т.е. мы, например, всегда берем разницу между прошлым значением МА и значением 4 бара назад, и получаем некую величину, чем больше эта величина, тем больше наклон.
Как дополнительный сигнал к входу будем определят находится ли текущая цена выше МА, для лонга и ниже для шорта.
Итак конечный алгоритм.
Вход в лонг осуществляется, если разница между значением МА на прошлом баре и 4 бара назад больше указанной величины и цена закрытия прошлого бара больше МА на прошлом баре на 10 пунктов или более.
Вход в шорт, наоборот, соответственно.
Условный выход осуществляется по обратному пересечению МА ценой. Т.е. условие для закрытия лонга является превышение значение МА над ценой закрытия.
Во внешние переменные положим период средней и величину в пунктах определяющую тренд.
Заключение
Хоть и с большим дродауном эксперт показал на истории (евро Н4), положительный результат. Для Н1 и ниже я не подбирал параметры, но я думаю, эффективность эксперта ухудшится при переходе на меньшие фреймы.
/*[[
Name := NaklonMa
Author := forextimes
Link := fxtest.ru
Lots := 1.00
Stop Loss := 50
Take Profit := 1000
Trailing Stop := 100
]]*/
defines: tr(10),per(70);
var: cnt(0),k(0);
k=0; //обнудение флага, определяющего тренд
if iMA(per,MODE_SMA,1)-iMA(per,MODE_SMA,4)>tr*point then {k=1; };// условие на возходящий тренд
if iMA(per,MODE_SMA,1)-iMA(per,MODE_SMA,4)<-tr*point then {k=-1;};// условие на низходящий тренд
if TotalTrades=0 then { //если открых позиций нет...
if k=1 and c[1]-iMA(per,MODE_SMA,1)>10*point then
{Setorder(op_buy,lots,ask,3,bid-StopLoss*point,bid+TakeProfit*point,blue);
exit;};
if k=-1 and iMA(per,MODE_SMA,1)-c[1]>10*point 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 c[1]<iMA(per,MODE_SMA,1) then // условие выхода из лонга
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
Exit;
};
};
If OrderValue(cnt,VAL_TYPE)=OP_SELL then
{
if c[1]>iMA(per,MODE_SMA,1) then
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),ask,3,Violet); //условие выхода из шорта
Exit;
};
};
};
};};
Компания «Fxtest»
Халхальян Артур
техническая поддержка трейдеров
artur@fxtest.ru