Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 168

 
Slava:

Wenn Sie eine Meldung über ein Speicherleck erhalten, bedeutet dies, dass es keinen expliziten Befehl zur Freigabe dieses Speichers gab.

Wenn das Programm beendet wird (wenn Sie diese Meldungen erhalten), gibt es den gesamten Speicher frei, einschließlich des ausgelaufenen Speichers.

Vielleicht habe ich den Begriff "Leck" zu locker verwendet. Der Punkt ist, dass eine Ressource im Speicher hängen bleibt, deren Name nicht einmal erkennbar ist, wenn das Objekt gelöscht wird. Und wenn Sie ihren Namen kennen, können Sie sie nur aus dem Programm löschen, das die Ressource erstellt hat.


Jetzt ist es sehr einfach, ein Skript für Market zu schreiben, das das Terminal auf dem VPS aussetzt (nicht notwendigerweise absichtlich) und den gesamten Speicher mit Ressourcen füllt, die nach der Skriptausführung nicht gelöscht werden.

 

Einige Handelsserver können mehr als eine Art von Konto auf einmal führen. Zum Beispiel, ECN und Standard. In diesem Fall dürfen Symbole keine Präfixe haben, d.h. die Namen sind gleich.

In diesem Fall entsprechen die Balkenhistorie (einschließlich des aktuellen Werts von Bid/Ask/Last auf dem Chart) und die Tickhistorie immer nur einem Kontotyp.

Und die Daten von Market Watch entsprechen denjenigen, mit denen sie verbunden sind.


Aus diesem Grund ist es leicht zu beobachten, dass der Market Watch mit den Charts und der Tick-Historie völlig inkonsistent ist.

 

Es ist mir schon mehrfach passiert, dass das Kartensymbol versehentlich (von Hand) an der Stelle geändert wurde, an der ein Kampfberater steht.

Schutz gegen Symbolwechsel.

int OnInit()
{
  static const string Symb = _Symbol;  
  const bool Res = (_Symbol != Symb);
  
  if (Res)
    Alert("Symbol is change!");
  
  return(Res); // Защита от смены символа.
}
 
Wenn Sie einen EA starten, müssen Sie oft entscheiden, ab welchem Zeitpunkt der Kursverlauf ermittelt werden soll. Damit ich sie nicht jedes Mal manuell eingeben muss, habe ich es so gemacht.
#define  WEEK (7 * 24 * 3600)
input datetime temp = __DATE__ - WEEK;

Dementsprechend nehme ich die Geschichte eine Woche vor der Zusammenstellung. Es ist praktisch.

 
fxsaber:
Wenn Sie einen EA starten, müssen Sie oft entscheiden, ab welchem Zeitpunkt der Kursverlauf ermittelt werden soll. Damit ich sie nicht jedes Mal manuell eingeben muss, habe ich es so gemacht.

Dementsprechend nehme ich die Geschichte eine Woche vor der Zusammenstellung. Bequem.

Warum sollten Sie sich zu sehr auf den Optimierer verlassen? Das ist besser:

#define WEEK 604800

 

Notunterbrechungsfunktion, scheint gut zu funktionieren

#define  EXIT (STD_CExit(__LINE__,__FUNCTION__)).Exit

class STD_CExit{
   string function;
   int line;
public:
   STD_CExit(int _line,string _func):line(_line),function(_func){}
   void Exit(string reason=NULL);
};
//--------------------------------------------------------------------------
void STD_CExit::Exit(string reason=NULL){
   Alert(StringFormat("Abort in line %i, function %s.\nReason: %s.",line,function,reason==NULL||reason==""?"Unknow":reason));
   int a=0;
   int b=1/a;}

void OnStart()
{
   Test();
}

void Test(){
   EXIT("Some reason");
}
 
Vladimir Simakov:

Notunterbrechungsfunktion, scheint gut zu funktionieren

Es ist richtig, das zu tun - ich war froh, dass es passiert ist... wir haben es mit@Victhttps://www.mql5.com/ru/forum/318246/page10#comment_12651569

sondern dies:

- nichtExit http://www.delphibasics.ru/Exit.php

- nichtabbrechen http://www.delphibasics.ru/Abort.php

es istHalt http://www.delphibasics.ru/Halt.php

UPD: ein solches Skript wird dringend benötigt

void OnTick()
{
   if(!getData()) EXIT("No data");
}
bool getData()
{
   return(false);
}
 
Igor Makanu:

die Sache ist notwendig - ich war froh, es geschehen zu sehen..., hier ist das Problem, das wir mit@Victhttps://www.mql5.com/ru/forum/318246/page10#comment_12651569

sondern dies:

- nichtExit http://www.delphibasics.ru/Exit.php

- nichtabbrechen http://www.delphibasics.ru/Abort.php

es istHalt http://www.delphibasics.ru/Halt.php

UPD: ein solches Skript wird dringend benötigt

Das klappt noch nicht(((
 
Vladimir Simakov:
Das hat noch nicht geklappt(((.

Ich kann nicht erkennen, warum ich das brauche!

Wenn die Entwickler Exit / Abort als Standard angegeben hätten, dann wäre es möglich, die Datenverarbeitung korrekt zu beenden, wenn z.B. TF nicht bereit ist - OHLC-Daten, es wäre auch nützlich für die Verarbeitung von Aufträgen, die an den Server gesendet werden... es wäre praktisch, den Code an einer beliebigen Stelle zu unterbrechen und vor dem nächsten Tick zu beenden, ohne endlos return() zum Verlassen von OnTick()

 
Igor Makanu:

Ich kann nicht erkennen, warum ich das brauche!

Wenn die Entwickler Exit / Abort als Standard angegeben hätten, dann wäre es möglich, die Datenverarbeitung korrekt zu beenden, wenn z.B. TF nicht bereit ist - OHLC-Daten, es wäre auch nützlich für die Verarbeitung von Aufträgen, die an den Server gesendet werden... es wäre praktisch, den Code an einer beliebigen Stelle zu unterbrechen und vor dem nächsten Tick zu beenden, ohne endlos return() zum Verlassen von OnTick()

Nun, ich konnte nicht, noch nicht...