On Timer a Start ?

O jezykach programowania w platformach i nie tylko.
pim
Gaduła
Gaduła
Posty: 97
Rejestracja: 19 lut 2015, 09:52

On Timer a Start ?

Nieprzeczytany post autor: pim »

Witam.

Mam taki mały problem z popularnym wskaźnikiem BetterVolume 1.4.
Mianowicie liczy całość w sekcji Start() co każdy tick mocno obciążając CPU.

Przerobiłem go tak że dodałem sekcję OnTimer() w której co 10 sekund uruchamia się funkcja licz(). Wszystko co było w Start() przeniosłem do licz() tak że obliczenia są robione co 10 sekund i wszystko jest ok ale po naniesieniu na wykres wskaźnik czeka te 10 sekund zanim naniesie wartości.
Dodałem do sekcji OnInit() aby od razu wykonał pierwszy raz funkcję licz() a i tak indykator najpierw ma zwłokę 10 sekund a dopiero rysuje wartości.
Jak to poprawić aby na starcie policzył raz a potem co ileś tam sekund ?

Kod: Zaznacz cały

#property copyright ""
#property link      ""

#property indicator_separate_window
#property indicator_buffers 7
#property indicator_color1 Red
#property indicator_color2 DeepSkyBlue
#property indicator_color3 Orange
#property indicator_color4 Green
#property indicator_color5 Indigo
#property indicator_color6 Magenta
#property indicator_color7 Maroon

#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 2
#property indicator_width6 2






extern int     M1_bars = 7000;
extern int     M5_bars = 2500;
extern int     M15_bars = 2000;
extern int     M30_bars = 600;
extern int     H1_bars = 500;
extern int     H4_bars = 200;
extern int     D1_bars = 100;
extern int     W1_bars = 50;
extern int     MO_bars = 20;

int NumberOfBars; 
extern string  Note = "0 means Display all bars";
extern int     MAPeriod = 100;
extern int     LookBack = 20;


double red[],blue[],yellow[],green[],white[],magenta[],v4[];



#define seconds 10






//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  
  
  /// set timer
{

EventSetTimer(seconds ) ;



}
  
  
//---- indicators
      SetIndexBuffer(0,red);
      SetIndexStyle(0,DRAW_HISTOGRAM);
      SetIndexLabel(0,"Climax High ");
      
      SetIndexBuffer(1,blue);
      SetIndexStyle(1,DRAW_HISTOGRAM);
      SetIndexLabel(1,"Neutral");
      
      SetIndexBuffer(2,yellow);
      SetIndexStyle(2,DRAW_HISTOGRAM);
      SetIndexLabel(2,"Low ");
      
      SetIndexBuffer(3,green);
      SetIndexStyle(3,DRAW_HISTOGRAM);
      SetIndexLabel(3,"HighChurn ");
      
      SetIndexBuffer(4,white);
      SetIndexStyle(4,DRAW_HISTOGRAM);
      SetIndexLabel(4,"Climax Low ");
      
      SetIndexBuffer(5,magenta);
      SetIndexStyle(5,DRAW_HISTOGRAM);
      SetIndexLabel(5,"ClimaxChurn ");
      
      SetIndexBuffer(6,v4);
      SetIndexStyle(6,DRAW_LINE,0,2);
      SetIndexLabel(6,"Average("+MAPeriod+")");
      
      IndicatorShortName("Better Volume 1.4" );
      
      
     switch(Period())
{
  case 1: NumberOfBars=M1_bars; break;
  case 5: NumberOfBars= M5_bars; break;
  case 15: NumberOfBars=M15_bars; break;
  case 30: NumberOfBars=M30_bars; break;
  case 60: NumberOfBars=H1_bars; break;
  case 240: NumberOfBars=H4_bars; break;
  case 1440: NumberOfBars=D1_bars; break;
  case 10080: NumberOfBars=W1_bars; break;
  case 43200: NumberOfBars=MO_bars; break;
    
}
      
 licz();     


//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
  
  
void OnTimer()
{


licz();


}  
  
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    
         
   return(0);   }
//----
   
//----
   
