103 lines
2.9 KiB
MQL5
103 lines
2.9 KiB
MQL5
|
//+------------------------------------------------------------------+
|
||
|
//| ProjectName |
|
||
|
//| Copyright 2020, CompanyName |
|
||
|
//| http://www.companyname.net |
|
||
|
//+------------------------------------------------------------------+
|
||
|
#ifndef FRAMEWORK_TIMER_MQH
|
||
|
#define FRAMEWORK_TIMER_MQH
|
||
|
|
||
|
//+------------------------------------------------------------------+
|
||
|
//| |
|
||
|
//+------------------------------------------------------------------+
|
||
|
class timer_t : public disposable_obj
|
||
|
{
|
||
|
private:
|
||
|
int _interval_in_sec;
|
||
|
datetime _start;
|
||
|
string _timer_name;
|
||
|
public:
|
||
|
timer_t()
|
||
|
{
|
||
|
reset();
|
||
|
}
|
||
|
|
||
|
void reset()
|
||
|
{
|
||
|
_start = layer::time_current();
|
||
|
}
|
||
|
|
||
|
void set_zero()
|
||
|
{
|
||
|
_start = _start - _interval_in_sec;
|
||
|
}
|
||
|
|
||
|
bool is_elapsed()
|
||
|
{
|
||
|
return get_distance() >= _interval_in_sec;
|
||
|
}
|
||
|
|
||
|
int get_distance()
|
||
|
{
|
||
|
return time_get_distance_in_sec(layer::time_current(), _start);
|
||
|
}
|
||
|
|
||
|
datetime ent_time()
|
||
|
{
|
||
|
return _start + _interval_in_sec;
|
||
|
}
|
||
|
|
||
|
static timer_t *create(int interval_in_sec, const string name="")
|
||
|
{
|
||
|
return timer_t::create(layer::time_current(), interval_in_sec, name);
|
||
|
}
|
||
|
|
||
|
static timer_t *create(datetime start, int interval_in_sec, const string name)
|
||
|
{
|
||
|
timer_t *result = new timer_t();
|
||
|
result._start = start;
|
||
|
result._interval_in_sec = interval_in_sec;
|
||
|
result._timer_name = name;
|
||
|
result.save_state();
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
static timer_t *restore(string name)
|
||
|
{
|
||
|
double val=0;
|
||
|
if(tool_global_var::get(name,val))
|
||
|
{
|
||
|
if((datetime)val<=layer::time_current())
|
||
|
{
|
||
|
tool_global_var::del(name);
|
||
|
return NULL;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
return NULL;
|
||
|
|
||
|
int interval=time_get_distance_in_sec((long)val,layer::time_current());
|
||
|
return timer_t::create(interval, name);
|
||
|
}
|
||
|
|
||
|
|
||
|
bool save_state()
|
||
|
{
|
||
|
if(ent_time()>layer::time_current() && StringLen(_timer_name)>0)
|
||
|
{
|
||
|
return tool_global_var::set(_timer_name,ent_time());
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
//+------------------------------------------------------------------+
|
||
|
//| |
|
||
|
//+------------------------------------------------------------------+
|
||
|
int time_get_distance_in_sec(datetime end, datetime start)
|
||
|
{
|
||
|
return (int)(end - start);
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
//+------------------------------------------------------------------+
|