mql5 - вертикальная линия через определенное время с момента последней сделки - страница 2

 
Vladimir Karputov:

Хочу уточнить термин "последняя сделка".

Искать нужно последнюю сделку внутри текущего дня? Или на последние N-дней? 

посл. сделку за 24 часа - дальше не надо перебирать историю.

 
renatmt5:

посл. сделку за 24 часа - дальше не надо перебирать историю.

Значит так:

Индикатор использует код создания, перемещения и удаления вертикальной линии из справки OBJ_VLINE. (пока в индикаторе работает только создание линии). Имя линии задаётся во входном параметре "Vertical line name"

Last deal Move Vertical line

Вертикальная линия создаётся в OnOnit():

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   VLineCreate(0,InpVLineName);
//---
   return(INIT_SUCCEEDED);
  }


Для минимизации нагрузки опрашиваем истории раз в минуту. Для этих целей в области глобальных переменных нашей программы (в данном случае индикатора) объявим переменную ExtLastMove

//---
datetime ExtLastMove=0;                   // "0" -> D'1970.01.01 00:00';

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


Дальше в OnCalcalculate() от текущего времени (времени последней котировки по любому символу TimeCurrent) отнимаем сохранённое время ExtLastMove и если разница менее 60 секунд - выходим

//---
   datetime time_current=TimeCurrent();
   if(time_current-ExtLastMove<60) // 60 seconds
      return(rates_total);
   ExtLastMove=time_current;

если разница окажется больше - значит записываем в ExtLastMove новое время.


Обращение к торговой истории происходит в LastProfitForPeriod().

Здесь используются две даты: от и до. "До" выставляем в будущее (текущее время плюс одни сутки), а "от" получаем вычитанием суток из текущего времени

   datetime from_date   = time_current-60*60*24;   // time one day ago
   datetime to_date     = time_current+60*60*24;   // time from the future :)
   double   last_profit = LastProfitForPeriod(from_date,to_date);

   Comment("Last profit: ",DoubleToString(last_profit,2));


Пока всё, итак много букофф...

Файлы:
 
Владимир, большое спасибо за ваш код и особенно за комментарии к его фрагментам!
Не понял только, зачем нам to_date равное стуки в будущее? Может все-таки до текущего момента? В будущем результат сделки вроде не определить :) Или нам эти сутки в будущее необходимы, чтобы в будущем времени рисовать линию?
Еще по циклу вопрос.
Как я понял, мы подгружаем массив с данными по сделкам и перебираем массив с нулевой сделки к последней, сравнивая  время с последним записанным и перезаписываем переменную last_time, если deal_time оказывается более поздней. А может быть можно наоборот массив перебирать с конца? Собственно самый последний элемент массива и будет последней закрытой сделкой, по которой нам нужны данные? 
Возможно, я допускаю какие-то логические ошибки - прошу строго не судить :)
 
имел ввиду for(uint i=0;i<total;i++) заменить на for(uint i=total;i>=0;i--)
 
а вообще и цикл тогда не нужен - сразу к элементу массива под порядковым номером i=total обращаемся
 
Не понял только, зачем нам to_date равное стуки в будущее? 

Так нужно. Чтобы гарантированно получить "от" и до текущего времени.

А может быть можно наоборот массив перебирать с конца?

Если стоит задача найти последнюю сделку, то Массив необходимо перебирать и искать именно время - мало ли как чего случится или внутренняя логика ядра поменяется и  сделки будут скинуты вразнобой.

 
Vladimir Karputov:

Так нужно. Чтобы гарантированно получить "от" и до текущего времени.

Если стоит задача найти последнюю сделку, то Массив необходимо перебирать и искать именно время - мало ли как чего случится или внутренняя логика ядра поменяется и  сделки будут скинуты вразнобой.

Ок, понял. В принципе с учетом ограничения истории в 24 часа сколь-либо существенной нагрузки явно не будет при переборе данных :) 

 
renatmt5:

Ок, понял. В принципе с учетом ограничения истории в 24 часа сколь-либо существенной нагрузки явно не будет при переборе данных :) 

Итак, остаётся последний штрих - в зависимости от полученной прибыли перемещать линию.

НАпомните какие там правила перемещения?

 
Я правильно понял, что переменные last_time и result - это и есть искомые значения, с которыми работаем. А имено result определяет, на сколько по времени будет смещена (перерисована) линия в будущее. Тогда и блок кода "Profit for the period" надо поставить перед блоком "Move the vertical line", чтобы двигать линию уже с учетом полученных данных по последней сделке. 
Всё верно или что-то путаю?
 

Вот нашёл пояснение, почему параметр "до" нужно делать в будущее:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Renat Fatkhullin, 2016.11.04 12:43

Никогда не делайте TimeCurrent() как конечную дату, делайте TimeCurrent()+86400, чтобы гарантированно захватить все оконечные сделки.

TimeCurrent - это не точное последнее время, а "последнее известное при апдейтах время сервера", что не есть 100% точное время. Особенно на старте.


Причина обращения: