Обновление индикатора

 
Скачал 200 билд (до этого был 196)
И индикатор перестал обновляться.
Раньше были зависания на нем редко, но решалось все нажатием в контекстном меню кнопки обновить.
Сейчас он считается только на момент загрузки МТ и больше не обновляется.
Обновить не помогает.
Подскажите варианты решения проблемы или где что-нить почитать.
 
А правда, неужели никто не поможет! :)))))))
Я тоже спрошу, вот у меня перестал работать эксперт, никто не знает почему? :)))
 
Прилагаю индикатор.
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Green
#property indicator_color2 Navy
#property indicator_color3 Red
#property indicator_color4 Black
#property indicator_color5 Maroon
//---- buffers
double USD[];
double EUR[];
double GBP[];
double CHF[];
double JPY[];
extern int per1=14;
extern int D=3;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorShortName("USD:Зеленый; EUR:Синий; GBP:Красный; CHF:Черный; JPY:Коричневый");
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,USD);
SetIndexLabel(0, "USD");
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,EUR);
SetIndexLabel(1, "EUR");
SetIndexStyle(2,DRAW_LINE);
SetIndexBuffer(2,GBP);
SetIndexLabel(2, "GBP");
SetIndexStyle(3,DRAW_LINE);
SetIndexBuffer(3,CHF);
SetIndexLabel(3, "CHF");
SetIndexStyle(4,DRAW_LINE);
SetIndexBuffer(4,JPY);
SetIndexLabel(4, "JPY");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int limit;
int counted_bars=IndicatorCounted();
//---- проверка на возможные ошибки
if(counted_bars<0) return(-1);
//---- последний посчитанный бар будет пересчитан
if(counted_bars>0) counted_bars-=10;
if (Bars<300) limit=Bars-counted_bars;
else limit=300-counted_bars;
//---- основной цикл
int Price=6;
int Mode=3;
//int per1=13;
//int per2=5;
for(int i=0; i<limit; i++)
{
USD[i]=
(iMA("EURUSD",0,per1,0,Mode,Price,i+D)-
iMA("EURUSD",0,per1,0,Mode,Price,i))*10000
+
(iMA("GBPUSD",0,per1,0,Mode,Price,i+D)-
iMA("GBPUSD",0,per1,0,Mode,Price,i))*10000
+
(iMA("USDCHF",0,per1,0,Mode,Price,i)-
iMA("USDCHF",0,per1,0,Mode,Price,i+D))*10000
+
(iMA("USDJPY",0,per1,0,Mode,Price,i)-
iMA("USDJPY",0,per1,0,Mode,Price,i+D))*100
;
EUR[i]=
(iMA("EURUSD",0,per1,0,Mode,Price,i)-
iMA("EURUSD",0,per1,0,Mode,Price,i+D))*10000
+
(iMA("EURGBP",0,per1,0,Mode,Price,i)-
iMA("EURGBP",0,per1,0,Mode,Price,i+D))*10000
+
(iMA("EURCHF",0,per1,0,Mode,Price,i)-
iMA("EURCHF",0,per1,0,Mode,Price,i+D))*10000
+
(iMA("EURJPY",0,per1,0,Mode,Price,i)-
iMA("EURJPY",0,per1,0,Mode,Price,i+D))*100
;
GBP[i]=
(iMA("GBPUSD",0,per1,0,Mode,Price,i)-
iMA("GBPUSD",0,per1,0,Mode,Price,i+D))*10000
+
(iMA("EURGBP",0,per1,0,Mode,Price,i+D)-
iMA("EURGBP",0,per1,0,Mode,Price,i))*10000
+
(iMA("GBPCHF",0,per1,0,Mode,Price,i)-
iMA("GBPCHF",0,per1,0,Mode,Price,i+D))*10000
+
(iMA("GBPJPY",0,per1,0,Mode,Price,i)-
iMA("GBPJPY",0,per1,0,Mode,Price,i+D))*100
;
CHF[i]=
(iMA("USDCHF",0,per1,0,Mode,Price,i+D)-
iMA("USDCHF",0,per1,0,Mode,Price,i))*10000
+
(iMA("EURCHF",0,per1,0,Mode,Price,i+D)-
iMA("EURCHF",0,per1,0,Mode,Price,i))*10000
+
(iMA("GBPCHF",0,per1,0,Mode,Price,i+D)-
iMA("GBPCHF",0,per1,0,Mode,Price,i))*10000
+
(iMA("CHFJPY",0,per1,0,Mode,Price,i)-
iMA("CHFJPY",0,per1,0,Mode,Price,i+D))*100
;
JPY[i]=
(iMA("USDJPY",0,per1,0,Mode,Price,i+D)-
iMA("USDJPY",0,per1,0,Mode,Price,i))*100
+
(iMA("EURJPY",0,per1,0,Mode,Price,i+D)-
iMA("EURJPY",0,per1,0,Mode,Price,i))*100
+
(iMA("GBPJPY",0,per1,0,Mode,Price,i+D)-
iMA("GBPJPY",0,per1,0,Mode,Price,i))*100
+
(iMA("CHFJPY",0,per1,0,Mode,Price,i+D)-
iMA("CHFJPY",0,per1,0,Mode,Price,i))*100
;
//double Summa=USD[i]+EUR[i]+GBP[i]+CHF[i]+JPY[i];
//Print("Summa: ",Summa);
}
//----
return(0);
}
 
if (Bars<300) limit=Bars-counted_bars;
else limit=300-counted_bars;


Если график содержит 300 или больше баров при втором и последующих запусках цикл

for(int i=0; i<limit; i++)


не будет выполняться ни разу (i >= limit c самого начала). То есть индикатор будет обновляться до тех пор, пока число баров на графике будет меньше 300.

P.S. Точнее 310 баров

 
if (Bars<300) limit=Bars-counted_bars;
else limit=300-counted_bars;


Если график содержит 300 или больше баров при втором и последующих запусках цикл

for(int i=0; i<limit; i++)


не будет выполняться ни разу (i >= limit c самого начала). То есть индикатор будет обновляться до тех пор, пока число баров на графике будет меньше 300.



Огромное спасибо за понимание индикатор не мой и сам я в программировании чуть-чуть.
Поэтому суть понял ,а как исправить нет.
Если виндикаторе снять 300 и поставить 1000, то моя машина встает колом.
Если растянуть график до 10 баров на экране обновления всеравно нет.
Может подскажете , что я непонял и что сделать.
 
Мне не хочется тратить время на попытку полностью понять замысел автора. Простейшее предположение - имелось в виду
if (Bars>300) limit=Bars-counted_bars;
else limit=300-counted_bars;


Но и тут что-то не так, поскольку при числе баров меньше 300 счётчик цикла может попадать в запрещённую область. Впрочем, возможно терминал это может терпеть.

 
Мне не хочется тратить время на попытку полностью понять замысел автора. Простейшее предположение - имелось в виду
if (Bars>300) limit=Bars-counted_bars;
else limit=300-counted_bars;


Но и тут что-то не так, поскольку при числе баров меньше 300 счётчик цикла может попадать в запрещённую область. Впрочем, возможно терминал это может терпеть.


Еше раз срасибо , что не бросаете меня в беде, значит уже друг.
Раньше (до 200 билда) при нажатии кнопки обновить индикатор обновлялся, а сейчас нет.
И пересчитывается один раз только при загрузке терминала
Может с "обновить" что-то.
И подскажите где запрещенная область в которой он всегда , а не может попадать.
Как разбирающийся человек скажите может есть смысл вставить строчку отрубающую эту область и все.
 
Если предположить, что автор просто хотел ограничить глубину расчёта величиной 300 баров, то по идее нужно без else
limit=Bars-counted_bars;
if (limit>300) limit=300;
 
Если предположить, что автор просто хотел ограничить глубину расчёта величиной 300 баров, то по идее нужно без else
limit=Bars-counted_bars;
if (limit>300) limit=300;



Очень счастлив спасибо за помощь.
Все работает.
 
Ну и ладушки :).