//+------------------------------------------------------------------+
 
 
 
 // funkcje
 
 void licz()
 
 {
   double VolLowest,Range,Value2,Value3,HiValue2,HiValue3,LoValue3,tempv2,tempv3,tempv;
   int limit;
   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   if ( NumberOfBars == 0 ) 
      NumberOfBars = Bars-counted_bars;
   limit=NumberOfBars; //Bars-counted_bars;
   
Print ("bars   = " + NumberOfBars);
      
   for(int i=0; i<limit; i++)   
      {
         red[i] = 0; blue[i] = Volume[i]; yellow[i] = 0; green[i] = 0; white[i] = 0; magenta[i] = 0;
         Value2=0;Value3=0;HiValue2=0;HiValue3=0;LoValue3=99999999;tempv2=0;tempv3=0;tempv=0;
         
         
         VolLowest = Volume[iLowest(NULL,0,MODE_VOLUME,20,i)];
         if (Volume[i] == VolLowest)
            {
               yellow[i] = NormalizeDouble(Volume[i],0);
               blue[i]=0;
            }
               
         Range = (High[i]-Low[i]);
         Value2 = Volume[i]*Range;
         
         if (  Range != 0 )
            Value3 = Volume[i]/Range;
            
         
         for ( int n=i;n<i+MAPeriod;n++ )
            {
               tempv= Volume[n] + tempv; 
            } 
          v4[i] = NormalizeDouble(tempv/MAPeriod,0);
         
          
          for ( n=i;n<i+LookBack;n++)
            {
               tempv2 = Volume[n]*((High[n]-Low[n])); 
               if ( tempv2 >= HiValue2 )
                  HiValue2 = tempv2;
                    
               if ( Volume[n]*((High[n]-Low[n])) != 0 )
                  {           
                     tempv3 = Volume[n] / ((High[n]-Low[n]));
                     if ( tempv3 > HiValue3 ) 
                        HiValue3 = tempv3; 
                     if ( tempv3 < LoValue3 )
                        LoValue3 = tempv3;
                  } 
            }
                                      
          if ( Value2 == HiValue2  && Close[i] > (High[i] + Low[i]) / 2 )
            {
               red[i] = NormalizeDouble(Volume[i],0);
               blue[i]=0;
               yellow[i]=0;
            }   
            
          if ( Value3 == HiValue3 )
            {
               green[i] = NormalizeDouble(Volume[i],0);                
               blue[i] =0;
               yellow[i]=0;
               red[i]=0;
            }
          if ( Value2 == HiValue2 && Value3 == HiValue3 )
            {
               magenta[i] = NormalizeDouble(Volume[i],0);
               blue[i]=0;
               red[i]=0;
               green[i]=0;
               yellow[i]=0;
            } 
         if ( Value2 == HiValue2  && Close[i] <= (High[i] + Low[i]) / 2 )
            {
               white[i] = NormalizeDouble(Volume[i],0);
               magenta[i]=0;
               blue[i]=0;
               red[i]=0;
               green[i]=0;
               yellow[i]=0;
            } 
 }
 
 
 } // end licz
         

TesterForex
Stały bywalec
Stały bywalec
Posty: 43
Rejestracja: 22 gru 2016, 12:45

Re: On Timer a Start ?

Nieprzeczytany post autor: TesterForex »

Pewnie już do tego doszedłeś, ale tu:

Kod: Zaznacz cały

  /// set timer
{

EventSetTimer(seconds ) ;



}
te klamry nie są potrzebne. A w kwestii odpalenia funkcji "licz()" wraz z uruchomieniem EA, to powinieneś ją wywołać wewnątrz init() przed

Kod: Zaznacz cały

EventSetTimer(seconds ) ;
Współautor interaktywnego kursu MQL4 dla serwisu fxwatch

pim
Gaduła
Gaduła
Posty: 97
Rejestracja: 19 lut 2015, 09:52

Re: On Timer a Start ?

Nieprzeczytany post autor: pim »

dzięki :-) już o tym zapomniałem i używałem po staremu, sprawdze i zobacze

ODPOWIEDZ