функция OrderClose


например, forex

Пришло время рассказать отом, как закрыть открытую позицию спомощью функции OrderClose().

   bool OrderClose(int ticket, double lots, double price, int slippage, 
                              color Color=CLR_NONE)

Параметры функции:

  • ticket— тикер открытой позиции;
  • lots— объем влотах;
  • price— цена закрытия позиции;
  • slippage— максимально допустимое отклонение между price иценой сервера, при котором позиция будет закрыта;
  • arrow_color— цвет закрывающей стрелки награфике. Если параметр отсутствует или его значение равно CLR_NONE, тострелка неотображается награфике.

Функция OrderClose() вернет true, если позиция закрыта успешно. Еслиже произошла какая-то ошибка, тофункция вернет false икод ошибки можно будет получить спомощью функции GetLastError().

Практических примеров применения этой функции можно привести бесчисленное количество, т.к. вбольшинстве экспертов существует потребность закрывать позиции нетолько по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».
 
+7 (495) 710-76-76
8 (800) 200-01-31
по России бесплатно

закрыть

Вход в личный кабинет

Для счета alpari.classic введите номер счета (буква и 4 цифры) и пароль в ЛК.

Для счетов alpari.micro и alpari.partner введите логин и пароль в МТ.

Зарегистрироваться!Забыли пароль?

 
Rambler's Top100