Как правильно?

 
Уважаемые сотрудники Меты, а также просто знающие люди! У меня вопрос по правильному созданию индикаторов. Итак, код:
nExtCountedBars = IndicatorCounted();
if(nExtCountedBars < 0) 
	return(-1);

// last counted bar will be recounted
if(nExtCountedBars > 0) 
	nExtCountedBars--;
		
int nPos = Bars - nExtCountedBars;

while(nPos > 0)
{
	...
	arrBuffer[nPos] = ...



Вопросы:

1. Как правильно:
int nPos = Bars - nExtCountedBars;
или
int nPos = Bars - nExtCountedBars - 1;

2. Как правильно:

while(nPos > 0)
или
while(nPos >= 0)

3. Как правильно:
arrBuffer[nPos] = ...
или
arrBuffer[nPos +- 1] = ...

Другими словами, записывать ли данные в 0-ю ячейку индикатора, или в 1-ю, соответственно, из эксперта, (опять же, поправьте, если я не прав) вызываем iCustom(..., 0) или iCustom(..., 1), соответственно.

С уважением,
Кварк

 
Я делаю так:
	int counted_bars=IndicatorCounted();
	if ( counted_bars < 0 ) { Print( "Indicator Error (Counted bars < 0)!" ); return(-1); }
	if ( Bars < MAperiod ) { Print( "Indicator Error (Bars < " + MAperiod + ")!" ); return(-1); }
// MAperiod - глубина истории, необходимая для расчета индикатора.

   int limit = Bars - MAperiod - 1;
   if ( counted_bars > MAperiod ) { limit = Bars - counted_bars - 1; }

	for ( int i = limit; i >= 0; i -- )
	{



Итого:
1. int nPos = Bars - nExtCountedBars - 1;
2. while(nPos >= 0)
3. arrBuffer[nPos] = ...


Хотя с IndicatorCounted() я сам не полностью разобрался - индикаторы не моя стихия ;)

 
1. Как правильно:
int nPos = Bars - nExtCountedBars;
или
int nPos = Bars - nExtCountedBars - 1;

2. Как правильно:

while(nPos > 0)
или
while(nPos >= 0)

3. Как правильно:
arrBuffer[nPos] = ...
или
arrBuffer[nPos +- 1] = ...

Другими словами, записывать ли данные в 0-ю ячейку индикатора, или в 1-ю, соответственно, из эксперта, (опять же, поправьте, если я не прав) вызываем iCustom(..., 0) или iCustom(..., 1), соответственно.

По моим представлениям комбинация
int nPos = Bars - nExtCountedBars - 1;
while(nPos > 0)
будет обсчитывать только свежезакончившийся бар. Для обсчёта тиков, следовательно нужно
int nPos = Bars - nExtCountedBars - 1;
while(nPos >= 0)
Следовательно int nPos = Bars - nExtCountedBars; - не есть хорошо.
arrBuffer[nPos] = ... имеет то преимущество, что номер ячейки индикатора будет совпадать с номером бара. Если, конечно, нет цели специально его сдвинуть.
С другой стороны, рабочих вариантов кода можно добиться с любым из Ваших вариантов конструкций, взятым по отдельности, соответствующим образом подстраивая индексы :)
 
int limit = Bars - MAperiod - 1;
if ( counted_bars > MAperiod ) { limit = Bars - counted_bars - 1; }


при таком коде у тебя не пересчитывается текущий бар, т.к. лимит < 0

правильный код:

nExtCountedBars = IndicatorCounted();
if(nExtCountedBars < 0) 
	return(-1);

// last counted bar will be recounted
if(nExtCountedBars > 0) 
	nExtCountedBars--;
		
int nPos = Bars - nExtCountedBars;

while(nPos >= 0)
{
	...
	arrBuffer[nPos] = ...



на каждом тике будет считать бары 1 и 0

 
int limit = Bars - MAperiod - 1;
if ( counted_bars > MAperiod ) { limit = Bars - counted_bars - 1; }

при таком коде у тебя не пересчитывается текущий бар, т.к. лимит < 0
Вообще у меня "-1" не было =)
Но когда начал писать ответ, задумался - не лишний ли бар считаем? Получается, что не лишний ;)
Причина обращения: