Эксперт, торгующий в ночное время: функция start()
В этом выпуске я расскажу о том, как работает функция start() "ночного" эксперта, который был описан в прошлых выпусках.
В начале мы присваиваем значения текущего времени, текущего часа и текущей минуты локальным переменным c_time, c_hour и c_minute соответственно:
datetime c_time = TimeCurrent(); int c_hour = TimeHour(c_time); int c_minute = TimeMinute(c_time);
Далее мы проверяем, не пора ли нам выставлять отложенные ордера:
// Проверим, не пора ли нам выставлять отложенные ордера if (TimeDay(c_time)!=TimeDay(LastTradeTime)) { if ((c_hour>StartHour)||((c_hour==StartHour)&&(c_minute>=StartMinute))) { ... } }
Если же ордера действительно уже пора выставлять, то мы выставляем вначале Buy Limit ордер. Если это действие завершилось неудачно, то выходим.
Если же Buy Limit ордер выставлен без проблем, то пытаемся разместить Sell Limit. В случае возникновения ошибки пытаемся удалить Buy Limit и выходим.
Если же отложенные ордера выставлять не надо, то проверим, не сработал ли отложенный ордер и не нужно ли нам удалить второй ордер:
// если один отложенный ордер сработал, то удалим второй t = -1; for (i=0; iOrderSelect(", i, ") [OrderTotal()=", OrdersTotal(),"]"); continue; } if (OrderSymbol()!=Symbol()) continue; if (OrderMagicNumber()!=MyMagicNumber) continue; if ((OrderType() == OP_BUYLIMIT)||(OrderType() == OP_SELLLIMIT)) { if (t!=-1) { t = -1; break; } else { t = OrderTicket(); } } } if (t!=-1) { if (OrderDelete(t)) Print("Pending order #", t, " has been deleted [OCO]"); else Print("Error ", GetLastError(), ": Start()->OrderDelete() [OCO]"); }
Принцип работы этого куска кода очень простой - присваиваем переменной t начальное значение, равное -1. Далее перебираем открытые позиции и выставленные ордера в поисках всех отложенных ордеров по этой валютной паре с магическим числом MyMagicNumber. Каждый раз, когда мы находим такой отложенный ордер, мы меняем значение переменной t такой логике:
- Если t<0, то присвоим переменной значение тикера найденного отложенного ордера.
- Если t>0, то она уже содержит тикер предыдущего найденного отложенного ордера и поэтому присвоим ей значение -1.
Если в результате после окончания перебора значение переменной t будет равно -1, то либо не найдено вообще ни одного интересующего нас отложенного ордера, или же найдено оба. В этом случае ничего делать не надо.
Если же t>0, то найден только один отложенный ордер, поэтому мы делаем вывод, что второй ордер сработал и нам надо удалить найденный ордер, тикер которого мы записали в переменную t. Что мы в общем-то и делаем.
Далее мы проверяем, не пора ли закрывать открытые позиции, но об этом я расскажу в следующем выпуске.
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4:
Комментарии по теме "Эксперт, торгующий в ночное время: функция start()"
Уважаемый Андрей!
Что означает Slippage=3 в ночном эксперте
Автор: Алексей | 26.04.2007 19:21
Это означает, что если в момент совершения торговой операции цена на сервере изменилась против Вас не более, чем на три пипса, то сделка все равно будет совершена по текущей цене.
Автор: Андрей Ведихин | 07.05.2007 00:28