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

OrderCloseBy() - закрытие одной позиции другой

В прошлых выпусках мы рассмотрели пример применения функции OrderClose(). В этом примере мы закрывали все открытые позиции и удаляли отложенные ордера в 22:00 пятницы по времени торговой платформы. Код эксперта был приведен в выпуске "Пример использования функции OrderClose()".

Этот эксперт был абсолютно безупречен с технической точки зрения, но с финансовой точки зрения можно было бы написать более выгодного для нас эксперта. Если вместо того, чтобы просто закрывать открытую позицию по текущей цене, использовать, где возможно, закрытие одной локированной позиции другой локированной позицией, то в этих случаях мы будем терять не два спрэда, а только один.

Давайте перепишем нашего эксперта с учетом этого совета. В этом нам поможет функция OrderCloseBy():

   //+------------------------------------------------------------------+
   //|                      Close everything on Friday.mq4 |
   //|                 Copyright © 2006, Andrey Vedikhin |
   //|                                http://www.vedikhin.ru |
   //+------------------------------------------------------------------+
   #property copyright "Copyright © 2006, Andrey Vedikhin"
   #property link      "http://www.vedikhin.blog-forex.org"
//---- 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 { // попробуем найти локированную позицию по этому же инструменту int ticket0; ticket0 = OrderTicket();
string symbol0; symbol0 = OrderSymbol();
int ordertype0; ordertype0 = OrderType();
int i; for (i = 1; i<OrdersTotal(); i++) { if (!OrderSelect(i, SELECT_BY_POS)) // в случае неудачи выйти из цикла break; if ((symbol0==OrderSymbol()) && (OrderType()==((ordertype0+1)%2)) ) { if (!OrderCloseBy(OrderTicket(), ticket0)) { Print("Ошибка ", GetLastError()," при закрытии позиции ", OrderTicket(), " позицией ", ticket0); break; } else { i = -2; break; } } } // если CloseBy успешна, то пауза и завершить итерацию цикла if (i==-2) { Sleep(10000); continue; }
// заново выделим нулевую позицию if (!OrderSelect(ticket0, SELECT_BY_TICKET)) // в случае неудачи выйти из цикла break;
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); } //+------------------------------------------------------------------+

В следующем выпуске я объясню принцип работы этого эксперта и расскажу подробно о функции OrderCloseBy().



Все статьи по теме "Пишем советников для MetaTrader 4".

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

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



Размещение статьи "OrderCloseBy() - закрытие одной позиции другой" на Вашем сайте

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

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

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

Журнал FOREX MAGAZINE:



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

Счетчики:

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

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

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


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