Помогите разобраться: взаимодействие индикатора и эксперта

 
Ниже приводится индикатор, работающий подобно CLV, сглаженному МА, только нормирование осуществляется в интервале 0-1, а не -1:1.
Сам по себе, индикатор работает прекрасно. Однако при вызове его из эксперта, возникают проблемы. А именно, когда я вызываю из кода эксперта:
double dNoc = iCustom(NULL, 0, "_Noc_Ind", false, 27, 0.017, 7, 0, 1);
double dNocPrev = iCustom(NULL, 0, "_Noc_Ind", false, 27, 0.017, 7, 0, 2);

Comment(TimeToStr(CurTime()), ", Prev: ", dNocPrev,  ", Curr: ", dNoc);



Получаю вывод что-то вроде 0.5049, 0.505, в то время, как в окне индикатора последнее значение находится в районе 0.9.

Подскажите, пожалуйста, где ошибка.

Индикатор:

#property copyright "Copyright Quark"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_minimum 0
#property indicator_maximum 1

// indicator parameters
extern int nClvPeriod = 27;
extern int nClvMa = 7;

int nDrawBeginBar;

// indicator buffers
double arrExtMapBuffer[];

int nExtCountedBars = 0;

////////////////////////
int init()
{
	string strIndicatorShortName;

	// drawing settings
	SetIndexStyle(0, DRAW_LINE);
	SetIndexShift(0, 0);
		
	IndicatorDigits(4);
		
	nDrawBeginBar = MathMax(nClvPeriod, nClvMa);
	SetIndexDrawBegin(0, nDrawBeginBar);

	strIndicatorShortName = "Noc(" + nClvPeriod + ", " + nClvMa + ")";  
	IndicatorShortName(strIndicatorShortName);

	// indicator buffers mapping
	SetIndexBuffer(0, arrExtMapBuffer);
		
	return(0);
}
///////////////////////////
int start()
{
	if(Bars <= nDrawBeginBar) 
		return(0);
		
	nExtCountedBars = IndicatorCounted();
	if(nExtCountedBars < 0) 
		return(-1);

	// last counted bar will be recounted
	if(nExtCountedBars > 0) 
		nExtCountedBars--;
		
	Noc();  

	return(0);
}
///////////////////
// For the selected period:
// CLV = ((Close - Low) - (High - Close)) / (High - Low) 
void Noc()
{
	int nPos = Bars - nExtCountedBars;

	while(nPos >= 0)
	{
		double dClose = Close[nPos];
		double dLow = Low[ArrayMinimum(Low, nClvPeriod, nPos)]; 
		double dHigh = High[ArrayMaximum(High, nClvPeriod, nPos)]; 

		arrExtMapBuffer[nPos] = (((dClose - dLow) - (dHigh - dClose)) 
			/ (dHigh - dLow)) / 2 + 0.5; 

		nPos--;
	}
	
	if(nClvMa > 1)
		Ema(arrExtMapBuffer);
}
///////////////////
void Ema(double& arr[])
{
	double dPr = 2.0 / (nClvMa + 1);

	int nPos = Bars - nExtCountedBars;
	
	while(nPos >= 0)
	{
		if(nPos == Bars - 2) 
			arrExtMapBuffer[nPos + 1] = arr[nPos + 1];

		arrExtMapBuffer[nPos] = arr[nPos] * dPr + arrExtMapBuffer[nPos + 1] * (1 - dPr);
		nPos--;
	}
}




 
Quark, а зачем у тебя в цикле While каждый раз идет объявление переменных dClose, dLow и так далее?

void Noc()
{
	int nPos = Bars - nExtCountedBars;

	while(nPos >= 0)
	{
		double dClose = Close[nPos];
		double dLow = Low[ArrayMinimum(Low, nClvPeriod, nPos)]; 
		double dHigh = High[ArrayMaximum(High, nClvPeriod, nPos)]; 
		arrExtMapBuffer[nPos] = (((dClose - dLow) - (dHigh - dClose)) 
			/ (dHigh - dLow)) / 2 + 0.5; 

		nPos--;
	}
	
	if(nClvMa > 1)
		Ema(arrExtMapBuffer);
}
 
Quark, а зачем у тебя в цикле While каждый раз идет объявление переменных dClose, dLow и так далее?

- Согласен. Исправлю. Но на проблему это влиять не должно - в лучшем случае на быстродействие.
 
в индикаторе 2 входящих переменных:
extern int nClvPeriod = 27;
extern int nClvMa = 7;


а из эксперта вызывается 4, причём 2 из них - другого типа =)

iCustom(NULL, 0, "_Noc_Ind", false, 27, 0.017, 7, 0, 1);



т.е. надо так:

iCustom(NULL, 0, "_Noc_Ind", 27, 7, 0, 1);
 
Действительно, несовпадение количества и типа параметров. Я и не посмотрел.
 
Ура! Спасибо большое.
Причина обращения: