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

[Удален]  
Подскажите пожалуйста, как мне загнать все найденное в данном коде, в массив, а затем отобрать из него 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. Но нужно учесть, что и цену нужно будет брать среднюю для интервала. Хотя можно и наиболее вероятную.

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

 

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