Подскажите функцию для рисования ломаной линии по значению цены и определённой дате

 

Здравствуйте. У меня задача следующая.

На вход индикатора подаются данные прогноза цены (массив цен и datetime-ы), хочу сделать так, чтобы можно было нарисовать их на графике к примеру вот так:

***

(только линия будет не прямой, а ломаной).

В общем мне нужно каким-то образом нарисовать линию, исходя из значений массива [datetime1: цена1, datetime2: цена2, ... datetimeN: ценаN], где все datetime-ы исключительно будущие, о которых MetaTrader пока ещё не знает.

Есть ли в mql5 функции для того, чтобы провести хотя бы для начала прямую линию между двумя точками, но так, чтобы она была строго на datetime-е, берущемся из массива (т.е. чтобы при прокручивании, изменении масштаба или цены линия никуда не убегала и оставалась на месте)?

Либо может быть в ядре уже есть функция для рисования таких линий?

С барами, как я понял из документации, цены наперёд нарисовать нельзя, потому что в буфер нельзя записать будущее значение цены (т.е. можно подписаться на onTick и следить за датой, но мне нужно именно сейчас будущее на графике видеть, вот так вот не по феншую). Поэтому подумал сделать просто на линиях.

 
Для этого есть графический объект "трендовая линия", тип OBJ_TREND. Строится именно по двум точкам.
 
Ihor Herasko:
Для этого есть графический объект "трендовая линия", тип OBJ_TREND. Строится именно по двум точкам.

При прокрутке графика линии будут смещаться. Равно, как и при изменении масштаба графика, линия будет видоизменяться. А в условии было: "(т.е. чтобы при прокручивании, изменении масштаба или цены линия никуда не убегала и оставалась на месте)"

 
hatand:

Здравствуйте. У меня задача следующая.

На вход индикатора подаются данные прогноза цены (массив цен и datetime-ы), хочу сделать так, чтобы можно было нарисовать их на графике к примеру вот так:

***

(только линия будет не прямой, а ломаной).

В общем мне нужно каким-то образом нарисовать линию, исходя из значений массива [datetime1: цена1, datetime2: цена2, ... datetimeN: ценаN], где все datetime-ы исключительно будущие, о которых MetaTrader пока ещё не знает.

Есть ли в mql5 функции для того, чтобы провести хотя бы для начала прямую линию между двумя точками, но так, чтобы она была строго на datetime-е, берущемся из массива (т.е. чтобы при прокручивании, изменении масштаба или цены линия никуда не убегала и оставалась на месте)?

Либо может быть в ядре уже есть функция для рисования таких линий?

С барами, как я понял из документации, цены наперёд нарисовать нельзя, потому что в буфер нельзя записать будущее значение цены (т.е. можно подписаться на onTick и следить за датой, но мне нужно именно сейчас будущее на графике видеть, вот так вот не по феншую). Поэтому подумал сделать просто на линиях.

Если необходимо, чтобы линия всегда была такой, как её нарисовали, и не зависела от прокрутки графика и его масштабирования, то рисуйте на канвасе.

Документация по MQL5: Стандартная библиотека / Пользовательская графика
Документация по MQL5: Стандартная библиотека / Пользовательская графика
  • www.mql5.com
Отдельно разработаны классы для создания графических объектов и примитивов, для отрисовки различных видов диаграмм и кривых. Реализованы различные возможности отображения объектов: изменение стиля и цвета линий, заливка, работа с сериями данных на графике и т.д.
 
Всем спасибо за ответы, буду изучать)
 
Artyom Trishkin:

При прокрутке графика линии будут смещаться.

Не будут, если даты не попадают на выходные. Если попадают на выходные, то это проблема исходных данных. Их придется корректировать по мере приближения к дате.

Равно, как и при изменении масштаба графика, линия будет видоизменяться.

Визуально, конечно, будут, но по факту останутся на месте.

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

Исходные данные - цена и время. Если они находятся за пределами видимости графика, то их не должно быть на графике. А канвас - это в пределах видимости. И какой толк от того, что линия показана, но фактически не там, где нужно?

 
Ihor Herasko:

Не будут, если даты не попадают на выходные. Если попадают на выходные, то это проблема исходных данных. Их придется корректировать по мере приближения к дате.

Визуально, конечно, будут, но по факту останутся на месте.

Исходные данные - цена и время. Если они находятся за пределами видимости графика, то их не должно быть на графике. А канвас - это в пределах видимости. И какой толк от того, что линия показана, но фактически не там, где нужно?

Как я понял - у графика есть смещение от правого края. При его использовании, линию, нарисованную в будущем, будет видно, равно как и канвас, нарисованный там же - это же всего лишь координаты на графике, а нулевой бар графика можно смешать влево от правого края графика - вот это пустое поле и будет местом для рисования чего-либо в "будущем".

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

 
hatand:

С барами, как я понял из документации, цены наперёд нарисовать нельзя, потому что в буфер нельзя записать будущее значение цены

индикаторный буфер можно сместить на n-баров (влево или вправо) и рисовать в буфере что душе угодно

 
Индикатор напишите, и будет Вам то что заявлено
 
#property indicator_chart_window
#property indicator_plots   1 
#property indicator_buffers 1
#include <Canvas\iCanvas.mqh> // https://www.mql5.com/ru/code/22164 

input int N=10; // количество линий
datetime T[];
double Pr[];
int OnInit()
  {
   // Инициализируем массивы времени и цены случайными значениями
   /////////////////////////////////
   
   ArrayResize(T,N+1);
   ArrayResize(Pr,N+1);
   T[0]=TimeCurrent();
   Pr[0]=iClose(_Symbol,_Period,0);
   
   MathSrand(GetTickCount());
   for (int i=1; i<=N;i++) 
     {
       T[i]=TimeCurrent()+datetime((Canvas.TimePos(W.Width-1)-TimeCurrent())*rand()/32768.0);
       Pr[i]=W.Y_min+(W.Y_max-W.Y_min)*rand()/32768.0;
     }
   ArraySort(T);
   /////////////////////////////////
   DrawLines(T,Pr); 
   return(INIT_SUCCEEDED);
  }

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
  {
   return(rates_total);
  }
  
// функция отрисовывает массив линий 
void DrawLines(datetime &t[],double &p[])
{
 Canvas.Erase();
 for (int i=1;i<ArraySize(p);i++) Canvas.Line(Canvas.X(t[i-1]),Canvas.Y(p[i-1]),Canvas.X(t[i]),Canvas.Y(p[i]),ColorToARGB(clrRed));
 Canvas.Update();
}

как вариант 

Файлы:
Причина обращения: