Если всё найденное в этом коде ни для чего другого не понадобится, можно не запоминать. Просто сразу строить распределение. Размер массива D под распределение взять по чиcлу пунктов между MAX и MIN : (MAX - MIN )/Point+1. Теперь для очередного p вычислим индекс: ind = (p - MIN)/Point. И учтём это p: D[ind]++ . Когда построение распределения будет закончено, останется найти 10 максимальных значений и превратить индексы обратно в цены. Хотя если пользоваться сортировкой, лучше сразу взять двумерный массив и заранее заполнить второй вектор ценами.
Но похоже можно без сортировки. На старте процедуры устанавливаем порог отбора в 0 и по мере продвижения расчёта считаем количество пересечений порога. Как только оно превысит 10 увеличиваем порог на единицу, обнуляем счётчик пересечений и.т.д.
В конце один раз просматриваем массив и имея итоговое значение порога производим отбор.
Na100yaschiy, настоящие теории обычно очень практичны. Но это была не теория а типа инструкции по сборке мебели :)
Код может быть примерно такой:
int End = 0; int Start = 1000; double MAX = High[iHighest(NULL, 0, MODE_HIGH, Start, End)]; double MIN = Low[iLowest(NULL, 0, MODE_LOW, Start, End)]; int D[][2]; int DSize = NormalizeDouble((MAX-MIN)/Point+1,Digits); ArrayResize(D,DSize); for (int i = 0; i < DSize; i++) D[i][1] = i; for (i = End; i <= Start; i++) { for (int ind = NormalizeDouble((Low[i]-MIN)/Point,Digits); ind <= NormalizeDouble((High[i]-MIN)/Point,Digits); ind++) D[ind][0]++; } ArraySort(D,WHOLE_ARRAY,0,MODE_DESCEND); for (i = 0; i < DSize; i++) { if (D[i][0] < D[9][0]) break; Print("Price=",NormalizeDouble(MIN + Point*D[i][1],Digits),", Freq=",D[i][0]); }Насчет обойтись без сортировки дело немного сложнее (со сборкой мебели тоже такое бывает :). То есть из принципа это можно сделать, но сомнительно что получится быстрее сортировки.
Но опять одно "но" )) индикатор выводит 10 котировок, но некоторые из них идут подряд, например:
2007.08.08 14:05:47 Yrovni GBPUSD,H4: Price=1.4262, Freq=6094
2007.08.08 14:05:47 Yrovni GBPUSD,H4: Price=1.4267, Freq=6094
2007.08.08 14:05:47 Yrovni GBPUSD,H4: Price=1.427, Freq=6094
2007.08.08 14:05:47 Yrovni GBPUSD,H4: Price=1.4261, Freq=6094
2007.08.08 14:05:47 Yrovni GBPUSD,H4: Price=1.4263, Freq=6095
2007.08.08 14:05:47 Yrovni GBPUSD,H4: Price=1.4266, Freq=6095
2007.08.08 14:05:47 Yrovni GBPUSD,H4: Price=1.4253, Freq=6095
2007.08.08 14:05:47 Yrovni GBPUSD,H4: Price=1.4265, Freq=6096
2007.08.08 14:05:47 Yrovni GBPUSD,H4: Price=1.4272, Freq=6096
все эти котировки находятся примерно на одном уровне ~ 1.4266. Как можно сделать так, чтобы индикатор сам выводил уже округленные значения, т.е. если идет разброс котировок в районе 10-15 пунктов, он сам считает среднее значение цены и уже только его печатает.
То есть это тож самое, если загнать в эксель файл с котировками и обработать его там, получив на выходе уровни в диаграмме. Нечто похожее описывается в этой статье: 'Один способ построения уровней поддержки и сопротивления'
Вот я хотел бы получить на выходе индикатора тоже такие значения без применения экселя. Помогите люди пожалста.
Ну хотя бы теорию поподробнее можно а? Сейчас интервал 1 поинт, это где? я вообще запутался, то есть в вышеприведенном коде, так?
Интервал в расчёте участвует в двух местах:
int DSize = NormalizeDouble((MAX-MIN)/Point+1,Digits);
for (int ind = NormalizeDouble((Low[i]-MIN)/Point,Digits); ind <= NormalizeDouble((High[i]-MIN)/Point,
Digits); ind++) D[ind][0]++;
и задаётся когда делается .../Point. Но нужно учесть, что и цену нужно будет брать среднюю для интервала. Хотя можно и наиболее вероятную.
Возможно целесообразнее просто обработать результаты первой процедуры. То есть сделать ещё одно распределение, с более крупным шагом, суммируя частоты для цен по нужным интервалам.
Вообще хочу добавить, что чем больше таймфрейм, тем грубее результат - ведь внутри бара у цен были свои частоты, а они фактически принимаются равными единице. Минимизировать ошибку можно используя минутную историю. А для точного результата нужно иметь тиковую.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
int End = 0;
int Start = 1000;
double MAX = High[iHighest(NULL, 0, MODE_HIGH, Start, End)];
double MIN = Low[iLowest(NULL, 0, MODE_LOW, Start, End)];
for (double p = min; p <= max; p += Point)
{
for (int i = End; i <= Start; i++)
{
if (High[i] >= p && p >= Low[i]) f(i, p);
}
}
void f(int i, double p)