Эксперт, торгующий в ночное время: функция start() - продолжение
В прошлом выпуске я начал рассмотрение того, как реализована функция start() "ночного" эксперта. В этом выпуске я рассмотрю оставшиеся части кода эксперта.
После того, как мы выставили (если необходимо) отложенные ордера и проверили, не надо ли нам удалить отложенный ордер (как OCO), пришла пора проверить, не пришло ли время закрыть открытую позицию:
if (((c_hour>CloseHour)||((c_hour==CloseHour)&&(c_minute>=CloseMinute)))&& (TimeDay(c_time)!=TimeDay(LastTradeTime))) { // закрываем позицию ... }
Если же мы видим, что уже пришло время закрывать позицию, то мы осуществляем перебор всех открытых позиций и отложенных ордеров. В процессе перебора пытаемся найти позицию (OrderType() равен OP_BUY или OP_SELL), открытую по нашему инструменту и с магическим числом MyMagicNumber. Если такая позиция найдена, то мы ее закрываем:
for (i=0; i<OrdersTotal(); i++) { if (!OrderSelect(i, SELECT_BY_POS)) { Print("Error ", GetLastError(), ": Start()->OrderSelect(", i, ") [OrderTotal()=", OrdersTotal(),"]"); continue; } if (OrderSymbol()!=Symbol()) continue; if (OrderMagicNumber()!=MyMagicNumber) continue; if (OrderType() == OP_BUY) { if (!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage)) Print("Error ", GetLastError(), ": Start()->OrderClose() [cannot close", " a buy position]"); return(0); } if (OrderType() == OP_SELL) { if (!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage)) Print("Error ", GetLastError(), ": Start()->OrderClose() [cannot close", " a short position]"); return(0); } }
Если же закрывать позиции не надо, то мы проверяем, не сработал ли наш трейлинг-стоп. Но об этом я расскажу в следующем выпуске.
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4: