Терминал кушает много ОЗУ. - страница 2

 
grell:
В глобальных переменных чисто. Может как-то можно выгрузить часть памяти?


да никак - этим заведует винда - сколько процесс попросит столько она и выделит

попробуйте в индикаторах использовать меньшее количество буферов, попробуйте перейти на статический массив - т.е. ограничить размерностью

 
Так ведь расчет идет только по последнему бару (1 индикатор). Я уже этому индикатору урезал расчет. Вместо от лимит до 0 сделал от 2 до 0. На каждом тике переменные меняют значения, в буфера значения не складываются.
 
grell:
Так ведь расчет идет только по последнему бару (1 индикатор). Я уже этому индикатору урезал расчет. Вместо от лимит до 0 сделал от 2 до 0. На каждом тике переменные меняют значения, в буфера значения не складываются.


ну нам отсюда не видно :)

я про такие конструкции:

if (li_12 > Bars) li_12 = Bars;
ArrayResize(lda_16, li_12);
ArraySetAsSeries(lda_16, TRUE);
ArrayResize(lda_20, li_12);
ArraySetAsSeries(lda_20, TRUE);
может они и сьедают всю память при расчетах, а буфера это не то 

 
//+------------------------------------------------------------------+
//|                                                      Cluster.mq4 |
//|                      Copyright © 2010, MetaQuotes Software Corp. |
//|                                                dwgrell@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, MetaQuotes Software Corp."
#property link      "dwgrell@gmail.com"

#property indicator_chart_window
extern int       period=50;
extern color colorUp = Green;
extern color colorDown = Crimson;

int init()
  {
   ObjectCreate ("1", OBJ_LABEL, 0, 0, 0);// Создание объ.
   ObjectSet    ("1", OBJPROP_XDISTANCE, 10);      
   ObjectSet    ("1", OBJPROP_YDISTANCE, 10);
   ObjectSet    ("1", OBJPROP_CORNER, 0); //угол_вывода_ордеров
   
   ObjectCreate ("2", OBJ_LABEL, 0, 0, 0);// Создание объ.
   ObjectSet    ("2", OBJPROP_XDISTANCE, 10);      
   ObjectSet    ("2", OBJPROP_YDISTANCE, 10);
   ObjectSet    ("2", OBJPROP_CORNER, 0); //угол_вывода_ордеров
   
   ObjectCreate ("3", OBJ_LABEL, 0, 0, 0);// Создание объ.
   ObjectSet    ("3", OBJPROP_XDISTANCE, 10);      
   ObjectSet    ("3", OBJPROP_YDISTANCE, 10);
   ObjectSet    ("3", OBJPROP_CORNER, 0); //угол_вывода_ордеров
   
   ObjectCreate ("4", OBJ_LABEL, 0, 0, 0);// Создание объ.
   ObjectSet    ("4", OBJPROP_XDISTANCE, 10);      
   ObjectSet    ("4", OBJPROP_YDISTANCE, 10);
   ObjectSet    ("4", OBJPROP_CORNER, 0); //угол_вывода_ордеров
   
   return(0);
  }
int deinit()
  {
  ObjectDelete ("1");
  ObjectDelete ("2");
  ObjectDelete ("3");
  ObjectDelete ("4");
  return(0);
  }
