Прорисовать на графике прямоугольник из данных SQL БД - страница 2

 

если нет необходимости рисовать индикатором в реальном режиме времени, то проще записать нужные данные в файл и читать этот файл из индикатора раз в ХХХ минут

имхо, как записать в файл, по моему проще решить, чем с нуля писать код .dll , но все зависит от дальнейших задач

ЗЫ: на МТ5 больше встроенных сетевых функций, чем в 4-ке

 
Igor Makanu:

если нет необходимости рисовать индикатором в реальном режиме времени, то проще записать нужные данные в файл и читать этот файл из индикатора раз в ХХХ минут

имхо, как записать в файл, по моему проще решить, чем с нуля писать код .dll , но все зависит от дальнейших задач

ЗЫ: на МТ5 больше встроенных сетевых функций, чем в 4-ке

Да, на мт5 и планирую.
Данные будут рисоваться раз в сутки
 

Вообще в mql5 уже есть кое-какие средства для работы с БД: https://www.mql5.com/ru/docs/database

Не знаю конечно насколько это применимо к той БД которая у топик-стартера...

Что касается рисования то это самая простая задача по сравнению с передачей данных и синхронизации состояния.

Собственно рисование:

   ObjectCreate(0,name,OBJ_RECTANGLE,0,0,0);
   ObjectSetInteger(0,name,OBJPROP_TIME,0,time_start);
   ObjectSetInteger(0,name,OBJPROP_TIME,1,time_finish);
   ObjectSetDouble(0,name,OBJPROP_PRICE,0,border_upper);
   ObjectSetDouble(0,name,OBJPROP_PRICE,1,border_lower);
   ObjectSetInteger(0,name,OBJPROP_COLOR,colour);
   ObjectSetInteger(0,name,OBJPROP_FILL,true);

Здесь:

  • 0 - означает рисовать на текущем графике
  • name - имя прямоугольника (string)
  • time_start - время привязки левой границы (datetime)
  • time_finish - время привязки правой границы (datetime)
  • border_upper - цена верхней границы (double)
  • border_lower - цена нижней границы (double)
  • colour - цвет прямоугольника (color)
  • OBJPROP_FILL,true - рисовать прямоугольник с заполнением

Это нужно поместить в функцию OnTick в эксперте либо в отдельную функцию которая вызывается из OnTick либо если нужно только рисовать, но не торговать, тогда можно в функцию OnCalculate в индикаторе.

Если значения не меняются например в течение дня/часа, то не обязательно в OnTick/OnCalculate и тогда нужно написать обработчик события, надо ещё подумать как это правильно сделать.

И вообще лучше перенести весь расчёт в mql если есть такая возможность.



 

Насчёт синхронизации:

видимо советник/индикатор должен иметь переменную datetime last_update в которой будет храниться время последнего обновления значений и например каждый тик либо по таймеру (функция OnTimer) запрашивать время последнего обновления из источника datetime source_update и тогда сравнивая if( last_update != source_update ) можно запускать обновление прямоугольника или рисовать новый прямоугольник если старый нужен для анализа истории например

 
transcendreamer:

Вообще в mql5 уже есть кое-какие средства для работы с БД: https://www.mql5.com/ru/docs/database

Не знаю конечно насколько это применимо к той БД которая у топик-стартера...

Что касается рисования то это самая простая задача по сравнению с передачей данных и синхронизации состояния.

Собственно рисование:

Здесь:

  • 0 - означает рисовать на текущем графике
  • name - имя прямоугольника (string)
  • time_start - время привязки левой границы (datetime)
  • time_finish - время привязки правой границы (datetime)
  • border_upper - цена верхней границы (double)
  • border_lower - цена нижней границы (double)
  • colour - цвет прямоугольника (color)
  • OBJPROP_FILL,true - рисовать прямоугольник с заполнением

Это нужно поместить в функцию OnTick в эксперте либо в отдельную функцию которая вызывается из OnTick либо если нужно только рисовать, но не торговать, тогда можно в функцию OnCalculate в индикаторе.

Если значения не меняются например в течение дня/часа, то не обязательно в OnTick/OnCalculate и тогда нужно написать обработчик события, надо ещё подумать как это правильно сделать.

И вообще лучше перенести весь расчёт в mql если есть такая возможность.



Да, спасибо. По рисовке уже нашел мануал, изучаю команды.
Осталось разобраться с условиями проверки, и коннектом к SQL
 
transcendreamer:

Насчёт синхронизации:

видимо советник/индикатор должен иметь переменную datetime last_update в которой будет храниться время последнего обновления значений и например каждый тик либо по таймеру (функция OnTimer) запрашивать время последнего обновления из источника datetime source_update и тогда сравнивая if( last_update != source_update ) можно запускать обновление прямоугольника или рисовать новый прямоугольник если старый нужен для анализа истории например

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

Время обновления рисовки индикатором желательно задавать на конкретное время, например в 9 утра, так как парсинг новой информации на сервере будет происходить в 7 утра, и два часа на это с головой хватит, чтоб индикатор мог скушать данные. (Вернее чтоб до запуска обновления индикатора уже были эти данные)

П.с. Да и кстати, графические кнопки/списки и прочий функционал в окне графика торгового инструмента возможно создать только для советника, или индикатор так же может иметь это?
 
Хотя все таки один из графических объектов все таки будет перерисовываться (фибо) на протяжении всей торговой сессии, тригером для перерисовки должны служить утвержденные фракталы. И строить графические объекты надо по указанному заранее в конфиге ТФ. 
Так же не должно быть перерисовки/удаления тех объектов, которые нанес я вручную, а не индикатор.
Есть такая проверка в mql? 
Или надо будет отталкиваться проверкой уже от названия label таких объектов, которое будет с элементами идентификации самого индикатора?
 
Андрей:
Обновлять прямоугольник не нужно. Перерисовок не будет.

Просто каждый день наносить прямоугольник и несколько коротких линий, ну и возможно текст в виде заметок (время от времени).

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

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

Можно конечно, можно проверить существование объекта с заданным уникальным именем, а в имя записывать дату, тогда не будет перерисовываться, или просто запоминать в специальной переменной, что на эту дату уже объект был нарисован и ещё раз рисовать не надо.
Время обновления рисовки индикатором желательно задавать на конкретное время, например в 9 утра, так как парсинг новой информации на сервере будет происходить в 7 утра, и два часа на это с головой хватит, чтоб индикатор мог скушать данные. (Вернее чтоб до запуска обновления индикатора уже были эти данные)

Тогда просто вызываем TimeCurrent, конвертируем в MqlDateTime, вытаскиваем час и минуту, сравниваем их с 9:00, и проверяем что такой объект ранее не был нарисован, и если всё ок, тогда запрашиваем данные из базы и рисуем.

П.с. Да и кстати, графические кнопки/списки и прочий функционал возможно создать только для советника, или индикатор так де может иметь это?

Индикатор тоже может иметь кнопки и другие контролы и работать с ними точно так же (отслеживание событий нажатия).

 
transcendreamer:


Спасибо за советы.
Кстати спонтанно возник вопрос: то, что нарисовано в мт5 ПК возможно перенести в мобильнуб версию мт5 ()?
Или такой возможности не существует, и связать между собой разные платформы для синхронизации невозможно?
 
Андрей:
Хотя все таки один из графических объектов все таки будет перерисовываться (фибо) на протяжении всей торговой сессии, тригером для перерисовки должны служить утвержденные фракталы. И строить графические объекты надо по указанному заранее в конфиге ТФ. 
Так же не должно быть перерисовки/удаления тех объектов, которые нанес я вручную, а не индикатор.
Есть такая проверка в mql? 
Или надо будет отталкиваться проверкой уже от названия label таких объектов, которое будет с элементами идентификации самого индикатора?

Тогда надо определиться с алгоритмом, что от чего зависит, и проверять необходимость перерисовки каждый тик, можно например запустить в функции OnInit вызов индикатора фракталов с помощью IndicatorCreate или iFractals, а в OnCalculate/OnTick брать из него последние показатели с помощью CopyBuffer и по ним перерисовывать.

Только сразу скажу что фибо и фракталы не работают, лучше пойти на завод. 😀

Удаления объектов не будет, если не вызывать ObjectDelete специально.

Вообще есть две стратегии:

  1. создать один объект с именем типа MY_SUPER_DUPER_RECTANGLE и его каждый день обновлять (он будет сдвигаться на графике)
  2. создавать каждый день новый объект с именами RECTANGLE_2021_07_06, RECTANGLE_2021_07_07, RECTANGLE_2021_07_08 и так далее
Точно так же с фибо и прочими штуками, которые должны обновляться внутри торговой сессии.
Причина обращения: