Помогите оптимизировать индикатор - страница 2

 
Можно его еще облегчить, что бы еще и памяти меньше кушал
 

Что-то примерно так

//+------------------------------------------------------------------+
//|                                                    Gomez EMP.mq4 |
//|                   Copyright © 2010, Gomez Financial Engine, CEO. |
//|                                          fxprogrammer@rambler.ru |
//+------------------------------------------------------------------+
#property copyright "Gomez Financial Engine, CEO"
#property link      "fxprogrammer@rambler.ru"
//----
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DarkOrange
//---- input parameters
extern int BandPeriod = 20;
//---- buffers
double BandBuffer[];
double LnBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;

   IndicatorBuffers(2);
   

   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, BandBuffer);
   SetIndexDrawBegin(0, BandPeriod);

   if(BandPeriod <= 0) BandPeriod = 20;

   SetIndexBuffer(1, LnBuffer);
  
//---- name for DataWindow and indicator subwindow label
   short_name="Gomez Band(" + BandPeriod + ")";
   IndicatorShortName(short_name);
   SetIndexLabel(0, short_name);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Commodity Channel Index                                          |
//+------------------------------------------------------------------+
int start() {
   int i, k, counted_bars = IndicatorCounted();

   int limit1 = Bars - counted_bars;
   int limit2=limit1;
   if (limit1>1) {
      limit1=Bars-2;
      limit2=Bars-BandPeriod-2;
   }

   for (i = limit1;i>=0;i--) LnBuffer[i] = (Close[i]/Close[i+1]);
   for (i = limit2;i>=0;i--) {
      double Dev=iStdDevOnArray(LnBuffer, 0, BandPeriod, 0, MODE_SMA,i);
      double tmp=Close[i]/iMA(NULL, 0, BandPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
      BandBuffer[i] = (1.0-Dev)*(tmp - 1.0/tmp);
   }
   return(0);
  }
//+------------------------------------------------------------------+
 

Спасибо огромное. Так смотрится куда лучше. И код понятнее читается :)

Я и не знал, что стандартное отклонение уже реализовано в метатрейдере.

 

А в комплексный индикатор надо полностью дорабатывать.

Необходим контроль истории по всем нужным инструментам. Иначе деление на ноль

 
А не подвесит ли терминал сам по себе контроль истории на нескольких парах? Беглый взгляд показывает, что проблема весьма тяжелая.
 
Mathemat:
А не подвесит ли терминал сам по себе контроль истории на нескольких парах? Беглый взгляд показывает, что проблема весьма тяжелая.


По разному можно сделать.

А в данном случае нужно отказываться от кастомного индикатора. И это вполне возможно.

Контроль истории и отказ от кастомного позволят сократить нагрузку на процессор до минимума и избавиться от ошибок, (например деление на ноль)

 
Рабочий таймфрейм - часовки. Пересчет можно делать и раз в 5 минут...
 

Речь идет уже об этом, комплексном

//+------------------------------------------------------------------+
//|                                                 GomezHeatMap.mq4 |
//|                   Copyright © 2010, Gomez Financial Engine, CEO. |
//|                                          fxprogrammer@rambler.ru |
//+------------------------------------------------------------------+
#property copyright "Gomez Financial Engine, CEO"
#property link      "fxprogrammer@rambler.ru"

#property indicator_chart_window

// EMP band period
extern int bandPeriod = 20;

// price levels for color definition
extern double scaleLowNeutral = 5,
              scaleLowNeutralPlus = 10,
              scaleLowStrongMinus = 20,
              scaleLowStrongPlus = 30,
              scaleHighNeutral = 20,
              scaleHighNeutralPlus = 30,
              scaleHighStrongMinus = 50,
              scaleHighStrongPlus = 100;

// colors of the heat map
extern color signalBuyVeryStrong = SeaGreen,
             signalBuyStrongPlus = LimeGreen,
             signalBuyStrongMinus = DarkSeaGreen,
             signalBuyNeutralPlus = Yellow, 
             neutralColor = Yellow,
             signalSellNeutralPlus = Yellow,
             signalSellStrongMinus = LightPink,
             signalSellStrongPlus = FireBrick,
             signalSellVeryStrong = Red,             
             textColor = White;            

// pairs 
extern string pair1 = "USDJPY",
              pair2 = "USDCAD",
              pair3 = "USDCHF",
              pair4 = "EURCHF",
              pair5 = "EURUSD",
              pair6 = "GBPUSD",
              pair7 = "EURGBP",
              pair8 = "EURJPY", 
              pair9 = "AUDUSD", 
              pair10 = "NZDUSD";

// table struсture parameters
extern int fontSize = 15;
/*extern*/ int scaleX = 20,
           scaleY = 20,
           offsetX = 45,
           offsetY = 20,
           corner = 0, // correct parameters from 0 to 3
           symbolCode = 110; 

// calling arrays                         
int      period[]       = {  1,   5,   15,   30, 60,  240,1440,10080,43200}; // timeframes array for heat map 
string   periodString[] = {"M1","M5","M15","M30","H1","H4","D1"}, // timeframes array for header
     signalNameString[] = {"1","2","3","4","","","","","",""}; // pairs array 


//////////////////////////////////////////////////////////////////////
//
// init()          
//
//////////////////////////////////////////////////////////////////////
int init()
{
   // pairs array filling
   signalNameString[0] = pair1;
   signalNameString[1] = pair2;
   signalNameString[2] = pair3;
   signalNameString[3] = pair4;
   signalNameString[4] = pair5;
   signalNameString[5] = pair6;
   signalNameString[6] = pair7;
   signalNameString[7] = pair8;
   signalNameString[8] = pair9;
   signalNameString[9] = pair10;

   // scales normilizing
   scaleLowNeutral      = scaleLowNeutral       * 0.0001;
   scaleLowNeutralPlus  = scaleLowNeutralPlus   * 0.0001;
   scaleLowStrongMinus  = scaleLowStrongMinus   * 0.0001;
   scaleLowStrongPlus   = scaleLowStrongPlus    * 0.0001;
   scaleHighNeutral     = scaleHighNeutral      * 0.0001;
   scaleHighNeutralPlus = scaleHighNeutralPlus  * 0.0001;
   scaleHighStrongMinus = scaleHighStrongMinus  * 0.0001;
   scaleHighStrongPlus  = scaleHighStrongPlus   * 0.0001;    
 
   // the heat map
   for(int x=0;x<7;x++)
      for(int y=0;y<10;y++)
      {
         ObjectCreate("signal"+x+y,OBJ_LABEL,0,0,0,0,0);
         ObjectSet("signal"+x+y,OBJPROP_CORNER,corner);
         ObjectSet("signal"+x+y,OBJPROP_XDISTANCE,x*scaleX+offsetX);
         ObjectSet("signal"+x+y,OBJPROP_YDISTANCE,y*scaleY+20);
         ObjectSetText("signal"+x+y,CharToStr(symbolCode),fontSize,"Wingdings",textColor);
      }
  // timeframes names  
  for(x=0;x<7;x++)
  {
      ObjectCreate("textPeriod"+x,OBJ_LABEL,0,0,0,0,0);   
      ObjectSet("textPeriod"+x,OBJPROP_CORNER,corner); 
      ObjectSet("textPeriod"+x,OBJPROP_XDISTANCE,x*scaleX+offsetX);
      ObjectSet("textPeriod"+x,OBJPROP_YDISTANCE,offsetY-10);
      ObjectSetText("textPeriod"+x,periodString[x],8,"Tahoma",textColor);
  }
  // pairs names
  for(y=0;y<10;y++)
  {
      ObjectCreate("textSignal"+y,OBJ_LABEL,0,0,0,0,0);   
      ObjectSet("textSignal"+y,OBJPROP_CORNER,corner);
      ObjectSet("textSignal"+y,OBJPROP_XDISTANCE,offsetX-40);
      ObjectSet("textSignal"+y,OBJPROP_YDISTANCE,y*(scaleY)+offsetY+8);
      ObjectSetText("textSignal"+y,signalNameString[y],8,"Tahoma",textColor);      
  }
  
  return(0);
}
  
int start()
{
   for(int x=0;x<7;x++)
      for(int y=0;y<10;y++)
      {
         color clr = White;
         double emp = iCustom(signalNameString[y],period[x],"GomeztEMP (2)",bandPeriod,0,0);
         // color defenition
         if (x <= 3) 
           {
            if (emp >= scaleLowNeutral*(-1) && emp <= scaleLowNeutral) clr = neutralColor;
            
            if (emp > scaleLowNeutral && emp <= scaleLowNeutralPlus) clr = signalBuyNeutralPlus;
            if (emp > scaleLowNeutralPlus && emp <= scaleLowStrongMinus) clr = signalBuyStrongMinus;
            if (emp > scaleLowStrongMinus && emp <= scaleLowStrongPlus) clr = signalBuyStrongPlus;
            if (emp > scaleLowStrongPlus) clr = signalBuyVeryStrong;
           
            if (emp < scaleLowNeutral*(-1) && emp >= scaleLowNeutralPlus*(-1)) clr = signalSellNeutralPlus;
            if (emp < scaleLowNeutralPlus*(-1) && emp >= scaleLowStrongMinus*(-1)) clr = signalSellStrongMinus;
            if (emp < scaleLowStrongMinus*(-1) && emp >= scaleLowStrongPlus*(-1)) clr = signalSellStrongPlus;
            if (emp < scaleLowStrongPlus*(-1)) clr = signalSellVeryStrong;          
           } 
         else 
           {
            if (emp >= scaleHighNeutral*(-1) && emp <= scaleHighNeutral) clr = neutralColor;
            
            if (emp > scaleHighNeutral && emp <= scaleHighNeutralPlus) clr = signalBuyNeutralPlus;
            if (emp > scaleHighNeutralPlus && emp <= scaleHighStrongMinus) clr = signalBuyStrongMinus;
            if (emp > scaleHighStrongMinus && emp <= scaleHighStrongPlus) clr = signalBuyStrongPlus;
            if (emp > scaleHighStrongPlus) clr = signalBuyVeryStrong;
           
            if (emp < scaleHighNeutral*(-1) && emp >= scaleHighNeutralPlus*(-1)) clr = signalSellNeutralPlus;
            if (emp < scaleHighNeutralPlus*(-1) && emp >= scaleHighStrongMinus*(-1)) clr = signalSellStrongMinus;
            if (emp < scaleHighStrongMinus*(-1) && emp >= scaleHighStrongPlus*(-1)) clr = signalSellStrongPlus;
            if (emp < scaleHighStrongPlus*(-1)) clr = signalSellVeryStrong;             
           }
            // object setting
            ObjectSetText("signal"+x+y,CharToStr(symbolCode),fontSize,"Wingdings",clr);
      }

   return(0);
}

//////////////////////////////////////////////////////////////////////
//
//  deinit()                       
//
//////////////////////////////////////////////////////////////////////
int deinit()
{
   // deleting all objects 
   ObjectsDeleteAll();
   return(0);
}
 
Mathemat:
Рабочий таймфрейм - часовки. Пересчет можно делать и раз в 5 минут...



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

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

 
То есть вы предлагаете второй индикатор рассчитывать внутри первого? И тогда будет меньше загружаться процессор?
Причина обращения: