Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1174

 
Alexey Viktorov:

Второе и следующие измерения массива не могут быть динамическими. Следовательно как объявлен массив, к примеру int Mas[][7]; так и принимать его надо MyFun(int &Mas[][7])

Ага..
Спасибо. Моих мозгов не хватило.
 

Здравствуйте программисты. В очередной раз обращаюсь за Вашей помощью. Есть стандартный индикатор из которго нужно получить единственное значение. Индикатор вроде подключил и скопировал массив его значений в буфер double buf_atr[] Распечатка в журнал ArrayPrint(buf_atr) показывает такие значения:

0.00032 0.00037 0.00039 0.00039 0.00041 0.00039 0.00037 0.00036 0.00034 0.00035 0.00035 0.00035 0.00034 0.00030

КАК МНЕ ОБРАТИТЬСЯ К ЯЧЕЙКЕ МАССИВА В КОТОРОЙ ЗНАЧЕНИЕ 0.00030 ??Получается это значение не на текущей свече 0 а на предыдущей уже сформированной 1

Вроде все работает но как обратиться к ячейке массива для дальнейше работы с ней я не знаю;( 

input int InpPeriod=14;  // period
int handleIndicator; //указатель на индикатор


int OnInit()
{  
  
handleIndicator = iCustom(NULL,0,"Examples\\INDICATOR",InpPeriod);

   return(INIT_SUCCEEDED);
}



void OnTick()

{

int buf_size = 14;
double buf_atr[];

CopyBuffer(handleIndicator,0,0,buf_size,buf_atr);

ArrayPrint(buf_atr);

}
 
Kolya32:

Здравствуйте программисты. В очередной раз обращаюсь за Вашей помощью. Есть стандартный индикатор из которго нужно получить единственное значение. Индикатор вроде подключил и скопировал массив его значений в буфер double buf_atr[] Распечатка в журнал ArrayPrint(buf_atr) показывает такие значения:

0.00032 0.00037 0.00039 0.00039 0.00041 0.00039 0.00037 0.00036 0.00034 0.00035 0.00035 0.00035 0.00034 0.00030

КАК МНЕ ОБРАТИТЬСЯ К ЯЧЕЙКЕ МАССИВА В КОТОРОЙ ЗНАЧЕНИЕ 0.00030 ??Получается это значение не на текущей свече 0 а на предыдущей уже сформированной 1

Вроде все работает но как обратиться к ячейке массива для дальнейше работы с ней я не знаю;( 

void OnTick()

{

int buf_size = 14;
double buf_atr[];

CopyBuffer(handleIndicator,0,0,buf_size,buf_atr);
Print( buf_atr[buf_size-1] ); // Массив начинается с нуля
ArrayPrint(buf_atr);

}
 
Vitaly Muzichenko:
void OnTick()

{

int buf_size = 14;
double buf_atr[];

CopyBuffer(handleIndicator,0,0,buf_size,buf_atr);
Print( buf_atr[buf_size-1] ); // Массив начинается с нуля
ArrayPrint(buf_atr);

}


РАБОТАЕТ УРА!!! НУЖНО ОБРАЩАТЬСЯ К buf_atr[buf_size-1] ЧЕГО Я ТОЛЬКО НЕ ПЕРЕПРОБОВАЛ. БОЛЬШОЕ ВАМ ЧЕЛОВЕЧЕСКОЕ СПАСИБО   Vitaly Muzichenko

 

Обязателен ли mql стиль, array reference ?

(
                                     double &value[],// Buffer of values
                                     double& clr[],                                 // Color buffer
                                     const bool asSeries,                           // Numbering flag as in time series
                                     const string label,                           // Series name
                                     const color& colors[],                        // Line colors )
 
Создал свой класс CAppDialogPTR - наследник от CAppDialog -  подскажите как правильно переопределить объекты m_background, m_caption ... из класса  CDialog для доступа к ним из своего класса?
#property strict
#include <Controls\Dialog.mqh>

class CAppDialogPTR : public CAppDialog
{
private:
   int               m_deinit_reason;
public:
   CAppDialogPTR(void){};
   ~CAppDialogPTR(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);
};

bool CAppDialogPTR::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
{
   m_deinit_reason=WRONG_VALUE;
   bool res = CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2);
   return(res);
}

Dialog.mqh

***
class CDialog : public CWndContainer
  {
private:
   //--- dependent controls
   CPanel            m_white_border;        // the "white border" object
   CPanel            m_background;          // the background object
   CEdit             m_caption;             // the window title object
   CBmpButton        m_button_close;        // the "Close" button object
   CWndClient        m_client_area;         // the client area object
***
 
Peter Vorobyev:
Создал свой класс CAppDialogPTR - наследник от CAppDialog -  подскажите как правильно переопределить объекты m_background, m_caption ... из класса  CDialog для доступа к ним из своего класса?

Dialog.mqh

Никак. Эти объекты закрыты от непосредственного изменения в Вашем классе, о чем говорит ключевое слово private. Работать с ними напрямую нельзя. Используйте методы класса CDialog которые работают с этими полями.

 
Vasiliy Sokolov:

Никак. Эти объекты закрыты от непосредственного изменения в Вашем классе, о чем говорит ключевое слово private. Работать с ними напрямую нельзя. Используйте методы класса CDialog которые работают с этими полями.

Допустим.

У созданного экземпляра класса CAppDialogPTR - есть контролы (класса  CWndContainer -> CWnd*             Control(const int ind)            const { return(dynamic_cast<CWnd *>(m_controls.At(ind))); }) через которые можно получить доступ к m_background, m_caption

1)  Какой синтаксис обращения (ссылки на память) на созданный объект?: 

"CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2);"
 
Peter Vorobyev:

Допустим.

У созданного экземпляра класса CAppDialogPTR - есть контролы (класса  CWndContainer -> CWnd*             Control(const int ind)            const { return(dynamic_cast<CWnd *>(m_controls.At(ind))); } ) через которые можно получить доступ к m_background, m_caption

1)  Какой синтаксис обращения (ссылки на память) на созданный объект?: 

Получить доступ к контралам адресно через коллекцию m_controls Вы все равно не сможете, потому что она также закрыта, к тому же не известно какой именно индекс соответствует тому или иному контролу. Тут идея в том, что CDialog закрывает доступ к элементами из которых он состоит, но дает управлять основными свойствами в согласованном виде. Например обращаться к m_caption и менять его текст напрямую мы не можем, зато можем изменить его текст через метод Caption(const string text).

То, что Вы хотите это хак по сути. В принципе при использовании любой поделки от MQ возникает желание сделать тот или иной хак, поэтому тут Вы не одиноки. Наверное самым простым способом будет скопировать либу в отдельный каталог и переместить private секцию в protected. Это грубо и тупо, но сработает. Другие варианты едва ли - слишком жесткий код.

 
Vasiliy Sokolov:

Получить доступ к контралам адресно через коллекцию m_controls Вы все равно не сможете, потому что она также закрыта, к тому же не известно какой именно индекс соответствует тому или иному контролу. Тут идея в том, что CDialog закрывает доступ к элементами из которых он состоит, но дает управлять основными свойствами в согласованном виде. Например обращаться к m_caption и менять его текст напрямую мы не можем, зато можем изменить его текст через метод Caption(const string text).

То, что Вы хотите это хак по сути. В принципе при использовании любой поделки от MQ возникает желание сделать тот или иной хак, поэтому тут Вы не одиноки. Наверное самым простым способом будет скопировать либу в отдельный каталог и переместить private секцию в protected. Это грубо и тупо, но сработает. Другие варианты едва ли - слишком жесткий код.

Изменить исходники MQ и вытащить методы в публичные понятно что не наш метод :).
Но я могу обратиться в свойствам Caption после объявление глобальной переменной panel:

CAppDialogPTR panel;

            int total=panel.ControlsTotal();
            for(int i=0;i<total;i++)
            {
               CWnd *_control=panel.Control(i);
               string _control_name=_control.Name();

               if(StringFind(_control_name,"Caption")>0)
               {
                  CEdit *_caption=(CEdit*)_control;
                  _caption.Text("test";
                  _caption.Color(clrRed);
                  ChartRedraw();
                  break;
               }
               
             }

Но мало того что это както не красиво выглядит, так этот код за классом CAppDialogPTR. А как аналогично мне сделать тоже самое внутри класса CAppDialogPTR ?