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

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

Это внутренние переменные функции LastProfitForPeriod. 

Нам ведь нужно получить значение прибыли последней сделки? Вот LastProfitForPeriod() и выдаёт нам прибыль последней сделки. Остаётся в зависимости от этой прибыли двигать вертикальную линию.

 
Vladimir Karputov:

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

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

упс, сорри - уточняю:

- если результат последней сделки отрицательный и результат дня отрицательный, то вертикальная линия чертится на расстоянии 24 часа (сутки) в будущее.
- если результат последней сделки отрицательный, а результат дня положительный, то вертикальная линия чертится на расстоянии 2 часа в будущее.
- если результат последней сделки положительный, то вертикальная линия чертится на расстоянии 1 час в будущее.

 
Vladimir Karputov:

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


Спасибо!

 

Судя по условиям необходим еще результат дня, в котором была последняя сделка (если сделок в этот день было несколько)

 
renatmt5:

упс, сорри - уточняю:

- если результат последней сделки отрицательный и результат дня отрицательный, то вертикальная линия чертится на расстоянии 24 часа (сутки) в будущее.
- если результат последней сделки отрицательный, а результат дня положительный, то вертикальная линия чертится на расстоянии 2 часа в будущее.
- если результат последней сделки положительный, то вертикальная линия чертится на расстоянии 1 час в будущее.

А, так нужно ещё отдельно получать прибыль за текущий день.


Внести коррективы в LastProfitForPeriod() - убираем входные параметры времени "от" и "до" и формируем эти параметры уже внутри функции: формируем время начала дня (это будет "от"), а "до" получаем текущее время + сутки.


В итоге в LastProfitForPeriod() будем передавать по ссылке два параметра: прибыль за день и прибыль последней сделки.


Начало дня получаем при помощи iTime

   datetime from_date=iTime(Symbol(),PERIOD_D1,0);

- то есть это время открытия текущего дневного бара.

Файлы:
 

Скомпилировал - здорово!
Есть только моменты следующие:
1) Значению переменной Profit last day при наложении индикатора присваивается итоговая прибыль не за последний день, в котором была последняя сделка, а итоговую прибыль вообще по счету. Потом, правда, при перерасчете индикатора (где-то через 1-2 минуты) значение меняется на верное (итоговая прибыль за день, в котором была посл. сделка). Я только сужу по счету, на котором посл. сделка была сегодня.
2) При удалении индикатора с графика Comment в левом верхнем углу не удаляются. При очистке списка объектов тоже не удаляются. Я перезапускаю терминал, чтобы значения пропали, что не удобно конечно же. Как сделать проще - не знаю :)

Еще наверное логично блоки с кодом создания линии, перемещения линии и удаления линии (Create the vertical line, Move the vertical line и Delete the vertical line) разместить уже после блока расчета по последней сделке (Profit for the period). Чтобы уже с учетом смещения в будущее на n-часов, рассчитанных на основании данных profit_last_day и profit_last_deal, рисовать линию. 

Типа

if (profit_last_day<=0 and profit_last_deal<=0){n=24;}

else (profit_last_day>0 and profit_last_deal<=0){n=2;}

else {n=1;}
//---
time = last_time + n;
//---
далее уже рисуем линию со смещением по времени относительно посл. сделки, используя рассчитанное значение time...

 

В версии 1.002 введена защита: если время открытия дневного бара вернуло "0" - значит не судьба и выходим.

//+------------------------------------------------------------------+
//| Profit for the period                                            |
//+------------------------------------------------------------------+
void LastProfitForPeriod(double &profit_last_day,double &profit_last_deal)
  {
   datetime from_date=iTime(Symbol(),PERIOD_D1,0);
   if(from_date==D'1970.01.01 00:00')
      return;
   datetime to_date=TimeCurrent()+60*60*24;

   long last_time=0;


Теперь не будет запроса за всю жизнь торгового счёта.

Файлы:
 
Владимир, еще раз спасибо огромное за ваш труд! 
Я попробую сам поковырять код, чтобы уж совсем совесть не замучала и практики ради :)  Отпишусь по успехам, если таковые будут
 
renatmt5:
Владимир, еще раз спасибо огромное за ваш труд! 
Я попробую сам поковырять код, чтобы уж совсем совесть не замучала и практики ради :)  Отпишусь по успехам, если таковые будут

Хорошо.

 
Кстати,  по защите, которую вы добавили есть следующий момент. Поскольку до расчета правильного значения у меня идет задержка 1-2 минуты, в течении которых переменные равны нулю, я для быстрого обновления переключаю текущий таймфрейм на другой - значения сразу же пересчитываются. Наверное, можно по этому принципу какой-то программный костыль сделать?
Причина обращения: