Эксперт, торгующий в ночное время: функция 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: