Скачать MetaTrader 5

Как добавить время к таймфрейму

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Скачай документацию одним файлом. Это просто!
Pirat
251
Pirat 2010.09.27 22:47 

Здравствуйте уважаемые форумчане, уже писал на форуме, всем спасибо за помощь. Хочу сделать одну вещь. Напомню вкратце.

У меня стратегия рассчитана на работу по таймфреймам, советник открывает отложники каждый таймфрейм (например если советник стоит на h1, то открывает каждый час). Реализовал я это с помощью функции

   if (Time[0] == my_time) return (0);
   my_time = Time[0];


Хочу добавить проскальзывание времени, то есть чтобы советник не прямо каждый час открывал, например спустя минуту после часа, например не в 19.00, а в 19.01. Прошу помочь советом знающих программистов.

Заранее спасибо за ваши советы.

Oleg
2377
Oleg 2010.09.27 23:25  
Pirat:

Здравствуйте уважаемые форумчане, уже писал на форуме, всем спасибо за помощь. Хочу сделать одну вещь. Напомню вкратце.

У меня стратегия рассчитана на работу по таймфреймам, советник открывает отложники каждый таймфрейм (например если советник стоит на h1, то открывает каждый час). Реализовал я это с помощью функции


Хочу добавить проскальзывание времени, то есть чтобы советник не прямо каждый час открывал, например спустя минуту после часа, например не в 19.00, а в 19.01. Прошу помочь советом знающих программистов.

Заранее спасибо за ваши советы.

Time[] - время открытия свечи, в секундах. Добавьте к нему 60 секунд.
Pirat
251
Pirat 2010.09.28 10:39  

я пробовал сделать так

 if (Time[0] + 60 == my_time) return (0);
   my_time = Time[0] + 60;


но в итоге он открывает ордера каждую секунду.

Oleg
2377
Oleg 2010.09.28 11:50  

Моя вина, я ответил лишь на вопрос как прибавляется время, не разбираясь в сути проблемы.

Есть одно "но" - то что у вас было изначально позволяло проходить сигналу лишь один раз за бар. В тестере это будет работать всегда, но если в реале торговый поток окажется занят, а my_time уже будет изменен то

фактически у вас не будет открыто ни одного ордера для этого бара. Подумайте и над этим.

Касательно основного вопроса: вам необходимо что-то вроде (набросок, надо перепроверить):

=========================================================

datetime Current_Time = 0;

datetime Handle_Time = 0;

start() {

Current_Time = TimeCurrent();


if(Current_Time-Time[0]>60 && Handle_Time!=Time[0]) { // Вы хотели подождать минуту после открытия бара

..Открывается ордер и если открытие успешно => Handle_Time = Time[0];

}

=========================================================


Pirat
251
Pirat 2010.09.28 12:54  

А может перед OrderSend вставить функцию типа этой https://www.mql5.com/ru/articles/1558

int _time_waiting=0;
// ...
if ( ... ) // условие, при выполнение которого требуется выдержать паузу
   _time_waiting = TimeLocal() + 10; // окончание паузы через 10 секунд от текущего локального времени
while ( TimeLocal() < _time_waiting )
{ // программный блок, выполнение которого производится во время ожидания времени окончания паузы циклически
   // ...
}
// программный блок, выполнение которого произойдет не ранее времени окончания паузы
// ...
Pirat
251
Pirat 2010.09.28 12:55  
или например, просто
 Sleep(60000);
или такое не прокатит ?
hasayama
610
hasayama 2010.09.28 13:15  
datetime last_candle_time = 0;

//сначала проверяем начало новой свечи
if ( iTime( Symbol(), Period(), 0 ) > last_candle_time ) { last_candle_time = iTime( Symbol(), Period(), 0 ); }

//теперь делаем задержку
if ( last_candle_time + pause_in_seconds > TimeCurrent() ) { /*нужно ждать, потому что время еще не настало*/ return; }

//а иначе мы уже там где нужно и пытаемся открываться...
Только в таком случае нужно продумать чтобы повторных открытий не было.
hasayama
610
hasayama 2010.09.28 13:16  
Pirat:
или например, просто или такое не прокатит ?
В таком случае вы выводите эксперта из игры на 60 секунд. А как же сопровождение?
Pirat
251
Pirat 2010.09.28 17:03  

Спасибо всем, получилось, реализовал с помощью такого кода


datetime last_candle_time = 0;
datetime pause_in_seconds = 60;


//сначала проверяем начало новой свечи
if ( iTime( Symbol(), Period(), 0 ) > last_candle_time ) { last_candle_time = iTime( Symbol(), Period(), 0 ); }

//теперь делаем задержку
if ( last_candle_time + pause_in_seconds > TimeCurrent() ) { /*нужно ждать, потому что время еще не настало*/ return; }

//а иначе мы уже там где нужно и пытаемся открываться...

 if (Time[0] == my_time) return (0);
   my_time = Time[0];


Если убрать

if (Time[0] == my_time) return (0);
   my_time = Time[0];


То почему-то опять он каждую минуту открывает. Также пытался реализовать с помощью sleeo (10000) - не получилось, и с

int _time_waiting=0;
// ...
if ( ... ) // условие, при выполнение которого требуется выдержать паузу
   _time_waiting = TimeLocal() + 10; // окончание паузы через 10 секунд от текущего локального времени
while ( TimeLocal() < _time_waiting )
{ // программный блок, выполнение которого производится во время ожидания времени окончания паузы циклически
   // ...
}
// программный блок, выполнение которого произойдет не ранее времени окончания паузы
// ...
тоже не получилось, тут он вообще не захотел ничего открывать. В любом случае спасибо за помощь и четкие советы.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий