Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 200

 
fxsaber:
Die Objekt*-Funktionen sind sehr träge, wenn man die Grafik mit der Maus zieht.
Können sie einfach neu zeichnen?
 
Nikolai Semko:
Können sie einfach neu gezeichnet werden?

Was hat zum BeispielObjectFind mit dem Redrawing zu tun?

 
fxsaber:

Was hatObjectFind zum Beispiel mit dem Neuzeichnen zu tun?

Ah, das ist nicht das, was ich im Sinn hatte.
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten von mql5, Tipps und Tricks

fxsaber, 2020.03.04 08:58

Ich war vorher nur misstrauisch, jetzt ist es bestätigt. Bei der Arbeit mit Ressourcen kann es leicht zu Speicherlecks kommen.

Das Skript über SB gibt einen Graphen eines numerischen Arrays in das Diagramm aus. Sie können dieses Diagramm (Objekt) dann manuell löschen, aber die diesem Diagramm zugewiesene Ressource bleibt für immer im Speicher im Nur-Lese-Modus hängen. Sie kann nicht gelöscht werden, da nur das Eigentümer-Skript sie löschen kann (siehe die hervorgehobene Zeile).


Es gibt keine Funktion in MQL, um so belegten Speicher freizugeben. Seien Sie damit auf VPS besonders vorsichtig.


Wie kann ich den Speicher in Terminal nach den Skripten freigeben, die nicht nach sich selbst aufräumen (oder nach anormalen Stopps)?

// После окончания работы скрипта Терминал потребляет дополнительные 4 Gb. Как освободить?
void OnStart()
{
  uint Data[];
  
  ArrayResize(Data, 1 e6);
  
  for (int i = 0; i < 1000; i++)  
    ResourceCreate("::" + (string)i, Data, ArraySize(Data), 1, 0, 0, ArraySize(Data), COLOR_FORMAT_ARGB_NORMALIZE);
}

Im TaskManager (F2) wird der Speicherverbrauch sehr gut angezeigt. Jetzt hilft nur noch ein Neustart des Terminals.

 
fxsaber:

Wie kann man in Terminal Speicher freigeben, nachdem Skripte ausgeführt wurden, die sich nicht selbst aufräumen (oder nach einem abnormalen Stopp)?

Im TaskManager (F2) ist der Speicherverbrauch gut sichtbar. Im Moment hilft nur der Neustart des Terminals.

Normalerweise ist es notwendig, ResourceFree für jede Ressource aufzurufen.

Bei Abstürzen können Sie nichts tun. Die einzige Möglichkeit, dies zu tun, besteht darin, eine eigene DLL zu erstellen, die zum Erstellen von Ressourcen und zum Aufräumen nach dem Beenden des Threads verwendet wird.

 
Vladimir Simakov:

Normalerweise müssen Sie ResourceFree für jede Ressource aufrufen.

Im Falle einer Notabschaltung können Sie nichts tun. Nur wenn Sie Ihre eigene dll machen, durch die Ressourcen zu erstellen, die, wenn der Thread ausgeschaltet ist, wird sie selbst zu löschen.

Die Notabschaltung umfasst auch die Unterbrechung der Fehlersuche.

 
fxsaber:

Der Absturz beinhaltet eine Debug-Unterbrechung.

Mit den üblichen mql-Mitteln - Speicherleckage. Nur Ihre eigene Umsetzung all dessen sollte in einer ausgereiften Weise geschrieben werden. In Anbetracht der Tatsache, dass DllMain mit DLL_THREAD_DETACH wahrscheinlich nicht aufgerufen wird, wenn ein solcher Thread beendet wird, ist dies nicht die trivialste Aufgabe, aber sie ist machbar.

UPD: Dieser Thread sollte in den Bug-Thread verschoben werden. IMHO
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Neue Version von MetaTrader 5 build 2650: Laden von Charts im Hintergrund und Verbesserungen im MQL5 Code Profiler

fxsaber, 2020.10.23 18:44

In der Diagrammleiste können Sie nun nicht sehen, auf welchem Diagramm der Expert Advisor läuft und auf welchem nicht.

Ist es möglich, ein Unterscheidungsmerkmal hinzuzufügen? Wenn zum Beispiel das EURUSD-Diagramm mit einem EA arbeitet, fügen Sie ein Sternchen am Ende hinzu: EURUSD*. Im Allgemeinen etwas, das visuell einprägsam sein könnte.

Eine Menge Charts, einige laufen EAs auf einige. Wahrscheinlich ist es auch für Indikatoren nützlich, aber ich benutze es nicht. Deshalb weiß ich es nicht.


Aus irgendeinem Grund gibt es keinen Hotkey für die Liste der laufenden EAs. Sie können es nur mit der Maus öffnen.

F2 jetzt. Drücken Sie ENTER auf einem EA - wir wechseln zu seinem Diagramm und ein Baum mit dem Pfad zu ihm wird im Navigator geöffnet. Zweites Mal ENTER - Quelle in ME.

 
Zuvor führte ein interner Fehler im EA nicht zu dessen Schließung.
2021.03.18 11:41:47.413 zero divide in 'Test9.mq5' (550,5)
2021.03.18 11:42:26.619 array out of range in 'Test9.mq5' (550,8)

In jüngster Zeit ist sie die Ursache des Problems.


Bisher konnte ein Market-Kunde das Problem durch einen Neustart des Terminals umgehen. Jetzt ist das nicht mehr der Fall.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Neue Version von MetaTrader 4 build 1330

fxsaber, 2021.04.03 00:21

// Конструкция обнаружения бесконечных циклов.
class LOOP
{
private:
  static int PrevLine;    
  static uint PrevTime;
  
public:
#define  LOOP_CHECKTIME 100000 // Максимальная длительность (в миллисекундах) выполнения цикла

  static bool CheckFirst( const int Line )
  {
    if (Line != PrevLine)
    {
      LOOP::PrevTime = ::GetTickCount();
      LOOP::PrevLine = Line;
    }
      
    return(!::IsStopped() && ::GetTickCount() - LOOP::PrevTime < LOOP_CHECKTIME);
  }
  
  static bool Description( const string Str )
  {
    if (!::IsStopped() && (::GetTickCount() - LOOP::PrevTime > LOOP_CHECKTIME))
    {
      ::MessageBox("Endless loop:\n" + Str);
  
      LOOP::PrevTime = ::GetTickCount();
    }
    
    return(!::IsStopped());
  }
#undef  LOOP_CHECKTIME
};

static int LOOP::PrevLine = 0;
static uint LOOP::PrevTime = 0;


#define _CS(A) ((LOOP::CheckFirst(__LINE__) || LOOP::Description(__FILE__ + "\n" + (string)__LINE__ + "\n" + __FUNCSIG__ + "\nCondition: " + #A)) && (A))


Beispiel für die Verwendung.

void OnInit()
{
  for (uint i = 5; _CS(i >= 0); i--)
    ;
}