Расчёт индикаторов со сдвигом по времени

 
Интересен такой вопрос.
Допустим, мы применяем какой-либо индикатор на D1 графике. Т.е. он вычисляется как некая функция от дневных значений цен закрытия (Close) за какое-либо N число дней. В свою очередь, каждое дневное значение закрытия (Close[i]) на D1 вычисляется на основе движений цены за эти сутки, с 00:00:00 до 00:00:00 следующего дня, не включая верхнюю границу.

Вопрос, возможно ли каким-то способом получить дневные значения цен закрытия (Close[i]) на D1 со сдвигом по времени? Т.е. не от 0:00 до 0:00 часов, а, например, со сдвигом на 3 часа, т.е. Close[i]_D1 с 19.12.2006 03:00 до 20.12.2006 03:00?
То же самое верно и для, например, H4 цен закрытия. Их можно считать не от 12:00 до 16:00, а, например, от 13:30 до 17:30?
 
chv:
Интересен такой вопрос.
Допустим, мы применяем какой-либо индикатор на D1 графике. Т.е. он вычисляется как некая функция от дневных значений цен закрытия (Close) за какое-либо N число дней. В свою очередь, каждое дневное значение закрытия (Close[i]) на D1 вычисляется на основе движений цены за эти сутки, с 00:00:00 до 00:00:00 следующего дня, не включая верхнюю границу.

Вопрос, возможно ли каким-то способом получить дневные значения цен закрытия (Close[i]) на D1 со сдвигом по времени? Т.е. не от 0:00 до 0:00 часов, а, например, со сдвигом на 3 часа, т.е. Close[i]_D1 с 19.12.2006 03:00 до 20.12.2006 03:00?
То же самое верно и для, например, H4 цен закрытия. Их можно считать не от 12:00 до 16:00, а, например, от 13:30 до 17:30?
Я бы предположил, что можно вот так.
Пример для D1 со сдвигом на 3 часа:

double iMyClose(int shift)
  {
   datetime T = iTime(NULL,PERIOD_D1,shift);
   int shiftH1 = iBarShift(NULL,PERIOD_H1,T);
   shiftH1 += 3;
   return (iClose(NULL,PERIOD_H1,shiftH1));
  }

Пример для H4 со сдвигом на полтора часа
double iMyClose(int shift)
  {
   datetime T = iTime(NULL,PERIOD_H4,shift);
   int shiftM30 = iBarShift(NULL,PERIOD_M30,T);
   shiftM30 += 3; //три тридцатиминутки - полтора часа
   return (iClose(NULL,PERIOD_M30,shiftM30));
  }
Вот такое извращение - логика, по моему, ясна. Уточнение - это если дыр на графиках нету. Если есть - нужно ещё проверять время открытия того бара, который найден iBarShift'ом и увеличивать потом shiftXX не на конкретное число, а так, чтобы попасть в нужное место.
 
Я бы сказал, что это не то, что надо.
Пояснение.
double iClose( string symbol, int timeframe, int shift)
Возвращает значение цены закрытия указанного параметром shift бара с соответствующего графика (symbol, timeframe).


Эти функции (iClose, iBarShift) работают со смещением на целые бары, а я говорил о смещении по времени внутри бара. Вызов iClose(null, PERIOD_D1, 2) вернёт мне цену закрытия на два бара, т. е. два дня назад.

Вопрос был, как посчитать значения дневных цен со сдвигом времени внутри бара, т.е. время, меньшее, чем продолжительность самого бара, например, D1 с 19.12.2006 03:00 до 20.12.2006 03:00?
 
chv:
Я бы сказал, что это не то, что надо.
Пояснение.
double iClose( string symbol, int timeframe, int shift)
Возвращает значение цены закрытия указанного параметром shift бара с соответствующего графика (symbol, timeframe).


Эти функции (iClose, iBarShift) работают со смещением на целые бары, а я говорил о смещении по времени внутри бара. Вызов iClose(null, PERIOD_D1, 2) вернёт мне цену закрытия на два бара, т. е. два дня назад.

Вопрос был, как посчитать значения дневных цен со сдвигом времени внутри бара, т.е. время, меньшее, чем продолжительность самого бара, например, D1 с 19.12.2006 03:00 до 20.12.2006 03:00?
Обратите внимание на:
   shiftH1 += 3;
и затем
   return (iClose(NULL,PERIOD_H1,shiftH1));
это - смещение внутри бара. Внутри дневного. На часовом графике.
 
Хорошо, я понял по сдвигам баров. А почему Вы решили, что код:
iClose(NULL,PERIOD_H1,shiftH1)
вернёт именно значение D1 цены закрытия за дневной период, в который входит этот часовой бар?

Ну, например, индикатор считается как функция от 20 последних D1 цен закрытия: Close[0]_D1, Close[1]_D1, ..., Close[19]_D1. Т.е. на него влияют Close_D1 цены последних 20-ти суток. И значение индикатора-D1 на текущий день может вообще не равняться ни одной минутной цене текущего дня, если 19 предыдущих дней "тянут" её в другую сторону. Например, 19 дней цена падала, и D1 индикатор также на основе этого упал до безобразия, а сегодня цена поскакала вверх, но текущее значение индикатора даже после этого 0-го бара не успеет поскакать также, другие слагаемые влияют.

Т.е. я пока вообще не знаю, как считается, например, Close_D1 дневная цена закрытия - от всех тиковых цен, от средних по Close_M1 и т.д.? Хотя среднее от средних будет математически неверно, если первоначально усреднённые значения агрегируют разный объём первичных данных.
А как посчитать D1 цену закрытия на произвольном 24-х часовом промежутке времени?
 

Т.е. я пока вообще не знаю, как считается, например, Close_D1 дневная цена закрытия - от всех тиковых цен, от средних по Close_M1 и т.д.? Хотя среднее от средних будет математически неверно, если первоначально усреднённые значения агрегируют разный объём первичных данных. А как посчитать D1 цену закрытия на произвольном 24-х часовом промежутке времени?


Быть очень умным иногда даже плохо. :-))
Зачем Вы так усложняете себе жизнь ? Цена закрытия бара это цена последнего тика в этом баре. Это распространяется на все т/ф. Поэтому цена закрытия Д1 определяется последним тиком суток. А что там было внутри дня роли не играет. Поэтому какой бы промежуток времени Вы не взяли цена его закрытия - это последняя цена.
 

Быть очень умным иногда весьма полезно.
Если следовать Вашей теории, то получается такое следствие. Поскольку периоды, например, H1, H4 и D1 кратны и в определённые промежутки времени заканчиваются одновременно (например, 20. 12.2006 00:00), то последний тик у них всех суть есть один и тот же. Этот тик даёт, пардон, конец бара и для H1, и для H4 и D1. Точно также можно указать время, когда, например, совпадают последние тики у M15 и M30 периодов, они тоже кратны, ну и т.д., вообще все стандартные таймфреймы кратны M1. Значит, один и тот же тик должен дать одну и ту же цену закрытия всем закрываемым им таймфреймам (барам этих таймфреймов), верно?

Короче. Берём для примера стандартный индикатор Moving Average. И по всплывающим подсказкам на графиках H1, H4 и D1 получаем его значения на указанную дату/время, ну например для EURUSD.

EURUSD, Moving Average

H1 2006.12.20 00:00 1.3184
H4 2006.12.20 00:00 1.3129
D1 2006.12.20 00:00 1.3199

как видно, они не равны даже примерно, хотя, как утверждалось (цитата): "Цена закрытия бара это цена последнего тика в этом баре".
Как видим, эта теория разрушена просто навскидку взятым примером, аналогов которого можно найти на графиках целые биллионы.

Значит, не последним тиком (не только им) определяется цена закрытия бара. А чем тогда?

 
Функция StrToTime("h:m") вернет дату и время текущего дня, используем iBarShift() c указанием младшего таймфрема и получаем номер бара на этом младшем таймфреме соответсвующий требуемому времени.

Про МА примера не понял, период у нее какой был? Если1 то должно соответсвовать, а если больше, то было бы удивительней, если совпадало.
 
Вредно-вредно...
Цена закрытия именно последний тик. А вот мувинг это производная от набора последних тиков. В твоем примере совпадает только один, последний "последний тик", а все остальные-то разные. Дневной мувинг может берет такой далекий бар, что на часовой график он даже не подкачивается.
Бар - это такая условная условность, что не стоит на нем зацикливаться, это просто один из вариантов представления информации и никакого глубинного смысла он не несет. Начало бара - первый тика часа, например. Конец - последний тик. Открытие следующего бара практически всегда это закрытие предыдущего, ибо тик от тика не далеко падает. У разных дилеров тики разные, а значит и бары отличаются. "Очень сложно найти черную кошку в темной комнате, особенно если ее там нет"
 
Например рисуем индикатор на часовом графике. Делаем массив с ценами закрытия дней, последнему элементу массива присваиваем цену закрытия последнего часового бара. Сглаживаем массив и в буфер его, может еще какие тонкости всплывут по мере написания.
 
timbo:
Бар - это такая условная условность, что не стоит на нем зацикливаться.


Это точно. И всё же индикаторы считаются по барам, приходится с этим считаться.

Опять же, из проведённых замеров. Фиксируем пару и время за сегодня 07:00, и смотрим цену закрытия по всплывающим подсказкам на разных timeframes.

1. EURUSD:

M5
07:00
1.3193

M15
07:00
1.3190

M30
07:00
1.3194

H1
07:00
1.3194

---

2. GBPJPY:

M5
07:00
232.76

M15
07:00
232.79

M30
07:00
232.80

H1
07:00
232.77

Вопрос, почему такая разница? Время-то одно и то же.

Задача возникла из необходимости рассчитывать по возможности точные и актуальные значения индикаторов по разным таймфреймам, ну например, Moving Average на D1, H4, H1 в течении 0-го бара этих таймфреймов, но эти значения, допустим, D1 значения индикатора, получаемые в течении текущего дня, чувствительны к движениям цены и окончательно зафиксируются лишь после завершения дня, т.е. фиксации и завершения этого D1 бара.
А как получить по возможности наиболее точные значения индикаторов по D1 периоду до его закрытия?