Скачать MetaTrader 5

EventSetTimer,OnTimer

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vasyl Nosal
18650
Vasyl Nosal  

Можно как то сделать чтобы определённое событие происходило например за 3 секунды до окончания бара?

Time[0]+(Time[0]-Time[1]-3) 
Vladislav Andruschenko
94286
Vladislav Andruschenko  

попробуй так:

пере стартом эксперта в ините вычисли время старта в секундах от текущего бара.

TimeCurrent() - Time[0]

получишь количество секунд

далее высчитай сколько в баре секунд Period()*60

Period()*60-(TimeCurrent() - Time[0])

количество секунд до конца бара - 3 секунды

в ините поставь

EventSetTimer (полученный результат);

потом уже в старте вычитывай тоже самое и ставь таймер на полученное значение.

Мысли в слух.

Vasyl Nosal
18650
Vasyl Nosal  
Vladon:

попробуй так:

пере стартом эксперта в ините вычисли время старта в секундах от текущего бара.

получишь количество секунд

далее высчитай сколько в баре секунд Period()*60

количество секунд до конца бара - 3 секунды

в ините поставь

EventSetTimer (полученный результат);

потом уже в старте вычитывай тоже самое и ставь таймер на полученное значение.

Мысли в слух.


Спасибо.

Тоесть идея в том чтобы каждую секунду проверять когда останется 3 секунды до конца?

Тогда может в инит

EventSetTimer(1)

А в онтаймер

if(TimeCurrent()==Time[0]+(Time[0]-Time[1]-3))

Я думал что разработчики придумали этот онтаймер как раз для таких случаев как у меня. Ошибся.

Vladislav Andruschenko
94286
Vladislav Andruschenko  
eevviill:


Спасибо.

Тоесть идея в том чтобы каждую секунду проверять когда останется 3 секунды до конца?

Тогда может в инит

EventSetTimer(1)

А в онтаймер

if(TimeCurrent()==Time[0]+(Time[0]-Time[1]-3))

Я думал что разработчики придумали этот онтаймер как раз для таких случаев как у меня. Ошибся.


да нет таймер тоже классная штука, теперь не надо циклить эксперта в некоторых случаях.
Alexey Viktorov
8019
Alexey Viktorov  
eevviill:

Можно как то сделать чтобы определённое событие происходило например за 3 секунды до окончания бара?

Надо просто определить наступление бара не в Time[0] а в Time[1]+Period()-3

void OnTick()
{
  if(NewBar()) // делаем всё что надо
}//******************************************************************|

bool NewBar()
{
   static datetime lastbar = 0;
   datetime curbar = Time[1]+Period()-3;
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}//******************************************************************|
Alexander
2441
Alexander  
Неправильный совет, тика в эту секунду может и не быть,
Alexey Viktorov
8019
Alexey Viktorov  

Я думаю что 3 секунды это было взято от фонаря, на самом деле побольше и следовательно должно сработать пусть даже на 1-2 секунды позже.

А вот конкретно 3 секунды, наблюдались такие моменты когда не-было котировок 3 и более секунд? Я не интересовался и не наблюдал за этим.

Alexander
2441
Alexander  
AlexeyVik:

А вот конкретно 3 секунды, наблюдались такие моменты когда не-было котировок 3 и более секунд? Я не интересовался и не наблюдал за этим.


Откройте минутный график например EURUSD, Вы легко найдете бары со значениями V<20.
Алексей Тарабанов
7316
Алексей Тарабанов  
eevviill:

Можно как то сделать чтобы определённое событие происходило например за 3 секунды до окончания бара?


Нельзя.
Yuriy Zaytsev
15062
Yuriy Zaytsev  
eevviill:

Можно как то сделать чтобы определённое событие происходило например за 3 секунды до окончания бара?

Какой смысл в этом ?


в теории Вам никто не мешает, вызывать событие в XX:XX:57 это близко к тому что Вы задумали


tara:

Нельзя.

можно
Vasyl Nosal
18650
Vasyl Nosal  

Вообщем для меня единственное решение. Поскольку TimeCurrent всё ровно зависит от тиков, то пришлось привязывать к часам на ПК. Проверять каждую секунду или наступила 3 секунда от конца бара.

extern int seconds_to_end_bar = 3;

int local_timeHours_shift;

int local_timeMinutes_shift;

int local_timeSeconds_shift;

////////////// 

 void init()

{ 
local_timeHours_shift=TimeHour(TimeLocal())-TimeHour(TimeCurrent());
local_timeMinutes_shift=TimeMinute(TimeLocal())-TimeMinute(TimeCurrent());
local_timeSeconds_shift=TimeSeconds(TimeLocal())-TimeSeconds(TimeCurrent());
EventSetTimer(1);
}

//////////////

 void OnTimer ()

   {

   if(TimeLocal()-local_timeHours_shift*3600-local_timeMinutes_shift*60-local_timeSeconds_shift==Time[0]+(Period()*60-seconds_to_end_bar)) 

   Close_all();

   }
1234
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий