Учимся писать эксперты для MetaTrader. Урок №14
Обучение MQL II. Урок №14
Здравствуйте дорогие читатели. Я получил несколько алгоритмов экспертов, в следующих выпусках я обязательно реализую некоторые из них. В этом же выпуске а бы хотел поговорить о частях исходного кода, которые одинаковы в любых экспертах. Кто-то скажет, что каждый эксперт индивидуален, кто-то, что во всех очень много общего, но точно, что некоторые моменты абсолютно одинаковые. Это проверка свободной маржи, ограничение торговли эксперта по времени (торговые сессии или ограничение по дням недели), трейлингстоп и т.д. Об этих фрагментах кода экспертов и пойдет речь.
14.1 Ограничение ДЦ
На работу экспертов у ДЦ ограничений 2, точнее это ограничение не на эксперты конкретно, а вообще на работу через ДЦ.
1) Ограничение на свободную маржу: If FreeMargin<1000 then Exit;
2) 10 секундный таймаут, после открытия позиции: If((CurTime-LastTradeTime)<10
14.2 Возможные проверки
В начале эксперта можно делать проверку на
1) Правильное выставление стопов If StopLoss<10*point or StopLoss>100*point then exit;
2) Проверка количества баров истории (для теста на истории) If Bars<200 then Exit;
3) Для игры одной позицией можно использовать конструкцию вида If TotalTrades<1 then {
или
If TotalTrades=1 then exit;
4) Для запуска трейлинга If TrailingStop>0 then {
14.3 Проверки и ограничения по времени
Иногда возникает потребность протестировать эксперт на каком-то определенном промежутке истории, условия могут выглядеть следующим образом
If Year <> 2003 Then Exit; С помощью этого ограничения, тестирование эксперта произойдет только за 2003 год
If Year >= 2004 And Month > 2 Then Exit; Тестирование эксперта до определенной даты, в данном случае до конца февраля 2004 года.
Условия на проверки времени внутри дня.
If Hour < 10 Or Hour > 19 Then Exit; Торговля будет производиться в интервале с 10 до 19 по времени МТ.
If Minute = 10 Then { Действие будет происходить в 10 минут каждого часа по времени МТ.
If Seconds = 10 Then { То же, для секунд.
Так же в МТ можно делать проверки по времени на время суток, для этого существует функция Day of week. Она может принимать значения от 1 до 7, соответственно дням недели, только нумерация начинается с воскресения. Т.е. 1-воскресенье, 2- понедельник и т.д.
If DayOfWeek = 3 Then Exit; Эксперт не будет работать по вторникам.
14.4 Трейлингстопы
Конечно же нет смысла писать новый трейлингстоп для каждого эксперта, его можно вставлять в код эксперта при желании.
If TrailingStop>0 then {
for cnt=1 to TotalTrades
begin
/* если это длинная позиция? */
If Ord(cnt,VAL_TYPE)=OP_BUY then /* длинная позиция */
{
/* есть ли профит у этой сделки больше чем уровень трейлинг стопа? */
If (Bid-Ord(cnt,VAL_OPENPRICE))>(TrailingStop*Point) then
{
/* позиция имеет прибыль больше чем значение трейлинг стопа тогда проверяем, можно ли поджать стоп? */
If Ord(cnt,VAL_STOPLOSS)<(Bid-TrailingStop*Point) then
{
/* поджимаем стоплосс до Bid-Trailing Stop */
ModifyOrder(Ord(cnt, VAL_TICKET), Ord(cnt, VAL_OPENPRICE), Bid-TrailingStop*Point, Ord(cnt, VAL_TAKEPROFIT), Red);
Exit;
};
};
};
/* это короткая позиция? */
If Ord(cnt,VAL_TYPE)=OP_SELL then
{
/* есть ли профит у этой сделки больше чем уровень трейлинг стопа? */
If (Ord(cnt,VAL_OPENPRICE)-Ask)>(TrailingStop*Point) then
{
/* позиция имеет прибыль больше чем значение трейлинг стопа тогда проверяем, можно ли поджать стоп?*/
If Ord(cnt,VAL_STOPLOSS)>(Ask+TrailingStop*Point) or Ord(cnt,VAL_STOPLOSS)=0 then
{
/* поджимаем стоплосс*/
ModifyOrder(Ord(cnt, VAL_TICKET), Ord(cnt, VAL_OPENPRICE), Ask+TrailingStop*Point, Ord(cnt, VAL_TAKEPROFIT), Red);
Exit;
};
};
};
end;
};
Я уверен, что благодаря этим не сложным заготовкам, процесс написания экспертов только улучшиться и немного упроститься.
В следующем выпуске мы напишем эксперт или индикатор, алгоритм которого покажется мне более интересным.
Компания <Fxtest>
Халхальян Артур
техническая поддержка трейдеров
artur@fxtest.ru