Как заработать деньги. Проект сам себе финансист.
сентябрь 2011
пн вт ср чт пт сб вс
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Главная » » »

Пример использования функции OrderClose()

В прошлом выпуске мы рассказали о том, как можно закрыть открытую позицию с помощью функции OrderClose(). Практических примеров применения этой функции можно привести бесчисленное количество, т.к. в большинстве экспертов существует потребность закрывать позиции не только по Stop Loss или Take Profit ордеру, но и по текущей цене.

Мы же в качестве примера применения функции OrderClose() рассмотрим эксперт, который закрывает все открытые позиции и удаляет все отложенные ордера в пятницу после 22:00 (по времени торговой платформы).

   //+------------------------------------------------------------------+
   //|                      Close everything on Friday.mq4 |
   //|                 Copyright © 2006, Andrey Vedikhin |
   //|                                http://www.vedikhin.ru |
   //+------------------------------------------------------------------+
   #property copyright "Copyright © 2006, Andrey Vedikhin"
   #property link      "http://www.vedikhin.ru"
//---- input parameters extern int MyHour=22; extern int MyMinute=00;
// 5 - Friday #define MyDay 5
datetime LastTradeTime;
//+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- // установим время последней торговой операции вчерашним днем LastTradeTime = CurTime()-24*60*60; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //----
//---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- // проверим, не закрывали ли мы все уже сегодня // если да - выходим if (TimeDayOfYear(CurTime())==TimeDayOfYear(LastTradeTime)) return(0);
// если не пятница - выходим if (DayOfWeek()!=MyDay) return(0);
// проверим, не наступило ли время закрывать позиции if (((TimeHour(CurTime())==MyHour)&&(TimeMinute(CurTime())>=MyMinute)) ||(TimeHour(CurTime())>MyHour)) { // закроем все позиции и удалим ордера while (OrdersTotal()>0) { // выделим первую позицию или ордер в списке if (!OrderSelect(0, SELECT_BY_POS)) break; // в случае неудачи выйти из цикла
// если отложенный ордер, то удалить if (OrderType()>OP_SELL) { if (!OrderDelete(OrderTicket())) { Print("Ошибка ", GetLastError()," при удалении отложенного ордера ", OrderTicket()); break; } } // если открытая позиция, то закрыть else { double price; if (OrderType()==OP_SELL) price = MarketInfo(OrderSymbol(), MODE_ASK); else price = MarketInfo(OrderSymbol(), MODE_BID);

if (!OrderClose(OrderTicket(), OrderLots(), price, 3)) { Print("Ошибка ", GetLastError()," при закрытии позиции ", OrderTicket()); break; } }
// пауза 10 секунд Sleep(10000); } if (OrdersTotal()==0) LastTradeTime = CurTime(); }
//---- return(0); } //+------------------------------------------------------------------+

Итак, изучив код этого эксперта, давайте разберемся, как он работает.
Прежде всего этот эксперт имеет несколько параметров:

     extern int       MyHour=22;
     extern int       MyMinute=00;

Эти параметры имеют следующих смысл:

  • MyHour и MyMinute - час и минута, когда эксперт закрывает открытые позиции и удаляет отложенные ордера.

Напомню, что о том, как описать в коде параметры эксперта, я рассказывал в выпуске "Внешние переменные".

Мы объявили глобальную переменную LastTradeTime:

   datetime LastTradeTime;

С ее помощью мы сможем избежать "сработки" эксперта на каждом тике после 22:00, если в этот день мы уже закрыли все открытые позиции и удалили отложенные ордера.

При инициализации эксперта в функции init() мы присваиваем этой переменной значение вчерашнего дня:

   int init()
     {
   //----
     // установим время последней торговой операции вчерашним днем 
     LastTradeTime = CurTime()-24*60*60;    
   //----
      return(0);
     }

Напомню, что функция CurTime() возвращает текущее время в формате datetime.

На каждом тике вызывается функция 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 (DayOfWeek()!=MyDay) return(0);

Функция DayOfWeek() возвращает порядковый номер дня недели (воскресенье - 0, 1 - понедельник, ..., 6 - суббота) последнего известного времени сервера.

Теперь проверим, не наступило ли время закрывать позиции:

     if (((TimeHour(CurTime())==MyHour)&&(TimeMinute(CurTime())>=MyMinute))
         ||(TimeHour(CurTime())>MyHour))
       {
         ...
       }

В этом кусочке кода я использовал две новые функции:

  • int TimeHour(datetime time) - возвращает час для времени time: 0..23;
  • int TimeMinute(datetime time) - возвращает минуту для времени time: 0..59.

Далее с помощью функции OrderSelect() мы начинаем выделять первую позицию/ордер в списке, пытаться ее закрыть или удалить ордер, а потом с помощью цикла while этот процесс повторяется вновь и вновь, пока есть открытые позиции или отложенные ордера. Также цикл прерывается в случае ошибки.

Обязательно между торговыми операциями мы выдерживаем паузу в 10 секунд:

   Sleep(10000);

Функция Sleep(int milliseconds) делает паузу в работе эксперта на milliseconds милисекунд (1 секунда = 1000 милисекунд).

После того, как все позиции закрыты и все отложенные ордера удалены, мы задаем время последней "сработки" советника текущим временем:

   if (OrdersTotal()==0) LastTradeTime = CurTime(); 

В коде эксперта Вы видите еще одну незнакомую нам функцию - MarketInfo():

   double MarketInfo(string symbol, int type)

С помощью этой функции можно получить различную информацию об инструменте symbol. Вид получаемой информации зависит от значения параметра type:

КонстантаЗначениеОписание
MODE_LOW1Минимальная цена за день
MODE_HIGH2Максимальная цена за день
MODE_TIME5Время поступления последней котировки
MODE_BID9Последний Bid
MODE_ASK10Последний Ask
MODE_POINT11Размер пункта в валюте котировки
MODE_DIGITS12Количество цифр после десятичного точки в цене инструмента
MODE_SPREAD13Спрэд в пунктах
MODE_STOPLEVEL14Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах
MODE_LOTSIZE15Размер контракта в базовой валюте инструмента
MODE_TICKVALUE16Размер минимального изменения цены инструмента в валюте котировки
MODE_TICKSIZE17Минимальный шаг изменения цены инструмента в пунктах
MODE_SWAPLONG18Сторидж для длинных позиций
MODE_SWAPSHORT19Сторидж для коротких позиций
MODE_STARTING20Дата начала торгов по инструменту (для фьючерсов)
MODE_EXPIRATION21Дата окончания торгов по инструменту (для фьючерсов)
MODE_TRADEALLOWED22Флаг разрешения торгов по данному инструменту
MODE_MINLOT23Минимальный размер лота
MODE_LOTSTEP24Шаг изменения размера лота
MODE_MAXLOT25Максимальный размер лота

В следующй статье мы познакомимся с функцией OrderCloseBy().

Хомячковый рай. Уйти и потеряться:

Комментарии к этой заметке больше не принимаются.




Есть что сказать? Не стесняйтесь!






Последние статьи:

Выгодные «исламские счета» для трейдеров Форекс Выгодные «исламские счета» для трейдеров Форекс Таким образом, вне зависимости от стиля работы стоит использовать «исламские счета» и сотрудничать с компаниями, которые не берут с трейдеров swap-комиссии. ..
2014-09-29
Стоит ли покупать чужие торговые сигналы и прогнозы? Стоит ли покупать чужие торговые сигналы и прогнозы? И все же основным нашим советом станет отказ от покупки торговых сигналов и прогнозов. Куда лучше научиться анализировать валютный рынок и думать всегда только своей головой. ..
2015-02-12

Видео по теме:




В мире больших денег

  • Самые богатые люди
    планеты. Ежегодные рейтинги FORBS. Истории успеха признаных финансовых гуру
  • Самые дорогие вещи:
    Часы, автомобили, ноутбуки стоимотью в десятки и сотни тысяч долларов. Рубрика "Чтоб я так жил"
  • Денежные прогнозы
    Что покупать и что продавать? Периодические прогнозы цен на иностранные валюты, акции крупнейших компаний и драгоценные металлы

ВКонтакте с деньгами

УГОЛОК АДМИНИСТРАТОРА