Учимся писать эксперты для MetaTrader. Урок №17
Добрый день дорогие читатели! Сегодня мы напишем довольно интересный эксперт. Его алгоритм основан на времени, точнее на торговых сессиях.
Алгоритм
Не представившийся читатель прислал мне следующие рисунки, и попросил по ним, на свое усмотрение написать эксперт.
Ну что ж попробуем это все описать словами.
Условия на вход в лонг. Цена открытия дня ниже максимальной цены за период, максимальная цена достигается за азиатскую сессию. Минимальная цена за период достигнута за европейскую сессию, и она ниже цены открытия. Вход осуществляется в начало американской сессии по пробою максимально достигнутой цены. Стоплосс- минимальная цена дня.
Условие на вход в шорт. Цена открытия дня выше минимальной цены за период, достигнутой за азиатскую сессию. Максимальная цена за период достигнута за европейскую сессию, и она выше цены открытия. Вход осуществляется в начало американской сессии по пробою минимально достигнутой цены. Стоплосс- максимальная цена дня.
Время входа в часах по GMT, доступна для регулирования (во внешней переменной).
Т.к. конкретной цели у нас нет, за цель мы получим банальный трейлингстопом. Т.к. будем просто поджимать стоплосс под уже достигнутый профит.
Вот такой простейший алгоритм получился. Его можно сильно усложнить, но я не ставил этой цели, т.к. те кого он заинтересует, будут иметь такую возможность.
Заключение
При тестировании на истории картина получается довольно неплохая. Но есть несколько но. Во-первых 40 сделок на 1 год и 3 месяца, конечно же маловато тем более, что фильтров никаких мы не применяли. И во-вторых за эти год и 3 месяца истории мы имеем сильный восходящий тренд, поэтому целесообразней учитывать только короткие позиции.
/*[[
Name := Sessiy
Author := forextimes.ru
Link := www.Fxtest.ru
Lots := 1.00
Stop Loss := 0
Take Profit := 1000
Trailing Stop := 30
]]*/
Define: USAhour(13); //время за которое мы принимаем начало американской сессии, т.е начинаем торговать
var:cnt(0),i(0),MaxH(0),MinL(0),op(0),MaxHi(0),MinLi(0);
if hour=USAhour and TotalTrades=0 then { //если время американской сессии наступило и открытых позиций нет но начинаем.
op=o[USAhour]; //так определяем цену открытия дня, т.е цену открытия в 0 по GMT
MaxH=h[1]; //изначально за максимальную цену дня принимаем максимальную цену прошлого бара
MinL=l[1]; //изначально за минимальную цену дня принимаем минимальную цену прошлого бара
for i=USAhour DownTo 1 { //в цикле производим поиск реальных минимальных и максимальных цен периода
if h[i]>MaxH then {MaxH=h[i]; MaxHi=i;}; // в переменную MaxH кладем максимальную цену, в MaxHi ее индекс
if l[i]<MinL then {MinL=l[i]; MinLi=i;}; // в переменную MinL кладем минимальную цену, в MinLi ее индекс
};
if op>MinL and MinLi<(USAhour-1) and MinLi>(USAhour-6) and hour<19 and bid<MinL then
{SetOrder(op_sell,lots,bid,3,MaxH+5*point,ask-takeprofit*point,red); exit;};
if op<MaxH and MaxH<(USAhour-1) and MaxHi>(USAhour-6) and hour<19 and ask>MaxH then
{SetOrder(op_buy,lots,ask,3,MinL,bid+takeprofit*point,blue); exit;};
// выше производим проверку условий на вход, о условиях мы подробней говорили выше
};
for cnt=1 to TotalTrades
begin
/* это длинная позиция? */
If Ord(cnt,VAL_TYPE)=OP_BUY then /* длинная позиция */
{
/* есть ли профит у этой сделки больше чем уровень трейлинг стопа? Проверяем Bid, так как позиция BUY */
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
{
/* есть ли профит у этой сделки больше чем уровень трейлинг стопа? Проверяем Ask, так как позиция SELL */
If (Ord(cnt,VAL_OPENPRICE)-Ask)>(TrailingStop*Point) then
{
/* позиция имеет прибыль больше чем значение трейлинг стопа, можно ли поставить стоп лучше чем он был ранее? */
If Ord(cnt,VAL_STOPLOSS)>(Ask+TrailingStop*Point) or Ord(cnt,VAL_STOPLOSS)=0 then
{
/* меняем стоплосс на уровень Ask+Trailing Stop */
ModifyOrder(Ord(cnt,VAL_TICKET),Ord(cnt,VAL_OPENPRICE),
Ask+TrailingStop*Point,Ord(cnt,VAL_TAKEPROFIT),Red);
Exit;
};
};
};
end;
Компания «Fxtest»
Халхальян Артур
техническая поддержка трейдеров
artur@fxtest.ru