Отбор в массиве?

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

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)
 

Если всё найденное в этом коде ни для чего другого не понадобится, можно не запоминать. Просто сразу строить распределение. Размер массива D под распределение взять по чиcлу пунктов между MAX и MIN : (MAX - MIN )/Point+1. Теперь для очередного p вычислим индекс: ind = (p - MIN)/Point. И учтём это p: D[ind]++ . Когда построение распределения будет закончено, останется найти 10 максимальных значений и превратить индексы обратно в цены. Хотя если пользоваться сортировкой, лучше сразу взять двумерный массив и заранее заполнить второй вектор ценами.

 

Но похоже можно без сортировки. На старте процедуры устанавливаем порог отбора в 0 и по мере продвижения расчёта считаем количество пересечений порога. Как только оно превысит 10 увеличиваем порог на единицу, обнуляем счётчик пересечений и.т.д.

В конце один раз просматриваем массив и имея итоговое значение порога производим отбор.

 
Спасибо тебе большое lna01 за теорию, но я не могу понять как это написать на МУКУЛе, я только учусь :) Если можно покажи как это все выглядит в коде
 

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 Point. Сразу заявляю что кода не будет :)
 
Кода не нужно, буду старатся делать сам ))
Ну хотя бы теорию поподробнее можно а? Сейчас интервал 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. Но нужно учесть, что и цену нужно будет брать среднюю для интервала. Хотя можно и наиболее вероятную.

Возможно целесообразнее просто обработать результаты первой процедуры. То есть сделать ещё одно распределение, с более крупным шагом, суммируя частоты для цен по нужным интервалам.

 

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

Причина обращения: