Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 508

 
Ich habe allen möglichen Unsinn wie Indikatorparameter usw. als Parameter in meiner Klasse. Im Allgemeinen sind es Dinge, die statisch und gleich bleiben. Warum also sollte ich diese Werte jedes Mal übergeben, wenn ich ein Objekt erstelle?
 
STARIJ:

ist das kürzer? bool barup=... WindowRedraw(); wird trotzdem ausgeführt - übernommen aus if

es kann auch kürzer sein ... siehe meine Datei

Ich danke Ihnen. Wie stelle ich das Intervall, in dem die Fibo-Levels gezeichnet werden, richtig ein? Wenn es (Zeit) 9.00 Uhr ist, sollte es von 8.00 bis 8.59 Uhr auf М1 zeichnen.
 
Juer:

Irgendwie ist die Aussage der Frage doch klar, oder? Es geht darum, dieselbe Sache zu initialisieren.

Wie wollen Sie etwas initialisieren, das noch nicht existiert? Nachdem das Objekt erstellt wurde, beginnt es zu existieren, und erst dann kann es initialisiert werden.

Ich habe es Ihnen gleich gesagt: Machen Sie aus einem Objekt einen parametrischen Konstruktor, und übergeben Sie ihm die erforderlichen Parameter, die zur Initialisierung des neu erstellten Objekts verwendet werden sollen.

Sie können Parameter über eine Struktur übergeben, die Sie in OnInit() des Programms mit den erforderlichen (für alle derartigen Objekte konstanten) Daten füllen. Dann erstellen Sie beispielsweise in OnTick() oder in jedem anderen Standard-Handler Ihre Objekte, aber wenn Sie sie erstellen, schreiben Sie Folgendes:
CMyObject object = new CMyObject(a_here_structure_with_set_parameters);

Oder, wenn sich die Objektdaten von Programm zu Programm nicht ändern und immer die gleichen Werte haben, dann initialisieren Sie sie explizit mit den erforderlichen Parametern im Konstruktor über die Initialisierungsliste, wie Igor oben sagte:

Forum über Handel, automatisierte Handelssysteme und Strategietests

Alle Fragen von Neulingen zu MQL4, Hilfe und Diskussion über Algorithmen und Codes

Ihor Herasko, 2018.03.28 17:31

Dies geschieht in der Initialisierungsliste, die sich im Klassenkonstruktor befindet:

class CCandle
{
   int      m_nA;
   double   m_fB;
   datetime m_dtC;


   void CCandle::CCandle(void);
};

CCandle::CCandle(void)
            : m_nA(0)
            , m_fB(0.0)
            , m_dtC(0)
{
}

 
Artyom Trishkin:

Wie wollen Sie etwas initialisieren, das noch nicht existiert? Nachdem das Objekt erstellt wurde, beginnt es zu existieren, und erst dann kann es initialisiert werden.

Ich habe es Ihnen gleich gesagt: Machen Sie aus einem Objekt einen parametrischen Konstruktor, und übergeben Sie ihm die erforderlichen Parameter, die zur Initialisierung des neu erstellten Objekts verwendet werden.

Sie können Parameter über eine Struktur übergeben, die Sie in OnInit() des Programms mit den erforderlichen (für alle derartigen Objekte konstanten) Daten füllen werden. Dann erstellen Sie z. B. in OnTick() oder in jedem anderen Standard-Handler Ihre Objekte, aber bei der Erstellung schreiben Sie Folgendes:
CMyObject object = new CMyObject(a_here_structure_with_set_parameters);

Ja, ich verstehe. Ich danke Ihnen. Nun, irgendwie dachte ich, es gäbe eine Lösung, damit ein Objekt, wenn es erstellt wird, sofort einige voreingestellte Parameter hat, ohne sie an den Konstruktor oder was auch immer übergeben zu müssen. Durch einen Elternkurs oder so.

 
Juer:
In meiner Klasse habe ich alle möglichen Dinge wie Indikatorparameter usw. als Parameter. Im Allgemeinen sind es Dinge, die statisch und gleich bleiben. Warum also sollte ich diese Werte jedes Mal übergeben, wenn ich ein Objekt erstelle?

Geben Sie es also nicht weiter. Initialisieren in der Initialisierungsliste, wie ich gezeigt habe. Bei der Erstellung einer Instanz der Klasse wird automatisch der Klassenkonstruktor aufgerufen, der alle in der Initialisierungsliste angegebenen Mitglieder der Klasse initialisiert. Fügen Sie die Funktion Print in die CCandle-Methode ein, und Sie werden sehen, dass der Konstruktor ohne einen Verweis auf ihn aufgerufen wird.

 
Juer:

Ja, ich verstehe. Ich danke Ihnen. Nun, irgendwie dachte ich, es gäbe eine Lösung, so dass, wenn ein Objekt erstellt wird, würde es einige voreingestellte Parameter sofort haben, ohne sie an den Konstruktor oder was auch immer zu übergeben. Über eine übergeordnete Klasse oder so.

Nochmals. Sie können dies tun, ohne die Daten an den Konstruktor zu übergeben.

 
Ihor Herasko:

Geben Sie es also nicht weiter. Initialisieren in der Initialisierungsliste, wie ich gezeigt habe. Bei der Erstellung einer Instanz der Klasse wird automatisch der Klassenkonstruktor aufgerufen, der alle in der Initialisierungsliste angegebenen Mitglieder der Klasse initialisiert. Legen Sie die Print-Funktion in die CCandle-Methode, und Sie werden sehen, dass der Konstruktor ohne Verweis auf ihn aufgerufen wird.

Ich verstehe es nicht, welchen Unterschied macht es, ob man sie durch den Konstruktor oder durch die Initialisierungsfunktion übergibt?

 
Ihor Herasko:

Geben Sie es also nicht weiter. Initialisieren in der Initialisierungsliste, wie ich gezeigt habe. Bei der Erstellung einer Instanz der Klasse wird automatisch der Klassenkonstruktor aufgerufen, der alle in der Initialisierungsliste angegebenen Mitglieder der Klasse initialisiert. Fügen Sie die Print-Funktion in die CCandle-Methode ein und sehen Sie, wie der Konstruktor aufgerufen wird, ohne dass ein Verweis darauf besteht.

Womit sollen sie initialisiert werden? Mit welchen Werten? Das verstehe ich nicht.

Angenommen, ich habe Anfangswerte in den Eingabeparametern des Expert Advisors. Ich muss sie also an jedes Objekt der Klasse weitergeben. Aber nicht, um sie an jedes neu erstellte Objekt zu übergeben.

 

Wie kommt es, dass in diesem Zyklus meine Limit-Order nur dann gelöscht wird, wenn nach der Platzierung einer Limit-Order auf dem nächsten Balken keine weitere Limit-Order platziert wurde, d. h. eine Limit-Order wird nur dann gelöscht, wenn sie platziert wird und dann zwei Balken ohne Limit-Order folgen?

 int i;
   for(i=0;i<=OrderTicket();i++)
     {
      takelimit=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

      if(iBarShift(Symbol(),0,OrderOpenTime())==2)//здесь нужно что бы на 2-ом баре если есть ордер его удалить, но удаляется он только если после его установки небыло на след баре еще лимитника
        {
         deletelimit=OrderDelete(ticket);
         if(!deletelimit)
           {
            Comment(GetLastError());
           }
        }
     }
if(условие для байлимита)
{ордерсенд}
else if(условие для селлимита)
{ордерсенд}
 
Juer:

Womit werden sie initialisiert? Mit welchen Werten? Nicht klar

Die, die Sie in die Initialisierungsliste schreiben.

Angenommen, ich habe Werte in den Eingabeparametern des Expert Advisors initialisiert. Ich muss sie also an jedes Objekt dieser Klasse übergeben. Aber nicht, um sie an jedes neu erstellte Objekt zu übergeben.

Hier ist sie:

input int      i_nA     = 10;
input double   i_fB     = 20.0;
input datetime i_dtC    = D'2018.03.08 10:12:14';

class CCandle
{
   int         m_nA;
   double      m_fB;
   datetime    m_dtC;
   
public:
                     CCandle(void);
};

CCandle::CCandle(void)
         : m_nA(i_nA)
         , m_fB(i_fB)
         , m_dtC(i_dtC)
{
   Print("Создан объект со значениями: A = ", m_nA, ", B = ", m_fB, ", C = ", m_dtC);
}

int OnInit()
{
   CCandle arrclass[10];
     
   return(INIT_SUCCEEDED);
}

Wenn wir es ausführen, erhalten wir:

0       22:09:36.706    Test EURUSD,M1 inputs: i_nA=10; i_fB=20.0; i_dtC=1520503934; 
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: initialized
0       22:09:36.995    Test EURUSD,M1: uninit reason 0
0       22:09:37.062    Script Test EURUSD,M1: removed
Grund der Beschwerde: