Разница между графиком CustomIndicator и значениями iCustom в эксперте

 
Разница между графиком CustomIndicator и значениями iCustom в эксперте
У меня возникла проблема с индикатором (его текст см ниже). Дело в том что на графике он отображает правильные значения, но когда я использую его в эксперте через iCustom(), он выдает совсем неправильные цифры (завышенные). Похоже что проблема в том что при построении графика МТ проходит по каждому бару 1 раз и все Ok, а эксперт проходит несколько раз (даже когда используется OHLC) и приводит к возникновению неправильных значений. Как этого избежать?? Или до выхода МТ4 никак?

===================

/*[[
Name := wADX
Author := Copyright © 2003, Company
Link := http://www.company.com/
Separate Window := Yes
First Color := Blue
First Draw Type := Line
First Symbol := 217
Use Second Data := Yes
Second Color := Red
Second Draw Type := Line
Second Symbol := 218
]]*/
Inputs : Periods(20);
Variable : s(0), PlusDM(0), PlusDI(0), MinusDM(0), MinusDI(0), PEMA(0), MEMA(0), ATR(0);
Variable : lb(0), first(True), prevbars(0);

SetLoopCount(1);

If Bars < prevbars Or Bars-prevbars>1 Then first = True;
prevbars = Bars;

If first Then Begin
lb = Bars-Periods-1;
If lb < 0 Then Exit; // not enough bars for counting
first = False;
End;

lb = lb+1; // current bar is to be recounted too
For s = lb Downto 0 Begin

ATR=iATR(Periods,s);

If H[s]>H[s+1] AND H[s]-H[s+1]>L[s+1]-L[s] then PlusDM=H[s]-H[s+1] else PlusDM=0;
PEMA=PEMA+2*(PlusDM-PEMA)/(Periods+1);
PlusDI=100*PEMA/ATR;

If L[s]<L[s+1] AND H[s]-H[s+1]<L[s+1]-L[s] then MinusDM=L[s+1]-L[s] else MinusDM=0;
MEMA=MEMA+2*(MinusDM-MEMA)/(Periods+1);
MinusDI=100*MEMA/ATR;

SetIndexValue(s, PlusDI);
SetIndexValue2(s, MinusDI);
lb=lb-1;
End;
 
суть задачи
Вобщем, суть задачи мне кажется в том чтобы инкремент lb=lb+1 выполнялся только один раз, после формирования бара. Но как это сделать - не понятно, команд ответственных за статус бара я не нашел. Разработчики, что делать?
 
решение
если кому интересно, решение оказалось очень простым: заменить lb=lb+1 на
if Bars=bar+1 then
{
lb = lb+1;
bar=Bars;
}
 
но пока не полное ...
странно, но значения iCustom, рассчитанные таким образом все равно не правильные, хоть и ближе к истине. Как же все-таки это делается?
 
как Вы вызываете этот индикатор?
iCustom("wADX",20,MODE_FIRST,shift)
и ещё вопрос
зачем Вы используете SetLoopCount(1)?
 
корень зла
ATR=iATR(Periods,s);

Все индикаторы, построенные с использванием ATR, работают в Метатрейдере неправильно.
Значения, получаемые от индикаторов при тестировании, не совпадают со значениями индикаторов с экрана.
 
нет, дело не в этом ...
даже не используя ATR значения на графике этого Custom Indicator отличаются от значений, полученных через iCustom(), хотя должны быть одинаковыми.
 
вызываю именно так
вызываю именно так

на самом деле я использую SetLoopCount(0), это я тут опечатался
 
разница ATR
Уважаемые разработчики!
Есть масса интересных индикаторов, с использованием ATR.
Как добится их соответствия на графике и в тестере?
Приведу один пример:

/*[[
Name := Renko
Author := MechanicalTrading © 2003, Company
Link :=
Separate Window := No
First Color := Blue
First Draw Type := Line
First Symbol := 217
Use Second Data := Yes
Second Color := Blue
Second Draw Type := Line
Second Symbol := 218
]]*/
Variable : shift(0),Up(0),ATR_Current(0),Down(0),ttime(0);
Var: loopbegin1(0), first(True), prevbars(0);
Input: ATR(24), Brick(1);

SetLoopCount(0);

if ttime=time and loopbegin1=-1 then exit;
ttime=time;

if bars<50 then exit;
If Bars < prevbars Or Bars-prevbars>1 Then first = True;
prevbars = Bars;
If first Then Begin
loopbegin1 = Bars-50;
If loopbegin1 < 0 Then Exit; // not enough bars for counting
first = False; // this block is to be evaluated once only
End;
loopbegin1 = loopbegin1+1;
For shift = loopbegin1 Downto 0 Begin
//-------------------------------------------------------------------------------
ATR_Current=iATR(ATR,shift)*Brick;
IF O[shift]>Up+ATR_Current then Begin UP=UP+(floor((O[shift]-UP)/ATR_Current)*ATR_Current);Down=UP-ATR_Current; end;
IF O[shift]<Down-ATR_Current then Begin Down=Down-(floor((Down-O[shift])/ATR_Current)*ATR_Current);UP=Down+ATR_Current;end;
SetIndexValue (shift,Up);
SetIndexValue2(shift,Down);
loopbegin1 = loopbegin1-1;
//-------------------------------------------------------------------------------
End;
Причина обращения: