Группа "Стол заказов MQL"

Рейтинг 2146



РЕКОМЕНДУЮ



Подскажите, пожалуйста, как создаются подобные объекты?

Подскажите, пожалуйста, как создаются подобные объекты?

Есть открытый код индикатора (скрин 2) от автора: _https://www.mql5.com/en/code/9175
Но я не совсем понимаю как там создаются подобные вещи… Хотелось бы использовать подобное в советнике, например для индикации текущей просадки, или чего угодно. Может кто в курсе как ЭТО делается?
  • +1
  • Просмотров: 1618
  • 1 октября 2023, 17:32
  • FEEX
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Прошу написать индикатор
Следующая запись в группе  
Добавить параметр
01 октября 2023
01 октября 2023

Брокер для ваших роботов, 15 лет на рынке

Комментарии (25)

+
0
объект текстовая метка:

avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 1 октября 2023, 20:15
+
0
я не понимаю как эти прямоугольники отрисовать на графике. как такую шкалу отрисовать. Я смотрел код индюка, но не понял как именно получается такой прямоугольник… А потом еще их в шкалу загнать надо, т.е. это для каждого прямоугольника свой объект создавать что ли?
avatar

  11  FEEX Автор Сообщений: 361 - Владимир

  • 1 октября 2023, 22:15
+
0
функция может выглядеть примерно так. текст обычное тире "-"


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutLabel(string nm,string text,int x,int y)
  {
//--- создадим текстовую метку
   ObjectCreate(0,nm,OBJ_LABEL,0,0,0);
//--- установим координаты метки
   ObjectSetInteger(0,nm,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,nm,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,nm,OBJPROP_CORNER,0);
//--- установим текст
   ObjectSetString(0,nm,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,nm,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,nm,OBJPROP_FONTSIZE,7);
//--- установим цвет
   ObjectSetInteger(0,nm,OBJPROP_COLOR,Red);
  }
avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 1 октября 2023, 22:56
+
0
т.е прямоугольник это обычное тире?))
И одно такое тире выводится на график через ObjectCreate?
И если таких тире должно быть 10, то для каждого создается свой ObjectCreate?
avatar

  11  FEEX Автор Сообщений: 361 - Владимир

  • 1 октября 2023, 23:19
+
0
Можно создать массив с цветами, в теле цикла создать 10 объектов с цветом CLR_NONE, и так же в теле цикла задать цвета нужному кол-ву объектов.
пример со свободной маржой:
//+------------------------------------------------------------------+
//|                                                        Meter.mq4 |
//|                                               Copyright 2023,    |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023"
#property link      ""
#property version   ""
#property strict

color clr[10]={Red,OrangeRed,DarkOrange,Orange,Gold,Yellow,GreenYellow,LawnGreen,Lime,Lime};
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   MeterCreate();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void MeterCreate()
  {
   for(int i=0; i<10; i++)
     objectCreate("ind"+string(i),30,30+(i*7));
  }
//+------------------------------------------------------------------+
void objectCreate(string name,int x,int y,string text="-",int size=42,
                  string font="Arial",color colour=CLR_NONE)
  {
   ObjectCreate(name,OBJ_LABEL,0,0,0);
   ObjectSet(name,OBJPROP_CORNER,3);
   ObjectSet(name,OBJPROP_COLOR,colour);
   ObjectSet(name,OBJPROP_XDISTANCE,x);
   ObjectSet(name,OBJPROP_YDISTANCE,y);
   ObjectSetText(name,text,size,font,colour);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double Bal=AccountInfoDouble(ACCOUNT_BALANCE);
   double Free=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   double step=Bal/10;
   int i=(int)(Free/step);
   //----------------------
   for(int s=10; s>=i; s--)
     ObjectSet("ind"+string(s),OBJPROP_COLOR,CLR_NONE);
   for(int k=0; k<i; k++)
    ObjectSet("ind"+string(k),OBJPROP_COLOR,clr[k]);
  }
//+------------------------------------------------------------------+
avatar

  14  verta81 Сообщений: 389

  • 1 октября 2023, 23:48
+
0
выглядит компактнее, чем у меня получилось) только у вас все кирпичики сразу отрисовались при запуске, а мне надо отрисовка в зависимости от величины того или иного значения, например текущего профита за день.

я, как бы, сделал — первый кирпич рисуется если профит > 0, второй если > 5, profit > 10, profit > 15 и т.д.
Но слишком громоздкая конструкция получилась…
<code>if (profitToday > 0)
          {                      
           ProText = "-";
          }
  ObjectCreate("label_object44", OBJ_LABEL, 0, 0, 0);
  ObjectSet("label_object44", OBJPROP_CORNER, 3);
  ObjectSet("label_object44", OBJPROP_XDISTANCE, 10);
  ObjectSet("label_object44", OBJPROP_YDISTANCE, 10);
  ObjectSet("label_object44", OBJPROP_BACK, false);    
  ObjectSetText("label_object44", StringConcatenate(ProText), 42, "Arial", Red);</code>

это только один кирпич, а всего их 10…
Как сделать компактнее — я хз…
Редактирован: 2 октября 2023, 02:10
avatar

  11  FEEX Автор Сообщений: 361 - Владимир

  • 2 октября 2023, 01:19
+
+1
//+------------------------------------------------------------------+
//|                                                        Meter.mq4 |
//|                                               Copyright 2023,    |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023"
#property link      ""
#property version   ""
#property strict

color clr[10]={Red,OrangeRed,DarkOrange,Orange,Gold,Yellow,GreenYellow,LawnGreen,Lime,Lime};
int count_step=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   MeterCreate();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void MeterCreate()
  {
   for(int i=0; i<10; i++)
     objectCreate("ind"+string(i),30,30+(i*7));
  }
//+------------------------------------------------------------------+
void objectCreate(string name,int x,int y,string text="-",int size=42,
                  string font="Arial",color colour=CLR_NONE)
  {
   ObjectCreate(name,OBJ_LABEL,0,0,0);
   ObjectSet(name,OBJPROP_CORNER,3);
   ObjectSet(name,OBJPROP_COLOR,colour);
   ObjectSet(name,OBJPROP_XDISTANCE,x);
   ObjectSet(name,OBJPROP_YDISTANCE,y);
   ObjectSetText(name,text,size,font,colour);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int step=5;// шаг индикации
   int i=(int)(ProfitToday/step);//замените ProfitToday на нужную переменную 
   //----------------------
   if(count_step!=i)
     {
      for(int s=10; s>=i; s--)
        ObjectSet("ind"+string(s),OBJPROP_COLOR,CLR_NONE);
      for(int k=0; k<i; k++)
       ObjectSet("ind"+string(k),OBJPROP_COLOR,clr[k]);
      count_step=i;
     }
  }
//+------------------------------------------------------------------+

Редактирован: 2 октября 2023, 06:46
avatar

  14  verta81 Сообщений: 389

  • 2 октября 2023, 06:43
+
0
Спасибо!)) Это очень даже компактно выглядит) Я попробую применить, и разобраться как это работает. Раньше не встречал таких конструкций…
avatar

  11  FEEX Автор Сообщений: 361 - Владимир

  • 2 октября 2023, 09:27
+
0
В горизонтальной визуализации заменить:
objectCreate("ind"+string(i),30,30+(i*7));

на строчку:
objectCreate("ind"+string(i),30+(i*7),30);

и вместо "-" можно использовать "|" или "."
avatar

  14  verta81 Сообщений: 389

  • 2 октября 2023, 06:52
+
0
Работает))) И вертикальная шкала и горизонтальная!!))

Единственный момент: для горизонтального вывода в этой с троке
<code>objectCreate("ind"+string(i),30+(i*7),30);</code>

умножение не на 7 нужно, а больше, я 17 поставил, тогда расстояния между «кирпичами» без наложения друг на друга получается (см. скрин)
Еще раз спасибо))

P.S. Еще хотел спросить: по этой схеме мы выводим шкалу для одного параметра. А если мы хотим вывести индикацию одновременно для двух, или трех параметров? Как это сделать с использованием этой схемы?)
Редактирован: 2 октября 2023, 15:25
avatar

  11  FEEX Автор Сообщений: 361 - Владимир

  • 2 октября 2023, 14:57
+
0
В функции MeterCreate() добавить еще:
objectCreate("ind2"+string(i),40+(i*7),30);

Где «ind2» Уже имена новых объектов, плюс смещение по оси Х не 30 а 40(например).
Далее в функции OnTick() добавить условие индикации:

if(...)
     {
      for(...)
        ObjectSet("ind2"+string(s),OBJPROP_COLOR,CLR_NONE);
      for(...)
       ObjectSet("ind2"+string(k),OBJPROP_COLOR,clr[k]);
     }
  }


И т.д.
Экспериментируйте.
avatar

  14  verta81 Сообщений: 389

  • 2 октября 2023, 15:47
+
0
перед условием у нас есть еще
<code>int step=5;// шаг индикации
int i=(int)(profitToday/step);</code>

где как раз и выбирается переменная. И тут непонятно.
у меня есть две переменные: profitToday и Pr_01
т.е у меня должна появиться еще строка
<code>int i=(int)(Pr_01/step);</code>

как её добавить в эту конструкцию, чтобы работало?

P.S. При добавлении строки objectCreate(«ind2»+string(i),40+(i*7),30);
сразу ошибка: 'i' — undeclared identifier

P.S.2. еще одна проблемка: выставил ради интересa step=3, шкала заполнилась на макс и тестер отключился с ошибкой в журнале

2023.10.03 11:46:14.937 2023.01.03 13:21:27 Testing pass stopped due to a critical error in the EA
2023.10.03 11:37:20.811 2023.01.03 10:52:38 ZolotoAM2__4 EURUSD,H1: array out of range in 'ZolotoAM2__4.mq4' (631,52)

Как я понял, у нас стоит ограничение на 10 «кирпичей», при попытке нарисовать 11-й — ошибка.
это где-то тут прописано:
<code>void MeterCreate()
  {
   for(int i=0; i<10; i++)
    // objectCreate("ind"+string(i),10,5+(i*7)); // вертикальная шкала
   objectCreate("ind"+string(i),10+(i*17),5); // горизонтальная шкала  
  }</code>


Как оставить 10 кирпичей, т.е. не рисовать 11-й, а просто разрешить работать дальше без ограничений?
Редактирован: 3 октября 2023, 12:04
avatar

  11  FEEX Автор Сообщений: 361 - Владимир

  • 2 октября 2023, 20:00
+
0
не вижу, куда и что Вы вписали.
Давайте весь код, поправлю.
avatar

  14  verta81 Сообщений: 389

  • 3 октября 2023, 20:11
+
0
Дело в том, что я еще ничего никуда не вписывал — эта конструкция даже с одной переменной profitToday уже работает неправильно. После того как отрисовываются все 10 «кирпичей», а значение переменной profitToday продолжает расти, тестер прекращает работу с ошибкой. Т.е. у данной системы нет условия, при котором советник продолжит работу когда все 10 кирпичей отрисуются. Последний нарисованный кирпич не должен быть окончанием работы советника, нужно какое-то условие, при котором после отрисовке 10-го кирпича не зависимо от значения переменной profitToday советник не выдавал бы ошибки в тестере. Сейчас на 10-м кирпиче всё блокируется.
Пока надо как-то вылечить это, но я не могу сообразить как создать нужное условие…
Я ранее писал, что у меня есть рабочий вариант, который я сам слепил, но он очень громоздкий, там на каждый киприч отдельный объект, но там есть и условия на каждый кирпич
<b>if (profitToday > 0)</b>
          {                      
           ProText = "-";
          }
  ObjectCreate("label_object44", OBJ_LABEL, 0, 0, 0);
  ObjectSet("label_object44", OBJPROP_CORNER, 3);
  ObjectSet("label_object44", OBJPROP_XDISTANCE, 10);
  ObjectSet("label_object44", OBJPROP_YDISTANCE, 10);
  ObjectSet("label_object44", OBJPROP_BACK, false);    
  ObjectSetText("label_object44", StringConcatenate(ProText), 42, "Arial", Red);

  <b>if (profitToday > 5.0)</b>
          {                      
           ProText2 = "-";
          }
  ObjectCreate("label_object45", OBJ_LABEL, 0, 0, 0);
  ObjectSet("label_object45", OBJPROP_CORNER, 3); 
  ObjectSet("label_object45", OBJPROP_XDISTANCE, 10);
  ObjectSet("label_object45", OBJPROP_YDISTANCE, 17);
  ObjectSet("label_object45", OBJPROP_BACK, false);    
  ObjectSetText("label_object45", StringConcatenate(ProText2), 42, "Arial", OrangeRed);

И последний «кирпич» с условием if (profitToday > 45.0) — т.е. если значение profitToday > 45.0 то последний «кирпич» отрисуется, и не имеет значения до какой величины profitToday будет дальше расти, все будет работать.
В вашем варианте так пока что не получается…
avatar

  11  FEEX Автор Сообщений: 361 - Владимир

  • 3 октября 2023, 21:04
+
0
самое простое решение
<code>int step=ProfitToday/10;// шаг индикации</code>

Редактирован: 3 октября 2023, 21:09
avatar

  14  verta81 Сообщений: 389

  • 3 октября 2023, 21:09
+
0
avatar

  8  Maxix Сообщений: 59

  • 2 октября 2023, 14:26
+
0

int step=ProfitToday/10;// шаг индикации
int i=(int)(ProfitToday/step);//замените ProfitToday на нужную переменную 
   

или

int step=5;// шаг индикации
int i=(int)(ProfitToday/step);//замените ProfitToday на нужную переменную 
if(i>10) i=10;
avatar

  14  verta81 Сообщений: 389

  • 3 октября 2023, 21:12
