Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1174

 
Alexey Viktorov:

Die zweite und die folgenden Dimensionen eines Arrays können nicht dynamisch sein. Wenn also ein Array deklariert wird, z. B. int Mas[][7]; muss es von MyFun(int &Mas[][7]) übernommen werden

Ja.
Danke. Ich hatte nicht den Verstand dafür.
 

Hallo Programmierer. Wieder einmal bitte ich Sie um Ihre Hilfe. Es gibt einen Standardindikator, von dem ich einen einzelnen Wert erhalten möchte. Ich habe den Indikator verbunden und kopiert ein Array seiner Werte in den Puffer double buf_atr[] Printed to the log ArrayPrint(buf_atr) zeigt diese Werte:

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

WIE WENDE ICH DEN MASSIVEN SCHLÜSSEL AN, DER DEN WERT 0,00030 HAT? Es stellt sich heraus, dass dieser Wert nicht auf der aktuellen Kerze 0 ist und die vorherige bereits gebildet wird 1

Es scheint zu funktionieren, aber wie man auf das Zell-Array zugreifen, um mit ihm weiter zu arbeiten, weiß ich nicht ;(

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:

Hallo Programmierer. Wieder einmal bitte ich Sie um Ihre Hilfe. Ich habe einen Standardindikator, von dem ich einen einzelnen Wert erhalten möchte. Ich habe den Indikator verbunden und kopiert ein Array seiner Werte in den Puffer double buf_atr[] Printed to the log ArrayPrint(buf_atr) zeigt diese Werte:

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

WIE WENDE ICH DEN MASSIVEN SCHLÜSSEL AN, DER DEN WERT 0,00030 HAT? Es stellt sich heraus, dass dieser Wert nicht auf der aktuellen Kerze 0 ist und die vorherige bereits gebildet wird 1

Es scheint zu funktionieren, aber wie man auf das Zell-Array zugreifen, um mit ihm weiter zu arbeiten, weiß ich nicht ;(

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

}


ES FUNKTIONIERT, JUHU!!! Ich muss mich anbuf_atr[buf_size-1] wenden, ich habe ALLES versucht. Vielen Dank an Sie,Vitaly Muzichenko.

 

Ist mql styling obligatorisch, Array-Referenz?

(
                                     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 )
 
ErstelltCAppDialogPTR Klasse - Nachkomme von CAppDialog - beraten, wie man richtig überschreiben m_background, m_caption ... von der Klasse CDialog, um sie von meiner Klasse aus zu erreichen?
#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:
ErstelltCAppDialogPTR Klasse - Nachkomme von CAppDialog - beraten, wie man richtig überschreiben m_background, m_caption ... von der Klasse CDialog, um sie von meiner Klasse aus zu erreichen?

Dialog.mqh.

Das können Sie nicht. Diese Objekte sind gegen direkte Änderungen in Ihrer Klasse gesperrt, was durch das Schlüsselwort private angezeigt wird. Sie können nicht direkt mit ihnen arbeiten. Verwenden Sie Methoden der Klasse CDialog, die mit diesen Feldern arbeiten.

 
Vasiliy Sokolov:

Das können Sie nicht. Diese Objekte sind gegen direkte Änderungen in Ihrer Klasse gesperrt, was durch das Schlüsselwort private angezeigt wird. Sie können nicht direkt mit ihnen arbeiten. Verwenden Sie Methoden Ihrer CDialog-Klasse, die mit diesen Feldern arbeiten.

Nehmen wir an.

Eine erstellte Instanz derCAppDialogPTR-Klasse hat Steuerelemente (CWndContainer-Klasse-> CWnd* Control(const int ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind)); }) über die aufm_background, m_caption zugegriffen werden kann

1) Wie lautet die Syntax für den Zugriff auf das erstellte Objekt (Bezugnahme auf den Speicher)?

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

Angenommen.

Eine erstellte Instanz derCAppDialogPTR-Klasse hat Steuerelemente (CWndContainer-Klasse -> CWnd* Control(const int ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind)); } ), über die aufm_background, m_caption zugegriffen werden kann

1) Wie lautet die Syntax für den Zugriff auf das erstellte Objekt (Bezugnahme auf den Speicher)?

Auf die Kondensstreifen kann man immer noch nicht adressierbar über die m_controls-Sammlung zugreifen, da diese ebenfalls geschlossen ist, außerdem weiß man nicht, welcher Index welchem bestimmten Steuerelement entspricht. Die Idee ist, dass CDialog den Zugriff auf die Elemente, aus denen es besteht, sperrt, es Ihnen aber erlaubt, seine Haupteigenschaften konsistent zu verwalten. Zum Beispiel können wir nicht direkt auf m_caption zugreifen, aber wir können seinen Text mit der Methode Caption(const string text) ändern.

Was Sie wollen, ist im Grunde genommen ein Hack. Im Prinzip möchte man bei der Verwendung jedes MQ-Tools diesen oder jenen Hack machen, damit sind Sie nicht allein. Am einfachsten ist es wahrscheinlich, die Bibliothek in ein separates Verzeichnis zu kopieren und den privaten Bereich nach protected zu verschieben. Das ist grob und dumm, aber es wird funktionieren. Andere Optionen sind unwahrscheinlich - zu harter Code.

 
Vasiliy Sokolov:

Über die m_controls-Sammlung können Sie ohnehin nicht auf die Gegenstücke zugreifen, da sie ebenfalls geschlossen ist. Außerdem wissen Sie nicht, welcher Index welchem Steuerelement entspricht. Die Idee ist, dass CDialog den Zugriff auf die Elemente, aus denen es besteht, sperrt, es Ihnen aber erlaubt, die wichtigsten Eigenschaften konsistent zu verwalten. Zum Beispiel können wir nicht direkt auf m_caption zugreifen, aber wir können seinen Text mit der Methode Caption(const string text) ändern.

Was Sie wollen, ist im Grunde genommen ein Hack. Im Prinzip möchte man bei der Verwendung jedes MQ-Tools diesen oder jenen Hack machen, damit sind Sie nicht allein. Am einfachsten ist es wahrscheinlich, die Bibliothek in ein separates Verzeichnis zu kopieren und den privaten Bereich nach protected zu verschieben. Das ist grob und dumm, aber es wird funktionieren. Die anderen Optionen werden wahrscheinlich nicht funktionieren, weil der Code zu schwierig ist.

Die Änderung des MQ-Quellcodes und die Freigabe von Methoden für die Öffentlichkeit ist eindeutig nicht unsere Methode :).
Aber ich kann nach der Deklaration der globalen Variablen panel auf die Eigenschaften von Caption verweisen:

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

Aber nicht nur das sieht unschön aus, sondern auch dieser Code hinter derCAppDialogPTR-Klasse. Wie kann ich dasselbe innerhalb der KlasseCAppDialogPTRtun?

Grund der Beschwerde: