Обсуждение статьи "Индикатор исторических позиций на графике в виде диаграммы их прибыли/убытка"

 

Опубликована статья Индикатор исторических позиций на графике в виде диаграммы их прибыли/убытка:

В статье рассмотрим вариант получения информации о закрытых позициях по истории их сделок. Создадим простой индикатор, отображающий в виде диаграммы приблизительный профит/убыток позиций на каждом баре.

В функцию передаётся цена (Close бара), относительно которой нужно получать количество пунктов прибыли позиции, и время, на котором проверяется существование позиции (Time open бара). Далее профит всех позиций, полученный от каждого объекта исторических позиций, суммируется и возвращается.

После компиляции можно запустить индикатор на графике символа, где было много открытых позиций, и он нарисует диаграмму прибыли всех исторических позиций:

Автор: Artyom Trishkin

 
Интересная статья, спасибо!
 
Тяжелая тема. MT5.
 
Да.... действительно интересный и полезный труд. Пока мельком глянул. Перечитаю предметно. Буду использовать участки кода в своих разработках.
Спасибо.
 
К сожалению, MQ не добавили в список History-функций HistoryPositionGet-функционал. С ним было бы гораздо проще.
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber #:
К сожалению, MQ не добавили в список History-функций HistoryPositionGet-функционал. С ним было бы гораздо проще.

Потому и приходится самим выкручиваться

 

Здравствуйте,

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

и если можно - линией ?!!

 
Roman Kutemov #:

Здравствуйте,

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

и если можно - линией ?!!

Навскидку и без проверки, нужно всего лишь добавлять профит к уже полученному, а не каждый раз его записывать тот, что взят с позиций.

Как-то так:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- Устанавливаем индексацию массивов close и time как в таймсерии
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(time,true);
//--- Флаг успешного создания списка позиций
   static bool done=false;
//--- Если объект данных позиций создан
   if(history!=NULL)
     {
      //--- Если ещё не создавался список позиций
      if(!done)
        {
         //--- Если список позиций по текущему инструменту успешно создан,
         if(history.CreatePositionList(Symbol()))
           {
            //--- распечатываем в журнале позиции и устанавливаем флаг успешного создания списка позиций
            history.Print();
            done=true;
           }
        }
     }
//--- Количество баров, необходимое для расчёта индикатора
   int limit=rates_total-prev_calculated;
//--- Если limit больше 1 - значит это первый запуск или изменение в исторических данных
   if(limit>1)
     {
      //--- Устанавливаем количество баров для расчёта, равное всей доступной истории и инициализируем буферы "пустыми" значениями
      limit=rates_total-1;
      ArrayInitialize(BufferFilling1,EMPTY_VALUE);
      ArrayInitialize(BufferFilling2,EMPTY_VALUE);
     }
//--- В цикле по барам истории символа
   static double profit=0;
   for(int i=limit;i>=0;i--)
     {
      //--- получаем профит позиций, присутствующих на баре с индексом цикла i и записываем в первый буфер полученное значение
      profit+=Profit(close[i],time[i]);
      BufferFilling1[i]=profit;
      //--- Во второй буфер всегда записываем ноль. В зависимости от того, больше или меньше нуля значение в первом буфере,
      //--- будет меняться цвет рисуемой заливки между массивами 1 и 2 буфера индикатора
      BufferFilling2[i]=0;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Ну и с буфером как линией - это сами. Там убрать один лишний буфер нужно, так как заливка всегда использует два буфера. А для линии нужен один.

 

Вроде получилось.

Внёс ваши изменения, и просто указал тип - графика линия.

Буферы не убирал.

https://www.mql5.com/ru/charts/18738352/nzdcad-d1-roboforex-ltd

График NZDCAD, D1, 2024.01.03 16:11 UTC, RoboForex Ltd, MetaTrader 5, Real
График NZDCAD, D1, 2024.01.03 16:11 UTC, RoboForex Ltd, MetaTrader 5, Real
  • www.mql5.com
Символ: NZDCAD. Период графика: D1. Брокер: RoboForex Ltd. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2024.01.03 16:11 UTC.
Файлы:
 
На  валютах хорошо вроде всё, а на серебре почему то постоянно перерисовывается.
 
Roman Kutemov #:
На  валютах хорошо вроде всё, а на серебре почему то постоянно перерисовывается.

Нужно смотреть какие данные получает индикатор и почему не просчитывается. Перерисовку может вызывать значение limit, большее 1. А это значение рассчитывается как разница между rates_total и prev_calculated. Вот эти значения нужно глядеть что в них содержится на каждом тике

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