Fragen von einem "Dummy" - Seite 162

 
Karlson:
DBL_MAX wird dort sein.
:-)
 

Warum wird das Behindertenkennzeichen nicht zurückgegeben, obwohl die Behinderung beseitigt wurde?

   int       indicator_handle=iCustom(
   NULL,
   PERIOD_CURRENT,
   "Examples\\ZigzagColor"
   );
   Print(indicator_handle);
   bool  a=IndicatorRelease(
   indicator_handle//,
   );
   Print(a);
   Print(indicator_handle);

Der erste Druck ist 10, der zweite Druck ist wahr, der dritte Druck ist wieder 10. Setzen Sie einen Zettel pro Minute - immer noch 10.

Ich denke, es sollte -1(INVALID_HANDLE) sein. Denke ich falsch?

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы - Документация по MQL5
 
Silent:

Warum wird das Behindertenkennzeichen nicht zurückgegeben, obwohl die Behinderung beseitigt wurde?

Der erste Druck ist 10, der zweite Druck ist wahr, der dritte Druck ist wieder 10. Setzen Sie einen Zettel pro Minute - immer noch 10.

Ich denke, es sollte -1(INVALID_HANDLE) sein. Denke ich falsch?

Die gelöschten Indikatoren werden nicht sofort physisch entfernt, sondern nach einer Pause (vielleicht ein paar Minuten), für den Fall, dass das gleiche oder ein anderes Programm sie erneut öffnet (Zwischenspeicheroption).

Das Problem tritt nur auf, wenn der Zyklus Puffer mit einer großen Anzahl von Indikatoren liest (so groß, dass nicht alle auf einmal in den Speicher passen).

// Nur in diesem Fall ist es sinnvoll, überhaupt Indikatoren im Programm freizugeben.

// Alle anderen Varianten der Verwendung der Funktion IndicatorRelease() sind "rassistisch falsch", da die Indikatoren bei Arbeitsende freigegeben werden.

Daraus ergibt sich das Paradoxon: Die Funktion ist nutzlos, weil die Zwischenspeicherung alle koscheren Anwendungsfälle vollständig ausschaltet.

In diesem Fall hat Renat einmal versprochen, eine Variante der "sofortigen Freigabe" zu erstellen, aber offenbar ist er noch sehr beschäftigt. ;)

--

Das ist sozusagen der erste Teil der Antwort (ohne den der zweite unverständlich wäre).

Und nun zu INVALID_HANDLE. Wie ich sehe, weisen die Funktionen zum Freigeben dynamischer Objekte sowie der Löschoperator dem Zeiger an sich nicht den Wert INVALID_HANDLE zu; sie entfernen nur Objekte, auf die der Handle zeigt. Nur Speicherzuweisungsfunktionen (auch der new-Operator) weisen Zeigern im Falle eines Fehlers zwangsweise INVALID_HANDLE-Werte zu. Der korrekte Weg, die Gültigkeit des Zeigers zu überprüfen, ist daher die Funktion CheckPointer(), die buchstäblich die Systemtabelle der Handles auf der Suche nach einem Objekt durchsucht und den Handle-Typ zurückgibt, wenn das Objekt gefunden wird, oder 0, wenn es nicht gefunden wird.

Hoffentlich ist die Logik des Umgangs mit Zeigern (Handles) jetzt ein wenig klarer geworden. Ebenso wie die Ergebnisse aus Ihrem Beispiel. Dort ist alles korrekt: Der Indikator ist ein Objekt mit Gruppenzugriff, er wird nicht beim ersten Pfiff physisch entfernt (so dass sogar CheckPointer() einen Wert ungleich Null zurückgibt), ganz zu schweigen von der Panne, dass man hofft, den Wert INVALID_HANDLE in der Zeigervariablen zu erhalten, nachdem man sie an IndicatorRelease() übergeben hat.

 

Der Artikel Orders, Positions and Trades in MetaTrader 5 gibt das Beispiel: "Jeder Handel basiert auf einer bestimmten Order, abereine Order kann mehrere Trades erzeugen. Beispielsweise kann ein Auftrag zum Kauf von 10 Losen durch mehrere aufeinanderfolgende Abschlüsse mit Teilausführung ausgeführt werden". Wenn ich eine Position für z.B. 10 Lots eröffne, kann es sein, dass mehrere Trades in der Historie erscheinen. Nach meiner Strategie, 1 und 2 Position in die gleiche Richtung, mein Expert Advisor (MT4) öffnet mit 1,0 Lot, und dann die dritte und dann 2,0 Lot. Im MT5 kann es vorkommen, dass beim Öffnen der 1. Position in der Historie z.B. 2 oder mehr Trades erscheinen. In der Historie können 2 oder mehr Abschlüsse erscheinen. Wenn Sie eine 2. Position öffnen möchten, scrollt der Expert Advisor durch die Historie und stellt fest, dass es sich um die dritte Position handelt. Und es wird das falsche Los geöffnet. Das ist irgendwie ärgerlich.

Vielleicht weiß jemand, wie man dieses Problem lösen kann oder kann mir einen Link geben.

 
MetaDriver:

Danke, genau das, was Sie brauchen.

// nelp by nelp for dummies - das ist es, was in den Artikeln gebraucht wird.

 

Ich versuche, einen Indikator zu erstellen, der zwei verschiedene Zeitrahmen verwendet, z. B. M5 (aktueller Zeitrahmen auf dem Bildschirm) und H1. Wie können die Preise zwischen diesen verschiedenen Zeitrahmen synchronisiert werden? Wenn ich z.B. den letzten Wert des Indikators auf M5 berechne, möchte ich automatisch die Preise von H1 der gleichen Zeit pumpen (d.h. der Null-Bar in beiden Timeframes nach ArraySetAsSeries entspricht der aktuellen letzten Zeit, wie in OnTick, aber nicht dem letzten Bar auf dem Bildschirm). Wenn es keine solche Möglichkeit gibt und wir die Bar-Zeiten manuell überprüfen sollten, sollten wir eine Synchronisierungsfunktion, wie onTick, für Indikatoren hinzufügen.

Ich habe versucht, es mit dem Tester zu testen - es ist eine gute Sache. Warum wird der zuletzt berechnete Wert nicht auf dem Bildschirm gespeichert?

 
gpwr:

Ich versuche, einen Indikator zu erstellen, der zwei verschiedene Zeitrahmen verwendet, z. B. M5 (aktueller Zeitrahmen auf dem Bildschirm) und H1. Wie können die Preise zwischen diesen verschiedenen Zeitrahmen synchronisiert werden? Wenn ich z.B. den letzten Wert des Indikators auf M5 berechne, möchte ich automatisch die Preise von H1 der gleichen Zeit pumpen (d.h. der Null-Bar in beiden Timeframes nach ArraySetAsSeries entspricht der aktuellen letzten Zeit, wie in OnTick, aber nicht dem letzten Bar auf dem Bildschirm). Wenn es keine solche Möglichkeit gibt und wir die Bar-Zeiten manuell überprüfen sollten, sollten wir eine Synchronisierungsfunktion, wie onTick, für Indikatoren hinzufügen.

Ich habe versucht, es mit dem Tester zu testen - es ist eine gute Sache. Warum werden die zuvor berechneten Werte nicht im Indikator gespeichert?

Verwenden Sie eine der Überladungen der Funktion CopyXXXX()

Bei der Fehlersuche ist zu prüfen, in welche Richtung die Daten kopiert werden (wenn mehr als 1 kopiert wird).

Обращение по начальной дате и количеству требуемых элементов

int  CopyRates(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   datetime         start_time,        // с какой даты
   int              count,             // сколько копируем
   MqlRates         rates_array[]      // массив, куда будут скопированы данные
   );
 
 
Urain:

Verwenden Sie eine der Überladungen von CopyXXXX()

Bei der Fehlersuche ist zu prüfen, in welche Richtung die Daten kopiert werden (wenn mehr als 1 kopiert wird).

Ich hab's. Ich danke Ihnen.
 

Hallo!

Könnten Sie mir bitte den Code des Indikators mitteilen, der die Maximal- und Minimalwerte auf den aktuellen Minutencharts des Vortages anzeigt?

SPS!

 

Lange nicht mehr gesehen =).

Sagen wir. Es gibt einen bestimmten Zeitpunkt. Zum Beispiel D'03.07.2005 13:48:12'.

Wie kann ich den Zeitpunkt des Balkens (eines bestimmten Zeitraums) herausfinden, der diesen Zeitraum umfasst?

Es wäre schön, wenn es eine Funktion wie diese gäbe:

datetime УзнатьВремяБараПоВремениПользователя (datetime времяПользователя, ENUM_TIMEFRAMES периодБаров) 

... Und dass sie einen negativen Wert zurückgeben würde, wenn es zu diesem Zeitpunkt keinen Handel gäbe.

Nun, spucken Sie es aus, gibt es eine solche Funktion?

Grund der Beschwerde: