Fehler, Irrtümer, Fragen - Seite 1124

 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  struct ARGB
  {
    uchar blue;
    uchar green;
    uchar red;
    uchar alpha;
  };
  
  struct N
  {
    uint num;
  };
  
  N n={100288};
  ARGB c;
  c=n;         //так получаем предупреждение implicit struct cast       sample.mq5      22      4
  c=(ARGB)n;   //а так всё в порядке
}
Obwohl beide Strukturen die gleiche Größe haben und verlustfrei ineinander kopiert werden, erhalten wir eine Warnung.
 
Fleder:
Obwohl beide Strukturen die gleiche Größe haben und verlustfrei ineinander kopiert werden, erhalten wir eine Warnung.
Nun, das ist großartig. Es ist nicht so schwer, eine offensichtliche Besetzung vorzunehmen. Aber es ist nicht so angenehm, herauszufinden, was zugewiesen wurde, wenn Fehler auftreten.
 
TheXpert:
Das ist also großartig. Es ist nicht so schwer, eine offensichtliche Kaste zu bilden. Und es ist nicht sehr angenehm, herauszufinden, wo man was zuordnen kann, wenn sich Fehler einschleichen.
Sieht aus wie das Motto des Compilers: "Better safe than sorry!"
 

Kopie aus der Anwendung in die SR:

Fähigkeit, Zeitreihen selbständig aus dem RAM zurück in den *.hc-Cache zu laden
Fehler, MetaTrader 5 MQL, Eröffnet, Gestartet: 2014.04.12 06:04, #995430

Terminalversion und Bit

910 32 bit

Beschreibung des Problems

Hallo, liebe Entwickler!

In MQL5 ist eine Reihe von Systemfunktionen wieCopyRates,CopyTime,CopyOpen usw. für den Empfang von Zeitreihendaten vorgesehen.

Wenn Sie eine dieser Funktionen aufrufen, wird die angeforderte Zeitreihe mit dem Parameter "Max bars in chart" in den RAM geladen.

Allerdings ist die Kombination von Faktoren wie:

1. Ausreichend tiefer Verlauf auf dem Symbol verfügbar oder vollständig vom Server geladen.

2. Der Parameter "Max bars in chart" ist "Unlimited".

3. Es werden Daten des kleinsten Zeitrahmens M1 angefordert.

Es wird eine sehr große Menge an Speicher verbraucht.

Das Problem wird durch die Tatsache verschärft, dass die Logik des Programms, auf dem MQL5 läuft (z.B. wenn es sich um einen Multicurrency Expert Advisor oder einen Indikator handelt)

kann für den alternativen Zugriff auf Daten mit einem niedrigen Zeitrahmen von mehreren Symbolen festgelegt werden (z. B. Einzelsuche).

Dadurch steigt der RAM-Verbrauch um ein Vielfaches.

Получение данных нужного таймфрейма из промежуточных данных

Servicedateien im HCC-Format spielen die Rolle der Datenquelle für die Erstellung der Preisdaten in den gewünschten Zeiträumen im HC-Format. Bei den Daten im HC-Format handelt es sich um Zeitreihen, die für einen schnellen Zugriff optimal aufbereitet sind. Sie werden nur auf Anforderung eines Diagramms oder mql5-Programms in der Menge erstellt, die den Parameter "Max bars in charts" nicht überschreitet, und werden zur weiteren Verwendung in Dateien mit der Erweiterung hc gespeichert.

Um Ressourcen zu sparen, werden die Daten des Zeitfensters nur bei Bedarf in den Arbeitsspeicher geladen und dort gespeichert, beilängerem Ausbleiben von Anfragen werden die Daten aus dem Arbeitsspeicher entladen und in einer Datei gespeichert. Die Daten für die einzelnen Zeiträume werden unabhängig von den Daten für die anderen Zeiträume aufbereitet. Die Regeln für die Datenaufbereitung und -verfügbarkeit sind für alle Zeiträume gleich. D.h., obwohl die Einheit der im HCC-Format gespeicherten Daten der Minutenbalken ist, bedeutet die Verfügbarkeit der Daten im HCC-Format nicht die Verfügbarkeit und Zugänglichkeit der Daten im HC-Format für den Zeitrahmen M1 im gleichen Umfang.

Der Empfang neuer Daten vom Server führt zu einer automatischen Aktualisierung der verwendeten Preisdaten im HC-Format für alle Zeiträume und zu einer Neuberechnung aller Indikatoren, die diese ausdrücklich als Eingangsdaten für die Berechnung verwenden.

Der in dem zitierten Dokument gelb hervorgehobene Zeitrahmen für den Vorgang ist recht groß: etwa eine halbe Stunde (nach meinen Beobachtungen).

Infolgedessen "sitzen" alle angeforderten Zeitreihen grundlos im "RAM".

Wenn der "RAM" nicht "Gummi" ist Und der "gefräßige" Expert Advisor/Indikator verlangt immer mehr Zeitreihen, das Terminal hat nichts anderes zu tun

außer einem dringenden "Dumping" überschüssiger Zeitreihen zurück in die Datei (Cache). Bei diesem Not-Reset kann das Terminal also die Zeitreihe auf

einen "kaputten Cache", d.h. er verliert "gut die Hälfte" der Daten. Beim nächsten Zugriff auf diese Zeitreihe lädt das Terminal diesen "defekten Cache" wie einen normalen.

Infolgedessen zeigt das Terminaldiagramm die benötigten Zeitreihen mit einem großen Loch in der Historie an.

Erwartetes Ergebnis

Die MQL5-Sprache neigt dazu, Ressourcen der Ausführungsumgebung zu sparen. Ein Beispiel hierfür ist das folgende:

1. die FunktionArrayFree

2. die FunktionresourceFree

3. Operatorlöschen

4. Parameter"Maximale Balken in Diagrammen

Ist es möglich, der MQL5-Sprachfunktionalität eine Systemfunktion hinzuzufügen, die das Terminal zwingen würde, Operationen mit der nicht mehr verwendeten Zeitreihe durchzuführen?

Wenn es kein geöffnetes Diagramm mit dieser Zeitreihe gibt, am Ende der Zeitmessung?

Zum Beispiel, eine Funktion:

bool SeriesFlush(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   );

Dies würde es ermöglichen:

1. keine Angst vor RAM-Überlauf.

2. Machen Sie sich keine Sorgen über "defekte Caches", die Sie nur durch manuelles Löschen von *.hc-Dateien loswerden können, wenn das Terminal ausgeschaltet ist.

3) Sie sind nicht vom Bitmodus Ihres Betriebssystems und der Größe des RAM abhängig.

4) Verwenden Sie bei der Entwicklung eines Softwareprodukts keine "Krücken", mit denen Sie die oben beschriebenen Nachteile zu umgehen versuchen.

 
Fleder:

Kopie aus der Anwendung in die SR:

Möglichkeit zum Selbstentladen von Zeitreihen aus dem RAM zurück in den *.hc-Cache
Das ist doch eine tolle Idee.
 
Können Sie mir sagen, wie ich Daten von einem Indikator erhalten kann, der einen positiven Bias hat? Ich interessiere mich für Daten auf -1 bar?
 
dentraf:
Können Sie mir sagen, wie ich Indikatordaten mit einem positiven Offset erhalte? Ich interessiere mich für Daten auf -1 bar?

Dazu müssen Sie die Offset-Einstellungen für die betreffende Indikatorlinie kennen. Dies ist ein Beispiel aus dem technischen IndikatoriAlligator

//--- зададим смещение для каждой линии
   PlotIndexSetInteger(0,PLOT_SHIFT,jaw_shift);

Es handelt sich um einen Ausgleich, nicht um eine Indikatorberechnung für die Zukunft.

 

Aus der Anwendung auf die SD-Karte kopieren:

Fehlerhafte Bedienung der Systemfunktion IsStopped in Indikatoren
Fehler, MetaTrader 5 MQL, Eröffnet, Gestartet: 2014.04.12 07:59, #995480

Terminalversion und Bitmodus

910 32 bit

Beschreibung des Problems

Hallo, liebe Entwickler!

Eine der Empfehlungen zur Verbesserung der Codequalität beim Entwurf von Schleifen mit einer großen Anzahl von Iterationen

ist es, die Überprüfung eines erzwungenen Stopps eines MQL5-Programms mit Hilfe des Systems

IsStopped() Systemfunktion;

In der Praxis funktioniert diese Prüfung jedoch nicht bei Indikatoren (bei Skripten und Expert Advisors schon).

Hier ist der Kurzcode des Indikators, der den Kern des Problems zeigt:

#property  indicator_plots 0
//=====================================================================
// Custom indicator initialization function
//=====================================================================
int OnInit()
{
  return(INIT_SUCCEEDED);
}
//=====================================================================
// Custom indicator iteration function
//=====================================================================
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
  long n=0;
  for(int i=0;i<1 e+10 && !IsStopped();i++) {n++;}
  Print("OnCalculate End");
  return(rates_total);
}

Wenn Sie versuchen, diesen Indikator aus dem Diagramm zu entfernen, wird der Prozess der "Berechnung des Indikators" nicht als solcher beendet,

obwohl dies aufgrund der Überprüfung des Stop-Flags des Programms der Fall sein sollte.

Sie können dies leicht herausfinden, indem Sie den Prozess terminal.exe im Task-Manager überwachen. Mit einem Quad-Core-Prozessor

Das sind etwa 25 % der CPU-Last. Außerdem nimmt die Terminallast im Laufe der Zeit überhaupt nicht ab, bis die

Abschaltung des Terminals. Und selbst nach dem Herunterfahren des Terminals bleibt der Prozess terminal.exe im Manager hängen. Und, es fühlt sich so an,

dass es vom Betriebssystem als "hängend" entladen wird.


Erwartetes Ergebnis

Bitte, beheben Sie dieses Problem.

 
barabashkakvn:

Dazu müssen Sie die Offset-Einstellungen für die betreffende Indikatorlinie kennen. Dies ist ein Beispiel aus dem technischen IndikatoriAlligator

Dabei handelt es sich um einen Ausgleich, nicht um die Berechnung des Indikators für die Zukunft.

Ich habe eine zukünftige Berechnung, aber ich benutze einen Offset, um es zu machen, wie ich -1 bar aus dem Expert Advisor berechnen?

Wenn jemand es braucht, verwenden Sie CopyBuffer(Handle_original,0,-2,10,Data_Ind )

 
dentraf:
Genau, ich habe eine Berechnung in der Zukunft, aber ein Offset zu zeichnen, wie lese ich -1 bar aus dem Expert Advisor?
Es gibt kein Angebot für -1 bar. Der Offset ist: die Berechnung für einen vorhandenen Balken (z.B. Balken Nummer 2) und dann wird dieser berechnete Wert auf Balken 2 minus den Offset geplottet. Das heißt, wenn der Versatz 5 beträgt, wird der in Takt 2 berechnete Wert in Takt "-3" gezeichnet.