Скачать MetaTrader 5

Начало работы советника в определённое время. Время - внешняя переменная

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Вся деятельность участников MQL5.community. Заходи в раздел Стена!
Sergio
59
Sergio 2011.11.08 12:38 

Добрый день. Кто может подсказать, как советнику начать исполнять код в определенное время? В 9 утра, например. Ну или может, есть какой другой способ рассматривать первый бар после открытия биржи. То есть запускаю я советника днем, а он ждет до вечера, биржа закрывается, ждет всю ночь, пока биржа не откроется, наконец, и начинает работу (анализ первого поступившего бара).

Я просто не могу понять, как это реализовать, ибо в данных типа datetime хранится вовсе не дата и время, а кол-во секунд с 01.01.1970...

Владимир Тезис
4266
Владимир Тезис 2011.11.08 12:56  
Sergio
59
Sergio 2011.11.08 15:50  

Хм.. Hour() возвращает серверное время, это полезно, разумеется, но в процессе работы программы значение этой функции не меняется. Как же нам начать работу ровно в 10 часов утра, например?..

Dezil
955
Dezil 2011.11.08 15:57  

подумайте еще раз

Владимир Тезис
4266
Владимир Тезис 2011.11.08 16:45  

Hour() Возвращает текущий час.

В старте программы пишем: "Если текущий час стал равен 10, то выполняем какие-то действия."

gena
53
gena 2011.11.09 07:45  

Могу дать готовые фрагменты подобного кода. Входной параметр времени старта для удобства задаем как double dbTime0= ЧАСЫ.МИНУТЫ.

extern double dbTime0 = 9.15//Время старта = 9ч.15мин, входной параметр.
/////////
datetime dt_T0;// Время старта (datetime), глобальная переменная советника. 
/////////

В init() пересчитываем double в datetime и суммируем с началом текущего дня. Проверяем на этапе отладки Принтом.

init()
//////////
dt_T0=dbTime0;   //расчет-преобразование double(Time0) в datetime(dt_T0)
dt_T0=(dbTime0*100-dt_T0*40)*60 + TimeCurrent()-TimeCurrent()%(24*60*60);
    Print("init:TimeStart= ",TimeToStr(dt_T0)); //после проверки удаляем
///////////

В start() остается сравнить задаваемое время с текущим

start()
////////
if(TimeCurrent()<dt_T0) return(0);            //ожидаем время старта
////////
Sergio
59
Sergio 2011.11.11 13:47  

К сожалению, не работает. Я сделал такое условие:

if(TimeCurrent()!=dt_T0) {return(0);}

else {Alert("Time");}

Сообщение не появляется.

Владимир Тезис
4266
Владимир Тезис 2011.11.11 14:15  

Сделайте простой скрипт:

Alert("Текущий час терминального времени = ",Hour(),"   текущая минута = ",Minute(),"   Итого время в терминале сейчас = ",Hour(),":", Minute() );

Затем откомпилируйте скрипт и бросьте его на график. Далее бросьте его на график через пару тройку минут, потом через час-другой и сравните выданные им результаты. Это Вам кое-что прояснит.

Sergio
59
Sergio 2011.11.11 14:46  

Все, проблема уже не актуальна - работает Alert("Time");

Есть другая проблема. Задача моя заключается в том, что по наступлении определенного времени необходимо начать анализировать график, отлавливать моменты появления новых баров и выполнять определенные действия при появлении каждого нового бара. Как же я всё это реализовал? Вот так:

функция NewBar() возвращает true, если появился новый бар:

start () {

if(TimeCurrent()!=dt_T0) {return(0);}

else {

if (NewBar== true) {..действия..}

return 0;

} }

Очевидно, что это работать не будет.. Ибо, например, запустились мы в 13:58, проверили, появился ли новый бар: не появился (ибо H1). Return 0; При следующем запуске функции start() новый бар, может, уже и появился, но время-то не 13:58 уже! Так вот, какой алгоритм можно вообще составить, чтобы при наступлении заданного времени он не завершал функцию start();, а просто ждал появления нового бара?

Владимир Тезис
4266
Владимир Тезис 2011.11.11 15:25  

Не завершать функцию Старт - значит "подвесить" советника. Это не корректно.

Перед блоком инициализации объявляете целочисленную переменную, например, OldBars

В блоке инициализации пишете:

OldBars=Bars;

В функции start() пишете

if(Bars>OldBars){
   OldBars=Bars;
  // преверяем, а ни наступило ли нужное время

  // если наступило, то выполняем какие-то действия

}
Владимир Тезис
4266
Владимир Тезис 2011.11.11 15:26  
Дело в том, что как только появилась новая свеча, то команда Bars вернёт число на единицу большее, чем было до появления новой свечи.
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий