Проблема с индикатором

 
Скорее всего, проблема у меня :) , но все-таки, вдруг кто увидит, свежим глазом. Не отображается корректно Anchored Momentum:


#property copyright "Implemented: Quark, based on: http://konkop.narod.ru/"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue

extern int nMomentum = 7;

int nMa;

double arrBuffer[];
double arrBuffer1[];

// ------

int init()
{
	nMa = 2 * nMomentum + 1;

	SetIndexStyle(0, DRAW_LINE);
	SetIndexBuffer(0, arrBuffer);
	SetIndexEmptyValue(0, 0.0);
	
	string strName = "Anchored Momentum(" + nMomentum + ", " + nMa  + ")";
	IndicatorShortName(strName);

	SetIndexLabel(0, strName);
	SetIndexDrawBegin(0, nMa);

	return(0);
}

// ------

int start()
{
	if(Bars <= nMa) 
		return(0);

	int nCountedBars = IndicatorCounted();

	if(nCountedBars < 0)
		return(-1);
	
	if(nCountedBars > 0) 
		nCountedBars--;
		
	int nPos = Bars - nCountedBars;
	
	while(nPos >= 0)
	{
		double dEma = iMA(NULL, 0, nMa, 0, MODE_EMA, PRICE_CLOSE, nPos + 1);
		double dSma = iMA(NULL, 0, nMa, 0, MODE_SMA, PRICE_CLOSE, nPos + 1);

		arrBuffer[nPos] = //dEma - dSma; 
			100.0 * (dEma / dSma - 1);

		nPos--;
	}
   
	return(0);
}

// ------


 
А вы уверены что это Anchored Momentum?
Формул не помню, но по смыслу у вас совсем другое.
Рисовать чтото должна, но чтото бессмысленное (ИМХО).
 
А вы уверены что это Anchored Momentum?
Формул не помню, но по смыслу у вас совсем другое.
Рисовать чтото должна, но чтото бессмысленное (ИМХО).


Ну хорошо, это - вольная интерпретация на тему АМ :) Там (http://konkop.narod.ru/) тема АМ несколько развита, ну и я попытался. Вопрос не в правильности индикатора, а в том, почему он не отображается.
 
Скорее всего, проблема у меня :) , но все-таки, вдруг кто увидит, свежим глазом. Не отображается корректно Anchored Momentum:
...
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
...
double arrBuffer[];
double arrBuffer1[];
...
	SetIndexBuffer(0, arrBuffer);
...
	arrBuffer[nPos] = //dEma - dSma;
	100.0 * (dEma / dSma - 1);
...



а в каком месте ты рассчитываешь значение arrBuffer? (я другого не нашел) Оно у тебя ни где не посчитано, потому и не отображается.
 
Посмотрите логи эксперта у себя, происходит деление на 0 и эксперт сваливается.

Вот так работает
if (dSma != 0) arrBuffer[nPos] = 100.0 * (dEma / dSma - 1);
 
Замени
int nCountedBars = IndicatorCounted();

на

int nCountedBars = MathMax(IndicatorCounted(),nMa+2);
 
Спасибо всем!

Всвязи с последним постом (int nCountedBars = MathMax(IndicatorCounted(),nMa+2);)
Оно работает, но я не совсем понял логику. То есть, для того, чтобы получить SMA, мне нужно пересчитывать все входящие в нее бары? Если так, то это проблема с логикой MQL - по умолчанию, "интуитивно" - так быть не должно. По крайней мере, моя интуиция это не просекла :) - я был так уверен, что SMA от цены никогда не будет нулем...
 
То есть, для того, чтобы получить SMA, мне нужно пересчитывать все входящие в нее бары? Если так, то это проблема с логикой MQL - по умолчанию, "интуитивно" - так быть не должно. По крайней мере, моя интуиция это не просекла :) - я был так уверен, что SMA от цены никогда не будет нулем...

Моя логика подсказывает, что МТ4 плохо считает среднее SMA за N периодов, для первых N-1 баров, оно понятно, что данные не полные, но вот в качестве результата - 0, это имхо баг.
 
Моя логика подсказывает, что МТ4 плохо считает среднее SMA за N периодов, для первых N-1 баров, оно понятно, что данные не полные, но вот в качестве результата - 0, это имхо баг.

это не баг. для первх N-1 баров среднее(кроме экспоненциальной) вообще не считается.
 
В вышеприведенном коде, я использую SetIndexDrawBegin(0, nMa); Это должно решить проблему с неотображаемыми N-1 барами - они просто не рисуются. Да и нули возникали (до того, как я скорректировал код предложенным Евгением образом), при рассчете последних баров. Странно все это. Фишка предложенного Евгением подхода - если число баров, подлежащих отрисовке меньше, чем период МА, то увеличить это число принудительно. При этом, если этого не сделать, то ошибки были не только на первых барах. А на самом деле, SMA должно считаться корректно, независимо от того, сколько баров мы обновляем. ИМХО.
 
ошибки были не только на первых барах.

Я проводил протоколирование рассчитываемых баров, при возникновении деления на 0, код переставал выполнятся, а при следующем запуске IndicatorCounted() говорил, что все бары рассчитаны, несмотря на то, что расчет прервался буквально на первых барах.