초보자의 질문 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.00035

값이 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.00035

값이 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 스타일, 배열 참조가 필요합니까?

(
                                     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의 후계자입니다. CDialog 클래스에서 m_background, m_caption ... 개체를 올바르게 재정의하여 내 클래스에서 액세스하는 방법을 알려주세요.
 #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의 후계자입니다. CDialog 클래스에서 m_background, m_caption ... 개체를 올바르게 재정의하여 내 클래스에서 액세스하는 방법을 알려주세요.

Dialog.mqh

안 돼요. 이러한 개체는 private 키워드로 표시된 대로 클래스에서 직접 수정되지 않도록 보호됩니다. 당신은 그들과 직접 일할 수 없습니다. 이러한 필드와 함께 작동 하는 CDialog 클래스 메서드를 사용하십시오.

 
Vasiliy Sokolov :

안 돼요. 이러한 개체는 private 키워드로 표시된 대로 클래스에서 직접 수정되지 않도록 보호됩니다. 당신은 그들과 직접 일할 수 없습니다. 이러한 필드와 함께 작동 하는 CDialog 클래스 메서드를 사용하십시오.

의 말을하자.

CAppDialogPTR 클래스의 생성된 인스턴스에는 액세스할 수 있는 컨트롤(클래스 CWndContainer -> CWnd* Control(const 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 ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind))); } )이 있습니다 . m_background, m_caption

1) 생성된 객체에 접근(메모리 참조)을 위한 구문은 무엇입니까?:

m_controls 컬렉션도 닫혀 있고 어떤 인덱스가 하나 또는 다른 컨트롤에 해당하는지 알 수 없기 때문에 여전히 m_controls 컬렉션을 통해 콘트랄에 액세스할 수 없습니다. 여기서 아이디어는 CDialog 가 구성하는 요소에 대한 액세스를 닫지만 사용자가 일관된 방식으로 주요 속성을 관리할 수 있도록 한다는 것입니다. 예를 들어 m_caption에 액세스하여 해당 텍스트를 직접 변경할 수 없지만 Caption(const string text) 메서드를 통해 텍스트를 변경할 수 있습니다.

당신이 원하는 것은 기본적으로 해킹입니다. 원칙적으로 MQ의 공예품을 사용할 때 이런 저런 해킹을 하고 싶은 욕구가 있으므로 여기에서 당신은 혼자가 아닙니다. 아마도 가장 쉬운 방법은 lib를 별도의 디렉토리에 복사하고 private 섹션을 protected로 이동하는 것입니다. 조잡하고 어리석은 일이지만 효과가 있을 것입니다. 다른 옵션은 거의 - 너무 어려운 코드입니다.

 
Vasiliy Sokolov :

m_controls 컬렉션도 닫혀 있고 어떤 인덱스가 하나 또는 다른 컨트롤에 해당하는지 알 수 없기 때문에 여전히 m_controls 컬렉션을 통해 contral에 액세스할 수 없습니다. 여기서 아이디어는 CDialog가 구성하는 요소에 대한 액세스를 닫지만 사용자가 일관된 방식으로 주요 속성을 관리할 수 있도록 한다는 것입니다. 예를 들어 m_caption에 액세스하여 해당 텍스트를 직접 변경할 수 없지만 Caption(const string text) 메서드를 통해 텍스트를 변경할 수 있습니다.

당신이 원하는 것은 기본적으로 해킹입니다. 원칙적으로 MQ의 공예품을 사용할 때 이런 저런 해킹을 하고 싶은 욕구가 있으므로 여기에서 당신은 혼자가 아닙니다. 아마도 가장 쉬운 방법은 lib를 별도의 디렉토리에 복사하고 private 섹션을 protected로 이동하는 것입니다. 조잡하고 어리석은 일이지만 효과가 있을 것입니다. 다른 옵션은 거의 - 너무 어려운 코드입니다.

MQ 소스를 변경하고 메서드를 공개로 가져옵니다. 이것이 우리의 메서드가 아니라는 것이 분명합니다. :)
그러나 패널 전역 변수 를 선언한 후 Caption 속성에 액세스할 수 있습니다.

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 클래스 내에서 어떻게 동일한 작업을 수행할 수 있습니까?

 

사유: