Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 1174

 
Alexey Viktorov :

Bir dizinin ikinci ve sonraki boyutları dinamik olamaz. Bu nedenle bir dizi nasıl bildirilir, örneğin int Mas[][7]; bu yüzden kabul etmeniz gerekiyor MyFun(int &Mas[][7])

Evet..
Teşekkür ederim. Beynim gitmişti.
 

Merhaba programcılar. Bir kez daha yardımınızı rica ediyorum. Tek bir değer almanız gereken standart bir gösterge vardır. Gösterge bağlamış ve değerlerinin dizisini double buf_atr[] tamponuna kopyalamış gibi görünüyor ArrayPrint (buf_atr) günlüğünün çıktısı aşağıdaki değerleri gösteriyor:

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

DEĞERİN 0,00030 OLDUĞU DİZİN HÜCRESİNE NASIL UYGULANIR? Bu değer, mevcut mum 0'da değil, daha önce oluşturulmuş 1 mumda elde edilir.

Her şey çalışıyor gibi görünüyor, ancak daha fazla çalışmak için dizi hücresine nasıl erişeceğimi bilmiyorum;(

 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 :

Merhaba programcılar. Bir kez daha yardımınızı rica ediyorum. Tek bir değer almanız gereken standart bir gösterge vardır. Gösterge, değerlerinin dizisini çift buf_atr[] arabelleğine bağlamış ve kopyalamış görünüyor: ArrayPrint(buf_atr) günlüğünün çıktısı aşağıdaki değerleri gösteriyor:

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

DEĞERİN 0,00030 OLDUĞU DİZİN HÜCRESİNE NASIL UYGULANIR? Bu değer, mevcut mum 0'da değil, daha önce oluşturulmuş 1 mumda elde edilir.

Her şey çalışıyor gibi görünüyor, ancak daha fazla çalışmak için dizi hücresine nasıl erişeceğimi bilmiyorum;(

 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);

}


İŞLER Yaşasın!!! SADECE DENEYMEDİĞİM buf_atr[buf_size- 1 ] ADRESİNE BAŞVURMANIZ GEREKİYOR. ÇOK TEŞEKKÜR EDERİM Vitaly Muzichenko

 

mql stili, dizi referansı gerekli mi?

(
                                     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 )
 
Kendi sınıfımı CAppDialogPTR'yi yarattım - CAppDialog'un halefi - CDialog sınıfındaki m_background, m_caption ... nesnelerini onlara sınıfınızdan erişmek için nasıl düzgün bir şekilde geçersiz kılacağımı söyleyin?
 #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);
}

iletişim.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 :
Kendi sınıfım CAppDialogPTR'yi yarattım - CAppDialog'un halefi - CDialog sınıfındaki m_background, m_caption ... nesnelerini onlara sınıfımdan erişmek için nasıl doğru bir şekilde geçersiz kılacağımı söyle?

iletişim.mqh

Mümkün değil. Bu nesneler, private anahtar sözcüğüyle belirtildiği gibi, sınıfınızda doğrudan değiştirilmeye karşı korunur. Onlarla doğrudan çalışamazsınız. Bu alanlarla çalışan CDialog sınıfı yöntemlerini kullanın.

 
Vasiliy Sokolov :

Mümkün değil. Bu nesneler, private anahtar sözcüğüyle belirtildiği gibi, sınıfınızda doğrudan değiştirilmeye karşı korunur. Onlarla doğrudan çalışamazsınız. Bu alanlarla çalışan CDialog sınıfı yöntemlerini kullanın.

Diyelimki.

CAppDialogPTR sınıfının oluşturulan örneğinde, erişebileceğiniz denetimler (sınıfın CWndContainer -> CWnd* Control(const int ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind))); } ) bulunur . m_background, m_caption

1) Oluşturulan nesneye erişim (bellek referansları) için sözdizimi nedir?:

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

Diyelimki.

CAppDialogPTR sınıfının oluşturulan örneğinde, erişebileceğiniz denetimler (sınıfın CWndContainer -> CWnd* Control(const int ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind))); } ) bulunur . m_background, m_caption

1) Oluşturulan nesneye erişim (bellek referansları) için sözdizimi nedir?:

Yine de m_controls koleksiyonu aracılığıyla kontrollere erişim elde edemezsiniz, çünkü o da kapalıdır, ayrıca hangi indeksin şu veya bu kontrole karşılık geldiği bilinmemektedir. Buradaki fikir, CDialog'un içerdiği öğelere erişimi kapatması, ancak ana özellikleri tutarlı bir şekilde yönetmenize izin vermesidir. Örneğin, m_caption'a erişip metnini doğrudan değiştiremeyiz, ancak metnini Caption(const string text) yöntemiyle değiştirebiliriz.

İstediğiniz şey temelde bir hack. Prensip olarak, MQ'dan herhangi bir zanaat kullanırken, bunu veya bu hack'i yapma arzusu vardır, bu yüzden burada yalnız değilsiniz. Muhtemelen en kolay yol, lib'i ayrı bir dizine kopyalamak ve özel bölümü korumalı'ya taşımak olacaktır. Kaba ve aptalca ama işe yarayacak. Diğer seçenekler zor - çok zor kod.

 
Vasiliy Sokolov :

Yine de m_controls koleksiyonu üzerinden kontrollere erişemeyeceksiniz çünkü o da kapalı ve hangi indeksin hangi kontrole karşılık geldiği bilinmiyor. Buradaki fikir, CDialog'un içerdiği öğelere erişimi kapatması, ancak ana özellikleri tutarlı bir şekilde yönetmenize izin vermesidir. Örneğin, m_caption'a erişip metnini doğrudan değiştiremeyiz, ancak metnini Caption(const string text) yöntemiyle değiştirebiliriz.

İstediğiniz şey temelde bir hack. Prensip olarak, MQ'dan herhangi bir zanaat kullanırken, bunu veya bu hack'i yapma arzusu vardır, bu yüzden burada yalnız değilsiniz. Muhtemelen en kolay yol, lib'i ayrı bir dizine kopyalamak ve özel bölümü korumalı'ya taşımak olacaktır. Kaba ve aptalca ama işe yarayacak. Diğer seçenekler zor - çok zor kod.

MQ kaynaklarını değiştirin ve yöntemleri herkese açık hale getirin, bunun bizim yöntemimiz olmadığı açık :).
Ancak panel global değişkenini bildirdikten sonra Caption özelliklerine erişebilirim:

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 ;
               }
               
             }

Ancak bir şekilde hoş görünmekle kalmaz, bu kod CAppDialogPTR sınıfının arkasındadır. Aynı şeyi CAppDialogPTR sınıfı içinde nasıl yapabilirim ?