Доступ к другим TimeFrame

Образцы, куски исходников, вопросы. Обсуждаем программирование.
Сообщение
Автор
duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#26 Сообщение duh » Вс апр 11, 2010 6:52 pm

Код: Выделить всё

// Функция по таймфрейму и индексу бара найдет номер бара на указанном таймфрейме
// Используется метод дихотомии и соотношения индексных интервалов для задания начальной точки
// log - символ инструмента
// tf1 - таймфрейм на котором имеем бар с индексом ibar1
// ibar1 - индекс бара
// tf2 - таймфрейм на котором ищем индекс бара соответствующий бару ibar1
// iy - предыдущий найденный бар (для ускорения и поиском методом перебора), если меньше 0, то ускорения нет
int ftib5(PChar, int , int, int, int);
int ftib5(PChar log, int tf1, int ibar1, int tf2, int iy)
{
	int i1 = iBars(log, tf1) - 1, i2 = iBars(log, tf2) - 1; // Индексы последнего бара
	double tbar1 = iTime(log, tf1, ibar1), tbar2 = iTime(log, tf2, 0);
	if(tbar2 <= tbar1) return 0; // Законченный временной интервал у текущего бара отсутсвует и он выходит за пределы временного диапазона, поэтому надо проверять текущий бар отдельно
	if(iy > -1) // В случае если задан предыдущий индекс, то используется метод перебора от предыдущего индекса
	{
		int ibar2 = 0;
		if(iy > i2) ibar2 = i2; else ibar2 = iy;
		tbar2 = iTime(log, tf2, ibar2);
		int v = 1;
		if(tbar1 > tbar2) v = -1;
		while(true)
		{
			if(tbar1 == tbar2) return ibar2;
			if(v == 1 && tbar1 > tbar2) return ibar2;
			if(v == -1 && tbar1 < tbar2) return (ibar2 + 1);
			ibar2 = ibar2 + v;
			tbar2 = iTime(log, tf2, ibar2);
		}
	}
	else	// Если не задан предыдущий индекс, то используется метод дихотомии
	{
		int tf = tf2; // Таймфрейм на котором ищем индекс бара
		int ia = 0, ib = 0, ix = 0, ix1 = 0, ix2 = 0; // Индексы баров
		double ts = tbar1; // Время входящего бара
		double ta = 0.0, tb = 0.0, tx = 0.0, tx1 = 0.0, tx2 = 0.0; // Времена соответствующее барам ia, ib, ix, ix1 и ix2

		ix1 = (int) ( (((double)(i2+1)/(double)(i1+1)) * (double)(ibar1+1)) - 1 ); // Вычисление первой начальной точки
		if(ix1 > i2) ix1 = i2; if(ix1 < 0) ix1 = 0; // Проверка на выход за пределы истории
		tx1 = iTime(log, tf, ix1);
		if(ts == tx1) return ix1; // Проверка на равенство

		if(ts < tx1)
		{
			ix2 = (int) ( (double)(ix1+1) + (((tx1 - ts) * 1440.0 ) / (double)tf) );  // Вычисление второй начальной границы интервала
			if(ix2 > i2) ix2 = i2; // Проверка на выход за пределы истории
			tx2 = iTime(log, tf, ix2);
			ia = ix2; ib = ix1;
			ta = tx2; tb = tx1;
		}
		else
		{
			ix2 = (int) ( (double)(ix1-1) - (((ts - tx1) * 1440.0 ) / (double)tf) ); // Вычисление второй начальной границы интервала
			if(ix2 < 0) ix2 = 0; // Проверка на выход за пределы истории
			tx2 = iTime(log, tf, ix2);
			ia = ix1; ib = ix2;
			ta = tx1; tb = tx2;
		}
		if(ts == tx2) return ix2; // Проверка на равенство
		ix = (int) ( (ia + ib) / 2 ); tx = iTime(log, tf, ix); // Задание начальных данных
		while(true) // Цикл
		{
			if(tx == ts) return ix;
			if(ts < tx) ib = ix; else ia = ix;
			if((ia - ib) <= 1) return ia; // Если интервал сошелся, то искомое время в диапазоне бара с индексом ia
			ix = (int) ( (ia + ib) / 2 );
			tx = iTime(log, tf, ix);
		}
	}
	return -1;
}
Последний раз редактировалось duh Вс окт 24, 2010 12:19 pm, всего редактировалось 1 раз.
zzz

duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#27 Сообщение duh » Вс апр 11, 2010 7:16 pm

Итак, функция вернет индекс бара на таймфрейме tf2, который соответсвует по времени бару ibar1 на таймфрейме tf1

Под соответствует понимается то, что ... (удалил этот абзац так как работает не совсем так :D, индексы то ищутся правиьно, но вот когда остается выбрать из двух оставшихся - один слева, другой справа, то тут логика посложнее должна быть из-за пропусков в истории и т.п. )


В общем функция определяет бары при любых таймфреймах, а над окончательным решением по поводу того какой бар выбрать надо еще подумать.

Ну надеюсь понятно объяснил :shock:
Последний раз редактировалось duh Вс окт 24, 2010 12:20 pm, всего редактировалось 1 раз.
zzz

duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#28 Сообщение duh » Вс апр 11, 2010 8:27 pm

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

Вот даже из справки "Если Exact = true тогда совпадение времени должно быть точным с временем бара time = время бара, если Exact = false то будет найден бар время которого <= time < время следующего бара."
а если часовой бар начинается с отсутствющего пятиминутного бара, тогда получается что равенства не будет :)
Последний раз редактировалось duh Вс окт 24, 2010 12:21 pm, всего редактировалось 1 раз.
zzz

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#29 Сообщение Terranin » Вс апр 11, 2010 9:23 pm

duh писал(а):Вот блин задумался - какой же индекс бара окончательно выбрать, так как с учетом тела бара, равенства или не равенства времени, пропусков в истории и т.п. возможны различные варианты.

Вот даже из справки "Если Exact = true тогда совпадение времени должно быть точным с временем бара time = время бара, если Exact = false то будет найден бар время которого <= time < время следующего бара."
а если часовой бар начинается с отсутствющего пятиминутного бара, тогда получается что равенства не будет :)
Часовые бары всегда начинаются с начала часа, неважно были там пропуски или нет, также как и остальные таймфреймы начинаются с начала таймфрейма.
Asta la vista
Mike

duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#30 Сообщение duh » Пн апр 12, 2010 1:51 pm

Вот накидал для примера возможные варианты - самый спорный - это конечно с дыркой (моя прога, которая приведена выше выбирает или равный бар по времени или левый бар если равного нет, как видно из примера - в случае пропуска истории левый бар может быть совсем уж левым)
Вложения
1.JPG
1
(26.31 КБ) 13122 скачивания
Последний раз редактировалось duh Вс окт 24, 2010 12:22 pm, всего редактировалось 1 раз.
zzz

duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#31 Сообщение duh » Ср апр 14, 2010 8:17 pm

Значит поразмышлял над выбором баров - возможны такие варианты
1 - всегда выбирается левый бар (сюда не входит тот для которого выполняется равенство по времени, надо понимать, что левый бар может быть очень далеко отстоять от указанного времени, например через выходные быть на предыдущей неделе, а также возможны спорные случаи когда кроме левого бара больше нет подходящих баров - следующий может лежать уже за допустимыми пределами в случае с пропусками истории)
2 - всегда выбирается правый бар (сюда входит бар с равенством по времени, тоже есть спорные моменты, так как правый бар может лежать за допустимыми пределами)
3 - выбирается самый ближайший бар (тоже есть спорные моменты - ближайшим может оказаться не всегда тот бар который ожидается)
4 - выбирается бар, время которого лежит в диапазоне заданного бара
(тоже есть спорные моменты - оказывается есть варианты когда времени открытия баров может и небыть вообще внутри диапазона)
5 - самый лучший вариант - это когда выбирается оптимальное наложение временных отрезков (это выбор бара для которого минимальна некоторая величина, как ее вычислить еще не соображу, но это кажется самый лучший вариант).
Последний раз редактировалось duh Вс окт 24, 2010 12:24 pm, всего редактировалось 1 раз.
zzz

duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#32 Сообщение duh » Ср апр 14, 2010 8:30 pm

Вот картинка поясняющая спорные моменты
Вложения
1.JPG
(28.45 КБ) 9503 скачивания
zzz

Ответить