+
0
Супер!!! Теперь работает дальше, без ошибок)
int step=5;// шаг индикации
int i=(int)(ProfitToday/step);//замените ProfitToday на нужную переменную 
if(i>10) i=10;

использовал этот вариант.
Теперь второй вопрос: две и более переменных)
Первая ProfitToday
Вторая Pr_01
Как это реализовать?)
avatar

  11  FEEX Автор Сообщений: 361 - Владимир

  • 3 октября 2023, 21:24
+
0
avatar

  14  verta81 Сообщений: 389

  • 3 октября 2023, 21:31
+
0
я там не понял и не увидел имя второй переменной (Pr_01) где прописывать?
Редактирован: 3 октября 2023, 21:34
avatar

  11  FEEX Автор Сообщений: 361 - Владимир

  • 3 октября 2023, 21:33
+
0
Пишите ТЗ
avatar

  14  verta81 Сообщений: 389

  • 3 октября 2023, 21:35
+
0
//+------------------------------------------------------------------+
//|                                                        Meter.mq4 |
//|                                               Copyright 2023,    |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023"
#property link      ""
#property version   ""
#property strict

color clr[10]={Red,OrangeRed,DarkOrange,Orange,Gold,Yellow,GreenYellow,LawnGreen,Lime,Lime};
int count_step=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   MeterCreate();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void MeterCreate()
  {
   for(int i=0; i<10; i++)
     objectCreate("ind"+string(i),30,30+(i*7));
  }
//+------------------------------------------------------------------+
void objectCreate(string name,int x,int y,string text="-",int size=42,
                  string font="Arial",color colour=CLR_NONE)
  {
   ObjectCreate(name,OBJ_LABEL,0,0,0);
   ObjectSet(name,OBJPROP_CORNER,3);
   ObjectSet(name,OBJPROP_COLOR,colour);
   ObjectSet(name,OBJPROP_XDISTANCE,x);
   ObjectSet(name,OBJPROP_YDISTANCE,y);
   ObjectSetText(name,text,size,font,colour);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int step=5;// шаг индикации
   int i=(int)(ProfitToday/step);//замените ProfitToday на нужную переменную 
   if(i>10) i=10; 
   //----------------------
   if(count_step!=i)
     {
      for(int s=10; s>=i; s--)
        ObjectSet("ind"+string(s),OBJPROP_COLOR,CLR_NONE);
      for(int k=0; k<i; k++)
       ObjectSet("ind"+string(k),OBJPROP_COLOR,clr[k]);
      count_step=i;
     }
  }
//+------------------------------------------------------------------+


В эту схему добавить еще одну переменную Pr_01, чтобы в итоге для каждой переменной (ProfitToday и Pr_01) отрисовывалась своя отдельная шкала «кирпичей»

P.S. В коде я уже внес последние изменения:
int step=5;// шаг индикации
int i=(int)(ProfitToday/step);//замените ProfitToday на нужную переменную
if(i>10) i=10;
чтобы все на этом этапе работало правильно)
avatar

  11  FEEX Автор Сообщений: 361 - Владимир

  • 3 октября 2023, 21:44
+
0
Если проще объяснить:

Моя система, с тем же шагом, что и у вас, отрисовыавает всю шкалу на 50 долларах, и дальше, если прибыль продолжает расти, советник продолжает работу без ошибок, т.е. 10 кирпичей нарисовал и работает дальше.
В вашем варианте отрисовал 10 кирпичей, дошли до 50 долларов, и дальше болкируется работа — в журнале ошибка:

2023.10.03 11:46:14.937 2023.01.03 13:21:27 Testing pass stopped due to a critical error in the EA
2023.10.03 11:37:20.811 2023.01.03 10:52:38 ZolotoAM2__4 EURUSD,H1: array out of range in 'ZolotoAM2__4.mq4' (631,52)
avatar

  11  FEEX Автор Сообщений: 361 - Владимир

  • 3 октября 2023, 21:19
+
0
не вижу, что и как Вы написали, по сему не могу решить проблему с ошибкой.
Если Ваша система работает, используйте Вашу.
avatar

  14  verta81 Сообщений: 389

  • 3 октября 2023, 21:22
+
0
Вы уже исправили, я выше ответил)
Теперь второй вопрос: две и более переменных)
Первая ProfitToday
Вторая Pr_01
Как это реализовать?)
Редактирован: 3 октября 2023, 21:30
avatar

  11  FEEX Автор Сообщений: 361 - Владимир

  • 3 октября 2023, 21:25

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий