![Документация по MQL5: Торговые функции Документация по MQL5: Торговые функции](https://c.mql5.com/36/81/dokumentaciya-po-mql5-torgovie.png)
- www.mql5.com
К сожалению, MQ не добавили в список History-функций HistoryPositionGet-функционал. С ним было бы гораздо проще.
Потому и приходится самим выкручиваться
Здравствуйте,
как можно сделать чтобы индикатор показывал не каждый профит/убыток, а накопительным итогом ?
и если можно - линией ?!!
Здравствуйте,
как можно сделать чтобы индикатор показывал не каждый профит/убыток, а накопительным итогом ?
и если можно - линией ?!!
Навскидку и без проверки, нужно всего лишь добавлять профит к уже полученному, а не каждый раз его записывать тот, что взят с позиций.
Как-то так:
//+------------------------------------------------------------------+ //| 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](https://c.mql5.com/36/81/grafik-nzdcad-d1-2024-01-03-16.png)
- www.mql5.com
На валютах хорошо вроде всё, а на серебре почему то постоянно перерисовывается.
Нужно смотреть какие данные получает индикатор и почему не просчитывается. Перерисовку может вызывать значение limit, большее 1. А это значение рассчитывается как разница между rates_total и prev_calculated. Вот эти значения нужно глядеть что в них содержится на каждом тике
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Индикатор исторических позиций на графике в виде диаграммы их прибыли/убытка:
В статье рассмотрим вариант получения информации о закрытых позициях по истории их сделок. Создадим простой индикатор, отображающий в виде диаграммы приблизительный профит/убыток позиций на каждом баре.
В функцию передаётся цена (Close бара), относительно которой нужно получать количество пунктов прибыли позиции, и время, на котором проверяется существование позиции (Time open бара). Далее профит всех позиций, полученный от каждого объекта исторических позиций, суммируется и возвращается.
После компиляции можно запустить индикатор на графике символа, где было много открытых позиций, и он нарисует диаграмму прибыли всех исторических позиций:
Автор: Artyom Trishkin