Как правильно рассчитать точку?

 

 Как правильно рассчитать точку правее нулевого бара?

Все пользуются таким выражением.

Time[0],Buf[0],Time[0]+15*_Period*60,Buf[0]

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

Кто как обходит этот неприятный момент?

 
Uladzimir Izerski:

 Как правильно рассчитать точку правее нулевого бара?

Все пользуются таким выражением.

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

Кто как обходит этот неприятный момент?

Time[0]+PeriodSeconds()
 

Если точка так и должна остаться там, где ее изначально поставили, то ничего не нужно делать. Само время верное.

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

 

Как правильно вычесть выходные из расчета?

Формально точка на дате будет верная, но на графике для текущего момента неправильная.

Т.е. смещена на количество выходных. Это искажение надо убрать.

 
Uladzimir Izerski:

Как правильно вычесть выходные из расчета?

Формально точка на дате будет верная, но на графике для текущего момента неправильная.

Т.е. смещена на количество выходных. Это искажение надо убрать.

Полученное время надо проверить на день недели и прибавить соответствующее количество секунд PeriodSeconds(PERIOD_D1)*количество_выходных. Это самый простой вариант для четвёрки. А так... можно и через структуру MqlDateTime изгаляться.
 
Alexey Viktorov:
Полученное время надо проверить на день недели и прибавить соответствующее количество секунд PeriodSeconds(PERIOD_D1)*количество_выходных. Это самый простой вариант для четвёрки. А так... можно и через структуру MqlDateTime изгаляться.

Правильно. Понял.

Придется немного попотеть над мелкими ТФ.

Может у кого есть готовая функция?

 
Uladzimir Izerski:

Как правильно вычесть выходные из расчета?

Наперед - никак. Ведь нам неизвестно, сколько именно баров продлятся выходные. Да, для высоких ТФ (D1, H4 и в большинстве случаев H1) это прогнозируемо, а вот для М1 - практически нет.

Формально точка на дате будет верная, но на графике для текущего момента неправильная.

Т.е. смещена на количество выходных. Это искажение надо убрать.

Убирайте искажение тогда, когда будущая точка получит реальный бар. Раньше нет смысла что-либо менять.

В крайнем случае можно пересчитывать ее положение на каждом новом баре еще до подхода настоящего времени к будущей точке.

 
точки лучше перепроверять/смещать в понедельник, потому как пара может котироваться в субботу-воскресенье (или может быть пара "лишних" часов в субботу или воскресенье)
 
Uladzimir Izerski:

Правильно. Понял.

Придется немного попотеть над мелкими ТФ.

Может у кого есть готовая функция?

Какая разница какой ТФ? Отодвигать-то точку всё-равно на один или два дня. PeriodSeconds(PERIOD_D1) возвращает количество секунд в одном дне.

 

Количество рабочих дней между двумя датами:

int WDCnt(datetime d1,datetime d2){
   int TotalDays=(int)(d2/86400)-(int)(d1/86400);    // всего дней между двумя датами
   int WholeWeeks=TotalDays/7;         // количество целых недель между двумя датами
   int RestDays=TotalDays%7;           // количество дней сверх количества целых недель (дополнительные дни)
   int StartDayOfWeek=TimeDayOfWeek(d1);// с какого дня недели начинаются дополнительные дни (условно считаем что они в начале интервала)
   int sddc[7][7]={ // по первому измерению - день недели начала дополнительных дней, по второму - количество дополнительных дней, в ячейке  количество дней за вычетом выходных
      0,  0,  1,  2,  3,  4,  5, // вос
      0,  1,  2,  3,  4,  5,  5, // пон
      0,  1,  2,  3,  4,  4,  4, // вто
      0,  1,  2,  3,  3,  3,  4, // сре
      0,  1,  2,  2,  2,  3,  4, // чет
      0,  1,  1,  1,  2,  3,  4, // пят
      0,  0,  0,  1,  2,  3,  4  // суб
   // 0   1   2   3   4   5   6         
   };
   return(WholeWeeks*5+sddc[StartDayOfWeek][RestDays]);
};
};

Только не проверял функцию. Попроверяйте кому не лень. Может кто знает более простой способ?