В прошлых выпусках мы рассмотрели пример применения функции 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. 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 { // попробуем найти локированную позицию по этому же инструменту int ticket0; ticket0 = OrderTicket(); string symbol0; symbol0 = OrderSymbol(); int ordertype0; ordertype0 = OrderType(); int i; for (i = 1; idouble 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().
Есть что сказать? Не стесняйтесь!
Последние статьи:
Видео по теме:
УГОЛОК АДМИНИСТРАТОРА