Как найти начало таймфрейма?

 

Может кто то знает как найти начало таймфрейма (например минутного) чтобы не гонять всю программу по каждому тику?

В MQL4 всё было просто  Tic=Volume[0]; и всего то делов..

Кстати определить наличие ордера тоже было просто:  order = OrdersTotal();

А в MQL5 это решаемо? 

 

у вас такой сложный языка, надо сообразить, что такое начало таймфрейма?

первый бар в истории, текущий бар минутного графика? 

 
lazarev-d-m:

у вас такой сложный языка, надо сообразить, что такое начало таймфрейма?

первый бар в истории, текущий бар минутного графика? 

просто: образование нового бара установленного на графике таймфрейма

или закрытие предыдущего бара 

или когда последний бар закрыт(сформирован) 

последний-значит самый свежий 

бар с индексом 1 

 

https://www.mql5.com/ru/articles/159

возможно это поможет, лично я решаю проблему тем или иным способом в зависимости от того, что мне нужно от нового бара или любого другого, обычно бары характеризуются, ценами и обьемами

https://www.mql5.com/ru/articles/81

эта статья не относится к данной теме, но там очень понятно и удобно расписано как вызывать бывшие функции iClose,iOpen,iVolume и т.д. 

Обработчик события "новый бар"
Обработчик события "новый бар"
  • 2010.10.04
  • Konstantin Gruzdev
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 
shelandr:

просто: образование нового бара установленного на графике таймфрейма

или закрытие предыдущего бара 

или когда последний бар закрыт(сформирован) 

последний-значит самый свежий 

бар с индексом 1 

int prev_timestamp = 0;

void OnTick()
  {
   MqlTick last_tick;
//---
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      int current_timestamp = last_tick.time / PeriodSeconds(Period());
      if (current_timestamp != prev_timestamp)
        {
         Print("Новый бар на текущем таймфрейме! Время: " + TimeToString(last_tick.time));
         YourMegaHandler();
         prev_timestamp = current_timestamp;
        }
      else 
         Print("Этот бар мы уже обрабатывали...");
     }
   else 
      Print("SymbolInfoTick() failed, error = ",GetLastError());
  }
Должно работать как швейцарские часы на любом таймфрейме
 
Vladix:
Должно работать как швейцарские часы на любом таймфрейме

Спасибо.попробую..

Чего только не приходится изобретать мз за головотяпства разработчиков..

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

Ну и тупизм.. 

 
Vladix:
Должно работать как швейцарские часы на любом таймфрейме

Какой то мазохизм... на каждом тике насиловать процессор делением многоразрядного целого числа на период в секундах..

Ладно если это мой процессор а ежели это-VPS ? А процессору ещё надо и алгоритм считать а не только эту байду,которая и так присутствует в терминале ибо в нём и формируются свечи... Кто же смог такое "изобрести" ? 

Можно конечно почитать диссертацию на эту тему:

Обработчик события "новый бар"

https://www.mql5.com/ru/articles/159

но почему нельзя было оставить метод применённый в МТ4 а не валить на скриптописателя новые проблемы? 

Обработчик события "новый бар"
Обработчик события "новый бар"
  • 2010.10.04
  • Konstantin Gruzdev
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 

Написал так:

datetime    ntm=TimeCurrent();
MqlDateTime stm;
TimeToStruct(ntm,stm);
string mmin = stm.min; 
Comment ( "\n" ,"      Min  = ", mmin, "      DB3 =  ", DBi[3] ); 

 так вроде полегче будет процессору..хотя-всё равно через жопу..

 
shelandr:

Какой то мазохизм... на каждом тике насиловать процессор делением многоразрядного целого числа на период в секундах..

 

В нынешних процессорах это не является мазохизмом. Всего один такт.

Но если у Вас не 64, а 32-битная система, то сначала время приведите к инту, а потом делите (будет всего 2 такта процессора). 32-битный инт пригоден для хранения времени до 2037 года

Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип datetime
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип datetime
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Тип datetime - Документация по MQL5
 
stringo:

В нынешних процессорах это не является мазохизмом. Всего один такт.

Но если у Вас не 64, а 32-битная система, то сначала время приведите к инту, а потом делите (будет всего 2 такта процессора). 32-битный инт пригоден для хранения времени до 2037 года

И где же вы такие волшебные процессоры обнаружили ? Может ссылочку дадите?

Пока нашёл только
http://forum.vingrad.ru/topic-88856.html 

 Операция деления реализуется через многократное вычитание делителя В из делимого А. Это достигается сложением чисел в обратном и дополнительном кодах.

VPF:: - Форум программистов Vingrad
  • forum.vingrad.ru
У меня есть цель. Узнать, за какое среднее количество тактов процессора выполняется та или иная инструкция. Или точнее количество тактов, расходуемое на выполнение микрооперации (инструкции ещё самим процессором декодируются в микрооперации). Команда чтения счетчика тактов работает под Windows на приложениях имеющих минимальный уровень...
 
shelandr:

...Кстати определить наличие ордера тоже было просто:  order = OrdersTotal();

А в MQL5 это решаемо? 

Посмотрите PositionSelect или PositionsTotal