вопрос к программмерам

 

Здравствуйте!

есть индикатор DSS Bressert, который строит кривую наподобие стохастика. его код (основной алгоритм):

extern int EMA_period=8;
extern int Stochastic_period=13;

double DssBuffer[];
double MitBuffer[];
double DssBuffer_UP[];
double DssBuffer_DW[];

double smooth_coefficient;

init()

{

smooth_coefficient = 2.0 / (1.0 + EMA_period);

}

//----------------------------------------------------

int start()
{
int i, limit, counted_bars=IndicatorCounted(), Bar_OK;
if (counted_bars == 0) limit = Bars - Stochastic_period;
if (counted_bars > 0) limit = Bars - counted_bars;

double HighRange, LowRange;
double delta, MIT;
for (i = limit; i >= 0; i--)
{
HighRange = High[iHighest(NULL,0,MODE_HIGH,Stochastic_period,i)];
LowRange = Low[iLowest(NULL,0,MODE_LOW,Stochastic_period,i)];
delta = Close[i] - LowRange;
MIT = delta/(HighRange - LowRange)*100.0;
MitBuffer[i] = smooth_coefficient * (MIT - MitBuffer[i+1]) + MitBuffer[i+1];
}

double DSS;
for (i = limit; i >= 0; i--)
{
HighRange = MitBuffer[ArrayMaximum(MitBuffer, Stochastic_period, i)];
LowRange = MitBuffer[ArrayMinimum(MitBuffer, Stochastic_period, i)];
delta = MitBuffer[i] - LowRange;
DSS = delta/(HighRange - LowRange)*100.0;
DssBuffer[i] = smooth_coefficient * (DSS - DssBuffer[i+1]) + DssBuffer[i+1];
}


после этого данные из DssBufferа раскидываются на 2 массива, один для long значений, другой для short и рисуются точками на чарте.

нужно вычислить несколько его последних значений, однако не через iCustom(), а в виде отдельной ф-ции.

в итоге, точно копируя эти 2 цикла в ф-цию советника, происходит странная вещь - на выделенной строке расчеты останавливаются и не возвращается никакого значения (проверял пошагово с выводом каждой строки в alert), кто может подсказать в чем тут дело?

что ни пробовал, ничего не помогает ...

 
для чего в советнике цикл от этого индикатора, сделайте функцию расчета значения индикатора для одного бара, и вычисляйте значение индикатора, на нужном баре, по средствам вызова этой функции, с передачей в параметры функции номера бара.
 

это пробовал тоже ... как уже сказал, не помогает. выполнение останавливается на той же самой строке

надо получить 2 последних значения, для текущего и предыдущего баров, однако

1) цикл вычисляется наоборот (от большего бара к меньшему) и

2) как я понял для вычисления должно быть минимум 13 баров, поскольку среди них в первом цикле надо найти iHighest

 
не надо рассчитывать все значения индикатора на данном чарте(тем болеев советнике), рассчитайте значения индикатора только для последнего бара, для этого уберите цикл и то что в цикле выведите в отдельную функцию(типа того), а переменную "i" выведите в параметры функции
 

каким образом если в строке

MitBuffer[i] = smooth_coefficient * (MIT - MitBuffer[i+1]) + MitBuffer[i+1];

и в строке

DssBuffer[i] = smooth_coefficient * (DSS - DssBuffer[i+1]) + DssBuffer[i+1];

надо высчитать значение используя следующий элемент по массиву, которое можно получить только если использовать цикл???

 
mike3900:

каким образом если в строке

MitBuffer[i] = smooth_coefficient * (MIT - MitBuffer[i+1]) + MitBuffer[i+1];

и в строке

DssBuffer[i] = smooth_coefficient * (DSS - DssBuffer[i+1]) + DssBuffer[i+1];

надо высчитать значение используя следующий элемент по массиву, которое можно получить только если использовать цикл???

как-то же в начале чарта индикатор начинает рисоватся
 

не знаю если только дробить первый цикл на 2 функции чтобы в конце прибавить след значение MitBuffer для следующего бара?

и потом точно также делать для DssBuffer?

гемор однако

 
sanyooooook:
как-то же в начале чарта индикатор начинает рисоватся

да то, что он там рисует на нулевом баре еще пока никто не видел)))
 
mike3900:

да то, что он там рисует на нулевом баре еще пока никто не видел)))
тогда действительно все нужно начинать со самого старого бара, или представить что на графике всего 2 бара
 
ну так что неужели никаких других идей нет почему цикл не выполняется до конца?
 
Проверьте на деление на ноль.