custom indicator

 
custom indicator
не сказал бы что совсем уж виснит, но на атлоне 1.5 xp отжирает 95% рессурсов

---------------
/*[[
Name := p1
Separate Window := No
First Color := Blue
First Draw Type := Line
First Symbol := 217
Use Second Data := No
Second Color := Red
Second Draw Type := Line
Second Symbol := 218
]]*/
var: i(0);
var: f(0);
var: s(0);
var: p(0);
p=0;
for i = bars - 12 downto 12 begin
s = iMAEx(24,MODE_LWMA,i-12,PRICE_MEDIAN,0);
f = iMAEx(12,MODE_LWMA,i-6,PRICE_MEDIAN,0);
SetIndexValue(i-6, -p*0.5+iMA(4,MODE_LWMA,bars-8));
p = p - (s - f);
end;
-------
 
что это значит
Как эта запись будет выглядеть в C++:


for(int i=0;i<8192;i++) // в основном цикле идем по всем барам (грубо взяли 8192)
{
double p=0;
for(int j=i-12;j>12;j--)
{
double s=iMAEx(24,...);
double f=iMAEx(12,...);
SetIndexValue(i-6,-p*0.5*iMA(4,...));
p=p-(s-f);
}
}



И все это хозяйство вызывается на каждый тик.
Не нужно забывать про общий цикл for(int i=0;i<8192;i++) и стоимость постоянных перерасчетов трех индикаторов.

 
скорее проблема в iMAEx
все бы хорошо, да вот только если iMAEx заменить просто на iMA, то даже с учетом тотго что это вызывается каждый тик и по всем барам, работает раз в 70 быстрее.
Ниже пример, работающий нормально, но если раскомментировать две строчки с iMAEx и закоментировать две с iMA, то работать будет существенно медленнее.
-------
/*[[
Name := p1
Separate Window := No
First Color := Blue
First Draw Type := Line
First Symbol := 217
Use Second Data := No
Second Color := Red
Second Draw Type := Line
Second Symbol := 218
]]*/
var: i(0);
var: f(0);
var: s(0);
var: p(0);
p=0;
for i = bars - 12 downto 12 begin
// s = iMAEx(24,MODE_LWMA,i-12,PRICE_MEDIAN,0);
// f = iMAEx(12,MODE_LWMA,i-6,PRICE_MEDIAN,0);
s = iMA(24,MODE_LWMA,i-12);
f = iMA(12,MODE_LWMA,i-6);
SetIndexValue(i-8, -p*0.5+iMA(4,MODE_LWMA,bars-20));
p = p - (s - f);
end;
------
 
iMA и iMAEx работают совершенно одинаково,
так как в конце концов вызывается одна и та же функция. в iMA недостающие параметры заполняются умолчательными значениями.
а именно ma_shift=0 и applied_price=PRICE_CLOSE.
причина Вашего замедления заключается в том, что Вы перепутали понятия ma_shift(смещение скользящей средней после расчёта) и shift(смещение относительно текущего бара (количество периодов назад), откуда нужно брать данные). самое интересное, что ошибки в такой путанице и нет! в iMAEx попробуйте поменять местами ma_shift и shift и Вы получите убыстрение. (правда, мы сильно сомневаемся про убыстрение "раз в 70")
Причина обращения: