Может кто-нибудбь подробно объснить что просходит?

 

Смысл в том что на нулевом баре я ищу при какой цене значение RSI будет, наприме 50. Вот что я делаю:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Green
double ExtBuffer[];
int init()
{IndicatorBuffers(1);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtBuffer);
return(0);
}
int start()
{
int i;
ArrayCopySeries(ExtBuffer,MODE_CLOSE,Symbol(),Period());
ArraySetAsSeries(ExtBuffer,true);
while(iRSIOnArray(ExtBuffer,0,3,0)>50)ExtBuffer[0]=ExtBuffer[0]-Point;
}

В итоге терминал зависает, я никак не могу понять что происходит и как мне решить задачу.

 

Бесконечный цикл while.

 
я никогда  while использую, только for, в принципе с for можно сделать все что и с while
 
Ага, только for ограничен по количеству циклов. Хотя то же можно сделать бесконечное количество. В зависимости от условий. Например for(int i=0;true;i+) {....} Будет работать бесконечно. Дело только в понимании своих действий.
 

artem, попробуй делать проверку значения RSI просто по приходу нового тика, без цикла. Можно оставить все так же как было, в функции start(), но цикл просто убрать, а вместо него поставить одиночный if.

 

Разумеется, всё можно и на while делать, не применяя for. Это дело удобства и вкуса.

 
только что сделал так, чтоб посмотреть а что вообще вычиляется и оказалось, что значение RSI вообще не меняется!!!!!


for (i = 1; i<=20; i++)
{
Print("iRSIOnArray(ExtBuffer,0,3,0) "+ DoubleToStr(iRSIOnArray(ExtBuffer, 0,3,0), 4) +" ExtBuffer[0] - " + DoubleToStr(ExtBuffer[0], 4)+" "+i);
ExtBuffer[0]=ExtBuffer[0]-10*Point;
}


КАК ЭТО??????

Может кто-то из разработчиков скажет в чем прикол?

 
Кстати это не первый случай когда я заметил эту проблему. Складывается такое впечатление, что раз вычислившись индикатор тупо не перевычисляется!!!, если нет нового тика а все изменения массивов происходят внутри тела start
 
Вопрос к stringo. Он то и получается бесконечным, так как значение iRSIOnArray не меняется,  а так ведь в коде все правильно...
 
Как написано в српавке по ArrayCopySeries:

Реального распределения памяти под массив данных и копирования не происходит. При обращении к такому массиву производится перенаправление доступа. Исключение составляют массивы, назначенные в качестве индексных в пользовательских индикаторах. В этом случае производится реальное копирование данных.
Поэтому попытки изменить значение любого элемента такого массива аналогично попыткам сдвинуть что-либо в голографическом изоюбражении. Вроде трехмерно, а зацепиться не за что. Я так понимаю :)
 
Да, но ведь тут ExtBuffer назначается индексом, так что с изменением данных все нормально. И на Print -   ExtBuffer[0] видно что меняется. Не меняется именно результат iRSIOnArrary
Причина обращения: