Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 172

 

Hallo.

Bitte beraten Sie mich, wie ich das richtig mache.

Es gibt eine globale Sammlung von Objekten:

CArrayObj array;

Es gibt eine zusätzliche Klasse, in der viele Berechnungen durchgeführt werden, einschließlich der Erstellung von Objekten und deren Hinzufügen zur Sammlung:

class CCheck : public CArrayObj
  {
  }
bool CCheck::SomeMethod(void)
  {
   CSample *sample_object=new CSample();
   array.Add(sample_object);
  }

Dieses zusätzliche Objekt der Klasse CCheck erstelle ich regelmäßig in einer Schleife. Aber ich kann es nicht zerstören, weil ich CSample-Objekte in der Array-Sammlung brauche. Wenn ich CCheck zerstöre, verliere ich auch die sample_objects im Array.

Ich schiebe diese CCheck-Objekte jetzt in ein anderes Array von Garbage-Objekten, das ich lösche, wenn ich die entsprechenden Objekte im Array nicht mehr brauche. Aber ich bekomme eine Fehlermeldung, weil ich viele schwere CCheck-Objekte im Array behalten muss. Ich benötige aber nicht das ganze Objekt, sondern nur das erstellte CSample-Objekt. Könnten Sie mir bitte sagen, wie ich es richtig mache, damit ich nur das Objekt CSample speichern und das Objekt CCheck löschen kann. Ich kann es nicht herausfinden.

Der Code sieht folgendermaßen aus:

CArrayObj array;
CArrayObj gargage_array;

void OnTick()
  {
   for(int i=0;i<total;i++)
     {
      CCheck *check_obj=new CCheck();
      check_obj.Check();
      garbage_array.Add(check_obj);
     }
   if(..)
     {
      array.Clear();
      garbage_array.Clear();
     }
  }

class CCheck : public CArrayObj
  {
   public:
   void         Check(void);
   protected:
   bool         SomeMethod(void);
  };
void CCheck::Check(void)
  {
   ...
   SomeMethod();
  }
bool CCheck::SomeMethod(void)
  {
   CSample *sample_object=new CSample();
   array.Add(sample_object);
  }

class CSample : public CObject
  {
  };
 

Die Lösung ist irgendwo in einem Forum zu finden, aber ich kann die Antwort nicht finden.

Wer hat ein "Gegengift" dagegen gefunden:

Standard-Panel

Der Code ist Standard:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {   
//--- create application dialog
      if(!ExtDialog.Create(0,"For Example ",0,40,40,760,400))
      //return(INIT_FAILED);
      return(false);            // исключительно для того, чтобы продемонстрировать наложение "панелей"
//---
//--- run application
   ExtDialog.Run();
//--- succeed
//-----
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy dialog
   ExtDialog.Destroy(reason);
//---
  }
//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
   ChartRedraw();
  }

Die Essenz: Der Expert Advisor stürzt ab, wenn er von einem Zeitrahmen zu einem anderen wechselt. In mt5 gibt es ein solches Problem nicht.

Gibt es eine Lösung? Oder es ist besser, die Panels in mt4 zu vergessen :)

 
Vjacheslav Lapaev:

Die Lösung stand schon irgendwo im Forum, aber ich kann die Antwort nicht finden.

Wer hat ein "Gegenmittel" gegen diese gefunden:


Der Code ist Standard:

Das Wesentliche: Expert Advisor stürzt ab, wenn ich von einem Zeitrahmen zu einem anderen wechsle. In mt5 gibt es ein solches Problem nicht.

Gibt es eine Lösung? Oder es ist besser, die Panels in mt4 zu vergessen :)

Vielleicht kann es jemand gebrauchen. Fazit: Es gab einen Experten, ich habe ihn als Indikator gespeichert, alles funktioniert. Ich meine den Code für das Panel.

 

Guten Tag!

Ich dachte, es wäre möglich, einfach ein Array zu drucken, aber ich kann mich nicht erinnern und finde nicht, wie man es macht. Wie?

 
Nauris Zukas:

Guten Tag!

Ich dachte, es sei möglich, einfach ein Array zu drucken, aber ich kann mich nicht erinnern und finde nicht, wie man es macht. Wie?

ArrayPrint
 
Vladislav Andruschenko:
ArrayPrint

Ah, es war in MQL5, danke klar!

 

Ich verstehe nicht, was Sie tun müssen, um das Problem zu beheben:

4030 ist "Karte antwortet nicht".

Gestern hat es funktioniert :( Der einzige Unterschied ist, dass MT5 parallel optimiert wird (benutzt auch Timer), aber es gibt freie Ressourcen. Das Diagramm mit diesem Expert Advisor ist überhaupt "sauber", es ist nichts damit verbunden.

 
Igor Zakharov:

Der einzige Unterschied besteht darin, dass MT5 parallel optimiert ist (er verwendet auch Timer), aber es gibt freie Ressourcen. Das Diagramm mit diesem Expert Advisor ist "sauber", es ist nichts damit verbunden.

Ich habe die Optimierung in 5 eingestellt und es funktioniert. Sollte es da nicht einen Zusammenhang geben?

 
Das war meine Frage zu Unicode. Warum wurde sie ausradiert?
 
secret:
Meine Frage zu Unicode war hier. Warum wurde sie gelöscht?

Ich möchte Ihnen ein wenig Hintergrundwissen vermitteln:

Ein bisschen weniger Ausdruck in den Fragen und sie werden nicht gelöscht. Es ist ganz einfach: Wenn Sie eine Frage stellen, geht es nicht darum, Ihre Negativität an anderen auszulassen. Sie sind in einer Gemeinschaft.
Respektieren Sie den Ort, an dem Sie Ihre Fragen stellen und erwarten Sie eine Antwort, nicht die Reaktion eines Moderators.