//--- input parameters input int order_time=0; // Время открытия ордера
Беда обоих тестеров, что нельзя datetime оптимизировать. Отсюда такое вынужденное уродство.
Давно уже надо было что-то с этим порешать.
ЗЫ OnTesterInit в состоянии помочь и с datetime, но не все же могут.
Хорошо если в терминале можно было бы узнать время сдвига брокера хотя бы относительно GMT. Точнее чтобы это прописывалось бы в терминале для каждого брокера. И в результатах теста. А то приводятся тесты - какой там сдвиг по времени? Фиг его знает.
Запрос TimeGMT() - это хорошо, но этого мало. И для рассмотрения теста ничего не дает. Нужно именно время сдвига брокера относительно GMT.
Беда обоих тестеров, что нельзя datetime оптимизировать. Отсюда такое вынужденное уродство.
Давно уже надо было что-то с этим порешать.
Здесь имеется ввиду не datetime -- см.:
if(time_now_str.hour==order_time && work==true && work_day==true)Просто у автора с названиями переменных "труба"
Хорошо если в терминале можно было бы узнать время сдвига брокера хотя бы относительно GMT. Точнее чтобы это прописывалось бы в терминале для каждого брокера. И в результатах теста. А то приводятся тесты - какой там сдвиг по времени? Фиг его знает.
Запрос TimeGMT() - это хорошо, но этого мало. И для рассмотрения теста ничего не дает. Нужно именно время сдвига брокера относительно GMT.
В режиме Оптимизации в MT5 определить TimeGMT несложно, одиночный прогон - надо подумать.
Здесь имеется ввиду не datetime -- см.:
Просто у автора с названиями переменных "труба"Каюсь, статью прочитал только до процитированной строки. Но проблема datetime имеет место быть. Время должно оптимизироваться не только через MQL, но и, по-человечески, через GUI.
А если другим человекам приводятся результаты теста? Никак не определишь.
Да, в отчете об этом ни слова. Поэтому кастомные отчеты - сила. Особенно, в MT5.
Может быть вместо
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- time_now_var=TimeCurrent(time_now_str);// текущее время switch(time_now_str.day_of_week) { case 1: if(mon==false){work_day=false;} else {work_day=true;} break; case 2: if(tue==false){work_day=false;} else {work_day=true;} break; case 3: if(wen==false){work_day=false;} else {work_day=true;} break; case 4: if(thu==false){work_day=false;} else {work_day=true;} break; case 5: if(fri==false){work_day=false;} else {work_day=true;} break; }
использовать более простое
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { time_now_var=TimeCurrent(time_now_str);// текущее время switch(time_now_str.day_of_week) { case 1: work_day=mon; break; case 2: work_day=tue; break; case 3: work_day=wen; break; case 4: work_day=thu; break; case 5: work_day=fri; break; } ...
Как говорится, ничего личного, просто дурацкая привычка - не могу пройти мимо, когда вижу какой-нибудь неэффективный код.
Дальше код не смотрел.
Может быть вместо
использовать более простое
Как говорится, ничего личного, просто дурацкая привычка - не могу пройти мимо, когда вижу какой-нибудь неэффективный код.
Дальше код не смотрел.
Спасибо, за комментарий. Привычка хорошая, сам так тоже бывает делаю...
Ваш пример:
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { time_now_var=TimeCurrent(time_now_str);// текущее время switch(time_now_str.day_of_week) { case 1: work_day=mon; break; case 2: work_day=tue; break; case 3: work_day=wen; break; case 4: work_day=thu; break; case 5: work_day=fri; break; } ...
Честно говоря не понял, его нужно дополнить... Так как во входящих переменных в советник, дни недели, в которые нужно работать, отмечены как "true", а если в этот день не надо работать то "false".
И переменная "work_day", передаёт ответ в виде "true" или "false". В вашем примере, переменная становится уже типа "string", дальше опять нужно будет делать сравнение.
А так, я за оптимизацию кода, хотя в этом советнике, это не стояло приоритетом.
Конкретно этот код можно оптимизировать:
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- time_now_var=TimeCurrent(time_now_str);// текущее время work_day=true; switch(time_now_str.day_of_week) { case 1: if(mon==false){work_day=false;} break; case 2: if(tue==false){work_day=false;} break; case 3: if(wen==false){work_day=false;} break; case 4: if(thu==false){work_day=false;} break; case 5: if(fri==false){work_day=false;} break; }
Размер кода уменьшится, но вот скорость работы нет...
Возможно можно через цикл в функции реализовать, тогда размер может меньше, удастся сделать, но скорость обработки будет дольше.
Можно ещё поработать и как то изменить входящие параметры, тогда и код можно как то изменить, возможно упростить.
work_day=false; switch(time_now_str.day_of_week) { case 1: if (mon) work_day=true; break; case 2: if (tue) work_day=true; break; case 3: if (wen) work_day=true; break; case 4: if (thu) work_day=true; break; case 5: if (fri) work_day=true; break; }
Вы могли бы предложить еще и такой код. Но убрав операторы "else", Вы упростили исходный код только наполовину. Оптимальный вариант получится, если уберете еще и операторы "if", оставив только 5 операторов присваивания. Это и будет оптимальным вариантом, который был предложен.
switch(time_now_str.day_of_week) { case 1: work_day=mon; break; case 2: work_day=tue; break; case 3: work_day=wen; break; case 4: work_day=thu; break; case 5: work_day=fri; break; default: work_day=false; // в субботу и воскресенье не торгуем... }
А вот про переменную, которая становится типа "string", я совсем не понял.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Ночная торговля в азиатскую сессию: как оставаться в прибыли:
В статье рассматривается понятие ночной торговли, стратегии торговли, их реализация на MQL5. Проведено тестирование и сделаны выводы.
Возьмем популярную пару EUR/USD. Чаще всего во время азиатской сессии она начинает сбавлять волатильность и двигаться во флэте. Коррекция на этом этапе может быть настолько незначительна, что ее можно посчитать за горизонтальное движение.
Рис.2. Флэтовое движение в азиатскую сессию, на паре EUR/USD
На рис. 2 жёлтыми прямоугольниками обозначено движение пары EUR/USD на таймфрейме H1 во время азиатской сессии. На первом прямоугольнике (слева) просматривается небольшое внутриканальное колебание. В начале сессии происходит движение по ранее созданному тренду, затем — небольшая корректировка (в середине сессии) и в завершении — резкое возвращение обратно. На втором прямоугольнике наблюдается медленное движение вверх, в данном случае повторяющее движение конца дня. На третьем прямоугольнике ситуация немного изменилась. В отличие от предыдущих сессий, начальное движение в ночное время корректирует дневной тренд.
Автор: Dmitriy Zabudskiy