Индикаторы подвешивают терминал.

 
Каждый раз при запуске терминала, он зависает на 1-2мин. видимо это время уходит на обновление графиков и пересчет индикаторов, в терминале открыть порядка 30 окон с графиками валют, но всеж это как-то странно на машине с топовым процем и 2 гигами оперативки, МТ4 вытворяет с системой иногда такое что не подсилу даже самым требовательным к ресурсам играм. :)
раздражает в основном что терминал умирает во время пересчета индикаторов вместо того чтобы делать это в фоновом режиме, а если еще и загрузить индикаторы расчет которых займет несколько минут, то МТ4 вообще может повесить всю систему (на WinXP у меня такое случалось.) мне кажется это очень неудобно гораздо лучше было-бы сделать пересчет большого числа индикаторов в фоновом режиме чтобы при этом не умирал терминал, а если расчет загруженного на график индикатора может занять оч. много времени пользователю выводилось бы сообщение что мол расчет индикатора может занять от года до двух и мол ждать бесполезно, и т.п. очень неприятно постоянно мочить процесс "teminal.exe" в диспетчере задач после нескольких минут ожидания пока МТ4 вернется к жизни, а вдруг такие манипуляции приведут к потере сохраненных ранее данных. :((
 
например вот эти индикаторы вешают терминал напрочь, хотя вроде рабочие :-\

#property  copyright "ANG3110@latchess.com"
//----------------at_DItpm3-------------------------
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 SkyBlue
#property indicator_color2 Silver
//----------------------------------
extern double hr=4;
extern int s=10;
extern int Days=11;
//----------------------------------
double ci[],bi[],at[],a0[];
int pt,cb;
//================================================
int init(){
   IndicatorBuffers(4);
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,at);
   SetIndexBuffer(1,a0);
   SetIndexBuffer(2,ci);
   SetIndexBuffer(3,bi);
pt=hr*60/Period();
cb=MathFloor(Days*1440/Period()/pt)*pt;   
   return(0);}
//================================================
int start() {
int cbi,aa,bb,cc;
//----------------------------
cbi=Bars-IndicatorCounted()-2;
if (cbi>=0) {
//------------------------
for (int m=0; m<=s; m++) {
for (int i=0; i<=cb; i=i+pt) {
if (m==0) {
ci[i+pt]=(Close[i]+Close[i+pt]+Close[i+2*pt])/3; 
ci[0]=Close[0]; ci[cb+2*pt]=Close[cb+2*pt]; }
if (m>0 && m<s) {
bi[i+pt]=(ci[i]+ci[i+pt]+ci[i+2*pt])/3; 
bi[0]=(ci[0]+ci[pt])/2;  
bi[cb+2*pt]=ci[cb+2*pt];
if (i==cb) ArrayCopy(ci,bi,0,0,cb+2*pt);}
if (m==s) { aa=i; bb=i+pt; cc=i+2*pt;
for (int n=i; n<=cc; n++)  {
ci[n]=ci[aa]*((n-bb)*(n-cc))/((aa-bb)*(aa-cc))
+ci[bb]*((n-aa)*(n-cc))/((bb-aa)*(bb-cc))
+ci[cc]*((n-aa)*(n-bb))/((cc-aa)*(cc-bb));}
}}}
for (i=cb; i>=0; i--) {
at[i]=ci[i]-ci[i+pt]; 
a0[i]=0.00000001;}
}
//-----------------------
return(0);
  }
//+------------------------------------------------------------------+



и второй

#property  copyright "ANG3110@latchess.com"
//----------------at_Itpm3-------------------------
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//----------------------------------
extern double hours=2;
extern int s=10;
extern int Days=11;
//----------------------------------
double ci[],bi[];
int pt,cb,bar;
//================================================
int init(){
   IndicatorBuffers(2);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ci);
   SetIndexBuffer(1,bi);
pt=hours*60/Period();
cb=MathFloor(Days*1440/Period()/pt)*pt;   
   return(0);}
//================================================
int start() {
int cbi,aa,bb,cc;
//----------------------------
cbi=Bars-IndicatorCounted()-2;
if (cbi>=0) {
//------------------------
for (int m=0; m<=s; m++) {
for (int i=0; i<=cb; i=i+pt) {
if (m==0) {
ci[i+pt]=(Close[i]+Close[i+pt]+Close[i+2*pt])/3; 
ci[0]=Close[0]; ci[cb+2*pt]=Close[cb+2*pt]; }
if (m>0 && m<s) {
bi[i+pt]=(ci[i]+ci[i+pt]+ci[i+2*pt])/3; 
bi[0]=(ci[0]+ci[pt])/2;  
bi[cb+2*pt]=ci[cb+2*pt];
if (i==cb) ArrayCopy(ci,bi,0,0,cb+2*pt);}
if (m==s) { aa=i; bb=i+pt; cc=i+2*pt;
for (int n=i; n<=cc; n++)  {
ci[n]=ci[aa]*((n-bb)*(n-cc))/((aa-bb)*(aa-cc))
+ci[bb]*((n-aa)*(n-cc))/((bb-aa)*(bb-cc))
+ci[cc]*((n-aa)*(n-bb))/((cc-aa)*(cc-bb));}
}}}
}
//-----------------------
return(0);}
//+------------------------------------------------------------------+
 
А Вы не задумываетесь над стоимостью тройного вложенного цикла, да еще и с массовым копированием массивов внутри?

Всегда есть возможность реализовать алгоритм в 10-100-1000 раз быстрее. Особенно в данном случае. При подходе "массовые расчеты проводим в лоб" никакого процессора не хватит.

Общий совет: проведите алгоритмическую оптимизацию и получите огромный выигрыш в скорости. Этот совет не означает автоматического вопроса "покажите как".
 
А Вы не задумываетесь над стоимостью тройного вложенного цикла, да еще и с массовым копированием массивов внутри?

Всегда есть возможность реализовать алгоритм в 10-100-1000 раз быстрее. Особенно в данном случае. При подходе "массовые расчеты проводим в лоб" никакого процессора не хватит.

Общий совет: проведите алгоритмическую оптимизацию и получите огромный выигрыш в скорости. Этот совет не означает автоматического вопроса "покажите как".


Ренат индюки компилируются, и вцелом нормально отображаются на графике, я их не писал я ими пользуюсь, проблема мне кажется в том что терминал тупо виснет когда пересчитывает индикаторы или запускается, вы же специалисты высокого уровня, вы же понимаете что я пытаюсь вам предложить, организовать такие расчеты в фоновом режиме, чтобы терминал не зависал.
у меня открыто более 30 графиков, на каждом с общего шаблона по 9 польз. индикаторов при запуске МТ4 с этим хозяйством зависает на 1-2мин. а при смене ТФ на одном из графиков на 20-30 сек. иногда такие зависания приводят к тому что терминал так и не заканчивает свои расчеты и виснет окончательно. приходится завершать процесс принудительно, ну разве сложно сделать чтобы он не вис а постепенно выводил индикаторы на графики по мере расчета чтобы окно терминала можно было в это время или свернуть или закрыть а то умирает просто и все.
 
У меня были похожие проблемы.
Просто добавь вызов ф-ции Sleep(1) внутрь каждого цикла, это разгрузит терминал.
 
у меня тоже терминал виснет при запуске, и я тоже подумал уже о предложении ShadowTrader
 
Тогда надо задать вопрос автору кода. А так как не Вы его автор, то я выскажу свое мнение более конкретно - это очень и очень плохой код, который нужно полностью переписать.

Терминал тут не виноват. Такой код кого угодно убъет.
Причина обращения: