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

 
hamsteruser:

Der *Returntick wird auch nicht zerstört. Mich verwirrt nur der Auspuff des Handelsterminals. Es ist ein Schreiben über unbewältigte Erinnerungen.


Geben Sie mir den gesamten Code, in dem Sie den von der Funktion zurückgegebenen Zeiger verwenden, und den Moment, in dem Sie den Zeiger zerstören. Es ist so schwer, dir zu helfen.

 
Anatolij Povoroznyj:

Hallo. Bitte helfen Sie mir, den Code zu korrigieren. Ich brauche den EA nicht, um eine Reihe von Aufträgen zu öffnen, sondern nur einen Auftrag auf das erste Ereignis.

Jetzt funktioniert es so: Wenn der CCI die Linie 200 nach unten kreuzt, wird ein BAY eröffnet, wenn der CCI dann wieder 200 nach unten kreuzt, wird ein weiterer BAY eröffnet, usw., usw., bis der CCI die Linie -200 nach oben kreuzt, dann werden alle BAY geschlossen und ein Sell eröffnet.

Was ich fragen möchte: Wenn SSI die Linie 200 von oben nach unten kreuzt, wird das erste und einzige BAI geöffnet, andere BAIs sollten nicht geöffnet werden, bis SSI die Linie -200 von unten nach oben kreuzt, in diesem Fall wird das BAI geschlossen und ein Verkauf eröffnet. (Spiegelung der Verkaufslinie und der Linie -200).


Fügen Sie eine Funktion hinzu, die prüft, ob offene Aufträge des betreffenden Typs vorhanden sind. Das heißt, wenn es Aufträge gibt, gibt die Funktion true zurück und der nächste Auftrag wird nicht geöffnet.

 

Wahrscheinlich ist das nicht der Punkt...

Ein Wunsch auf MT4

Ich verwende viele Warnmeldungen, und sie sind alle auf bestimmte Parameter eingestellt.

Ich stelle die Lebensdauer meiner Alarme so lange wie nötig ein und belebe sie mit einem neuen Kursziel.

Da das Warnprotokoll meines Terminals nicht nach Symbolen oder Ereignissen sortiert ist, ist die Suche nach der richtigen Warnung jedes Mal mühsam.

Es wäre schön, wenn es Sortiermöglichkeiten gäbe, wie auf der Registerkarte "Handel".

 
hamsteruser:

Es gibt eine Funktion mit einem Zeiger:


Ich rufe sie trotzdem in einer anderen Funktion auf:


Wie kann ich die Erinnerung daran löschen?

Bei delete(TickReturn); erhalte ich einen Fehler operand excepted.

TickReturn* rt = returntick( period, 1 );

int timeis = rt.curtime;

delete rt;
 
MMM1972:

Wahrscheinlich off topic...

Ein Wunsch auf MT4

Ich verwende viele Warnmeldungen, und sie sind alle auf bestimmte Parameter eingestellt.

Ich stelle die Lebensdauer meiner Alarme so lange wie nötig ein und belebe sie mit einem neuen Kursziel.

Da das Warnprotokoll meines Terminals nicht nach Symbolen oder Ereignissen sortiert ist, ist die Suche nach der richtigen Warnung jedes Mal mühsam.

Es wäre schön, wenn es Sortiermöglichkeiten gäbe, wie auf der Registerkarte "Handel".

Das MT4-Terminal wird nicht mehr weiterentwickelt. Nur die gefundenen Fehler werden behoben.

 
Алексей Барбашин:

Geben Sie den gesamten Code an, in dem Sie den von der Funktion zurückgegebenen Zeiger verwenden, und den Moment, in dem Sie den Zeiger zerstören. Es ist so schwer, dir zu helfen.

Das Gedächtnis ist wirklich im Fluss.

  class TickReturn

   {

   public:

      int curtime;

      double open;

      double close;

      double high;

      double low;

      double priceask;

      double pricebid;

      

   };



  TickReturn *returntick(int period, int timeposition)

   {

      TickReturn *returntick = new TickReturn();

      MqlRates rates[];

      MqlTick last_tick;

      

      if(SymbolInfoTick(symbol,last_tick)){}

      else Print("SymbolInfoTick() failed, error = ",GetLastError());

      

      //int timeposition=0;

      ArraySetAsSeries(rates,true);

      ArrayResize(rates,1);

      int copied=CopyRates(symbol,period,timeposition,1,rates);

      

      returntick.curtime = rates[0].time;

      returntick.open = rates[0].open;

      returntick.close = rates[0].close;

      returntick.high = rates[0].high;

      returntick.low = rates[0].low;

      returntick.priceask = last_tick.ask;

      returntick.pricebid = last_tick.bid;

      

      return(returntick);

}

void OnTick() { int period = 15; int timeis = returntick(period, 1).curtime; Print("timeis= ", TimeToStr(timeis,TIME_SECONDS)); Вот здесь пытаюсь уничтожить указатель. }

 
hamsteruser:

Das Gedächtnis ist wirklich im Fluss.


void OnTick() { int period = 15; int timeis = returntick(period, 1).curtime; Print("timeis= ", TimeToStr(timeis,TIME_SECONDS)); An dieser Stelle versuche ich, den Zeiger zu zerstören }


Es ist nicht ganz klar, was genau hier zerstört werden kann. Kein Wunder, dass der Speicher leckt. Was ist ein Zeiger? Ein Zeiger ist ein Verweis auf die Speicheradresse, an der die erstellte dynamische Variable gespeichert ist. In der Tat rufen Sie die Prozedur auf, um einen Zeiger auf die Klassenvariable zu erhalten. In dieser Prozedur wird das Klassenobjekt erstellt und im Speicher abgelegt, dann wird der Zeiger an die Funktion zurückgegeben, um die Zecken zu erhalten und.... wird zerstört, wenn Sie die Funktion verlassen. Beachten Sie, dass der Zeiger zerstört wird, der Speicher aber nicht gelöscht wird! Und mit jedem neuen Tick wird mehr und mehr Speicherplatz verbraucht! Um diesen Punkt in Ihrem Code zu vermeiden, sollten Sie zunächst die Abkürzung entfernen und den Zeiger in eine andere Variable setzen:TickReturn* temptick =returntick(period, 1);// Holen Sie sich den Zeiger und setzen Sie ihn in eine Variable int timeis = temptick.curtime; // Abrufen des gewünschten Wertes aus dem Objekt über den Zeiger ...... delete temptick; // Zerstören des Zeigers und Löschen des Speichers

Und bevor man den Zeiger zerstört, sollte man überprüfen, ob er korrekt ist, um den Löschfehler zu vermeiden.

Im Großen und Ganzen würde ich mich nicht mit den Zeigern und der Klasse im Besonderen herumschlagen, da die Aufgabe in Wirklichkeit viel einfacher ist und die Klasse nicht verwendet werden muss. Erstellen Sie eine Struktur mit den benötigten Feldern, deklarieren Sie eine globale Variable mit dem Typ dieser Struktur, erstellen Sie eine Funktion, um die Informationen in dieser Struktur bei jedem Tick zu aktualisieren und sammeln Sie daraus, was Sie benötigen, denn die Variable wird global sein, Sie werden sie nicht durch Funktionen laufen lassen müssen und Sie werden keine Zeiger benötigen.

 

1. ist es möglich, mql4 zu verwenden, um andere EAs zu deaktivieren?

2. Um zu überprüfen, ob ein Expert Advisor auf einer bestimmten ChartId?

 
Sergey Likho:

1. ist es möglich, mql4 zu verwenden, um andere EAs zu deaktivieren?

2. Prüfen, ob ein Expert Advisor auf einer gegebenen ChartId läuft?


Es ist möglich, den Handel innerhalb des EA-Codes zu deaktivieren und eine Umstellung in einer externen Datei vorzunehmen, so dass ein anderer EA in der Lage ist, jeden EA darüber zu informieren, dass der Handel nicht mehr benötigt wird.

 
Aleksey Vyazmikin:

Sie können den Handel innerhalb des EA-Codes verbieten und die Umstellung in der externen Datei vornehmen, dann kann ein anderer EA jedem EA mitteilen, dass der Handel nicht mehr erforderlich ist.


Die Idee ist genau, dass EA A EA B durch eine Bedingung deaktiviert.

Grund der Beschwerde: