Функция работы в заданном временном диапазоне не работает, что я делаю не так? Прилагаю скрипт:
При запуске в журнале если hr>HourEnd функция показывает true, почему?
- www.mql5.com
Функция работы в заданном временном диапазоне не работает, что я делаю не так? Прилагаю скрипт:
...
При запуске в журнале если hr>HourEnd функция показывает true, почему?
Правильно вставляем код на форуме
При объявлении переменной, желательно сразу её инициализировать - то есть присваивать какое-то значение. Например так:
input int HourStart = 10; // Час начала торговли input int HourEnd = 16; // Час окончания торговли //--- bool TradeInTimeRange=true; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart()
После того как я инициализировал TradeInTimeRange=true в этом скрипте, после запуска в журнале вообще перестал появляться Print, а появилась надпись:
2015.02.14 10:35:00.995 Test9 (Si-3.15,M1) Stack overflow in 'D:\Program Files\MQL5\Scripts\Test9.ex5' а эксперт с этой функцией вообще перестал открывать сделки?
После того как я инициализировал TradeInTimeRange=true в этом скрипте, после запуска в журнале вообще перестал появляться Print, а появилась надпись:
2015.02.14 10:35:00.995 Test9 (Si-3.15,M1) Stack overflow in 'D:\Program Files\MQL5\Scripts\Test9.ex5' а эксперт с этой функцией вообще перестал открывать сделки?
Исправьте, пожалуйста своё первое сообщение. Правильно вставляем код на форуме.
При TradeInTimeRange=true прекрасно появляются во вкладке "Эксперты" принты вроде этого:
2015.02.14 13:10:34.208 test_script (EURUSD,D1) lat_date.hour = 13 HourEnd = 16IsInTradeTimeRange()= true
И ещё - это скрипт, а не эксперт. Этот скрипт не имеет в своём коде торговых функций.
Что то не получается у меня вставить код, все делаю как в инструкции по ссылке, и когда вставляю все показывается как надо, а когда нажимаю "обновить" на странице никакого кода не появляется. И в скрипте, попробуйте поставить HourEnd меньше чем текущий час, у меня все равно в Print'е показывет IsInTradeTimeRange()=true.
В функции IsInTradeTimeRange() Вы делали зацикливание. Именно поэтому и происходило переполнение стека.
Вот Ваш код, с исправлением:
//+------------------------------------------------------------------+ //| Test9.mq5 | //| Ale Bor | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Ale Bor" #property link "http://www.mql5.com" #property version "1.00" input int HourStart = 10; // Час начала торговли input int HourEnd = 16; // Час окончания торговли //--- bool TradeInTimeRange=true; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- IsInTradeTimeRange(); MqlDateTime lat_date; //--- Получим последние данные даты и времени TimeTradeServer(lat_date); Print("lat_date.hour = ",lat_date.hour," HourEnd = ",HourEnd,"IsInTradeTimeRange()= ",IsInTradeTimeRange()); } //+------------------------------------------------------------------+ bool IsInTradeTimeRange() { //--- Если включена торговля во временном диапазоне if(TradeInTimeRange) { //--- Структура даты и времени MqlDateTime str_LastDate; //--- Переменная для хранения времени datetime current; //--- Получим последние данные даты и времени current=TimeCurrent(); //--- Конвертация из значения типа datetime (количество секунд с 01.01.1970) в переменную типа структуры MqlDateTime TimeToStruct(current,str_LastDate); int hr=str_LastDate.hour; //--- Вне разрешенного временного диапазона if(hr>HourEnd) { Print("last_date.hour = ",str_LastDate.hour," HourEnd = ",HourEnd); return(false); } } //--- В разрешенном временном диапазоне return(true); } //+------------------------------------------------------------------+
Да у меня тоже получилось когда я убрал вообще переменную TradeInTimeRange и вместо TimeTradeServer() поставил TimeCurrent() , но почему произошло зацикливание я так и не понял. И еще, не подскажите как еще добавить чтобы и минуты можно было указывать. Я в эту функцию вставил такой код:
if((last_date.hour<HourStart && last_date.min<5) || last_date.hour>=HourEnd) , но она минуты просто не заметила и работает только по часам?
Да у меня тоже получилось когда я убрал вообще переменную TradeInTimeRange и вместо TimeTradeServer() поставил TimeCurrent() , но почему произошло зацикливание я так и не понял. И еще, не подскажите как еще добавить чтобы и минуты можно было указывать. Я в эту функцию вставил такой код:
if((last_date.hour<HourStart && last_date.min<5) || last_date.hour>=HourEnd) , но она минуты просто не заметила и работает только по часам?
Да спасибо, все понял. Правда дело в том, что эту функцию я взял из эксперта multisymbolpendingorders.zip из статьи https://www.mql5.com/ru/articles/648 . Так все таки не подскажите, как сделать чтобы еще и минуты можно было указывать при работе во временном диапазоне? После исправления кода по вашему совету минуты все равно не работают.
MqlDateTime str_LastDate; //--- Переменная для хранения времени datetime current; //--- Получим последние данные даты и времени current=TimeCurrent(); //--- Конвертация из значения типа datetime (количество секунд с 01.01.1970) в переменную типа структуры MqlDateTime TimeToStruct(current,str_LastDate); int hr=str_LastDate.hour; int mn=str_LastDate.min; //--- Вне разрешенного временного диапазона if((hr<HourStart && mn<MinStart) || hr>=HourEnd) { Print("last_date.hour = ",str_LastDate.hour," HourEnd = ",HourEnd); return(false); }
- 2013.06.11
- Anatoli Kazharski
- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
ПОМОГИТЕ
Перестал работать тестер стратегий. Гонял много раз на 5 мин.. На других таймфреймах еще работает. В сообщениях- см. скрин. Кто может помогите разобраться.