Пример использования функции OrderSend() - продолжение
В прошлом выпуске я написал по просьбе одного из читателей моего блога эксперт, в котором воплощена следующая логика:
Советник должен в определенное время (параметры MyHour и MyMinute) на заранее заданном расстоянии от текущей цены (параметр MyPendingLevel) выставлять два ордера - Sell Stop и Buy Stop. При этом должны выставляться ордера Stop Loss на расстоянии MySL пипсов от цены ордера и Take Profit на расстоянии MyTP пипсов. |
В этом выпуске я хотел бы разобрать подробно логику работы этого эксперта.
Прежде всего этот эксперт имеет несколько параметров:
extern int MyPendingLevel=15; extern int MySL=30; extern int MyTP=15; extern int MyHour=19; extern int MyMinute=40; extern int MyLots=1.0;
Эти параметры имеют следующих смысл:
- MyPendingLevel - расстояние в пипсах от текущей цены, на котором выставляется отложенный ордер;
- MySL и MyTP - Stop Loss и Tale Profit в пипсах от цены отложенного ордера;
- MyHour и MyMinute - час и минута, когда выставляет отложенный ордер;
- MyLots - размер лота отложенного ордера.
Напомню, что о том, как описать в коде параметры эксперта, я рассказывал в выпуске "Внешние переменные".
В реальности может возникнуть ситуация, когда на баре MyHour:MyMinute может быть несколько тиков, поэтому чтобы избежать выставления отложенных ордеров на каждом тике, мы завели глобальную переменную LastTradeTime:
datetime LastTradeTime; // время последней торговой операции
Этой переменной мы присваиваем в качестве начального значения вчерашнюю дату при инициализации эксперта - в функции init():
//+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- // установим время последней торговой операции вчерашним днем LastTradeTime = CurTime()-24*60*60; //---- return(0); }
На каждом тике вызывается функция start(), в которой мы сначала проверяем, не выставляли ли мы уже сегодня отложенные ордера:
// проверим, не выставляли ли мы ордер уже сегодня // если выставляли - выходим if (TimeDayOfYear(CurTime())==TimeDayOfYear(LastTradeTime)) return(0);
Здесь используется неизвестная нам пока функция TimeDayOfYear():
int TimeDayOfYear( datetime date )
Эта функция возвращает порядковый номер дня (с начала года): 1 - 1 января, ... , 365 или 366 - 31 декабря.
Если же порядковый номер дня последней торговой операции - TimeDayOfYear(LastTradeTime) - равен порядковому дню текущего времени - TimeDayOfYear(CurTime()), - значит мы уже сегодня ордера выставляли, поэтому выходим из эксперта: return(0).
Теперь проверим, не наступило ли время выставить отложенный ордер:
// проверим, не наступило ли время выставить ордер if ((TimeHour(CurTime())==MyHour)&&(TimeMinute(CurTime())==MyMinute)) { ... }
Расскажу о двух незнакомых функциях в этом участке кода:
- int TimeHour(datetime time) - возвращает час для времени time: 0..23;
- int TimeMinute(datetime time) - возвращает минуту для времени time: 0..59.
Если уже пора выставить отложенный ордер, то сначала с помощью функции OrderSend() размещаем ордер Buy Stop.
Потом выжидаем паузу в 10 секунд с помощью функции Sleep():
void Sleep(int milliseconds)
Эта функция делает паузу в работе эксперта на milliseconds милисекунд (1 секунда = 1000 милисекунд).
За эти 10 секунд текущий бид и аск могли измениться, поэтому мы обновляем их с помощью функции RefreshRates().
Далее мы выставляем отложенный ордер Sell Stop.
Вот мы и дошли до конца нашего эксперта. Хочу заметить, что этот эксперт может пропустить момент, когда надо было выставить отложенный ордер, если в этом баре не было котировок и функция start() не вызывалась. Думаю, что у моего читателя уже достаточно собственных знаний, чтобы самостоятельно подправить этот недостаток эксперта.
В следующем выпуске я расскажу о функции OrderModify().
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4: