Расчёт PPZ - помогите доработать - страница 2

 
Тяжеловат индюк для советника, а так идея хорошая. Может удастся облегчить его, хотя сомневаюсь для визуальной торговли пойдет в принципе как дополнительный анализ.
 
По поводу оптимизации. На мой взгляд надо отсортировать получившийся массив Fr0[j] и уже плясать от него, в результате получится всего один проход.
 

Этот код не учитывает бары с двумя фракталами одновременно:


j=0;
for(i = loopbegin; i > Nfirst; i--) {
f0 = -1.0;
f0 = iFractals(NULL,0,MODE_UPPER,i);
if (f0<=0.0 ) f0 = iFractals(NULL,0,MODE_LOWER,i);
if (f0>0.0) {
Fr0[j]=f0;
Ind0[j]=i;
j++;
}
}
Nmax = j;


А здесь не надо перебирать все фракталы, тебе все равно, сравнивать ли фрактал #1 с #2 или #2 с #1.
Исправить его надо так:


for(i = 0; i < Nmax; i++) {
f0 = Fr0[i];
for(j = i+1; j < Nmax; j++) {
f1=Fr0[j];
if (MathAbs(Ind0[i]-Ind0[j])>minBars) {
for(k = j+1; k < Nmax; k++) {
f2 = Fr0[k];
if (MathAbs(Ind0[i]-Ind0[k])>minBars && MathAbs(Ind0[k]-Ind0[j])>minBars) {
for(l = k+1; l < Nmax; l++) {
f3 = Fr0[l];
if (MathAbs(Ind0[i]-Ind0[l])>minBars && MathAbs(Ind0[j]-Ind0[l])>minBars && MathAbs(Ind0[k]-Ind0[l])>minBars) {
p0 = (f0+f1+f2+f3)/4.0;
s0 = (f0-p0)*(f0-p0)+(f1-p0)*(f1-p0)+(f2-p0)*(f2-p0)+(f2-p0)*(f2-p0);
if (s0<smin) {
smin=s0;
pmin=p0;
imin=i;
jmin=j;
kmin=k;
lmin=l;
}
}
}
}
}
}
}
}

И надо этот код вынести в функцию и использовать его 4 раза, а не копировать код. Фракталы в Fr0 надо обнулить, чтобы при следуюшем проходе они не участвовали в расчете.



 

Зачем перебирать фракталы на каждой итерации? Не проще ли сделать это один раз, а потом уже анализировать? К тому же, сравнение должно сходиться в треугольник, а не в квадрат (нет смысла дважды сравнивать фрактал 1 и 2, а затем 2 и 1). Сделал немного по-другому - индикатор последовательно ищет расхождение от 0 пунктов и выше, пока не найдет четыре уровня. Расстояние между уровнями я не ограничивал:


Файлы:
 
Scriptong писал(а) >>

Зачем перебирать фракталы на каждой итерации? Не проще ли сделать это один раз, а потом уже анализировать? К тому же, сравнение должно сходиться в треугольник, а не в квадрат (нет смысла дважды сравнивать фрактал 1 и 2, а затем 2 и 1). Сделал немного по-другому - индикатор последовательно ищет расхождение от 0 пунктов и выше, пока не найдет четыре уровня. Расстояние между уровнями я не ограничивал:

Отлично! Скорость совсем другая... :)

А можно еще значения получаемых уровней в буферы индюка заносить? Чтобы их потом из эксперта обрабатывать.

 

Эксперта я сам собираюсь сделать. Некоторые идеи есть. Но может у кого-то есть более интересные мысли? Сделаю и выложу в Code Base.

 
Scriptong писал(а) >>

Эксперта я сам собираюсь сделать. Некоторые идеи есть. Но может у кого-то есть более интересные мысли? Сделаю и выложу в Code Base.

Еще можно вот так попробовать добавить:

if (period == 0) {period = WindowBarsPerChart();}
И выводить где-нибудь на экране количество баров для расчета...

 
mikola2 >>:

if (period == 0) {period = WindowBarsPerChart();}
И выводить где-нибудь на экране количество баров для расчета...

Я не это имел в виду :) 

Идеи насчет эксперта. То, что в самом индикаторе можно еще много чего добавить и так понятно

 
Идеи есть, сделайте его в виде функции, логику индюка имею в виду, сможете?
 
qwerewq >>:
Идеи есть, сделайте его в виде функции, логику индюка имею в виду, сможете?


он и так в виде функций...
Причина обращения: