Здравствуйте уважаемые форумчане, уже писал на форуме, всем спасибо за помощь. Хочу сделать одну вещь. Напомню вкратце.
У меня стратегия рассчитана на работу по таймфреймам, советник открывает отложники каждый таймфрейм (например если советник стоит на h1, то открывает каждый час). Реализовал я это с помощью функции
Хочу добавить проскальзывание времени, то есть чтобы советник не прямо каждый час открывал, например спустя минуту после часа, например не в 19.00, а в 19.01. Прошу помочь советом знающих программистов.
Заранее спасибо за ваши советы.
я пробовал сделать так
if (Time[0] + 60 == my_time) return (0); my_time = Time[0] + 60;
но в итоге он открывает ордера каждую секунду.
Моя вина, я ответил лишь на вопрос как прибавляется время, не разбираясь в сути проблемы.
Есть одно "но" - то что у вас было изначально позволяло проходить сигналу лишь один раз за бар. В тестере это будет работать всегда, но если в реале торговый поток окажется занят, а 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];
}
=========================================================
А может перед OrderSend вставить функцию типа этой https://www.mql5.com/ru/articles/1558
int _time_waiting=0; // ... if ( ... ) // условие, при выполнение которого требуется выдержать паузу _time_waiting = TimeLocal() + 10; // окончание паузы через 10 секунд от текущего локального времени while ( TimeLocal() < _time_waiting ) { // программный блок, выполнение которого производится во время ожидания времени окончания паузы циклически // ... } // программный блок, выполнение которого произойдет не ранее времени окончания паузы // ...
Sleep(60000);или такое не прокатит ?
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; } //а иначе мы уже там где нужно и пытаемся открываться...Только в таком случае нужно продумать чтобы повторных открытий не было.
или например, просто или такое не прокатит ?
Спасибо всем, получилось, реализовал с помощью такого кода
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 ) { // программный блок, выполнение которого производится во время ожидания времени окончания паузы циклически // ... } // программный блок, выполнение которого произойдет не ранее времени окончания паузы // ...тоже не получилось, тут он вообще не захотел ничего открывать. В любом случае спасибо за помощь и четкие советы.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте уважаемые форумчане, уже писал на форуме, всем спасибо за помощь. Хочу сделать одну вещь. Напомню вкратце.
У меня стратегия рассчитана на работу по таймфреймам, советник открывает отложники каждый таймфрейм (например если советник стоит на h1, то открывает каждый час). Реализовал я это с помощью функции
Хочу добавить проскальзывание времени, то есть чтобы советник не прямо каждый час открывал, например спустя минуту после часа, например не в 19.00, а в 19.01. Прошу помочь советом знающих программистов.
Заранее спасибо за ваши советы.