Проблемы с Time()

 
Здравствуйте, сообщество MQL4!

Это мой первый пост. Во-первых, прошу заметить, что я не являюсь разработчиком MQL. Я трейдер, который использует инструмент для создания советников. Этот инструмент позволяет использовать некоторую структуру MQL, но он не выполняет явные функции MQL. Он просто принимает код MQL, оценивает, является ли условие, основанное на MQL, истинным/ложным, а затем выполняет пользовательскую функцию, такую как OpenBuy, OpenSell, CloseBuy, CloseSell, DeletePendingBuy, DeletePendingSell и т.д. Но это не приводит к явному выполнению кода MQL. Например, вы можете использовать функцию Print или Comment, чтобы заставить что-то появиться на окне графика MT4 (только один пример).

Итак, я знаю совсем немного о MQL, и этого достаточно для того, чтобы я мог использовать инструмент разработки советников, который я использую для создания своих советников. На данный момент я создал 10 советников с помощью этого инструмента и отказался от 7 из них из-за непригодности, что примерно на 30% лучше, чем соотношение успешных прототипов, которое я получал при создании торговых систем в Excel. Обычно я ожидаю, что 7-8 идей из 10 окажутся не такими прибыльными, как ожидалось, оставляя 2-3 проекта достаточно прибыльными, чтобы начать процесс оптимизации. Ладно, хватит обо мне и о том, как я работаю.

Вот моя проблема, и я надеюсь, что я пришел в правильное место за помощью!

Я запускаю этот код [b]для закрытия сделок:[/b]

Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

Примечание: Проблема заключается в том, что все сделки остаются открытыми с понедельника по четверг до 23:57. Также все сделки остаются открытыми в пятницу до 21:57.


Я также запускаю этот код через блок MQL [b]для открытия сделок:[/b].

TimeHour(TimeCurrent()) == 00 && TimeMinute(TimeCurrent()) <= 05

Примечание: Единственная сделка, которая открывается между 00:00 и 00:05, - это самая первая сделка бэк-теста при нажатии на кнопку Tester Start. Эта сделка открывается точно в 00:00. Однако ни одна из других сделок не открывается между 00:00 и 00:05 позже в течение недели.

Итого:

- Одна сделка открывается после нажатия на кнопку "Старт тестера" в 00:00.
- Ни одна сделка впоследствии не закрывается в 23:57 (М-Ту) или 21:57 (Пн).
- После этого ни одна сделка не открывается в период с 00:00 до 00:05.

Все указанные выше времена имеют достаточный доступный поток тиков. Таким образом, в данных, используемых тестером, нет пробелов.

Любая помощь будет принята с благодарностью. Почему эти сделки не закрываются в указанное время? Почему сделки не исполняются, когда всегда есть торговый сигнал с 00:00 до 00:05, с понедельника по пятницу?

Спасибо!
cfx
 

Какие отладочные операторы Print вы добавили в свой код, чтобы выяснить, что выполняется, а что нет? Например, не работает ли OrderClose() или это код, который приводит к OrderClose()? Обращаете ли вы внимание на возвращаемые значения и выводите ли соответствующие ошибки?

Что такое возвращаемые значения функции? Как их использовать?

Правильно ли работает Day() в тестере стратегий? нужно ли проверять, что она работает? вместо нее можно использовать TimeDayOfWeek()...

 

>Я запускаю этот код [b]для закрытия сделок:[/b].

Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

>Примечание: Проблема заключается в том, что все сделки остаются открытыми с понедельника по четверг до 23:57. Также все сделки остаются открытыми в пятницу до 21:57.

Это очень распространенная ошибка у новичков: попытка уместить все логическое выражение в одной строке. Это невозможно отладить.

Хитрость заключается в том, чтобы разбить тест на маленькие кусочки и проверить каждый кусочек (с помощью операторов Print или иным способом).

