Caractéristiques du langage mql5, subtilités et techniques - page 169

 

Au fait, l'analogue de 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:

Je ne peux pas être sûr d'en avoir besoin !

Si les développeurs avaient donné exit / abort en standard, alors il serait possible de terminer correctement le traitement des données, si, par exemple, TF n'est pas prêt - données OHLC, il serait également utile pour le traitement de l'envoi des ordres au serveur .... il serait pratique d'interrompre le code à n'importe quel endroit et de sortir avant le prochain tick sans avoir besoin de return() pour sortir de OnTick().

En fait, il est possible d'implémenter une béquille, mais l'ergonomie est mauvaise dans ce cas, je ne vous la montrerai même pas, même si elle devrait fonctionner.
 

Bien que la convivialité semble avoir été améliorée. En général, chaque appel de fonction ou de méthode avec une sortie possible, y compris les fonctions imbriquées, doit être enveloppé dans la macro _call. Pour ceux qui sont intéressés, n'hésitez pas à écrire le reste pour tous les handlers. Il a été écrit sur une manivelle, comme un test d'une idée, donc il n'a pas été testé, à partir du mot - du tout.

#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");}
 

Le MT5 ne dispose d'aucune protection contre la fermeture accidentelle du terminal. Un tel scénario s'est produit récemment.

  • Le terminal et le navigateur sont ouverts sur l'ensemble de la fenêtre. Je suis dans le navigateur.
  • Le navigateur est gelé, je clique sur la croix dans le coin supérieur droit.
  • Il ne se ferme pas, j'appuie dessus quelques fois de plus.
  • À un moment donné pendant l'appui, le navigateur se ferme - la fenêtre disparaît. Et à ce moment la croix du terminal sous le curseur, où j'ai appuyé.
  • Le terminal se ferme, si rapidement qu'on ne le remarque tout simplement pas. Surtout lorsque de nombreux terminaux sont ouverts.

C'est une situation très désagréable lors de l'optimisation des lots, par exemple. Mais c'est encore pire pour le conseiller de combat. Vous êtes peut-être stupide de ne pas remarquer que vous avez tué votre terminal de combat.


Vous avez mis une telle protection.

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

Lorsque vous le fermez, un message apparaît pendant cinq secondes. Pour que vous puissiez découvrir ce qui s'est réellement passé. Il est étrange qu'il n'y ait pas de protection dans le terminal.

 
fxsaber:

Le MT5 ne dispose d'aucune protection contre la fermeture accidentelle du terminal. Un tel scénario s'est produit récemment.

  • Le terminal et le navigateur sont ouverts sur l'ensemble de la fenêtre. Je suis dans le navigateur.
  • Le navigateur est gelé, je clique sur la croix dans le coin supérieur droit.
  • Il ne se ferme pas, j'appuie dessus quelques fois de plus.
  • À un moment donné pendant l'appui, le navigateur se ferme - la fenêtre disparaît. Et à ce moment la croix du terminal sous le curseur, où j'ai appuyé.
  • Le terminal se ferme, si rapidement qu'on ne le remarque tout simplement pas. Surtout lorsque de nombreux terminaux sont ouverts.

C'est une situation très désagréable lors de l'optimisation des lots, par exemple. Mais c'est encore pire pour le conseiller de combat. Vous êtes peut-être stupide de ne pas remarquer que vous avez tué votre terminal de combat.


Vous avez mis une telle protection.

Lorsque vous le fermez, un message apparaît pendant cinq secondes. Pour que vous puissiez découvrir ce qui s'est réellement passé. Il est étrange que le terminal n'ait pas de protection.

Il existe quelques options plus simples.

  1. Gardez le terminal de combat au minimum.
  2. Gardez le terminal de combat sur le VPS
  3. Attachez les mains coquines et restez loin de l'ordinateur. )))
  4. Je vais devoir réfléchir, peut-être que quelque chose va se présenter...)))
 
Alexey Viktorov:

Il existe quelques options plus simples.

  1. Gardez le terminal de combat au minimum.
  2. Garder le terminal de combat sur un VPS
  3. Attachez les mains coquines et restez loin de l'ordinateur. )))
  4. Je dois réfléchir, peut-être que quelque chose va se présenter...)))

Sur VPS peut fermer aussi. J'ai des experts là-bas qui envoient du Push.

Et c'est vraiment facile de frapper la mauvaise croix quand l'interface du vent ralentit. Je l'ai fait, maintenant je le ferme sur la barre des tâches dans le menu contextuel.

 
Alexey Viktorov:

Il existe quelques options plus faciles.

Installez un gestionnaire de bureau et dédiez un bureau au navigateur et autres, et dédiez un autre bureau aux terminaux.

Ou installez Linux (le gestionnaire de bureau est fourni avec :) ).

 
Vladimir Simakov:

Au fait, l'analogue de Assert

Pour toute mise en œuvre d'une instruction mql, il est judicieux d'utiliser la fonction DebugBreak pour le mode débogage. Cela rend la vie très facile lors du débogage et bien plus utile que de se planter.
 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bibliothèques : MT4Orders

fxsaber, 2020.04.07 18:47

L'exécution partielle est très facile à trouver dans MT5.
// 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))));
}
 

Sur une couverture, une position peut être constituée de plusieurs transactions IN. Cela se fait par exécution partielle.

Dans ce cas, l'ordre qui est partiellement exécuté changera son ORDER_TIME_SETUP(_MSC) pour l'heure de la première (éventuellement avant-dernière) transaction. En d'autres termes, il serait impossible de déterminer à partir de l'historique quand, par exemple, BuyLimit a été placé.


En conséquence, la position sur la couverture peut avoir un prix d'ouverture fractionné, comme on peut souvent le voir sur la compensation.

Raison: