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

 
fxsaber:
La solution proposée n'a pas fait mouche jusqu'à présent. Par conséquent, je ne pourrais pas mieux vous le suggérer.
Merci de partager.
 
fxsaber:
Si vous mettez la solution en face du SB maintenant, elle devient synchronisée.
Je peux vous donner un petit exemple ? En reliant les classes - la vôtre et celle de SB :
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
La gronde de la compilation commence
 
Artyom Trishkin:
Je peux avoir un petit exemple ? En reliant les classes - la vôtre et celle de SB :
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Commence à jurer lors de la compilation

Entrer dans le thème)

Tiré d'ici

 
Vitaly Muzichenko:

Entrer dans le thème)

Tiré d'ici

Déjà fait.

J'ai juste échangé les lignes...
 
Artyom Trishkin:
Je peux vous donner un petit exemple ? En branchant des cours - les vôtres et ceux de SB :
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
J'ai un gros mot au moment de la compilation.
Ma faute, trop confiant, je n'ai pas vérifié.
Vitaly Muzichenko:

J'entre dans le sujet).

Oui, j'avais oublié cette nuance. Cependant, cette restriction n'y existe plus...

Si vous réorganisez les inludes, ça ne jurera pas, bien sûr. Mais l'effet sera nul - SB ne sera pas synchronisé.

Malheureusement, je ne vois pas de belle solution. Jusqu'à présent

// Вместо #include <Trade\Trade.mqh> использовать этот код
// Это сделает СБ синхронизированным и не потребует каких-либо изменений в экспертах.

#ifdef OrderSend
  #undef OrderSend

  #define CTrade CTradeBase
    #include <Trade\Trade.mqh>
  #undef CTrade
  
  class CTrade : public CTradeBase
  {
    virtual bool OrderSend(const MqlTradeRequest &request,MqlTradeResult &result)
      {
       bool res;
       string action="";
       string fmt   ="";
    //--- action
       if(m_async_mode)
          res=::OrderSendAsync(request,result);
       else
          res=ORDERSEND::OrderSendSync(request,result); // единственное отличие от стандарта
    //--- check
       if(res)
         {
          if(m_log_level>LOG_LEVEL_ERRORS)
             PrintFormat(__FUNCTION__+": %s [%s]",FormatRequest(action,request),FormatRequestResult(fmt,request,result));
         }
       else
         {
          if(m_log_level>LOG_LEVEL_NO)
             PrintFormat(__FUNCTION__+": %s [%s]",FormatRequest(action,request),FormatRequestResult(fmt,request,result));
         }
    //--- return the result
       return(res);
      }
  };
  
  // Эта строчка позволяет сделать все OrderSend корректными.
  #define OrderSend ORDERSEND::OrderSendSync  
#else
  
#include <Trade\Trade.mqh>
#endif
 
fxsaber:
C'est ma faute, je l'ai dit de manière trop confiante, je n'ai pas vérifié.

Oui, je l'avais oublié. Cependant, cette restriction n'y existe plus...

Si vous réorganisez les inludes, bien sûr, ça ne jurera pas. Mais l'effet sera nul - SB ne sera pas synchronisé.

Malheureusement, je ne vois pas de belle solution. Jusqu'ici, jusqu'à

// Вместо #include <Trade\Trade.mqh> использовать этот код
// Это сделает СБ синхронизированным и не потребует каких-либо изменений в экспертах.

...
Et s'il est nécessaire d'hériter de Trade\Trade.mqh ? Comment ?

Eh bien, c'est-à-dire de brancher votre classe, et Trade\Trade.mqh s'affichera déjà.
 
Artyom Trishkin:
Et s'il est nécessaire d'hériter de Trade\Trade.mqh ? Comment ?

Eh bien, c'est-à-dire, pour connecter votre classe, et Trade\Trade.mqh sera tiré vers le haut.
L'héritage fonctionnera comme avant. Mais vous feriez mieux de clarifier votre question.
 
fxsaber:
L'héritage fonctionnera comme avant. Mais vous feriez mieux de clarifier votre question.
Ce code doit être hérité de CTrade.

C'est-à-dire, faites de CTrade une classe de base dans la première ligne de votre code :

class ORDERSEND  : public CTrade
Respectivement, ce n'est plus Trade\Trade.mqh qui doit être inclus dans votre programme, mais plutôt un inline, par exemple #include <aTradeSync.mqh> qui contient votre classe et #include <Trade\Trade.mqh> écrit là au tout début.

Comment cela devrait-il être dans ce cas ? Au lieu de #include <Trade\Trade.mqh>, faut-il insérer le code suggéré ?
 
Artyom Trishkin:
Héritez de ce code de CTrade.

C'est-à-dire, faites de CTrade une classe de base dans la première ligne de votre code :

class ORDERSEND  : public CTrade

En conséquence, vous ne devez plus connecter Trade\Trade.mqh à votre programme, mais plutôt un inludeur, par exemple #include <aTradeSync.mqh> qui contient votre classe et #include <Trade\Trade.mqh> écrit là au tout début.

Je ne le ferais pas de cette façon, car cela nécessiterait de modifier des EAs déjà écrites. Et le pur OrderSend ne sera pas synchronisé, seulement SB-OrderSend. Tout le monde n'utilise pas le SB uniquement. Certaines personnes utilisent même du MQL5 pur.

Par conséquent, la solution ci-dessous semble optimale pour le moment. Tous les EAs fonctionneront sans changement.

#include <OrderSendSync.mqh> // Если хочется, чтобы OrderSend был синхронизированным.
#include <TradeSync.mqh>     // Если подключен OrderSendSync.mqh - СБ станет синхронизированной, иначе - стандартной.
Dossiers :
 
fxsaber:

Je ne le ferais pas de cette façon, car cela nécessiterait de changer les EAs précédemment écrites. Et le pur OrderSend ne sera pas synchronisé, seulement le SB-OrderSend. Tout le monde n'utilise pas le SB uniquement. Certaines personnes utilisent même du MQL5 pur.

Par conséquent, la solution ci-dessous semble optimale pour le moment. Tous les EAs fonctionneront sans changement.

#include <OrderSendSync.mqh> // Если хочется, чтобы OrderSend был синхронизированным.
#include <TradeSync.mqh>     // Если подключен OrderSendSync.mqh - СБ станет синхронизированной, иначе - стандартной.
Je vois, merci.