Можете ли вы заставить его закрывать сделки после 23:57 в любой день? В этом тесте нет необходимости беспокоиться о днях недели. Как только вы добьетесь корректной работы одного теста, можете приступать к более смелым действиям. Но по возможности используйте несколько строк, чтобы между ними можно было вывести операторы Print для отладки. Когда тест заработает, уберите операторы Print , но оставьте код на отдельных строках. Код на самом деле более эффективен, когда он написан на многих строках (выполняется быстрее).

 
  1.  Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    Что из этого вы имели в виду?
    Day() == 1 || Day() == 2 || Day() == 3 || ( Day() == 4 && TimeHour(TimeCurrent()) >=23) && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    ( Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4) && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    Всегда заключать в скобки полностью или упрощать и самостоятельно документировать
    #define HR2157 79020 // 21 * 3600 + 57 * 60
    #define HR2357 86220
    datetime now = TimeCurrent();
    int      tod = now % 86400;
    bool     isFriday = TimeDayOfWeek(now) == 5;
    if (isFriday) int todClose = HR215700;
    else              todClose = HR235700
    if (now >= todClose) ...
    

  2. https://www.mql5.com/en/forum/127483 сообщил, что DayOfWeek() всегда возвращает 5 в тестере, поэтому я использую только версии Timexxx().
 
WHRoeder:
  1. Что из этого вы имели в виду?
ОП, очевидно, имеет в виду ИЛИ все дни недели, кроме пятницы. Очевидно, что он пытается заставить закрыться до конца торгового дня, но так, чтобы пятница была короче. Он не понял, что тест на использование ИЛИ четырех дней является излишним, поскольку мы всегда можем закрыться, если время после 23:57. Пятницу не нужно исключать!
 
RaptorUK:

Какие отладочные операторы Print вы добавили в свой код, чтобы выяснить, что выполняется, а что нет? Например, не работает ли OrderClose() или это код, который приводит к OrderClose()? Обращаете ли вы внимание на возвращаемые значения и выводите ли соответствующие ошибки?

Что такое возвращаемые значения функции? Как их использовать?

Правильно ли работает Day() в тестере стратегий? проверяли ли вы, что она работает? вы можете использовать TimeDayOfWeek() вместо нее...


Я не использовал никаких операторов Print для этой цели. Я допустил опечатку в своем первоначальном сообщении. Инструмент, который я использую [b]не может[/b] (я первоначально напечатал "может") использовать MQL функции, такие как Print, или Comment. Поэтому я прошу прощения за опечатку, которая повлияла на ваш ответ.

Тем не менее, я могу легко взглянуть на журнал тестера и увидеть, что советник не готовит никаких сделок, когда должен (в 00:00), и не инстанцирует закрытие сделок, когда должен (с месяца по четверг в 23:59, или в пятницу в 21:57). По существу, я вижу загрузку советника во время выполнения тестера, обязательную информацию о демо-счете, и, наконец, я вижу, что все временные рамки для индикатора (индикаторов), используемого советником, загружаются правильно и без ошибок. Обычно я не получаю ошибок любого рода с моими советниками. И я постоянно тестирую советников с несколькими таймфреймами.

Похоже, что у меня проблема только с функцией Time().

Поскольку единственная позиция, которая когда-либо открывается, это самая первая сделка, которую советник видит после нажатия на кнопку запуска тестера, я не могу сказать, работает ли функция Day() или нет, по выводам, которые приходят из Print или Comment. Однако, в качестве случайного теста, я удалил строку [b]TimeMinute(TimeCurrent()) <= 05[/b] из сегмента кода, который управляет открытием позиций в 00:00, пн-пт. Когда я сделал это, следующий код начал работать так, как было задумано:

Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57.

Это говорит мне о том, что на самом деле Day() действительно работает по принципу дедукции. На самом деле, весь этот участок кода, который закрывает позиции, действительно работает. Но, почему-то, не работает, когда [b]TimeMinute(TimeCurrent()) <= 05[/b] используется в сегменте кода, который управляет открытием позиций. Эта ирония не имеет смысла для меня - я не могу понять, почему это может быть так.

Спасибо!

cfx

 
dabbler:

>Я запускаю этот код [b]для закрытия сделок:[/b]

>Примечание: Проблема в том, что все сделки остаются открытыми с понедельника по четверг до 23:57. Также все сделки остаются открытыми в пятницу до 21:57.

Это очень распространенная ошибка новичков: попытка уместить все логическое выражение в одной строке. Это невозможно отладить.

Хитрость заключается в том, чтобы разбить тест на маленькие кусочки и проверить каждый кусочек (с помощью операторов Print или иным способом).

Можете ли вы заставить его закрыться после 23:57 в любой день? В этом тесте нет необходимости беспокоиться о днях недели. Как только вы добьетесь корректной работы одного теста, можно приступать к более смелым действиям. Но по возможности используйте несколько строк, чтобы между ними можно было вывести операторы Print для отладки. Когда тест заработает, уберите операторы Print , но оставьте код на отдельных строках. Код на самом деле более эффективен, когда он написан на многих строках (выполняется быстрее).


Кстати, спасибо всем за ответы!


Управление закрытием работает. Когда я убрал [b]TimeMinute(TimeCurrent()) <= 05[/b] из Open Control, он действительно работает. Самая первая позиция, которая была выполнена после нажатия на кнопку запуска тестера, действительно закрывается в 23:57 (пн-чт). Проблема заключается в том, что новые позиции никогда не открываются в 00:00, как того требует Open Control ([b]TimeHour(TimeCurrent()) == 00 && TimeMinute(TimeCurrent()) <= 05[/b]). Даже когда я удаляю функцию [b]TimeMinute(TimeCurrent() <=5[/b] как просто проверку на вменяемость.

Я думал, что сделать код настолько компактным, насколько это возможно, будет лучшей альтернативой, но я попробую расширить каждую функцию, сегмент, компонент и т.д., чтобы посмотреть, поможет ли это.


Спасибо!

cfx

 
WHRoeder:
  1. что из этого вы имели в виду?
    Всегда полностью раскрывать скобки или упрощать и самодокументировать
  2. https://www.mql5.com/en/forum/127483 сообщил, что DayOfWeek() всегда возвращает 5 в тестере, поэтому я использую только версии Timexxx().

Я имел в виду:

( Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4) && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57


Похоже, что в этом сегменте кода не хватает скобки. Если вы можете исправить это для меня, я буду благодарен. Инструмент, который я использую, дает мне знать, когда скобка отсутствует, но не говорит, где именно.


Спасибо!

 
dabbler:
ОП, очевидно, имеет в виду ИЛИ все будние дни, кроме пятницы. Очевидно, что он пытается заставить закрыться до конца торгового дня, но так, чтобы пятница была короче. Он не понял, что проверка использования ИЛИ четырех дней является излишней, так как мы всегда можем закрыться, если время после 23:57. Пятницу не нужно исключать!

Я должен выделить пятницу, иначе не будет никакого различия между временем закрытия с понедельника по четверг и временем закрытия в пятницу. Оба времени закрытия отличаются днем недели, в который они происходят, а не только временем дня, в которое они происходят.

Таким образом, мне нужно закрыть понедельник - четверг в 23:57, а пятницу в 21:57, соответственно. Если я включу закрытие пятницы в понедельник - четверг, то все сделки будут закрыты в самое раннее время, которое увидит советник, а это 21:57, т.е. за целых два часа до требуемого времени закрытия с понедельника по четверг.

Пожалуйста, проясните ваше утверждение. Спасибо!

cfx

 

LOL!


Я начинаю думать, что большинство функций, основанных на "времени", в MT4 имеют серьезные недостатки.


Я имею в виду, что если я сброшу всю свою логику управления позициями на что-то такое обыденное, как: TimeHour(TimeCurrent()) == 23 && TimeHour(TimeCurrent()) == 59, и не смогу добиться закрытия одиночной сделки вообще (советник просто игнорирует код!), то я бы сказал, что в MT4 есть некоторые проблемы, которые необходимо исправить в отношении этих типов функций.


Я также провел серию тестов, используя следующее: DayOfWeek() != 0 && DayOfWeek() !=, и ни одна сделка не открылась бы с понедельника по пятницу! Фактически, ни одна сделка не открылась вообще. Но как вы думаете, что произошло с советником, когда я полностью удалил все функции, основанные на времени? Конечно, он работает без ошибок, как и было задумано. Я не разработчик MQL, но я действительно хорош в разработке логических конструкций, и я могу обнаружить системную проблему, когда я ее чувствую. Я чувствую, что у MetaQuotes есть проблема с их функциями Time(), и точка. Я не могу быть настолько невежественным в том, что так легко кодируется, и я видел, как другие люди, которые кодируют на MQL, испытывают трудности с функциями, основанными на времени, в MT4.

Я не знаю точно, в чем проблема, но когда я убираю TimeMinute(TimeCurrent()) <= 05, из логики управления открытием (тот кусок кода, который управляет открытием всех сделок), и я получаю ТОЛЬКО первую сделку, которая закрывается в правильное время, а ВСЕ ДРУГИЕ сделки, управляемые точно такой же логикой управления открытием, впоследствии суммарно игнорируются советником, тогда я знаю, что что-то системно не так с самой функцией.

Код не может быть более простым! Я даю советнику команду открыть эту чертову сделку между 00:00 и 00:05. В этом нет ничего сложного. Шестилетний ребенок мог бы написать такой код. Вот еще раз: [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b].


Вот. Я только что закодировал это. Затем я ввожу этот код в инструмент, который я использую, и инструмент сообщает мне, что синтаксис кода правильный! Хорошо, и что теперь? Ну, я компилирую этот чертов файл .ex4 в МИЛЛИОННЫЙ раз и запускаю M4 Tester. Хорошо, и что теперь? Ну, самая ПЕРВАЯ сделка запускается в 00:00. Круто, да? НЕЕЕЕЕТ! Почему? Потому что в 23:59 понедельника эта чертова позиция все еще открыта. И что тогда? Ну, в 00:00 следующей торговой сессии (следующий бар D1), старый добрый [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b] прорвется там, где не справился Closing Control, верно? Неправильно! Почему? Потому что в 00:00 - 00:05 советник не открывает ни одной чертовой сделки!!!

Я потратил два (2) дня на этот простой код, и никто не смог сказать мне, почему он не работает - даже эксперты MQL! Это говорит мне о том, что у MetaQuotes есть проблема.

Ладно, теперь я закончил. Это было двухдневное сдерживаемое разочарование, и я должен был его выпустить.

У меня НИКОГДА не было проблем с моими советниками, и я смог собрать несколько довольно сложных конструкций, используя все тайм-фреймы, кроме W1 и MN. Все мои советники используют конструкции iCustom, которые я создал и исследовал с нуля.

Внезапно, после работы, как хорошо смазанный и отлаженный двигатель V8, я начинаю использовать функции Time(), и весь ад вырывается наружу? Что-то здесь не совсем так. Я использую эти функции, основанные на времени, самым простым способом, а они все равно не работают? 48 часов на что-то подобное было для меня огромной потерей времени. Разочарованный и раздосадованный, я постараюсь жить без "Времени", если это возможно.

Мне придется научиться разрабатывать торговую логику вокруг функций Time().

Нереально.

 

CFx 2012.05.31 03:41

LOL!


Я начинаю думать, что большинство функций, основанных на "времени" в MT4, имеют серьезные недостатки.


Я имею в виду, что если я сброшу всю свою логику управления позицией на что-то такое обыденное, как: TimeHour(TimeCurrent()) == 23 && TimeHour(TimeCurrent()) == 59, и не смогу добиться закрытия одиночной сделки вообще (советник просто игнорирует код!), то я бы сказал, что в MT4 есть некоторые проблемы, которые необходимо исправить в отношении этих типов функций.


Я также провел серию тестов, используя следующее: DayOfWeek() != 0 && DayOfWeek() !=, и ни одна сделка не открылась бы с понедельника по пятницу! Фактически, ни одна сделка не открылась вообще. Но как вы думаете, что произошло с советником, когда я полностью удалил все функции, основанные на времени? Конечно, он работает без ошибок, как и было задумано. Я не разработчик MQL, но я действительно хорош в разработке логических конструкций, и я могу обнаружить системную проблему, когда я ее чувствую. Я чувствую, что у MetaQuotes есть проблема с их функциями Time(), и точка. Я не могу быть настолько невежественным в том, что так легко кодируется, и я видел, как другие люди, которые кодируют на MQL, испытывают трудности с функциями, основанными на времени, в MT4.

Я не знаю точно в чем проблема, но когда я убираю TimeMinute(TimeCurrent()) <= 05, из логики Opening Control (тот кусок кода, который управляет открытием всех сделок), и я получаю ТОЛЬКО первую сделку, которая закрывается в правильное время, а ВСЕ ДРУГИЕ сделки, управляемые точно такой же логикой Opening Control, впоследствии суммарно игнорируются советником, то я знаю, что что-то системно не так с самой функцией.

Код не может быть более простым! Я даю советнику команду открыть эту чертову сделку между 00:00 и 00:05. В этом нет ничего сложного. Шестилетний ребенок мог бы написать такой код. Вот еще раз: [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b].


Вот. Я только что закодировал это. Затем я ввожу этот код в инструмент, который я использую, и инструмент сообщает мне, что синтаксис кода правильный! Хорошо, и что теперь? Ну, я компилирую этот чертов файл .ex4 в МИЛЛИОННЫЙ раз и запускаю M4 Tester. Хорошо, и что теперь? Ну, самая ПЕРВАЯ сделка запускается в 00:00. Круто, да? НЕЕЕЕЕТ! Почему? Потому что в 23:59 понедельника эта чертова позиция все еще открыта. И что тогда? Ну, в 00:00 следующей торговой сессии (следующий бар D1), старый добрый [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b] прорвется там, где не справился Closing Control, верно? Неправильно! Почему? Потому что в 00:00 - 00:05 советник не открывает ни одной чертовой сделки!!!

Я потратил два (2) дня на этот простой код, и никто не смог сказать мне, почему он не работает - даже эксперты MQL! Это говорит мне о том, что у MetaQuotes есть проблема.

Ладно, теперь я закончил. Это было двухдневное сдерживаемое разочарование, и я должен был его выпустить.

У меня НИКОГДА не было проблем с моими советниками, и я смог собрать несколько довольно сложных конструкций, используя все тайм-фреймы, кроме W1 и MN. Все мои советники используют конструкции iCustom, которые я создал и исследовал с нуля.

Внезапно, после работы, как хорошо смазанный и отлаженный двигатель V8, я начинаю использовать функции Time(), и весь ад вырывается наружу? Что-то здесь не совсем так. Я использую эти функции, основанные на времени, самым простым способом, а они все равно не работают? 48 часов на что-то подобное было для меня огромной потерей времени. Разочарованный и раздосадованный, я постараюсь жить без "Времени", если это возможно.

Мне придется научиться разрабатывать торговую логику вокруг функций Time().

Нереально.

LOL. Это ты нереальный. Этот твой код ...

if (TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05)

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

Это вам нужно дальше развивать "свою" логическую конструкцию.

И построить эту...

if (TimeHour(TimeCurrent()) >= 00 && TimeHour(TimeCurrent()) <= 05)
Причина обращения: