Обсуждение статьи "Ночная торговля в азиатскую сессию: как оставаться в прибыли"

 

Опубликована статья Ночная торговля в азиатскую сессию: как оставаться в прибыли:

В статье рассматривается понятие ночной торговли, стратегии торговли, их реализация на MQL5. Проведено тестирование и сделаны выводы.

Возьмем популярную пару EUR/USD. Чаще всего во время азиатской сессии она начинает сбавлять волатильность и двигаться во флэте. Коррекция на этом этапе может быть настолько незначительна, что ее можно посчитать за горизонтальное движение.


Рис.2. Флэтовое движение, в Азиатскую сессию, на паре EUR/USD

Рис.2. Флэтовое движение в азиатскую сессию, на паре EUR/USD

На рис. 2 жёлтыми прямоугольниками обозначено движение пары EUR/USD на таймфрейме H1 во время азиатской сессии. На первом прямоугольнике (слева) просматривается небольшое внутриканальное колебание. В начале сессии происходит движение по ранее созданному тренду, затем — небольшая корректировка (в середине сессии) и в завершении — резкое возвращение обратно. На втором прямоугольнике наблюдается медленное движение вверх, в данном случае повторяющее движение конца дня. На третьем прямоугольнике ситуация немного изменилась. В отличие от предыдущих сессий, начальное движение в ночное время корректирует дневной тренд.

Автор: Dmitriy Zabudskiy

 
//--- input parameters
input int      order_time=0;                        // Время открытия ордера

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

Давно уже надо было что-то с этим порешать.


ЗЫ OnTesterInit в состоянии помочь и с datetime, но не все же могут.

 

Хорошо если в терминале можно было бы узнать время сдвига брокера хотя бы относительно GMT. Точнее чтобы это прописывалось бы в терминале для каждого брокера. И в результатах теста. А то приводятся тесты - какой там сдвиг по времени? Фиг его знает.

Запрос TimeGMT() - это хорошо, но этого мало. И для рассмотрения теста ничего не дает. Нужно именно время сдвига брокера относительно GMT.

 
fxsaber:

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

Давно уже надо было что-то с этим порешать.

Здесь имеется ввиду не datetime -- см.:

if(time_now_str.hour==order_time && work==true && work_day==true)
Просто у автора с названиями переменных "труба"
 
ANG3110:

Хорошо если в терминале можно было бы узнать время сдвига брокера хотя бы относительно GMT. Точнее чтобы это прописывалось бы в терминале для каждого брокера. И в результатах теста. А то приводятся тесты - какой там сдвиг по времени? Фиг его знает.

Запрос TimeGMT() - это хорошо, но этого мало. И для рассмотрения теста ничего не дает. Нужно именно время сдвига брокера относительно GMT.

В режиме Оптимизации в MT5 определить TimeGMT несложно, одиночный прогон - надо подумать.

 
Andrey F. Zelinsky:

Здесь имеется ввиду не datetime -- см.:

Просто у автора с названиями переменных "труба"

Каюсь, статью прочитал только до процитированной строки. Но проблема datetime имеет место быть. Время должно оптимизироваться не только через MQL, но и, по-человечески, через GUI.

 
fxsaber:

В режиме Оптимизации в MT5 определить TimeGMT несложно, одиночный прогон - надо подумать.

А если другим человеком приводятся результаты теста? Никак не определишь.
 
ANG3110:
А если другим человекам приводятся результаты теста? Никак не определишь.

Да, в отчете об этом ни слова. Поэтому кастомные отчеты - сила. Особенно, в 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;
     }
...

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

 
Eugene Myzrov:

Может быть вместо

использовать более простое

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

Спасибо, за комментарий. Привычка хорошая, сам так тоже бывает делаю...

Ваш пример:

//+------------------------------------------------------------------+
//| 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;
     }

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

Возможно можно через цикл в функции реализовать, тогда размер может меньше, удастся сделать, но скорость обработки будет дольше.

Можно ещё поработать и как то изменить входящие параметры, тогда и код можно как то изменить, возможно упростить. 

 
Dmitriy Zabudskiy: Спасибо, за комментарий. Привычка хорошая, сам так тоже бывает делаю... Ваш пример:Честно говоря не понял, его нужно дополнить... Так как во входящих переменных в советник, дни недели, в которые нужно работать, отмечены как "true", а если в этот день не надо работать то "false". И переменная "work_day", передаёт ответ в виде "true" или "false". В вашем примере, переменная становится уже типа "string", дальше опять нужно будет делать сравнение. А так, я за оптимизацию кода, хотя в этом советнике, это не стояло приоритетом. Конкретно этот код можно оптимизировать. Размер кода уменьшится, но вот скорость работы нет... Возможно можно через цикл в функции реализовать, тогда размер может меньше, удастся сделать, но скорость обработки будет дольше. Можно ещё поработать и как то изменить входящие параметры, тогда и код можно как то изменить, возможно упростить. 
   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", я совсем не понял.