Советники: All information about the symbol 2 - страница 2

 
Vitaly Muzichenko:

Не корректно задал вопрос.

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


В коде изменил размер списка:

-------------

В код добавил:

Не знаю, по моему панели - они вообще не динамические.

 
Vladimir Karputov:

Не знаю, по моему панели - они вообще не динамические.

Попробуйте изменённый мной код, там совсем малость.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Советники: All information about the symbol 2

Vitaly Muzichenko, 2021.02.23 13:06

Не корректно задал вопрос.

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


В коде изменил размер списка:

//+------------------------------------------------------------------+
//| Create the "ListView" element                                    |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateListView()
  {
//--- coordinates
   int x1=0;
   int y1=0;
   int x2=ClientAreaWidth();
   int y2=ClientAreaHeight();
//--- create
   if(!m_list_view.Create(m_chart_id,m_name+"ListView",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!Add(m_list_view))
      return(false);
//--- fill out with strings
   for(int i=0; i<16; i++)
      if(!m_list_view.AddItem("Item "+IntegerToString(i)))
         return(false);
//--- succeed
   return(true);
  }

-------------

В код добавил:

void OnChartEvent(const int id,         // event ID
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
//--- keypress
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch((int)lparam)
        {
         case KEY_NUMPAD_5:
            Print("Pressed KEY_NUMPAD_5");
            ExtDialog.Resize();
            break;
         default:
            Print("Pressed unlisted key");
        }
     }
   /*//--- left-clicking on a chart
      if(id==CHARTEVENT_CLICK)
         ExtDialog.Resize();*/
  if(id==CHARTEVENT_CHART_CHANGE)
     {
      if(ExtDialog.Height()>40) // Если окно не свёрнуто
        {
         ExtDialog.Height((int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS)-50); // Изменим высоту диалог-окна
         ExtDialog.Resize();
        }
     }
  }

----

Осталось только сделать перерисовку контента по высоте, исходя из количества элементов. Эту задачу осилить не могу.

 
Vitaly Muzichenko:

Попробуйте изменённый мной код, там совсем малость.

----

Осталось только сделать перерисовку контента по высоте, исходя из количества элементов. Эту задачу осилить не могу.

Может не нужно динамический? сделать 5 типоразмеров панели, и в зависимости от размера панели менять величину шрифта контента. Здесь вроде относительные проценты по ширине / высоте не работают, а шрифты задаются явно.

 
Valeriy Yastremskiy:

Может не нужно динамический? сделать 5 типоразмеров панели, и в зависимости от размера панели менять величину шрифта контента. Здесь вроде относительные проценты по ширине / высоте не работают, а шрифты задаются явно.

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

Что нужно конкретно от панели:

Есть 5 открытых позиций, высота графика 400. Каждая строка забирает 20, итого 5*20=100

Высота окна графика 400, значит выводим в диалог-окне 5 позиций без скролла, то есть - все будут видимые.

Открылись ещё 15 позиций+5 текущих, итого нужна ширина 20*20=400.

У нас ширина графика 400, места нужно 400, значит выводим все без скролла - видимые.

Открылось ещё 5 позиций: 25*20=500. Но места у нас всего 400, значит остальные 5 прячем за скроллом.

Если меняем окно графика в большую сторону, то показываем столько, сколько возможно, если окно графика по высоте стянули до 100, то показываем 100/20=5, то есть 5 позиций, остальные за скроллом.

Задача не сложная вроде, но как реализовать вывод позиций. Само окно менять по высоте возможно, что показано в коде

  if(id==CHARTEVENT_CHART_CHANGE)
     {
      if(ExtDialog.Height()>40) // Если окно не свёрнуто
        {
         ExtDialog.Height((int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS)-50); // Изменим высоту диалог-окна
         // ExtDialog.Resize();
        }
     }
  }

---

Осталось изменить вывод содержимого

 
Vladimir Karputov:

Ваш код крутил по-разному - ничего не получилось (

   

Очень надеюсь на ответ!

Запустите индикатор, потом растяните график по высоте и смените таймфрейм, строки заполнятся "как нужно"

После этого сожмите график и снова переключите таймфрейм - всё станет "как нужно"

Теперь вопрос: Что добавить в код, чтобы работало по событию CHARTEVENT_CHART_CHANGE, а не по смене таймфрейма?

Код прилагаю:

//+------------------------------------------------------------------+
//|                                                        mq4 | mq5 |
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\ListView.mqh>

//+------------------------------------------------------------------+
//| Class CPanelDialog                                               |
//| Usage: main dialog of the SimplePanel application                |
//+------------------------------------------------------------------+
class CPanelDialog : public CAppDialog
  {
public:
   CListView         m_list_view1; // the list object
   CListView         m_list_view2; // the list object

public:
                     CPanelDialog(void);
                    ~CPanelDialog(void);

   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
   virtual void      OnChangeListView(void);

protected:
   bool              CreateListView(void);
   virtual bool      OnResize(void);
   bool              OnDefault(const int id,const long &lparam,const double &dparam,const string &sparam);
  };

//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CPanelDialog)
ON_EVENT(ON_CHANGE,m_list_view1,OnChangeListView)
//ON_OTHER_EVENTS(OnDefault)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CPanelDialog::CPanelDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CPanelDialog::~CPanelDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Create                                                           |
//+------------------------------------------------------------------+
bool CPanelDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
  {
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- create dependent controls
   if(!CreateListView())
      return(false);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Create the "ListView" element                                    |
//+------------------------------------------------------------------+
bool CPanelDialog::CreateListView(void)
  {
//--- coordinates
   int x1=0;
   int y1=0;
   int x2=ClientAreaWidth();
   int y2=ClientAreaHeight();
//--- create
   m_list_view1.Create(0,m_name+"ListView",0,x1,y1,x2,y2);
   Add(m_list_view1);
   m_list_view1.Alignment(WND_ALIGN_HEIGHT,0,0,0,0);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Handler of resizing                                              |
//+------------------------------------------------------------------+
bool CPanelDialog::OnResize(void)
  {
//--- call method of parent class
   if(!CAppDialog::OnResize())
      return(false);

//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CPanelDialog::OnChangeListView(void)
  {

  }
//+------------------------------------------------------------------+
//| Rest events handler                                                    |
//+------------------------------------------------------------------+
bool CPanelDialog::OnDefault(const int id,const long &lparam,const double &dparam,const string &sparam)
  {

   return(false);
  }

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#property version "1.00"
#property strict

#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0

string symbols[];
int MarkWatch=0;
//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
CPanelDialog ExtDialog;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
// ExtDialog = new CPanelDialog;
//--- create application dialog
   if(!ExtDialog.Create(0,"Spread",0,5,15,250,(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS)-20))
      return(INIT_FAILED);
//--- run application
   if(!ExtDialog.Run())
      return(INIT_FAILED);

   MarkWatch=MarketWatch(); // Заполним массив символами
   for(int i=0; i<MarkWatch; i++)
     {
      string str = (string)(i+1)+" из "+(string)MarkWatch+": "+symbols[i]+" = "+(string)SymbolInfoInteger(symbols[i],SYMBOL_SPREAD);
      ExtDialog.m_list_view1.ItemAdd(str); // Заполним строками
     }

//--- ok
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy application dialog
   ExtDialog.Destroy(reason);
// delete ExtDialog;
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   for(int i=0; i<MarkWatch; i++)
     {
      string str = (string)(i+1)+" из "+(string)MarkWatch+": "+symbols[i]+" = "+(string)SymbolInfoInteger(symbols[i],SYMBOL_SPREAD);
      ExtDialog.m_list_view1.ItemUpdate(i,str);
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {

   if(id==CHARTEVENT_CHART_CHANGE)
     {
      if(ExtDialog.m_list_view1.IsVisible()) // Если окно не свёрнуто
        {
         MarkWatch=MarketWatch();
         ExtDialog.Height((int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS)-35); // Изменим высоту диалог-окна
        }
     }

   ExtDialog.OnEvent(id,lparam,dparam,sparam);
//---
  }

//+--- Список символов с MarketWatch --------------------------------+
int MarketWatch()
  {
   int s=SymbolsTotal(false), c=0;
   for(int i = 0; i < s; i++)
     {
      if(SymbolInfoInteger(SymbolName(i,false),SYMBOL_TRADE_CALC_MODE)!=0)
         continue;
      if(c==20)
         return(c);
      c++;
      ArrayResize(symbols,c);
      symbols[c-1] = SymbolName(i,false);
     }
   return(c);
  }
//+------------------------------------------------------------------+
 

Решил то, что хотел, немного кривое решение, но работает как предполагалось.

В панель можно подставлять любые данные, сейчас вывод спреда по первым 20 инструментам с общего списка MarketWatch

//+------------------------------------------------------------------+
//|                                                        mq4 | mq5 |
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\ListView.mqh>

//+------------------------------------------------------------------+
//| Class CPanelDialog                                               |
//| Usage: main dialog of the SimplePanel application                |
//+------------------------------------------------------------------+
class CPanelDialog : public CAppDialog
  {
public:
   CListView         m_list_view1; // the list object
   CListView         m_list_view2; // the list object
public:
                     CPanelDialog(void);
                    ~CPanelDialog(void);
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
   virtual void      OnChangeListView(void);

protected:
   bool              CreateListView(void);
   virtual bool      OnResize(void);
  };

//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CPanelDialog)
ON_EVENT(ON_CHANGE,m_list_view1,OnChangeListView)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CPanelDialog::CPanelDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CPanelDialog::~CPanelDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Create                                                           |
//+------------------------------------------------------------------+
bool CPanelDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
  {
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- create dependent controls
   if(!CreateListView())
      return(false);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Create the "ListView" element                                    |
//+------------------------------------------------------------------+
bool CPanelDialog::CreateListView(void)
  {
//--- coordinates
   int x1=0;
   int y1=0;
   int x2=ClientAreaWidth();
   int y2=ClientAreaHeight();
//--- create
   m_list_view1.Create(0,m_name+"ListView",0,x1,y1,x2,y2);
   Add(m_list_view1);
   m_list_view1.Alignment(WND_ALIGN_HEIGHT,0,0,0,0);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Handler of resizing                                              |
//+------------------------------------------------------------------+
bool CPanelDialog::OnResize(void)
  {
//--- call method of parent class
   if(!CAppDialog::OnResize())
      return(false);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CPanelDialog::OnChangeListView(void)
  {
//Alert("=");
  }

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#property version "1.00"
#property strict

#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0

string symbols[];
int MarkWatch=0;
int CurrentCH;
//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
CPanelDialog *ExtDialog;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   Update();

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy application dialog
   ExtDialog.Destroy(reason);
   delete ExtDialog;
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   Start();

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Start()
  {
   for(int i=0; i<MarkWatch; i++)
     {
      string str = (string)(i+1)+" из "+(string)MarkWatch+": "+symbols[i]+" = "+(string)SymbolInfoInteger(symbols[i],SYMBOL_SPREAD);
      ExtDialog.m_list_view1.ItemUpdate(i,str);
     }
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      if(ExtDialog.m_list_view1.IsVisible()) // Если окно не свёрнуто
        {
         if(CurrentCH!=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS))
           {
            #ifdef __MQL5__
            mySleep(1000);
            #endif
            ExtDialog.Destroy(REASON_CHARTCHANGE);
            delete ExtDialog;
            Update();
            ChartRedraw();
           }
        }
     }
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
//---
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Update()
  {
   ExtDialog = new CPanelDialog;
   MarkWatch=MarketWatch(); // Элементов в массиве
   int ChartHeight=CurrentCH=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);
   ChartHeight=ChartHeight<90?70:MarkWatch*20<ChartHeight-20?(MarkWatch+3)*19-(MarkWatch+5):ChartHeight-10;
   ExtDialog.Create(0,"Spread",0,5,20,200,ChartHeight);
   ExtDialog.Run();
//--
   for(int i=0; i<MarkWatch; i++)
     {
      string str = (string)(i+1)+" из "+(string)MarkWatch+": "+symbols[i]+" = "+(string)SymbolInfoInteger(symbols[i],SYMBOL_SPREAD);
      ExtDialog.m_list_view1.ItemAdd(str); // Заполним строками
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int MarketWatch()
  {
   int s=SymbolsTotal(false), c=0;
   for(int i = 0; i < s; i++)
     {
      if(SymbolInfoInteger(SymbolName(i,false),SYMBOL_TRADE_CALC_MODE)!=0)
         continue;
      if(c==20)
         return(c);
      c++;
      ArrayResize(symbols,c);
      symbols[c-1] = SymbolName(i,false);
     }
   return(c);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void mySleep(int msec)
  {
   uint now=GetTickCount();
   while(GetTickCount()<(now+msec))
     {
      for(int i=0; i<10000; i++)
        {
         double f=1;
         f*=f;
         f+=f;
        }
     }
   return;
  }
//+------------------------------------------------------------------+

---

Если есть более ровное решение, буду рад его принять.

Всем спасибо!

 
Смена таймфрейма - это полное пересоздание. И похоже пока самое надежное, о чем я говорил в самом начале.
 
Vladimir Karputov:
Смена таймфрейма - это полное пересоздание. И похоже пока самое надежное, о чем я говорил в самом начале.

Ну другой способ не нашёл, чтобы работало как хочется.

Конечно, то что панель уходит на первоначальное место, а не стоит куда поставили - нехорошо, но увы.

---

P.S. Подскажите, где выставить значение, чтобы при сворачивании она была ниже, а то сейчас "лезет" под кнопки

В раскрытом виде нормальное позиционирование:


В свёрнутом сильно высоко - нужно чем-то опустить:


 
Vitaly Muzichenko:

Ну другой способ не нашёл, чтобы работало как хочется.

Конечно, то что панель уходит на первоначальное место, а не стоит куда поставили - нехорошо, но увы.

---

P.S. Подскажите, где выставить значение, чтобы при сворачивании она была ниже, а то сейчас "лезет" под кнопки

В раскрытом виде нормальное позиционирование:


В свёрнутом сильно высоко - нужно чем-то опустить:


Вот здесь что-то было:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Советники: Open Close Panel 2 Reverse

Vladimir Karputov, 2020.05.26 16:17

Панель версии 2.002 - благодаря статье 

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


  


 

Вот эти строки:

//---
#include <Controls\Defines.mqh>
#undef CONTROLS_DIALOG_MINIMIZE_LEFT
#undef CONTROLS_DIALOG_MINIMIZE_TOP
//---
#define CONTROLS_DIALOG_MINIMIZE_LEFT  150
#define CONTROLS_DIALOG_MINIMIZE_TOP   150
//---