« Предыдущий пост | На главную страницу | Следующий пост »

Пример использования функции 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".

« Предыдущий пост | На главную страницу | Следующий пост »

Разместите свой комментарий по теме "Пример использования функции OrderSend() - продолжение"

Подписаться на мою рассылку



Размещение статьи "Пример использования функции OrderSend() - продолжение" на Вашем сайте

Размещение статьи "Пример использования функции OrderSend() - продолжение" на Вашем сайте возможно при условии выполнениия следующих условий:

  • Запрещается изменение оригинального текста без согласия автора - Андрея Ведихина.
  • Должен быть указан первоисточник. В случае публикации в интернете Вы должны разместить следующий код гиперссылки без изменений:
  • Запрещается коммерческое использование материалов, взятых с блога "Интернет-трейдинг на форекс / forex". Доступ к ним должен быть свободным, без взимания какой-либо платы, без обязательной регистрации и/или заполнения опросного листа (анкеты) и т.д.

В случае выполнения данных условий не требуется согласия автора блога "Интернет-трейдинг на форекс / forex" на размещение статьи "Пример использования функции OrderSend() - продолжение" на Вашем сайте.

Журнал FOREX MAGAZINE:



Архив номеров FOREX MAGAZINE
Котировки Forex:

Счетчики:

Авторские права © 2005-2006 Андрей Ведихин

Условия использования материалов блога "Интернет-трейдинг на форекс / forex"

Контакты с автором:


Движок сайта:
Movable Type 3.31