Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 169

 

Übrigens, das Analogon von Assert

#define  ASSERT (STD_CAssert(__LINE__,__FUNCTION__)).Assert

class STD_CAssert{
   string function;
   int line;
public:
   STD_CAssert(int _line,string _func):line(_line),function(_func){}
   void Assert(bool condition,string text=NULL);
  };
//--------------------------------------------------------------------------
void STD_CAssert::Assert(bool condition,string reason=NULL){
   if (condition) return;
   Alert(StringFormat("Assert 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(){
   ASSERT(2==3,"Some reason");
}
 
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()

Eigentlich ist es möglich, eine Krücke zu implementieren, aber die Benutzerfreundlichkeit ist dort schlecht, ich werde es Ihnen nicht einmal zeigen, obwohl es funktionieren sollte.
 

Allerdings scheint die Benutzerfreundlichkeit verbessert worden zu sein. Im Allgemeinen sollte jeder Funktions- oder Methodenaufruf mit möglicher Ausgabe, einschließlich verschachtelter Funktionen, in ein _call-Makro eingeschlossen werden. Diejenigen, die daran interessiert sind, können den Rest gerne für alle Handler schreiben. Es wurde auf einer Kurbel geschrieben, als Test einer Idee, so dass es nicht getestet wurde, von dem Wort - überhaupt.

#ifdef _DEBUG
   #define  DELETE(dObj) do if (CheckPointer(dObj)!=POINTER_INVALID) {delete dObj; dObj=NULL;} while(false)
#else
   #define  DELETE(dObj) do {delete dObj; dObj=NULL;} while(false)
#endif

#define  START  class STD_CStart; void OnStart(){std_start=new STD_CStart; std_start.Main(); DELETE(std_start);}
#define  ON_START  START\
static STD_CStart* std_start=NULL;  \
class STD_CStart{   \
public: void Main();   \
};                \
void STD_CStart::Main

#define  DELETE_EVENTS do if (std_start!=NULL) DELETE(std_start); while(false)
#define  EXIT(out) do {DELETE_EVENTS; return out;} while(false)
#define  CHECK(out) do if (!std_start) EXIT(out); while(false)
#define _call(funk,out) do {funk;CHECK(out);} while(false)

ON_START()
{
   int x=0;
   Print("Start");
   _call(TestInt(4),);
   Print(++x);
   _call(TestInt(1),);
   Print(++x);
   _call(TestInt(6),);
   Print(++x);
   TestVoid();   
}

int TestInt(int a){
   static int x=0;
   Print("Func call ",++x);
   if (a<3) EXIT(NULL);
   return 0;
}

void TestVoid(){
   Print("Error");}
 

MT5 bietet keinen Schutz gegen versehentliches Schließen des Terminals. Vor kurzem gab es ein solches Szenario.

  • Das Terminal und der Browser sind für das gesamte Fenster geöffnet. Ich bin im Browser.
  • Der Browser ist eingefroren, ich klicke auf das Kreuz in der rechten oberen Ecke.
  • Sie lässt sich nicht schließen, ich drücke sie noch ein paar Mal.
  • Irgendwann während des Drückens wird der Browser geschlossen - das Fenster verschwindet. Und zu diesem Zeitpunkt das Kreuz des Terminals unter dem Cursor, wo ich gedrückt habe.
  • Das Terminal schließt sich so schnell, dass es einfach nicht auffällt. Vor allem, wenn viele Terminals geöffnet sind.

Dies ist eine sehr unangenehme Situation, z. B. bei der Stapeloptimierung. Aber für den Battle Advisor ist es noch schlimmer. Sie sind vielleicht dumm, wenn Sie nicht bemerken, dass Sie Ihr Kampfterminal getötet haben.


Sie haben einen solchen Schutz angebracht.

void OnDeinit( const int Reason )
{
  if (Reason == REASON_CLOSE)
    MessageBox("Terminal is being closed!");
}

Wenn Sie es schließen, erscheint für fünf Sekunden eine Meldung. So können Sie herausfinden, was wirklich passiert ist. Es ist merkwürdig, dass es im Terminal keinen Schutz gibt.

 
fxsaber:

MT5 bietet keinen Schutz gegen versehentliches Schließen des Terminals. Vor kurzem gab es ein solches Szenario.

  • Das Terminal und der Browser sind für das gesamte Fenster geöffnet. Ich bin im Browser.
  • Der Browser ist eingefroren, ich klicke auf das Kreuz in der rechten oberen Ecke.
  • Sie lässt sich nicht schließen, ich drücke sie noch ein paar Mal.
  • Irgendwann während des Drückens wird der Browser geschlossen - das Fenster verschwindet. Und zu diesem Zeitpunkt das Kreuz des Terminals unter dem Cursor, wo ich gedrückt habe.
  • Das Terminal schließt sich so schnell, dass es einfach nicht auffällt. Vor allem, wenn viele Terminals geöffnet sind.

Dies ist eine sehr unangenehme Situation, z. B. bei der Stapeloptimierung. Aber für den Battle Advisor ist es noch schlimmer. Sie sind vielleicht dumm, wenn Sie nicht bemerken, dass Sie Ihr Kampfterminal getötet haben.


Sie haben einen solchen Schutz angebracht.

Wenn Sie es schließen, erscheint für fünf Sekunden eine Meldung. So können Sie herausfinden, was wirklich passiert ist. Seltsam, dass das Terminal keinen Schutz hat.

Es gibt ein paar einfachere Möglichkeiten.

  1. Halten Sie das Combat-Terminal so klein wie möglich.
  2. Behalten Sie das Battle-Terminal auf dem VPS
  3. Binden Sie unartige Hände und halten Sie sich vom Computer fern. )))
  4. Ich muss nachdenken, vielleicht fällt mir etwas ein...)))
 
Alexey Viktorov:

Es gibt ein paar einfachere Möglichkeiten.

  1. Halten Sie das Kampfterminal so klein wie möglich.
  2. Behalten Sie das Battle-Terminal auf einem VPS
  3. Binden Sie unartige Hände und halten Sie sich vom Computer fern. )))
  4. Ich muss nachdenken, vielleicht fällt mir etwas ein...)))

Auf VPS kann auch schließen. Ich habe dort Experten, die Push senden.

Und es ist wirklich einfach, das falsche Kreuz zu treffen, wenn sich die Windschnittstelle verlangsamt. Ich habe es getan, jetzt schließe ich es in der Taskleiste im Kontextmenü.

 
Alexey Viktorov:

Es gibt ein paar einfachere Möglichkeiten.

Installieren Sie einen Desktop-Manager und widmen Sie einen Desktop dem Browser und anderen Dingen, und einen anderen Desktop den Terminals.

Oder installieren Sie Linux (der Desktop-Manager wird mitgeliefert :) )

 
Vladimir Simakov:

Übrigens, das Analogon von Assert

Für jede Implementierung einer mql-Anweisung ist es sinnvoll, die Funktion DebugBreak für den Debug-Modus zu verwenden. Das macht die Fehlersuche sehr einfach und ist viel nützlicher als ein einfacher Absturz.
 

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Bibliotheken: MT4Orders

fxsaber, 2020.04.07 18:47

Teilausführungen sind im MT5 sehr leicht zu finden.
// true - сделка в результате частичного исполнения.
bool IsPartial( const ulong TicketDeal )
{
  const ulong TicketOrder = HistoryDealGetInteger(TicketDeal, DEAL_ORDER);
  
  return((HistoryDealGetInteger(TicketDeal, DEAL_TYPE) <= DEAL_TYPE_SELL) &&
         (!TicketOrder ||
          (HistoryDealGetDouble(TicketDeal, DEAL_VOLUME) != HistoryOrderGetDouble(TicketOrder, ORDER_VOLUME_INITIAL))));
}
 

Bei einem Hedge kann eine Position aus mehreren IN-Geschäften bestehen. Dies geschieht durch Teilausführung.

In diesem Fall ändert der teilweise ausgeführte Auftrag seine ORDER_TIME_SETUP(_MSC) auf den Zeitpunkt des ersten (möglicherweise vorletzten) Abschlusses. Mit anderen Worten, es wäre unmöglich, aus der Historie zu ermitteln, wann z. B. BuyLimit platziert wurde.


Infolgedessen kann der Eröffnungskurs der Hedge-Position einen Bruchteil davon betragen, was sich häufig in der Aufrechnung zeigt.