int start()
  {
  ObjectSetText("1"," ",30,"Arial",colorUp); 
  ObjectSetText("2"," ",30,"Arial",colorUp); 
  ObjectSetText("3"," ",30,"Arial",colorUp); 
  ObjectSetText("4"," ",30,"Arial",colorUp); 

  int n=1;
  for(int i=1;i<=14;i++)
    {
    if(i==1){string symb="EURUSD";string ob="1";}
    if(i==2){symb="USDJPY";ob="2";}
    if(i==3){symb="USDCHF";ob="3";}
    if(i==4){symb="GBPUSD";ob="4";}
    if(i==5){symb="AUDUSD";ob="5";}
    if(i==6){symb="EURCHF";ob="6";}
    if(i==7){symb="EURGBP";ob="7";}
    if(i==8){symb="EURJPY";ob="8";}
    if(i==9){symb="NZDUSD";ob="9";}
    if(i==10){symb="USDX";ob="10";}
    if(i==11){symb="USDCAD";ob="11";}
    if(i==12){symb="AUDJPY";ob="12";}
    if(i==13){symb="CHFJPY";ob="13";}
    if(i==14){symb="USDSEK";ob="14";}
    double cu15=  iCustom(symb,15,"Supertrend_by_Grell",period,0,0);
    double cu30=  iCustom(symb,30,"Supertrend_by_Grell",period,0,0);
    double cu60=  iCustom(symb,60,"Supertrend_by_Grell",period,0,0);
    double cu240= iCustom(symb,240,"Supertrend_by_Grell",period,0,0);
    double cu1440=iCustom(symb,1440,"Supertrend_by_Grell",period,0,0);
    double cd15=  iCustom(symb,15,"Supertrend_by_Grell",period,1,0);
    double cd30=  iCustom(symb,30,"Supertrend_by_Grell",period,1,0);
    double cd60=  iCustom(symb,60,"Supertrend_by_Grell",period,1,0);
    double cd240= iCustom(symb,240,"Supertrend_by_Grell",period,1,0);
    double cd1440=iCustom(symb,1440,"Supertrend_by_Grell",period,1,0);
    if(cu15>0&&cu30>0&&cu60>0&&cu240>0&&cu1440>0)
      {
      ObjectSet    (ob, OBJPROP_YDISTANCE, n*(36)); 
      ObjectSetText(ob,"BUY  "+symb+" "+DoubleToStr((AccountFreeMargin()/1000),2),30,"Arial",colorUp); 
      n=n+1;
      }
    if(cd15>0&&cd30>0&&cd60>0&&cd240>0&&cd1440>0)
      {
      ObjectSet    (ob, OBJPROP_YDISTANCE, n*(36)); 
      ObjectSetText(ob,"SELL "+symb+" "+DoubleToStr((AccountFreeMargin()/1000),2),30,"Arial",colorDown); 
      n=n+1;
      }
   } 
   return(0);
  }
Сам индикатор, как уже писал, считает только 3 бара.
 

При каждом вызове iCustom с оригинальнвм набором значений параметров для него заводятся копии индикаторных буферов. На всю историю.


P.S. То есть каждый такой вызов эквивалентен добавлению нового экземпляра индикатора на график.


 
grell:
За полчаса набегает 1.5Г, висит всего один индикатор. Расчет ведется всего по 2 последним барам, но по 14 парам и на 5 ТФ.
В таких условиях лучше перенести код индюка в эксперт, а использовать буфера обмена - это непрофиссионально и очень неэффективно (требует миллион совершенно ненужных действий).
Только в этих условиях можно хоть что-то оптимизировать. Ну можно также баров уменьшить на графике и посмотреть как влияет.
 

Дык ведь речь об индикаторе, советник не нужен. Делал специально для ручной торговли.

 

Но ведь индикатор же не использует всю историю, он даже не знает сколько баров в истории (убрал расчет).

 
grell:

Дык ведь речь об индикаторе, советник не нужен. Делал специально для ручной торговли.

Но ведь индикатор же не использует всю историю, он даже не знает сколько баров в истории (убрал расчет).

Тогда нужно смотреть шото в коде индюка если нет iCustom. Например, частое изменение размерности массива или передача копии массива в фукцию заместо ссылки.
 
У iCustom расчет из 8 индикаторов (только последний бар). Может и там расчет урезать?
 
grell:
У iCustom расчет из 8 индикаторов (только последний бар). Может и там расчет урезать?
Дело не в расчёте, а в том что при каждом обращении память выделяется на всю катушку
Причина обращения: