Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 6

 
fxsaber:
Die vorgeschlagene Lösung hat bis jetzt nichts anderes getroffen. Deshalb kann ich es nicht besser empfehlen.
Vielen Dank für die Mitteilung.
 
fxsaber:
Wenn Sie die Lösung jetzt vor den SB setzen, wird sie synchronisiert.
Darf ich Ihnen ein kleines Beispiel geben? Beim Verbinden von Klassen - Ihrer und der von SB:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Kompilationsschelte beginnt
 
Artyom Trishkin:
Kann ich ein kleines Beispiel haben? Beim Verbinden von Klassen - Ihrer und der von SB:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Beginnt beim Kompilieren zu fluchen

Einstieg in das Thema)

Entnommen von hier

 
Vitaly Muzichenko:

Einstieg in das Thema)

Entnommen von hier

Bereits erledigt.

Habe gerade die Leitungen getauscht...
 
Artyom Trishkin:
Darf ich Ihnen ein kleines Beispiel geben? Beim Einstecken von Klassen - Ihre und SB:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Ich erhalte ein Kompilierzeit-Schimpfwort.
Mein Fehler, ich war zu zuversichtlich und habe es nicht überprüft.
Vitaly Muzichenko:

Ich steige in das Thema ein.)

Ja, ich habe diese Nuance vergessen. Allerdings gibt es diese Einschränkung dort nicht mehr...

Wenn Sie die Einschübe neu anordnen, wird es natürlich nicht fluchen. Die Wirkung ist jedoch gleich Null - SB wird nicht synchronisiert.

Leider sehe ich keine schöne Lösung. Bislang

// Вместо #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:
Mein Fehler, zu selbstbewusst ausgedrückt, ich habe nicht nachgesehen.

Ja, das habe ich vergessen. Allerdings gibt es diese Einschränkung dort nicht mehr...

Wenn Sie die Einlagen neu anordnen, wird es natürlich nicht fluchen. Die Wirkung ist jedoch gleich Null - SB wird nicht synchronisiert.

Leider sehe ich keine schöne Lösung. So weit, so gut

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

...
Was, wenn es erforderlich ist, von Trade\Trade.mqh zu erben? Wie?

Nun, d.h., Sie geben Ihre Klasse ein, und Trade\Trade.mqh wird bereits angezeigt.
 
Artyom Trishkin:
Was, wenn es erforderlich ist, von Trade\Trade.mqh zu erben? Wie?

Nun, das heißt, um Ihre Klasse zu verbinden, und Trade\Trade.mqh wird aufgerufen werden.
Die Vererbung wird wie bisher funktionieren. Aber Sie sollten Ihre Frage besser präzisieren.
 
fxsaber:
Die Vererbung wird wie bisher funktionieren. Aber Sie sollten Ihre Frage besser präzisieren.
Dieser Code sollte von CTrade geerbt werden.

D.h., machen Sie CTrade in der ersten Zeile Ihres Codes zu einer Basisklasse:

class ORDERSEND  : public CTrade
Dementsprechend ist es nicht mehr Trade\Trade.mqh, das in Ihr Programm eingebunden werden sollte, sondern ein Inline, z.B. #include <aTradeSync.mqh>, das Ihre Klasse enthält und #include <Trade\Trade.mqh>, das dort ganz am Anfang steht.

Wie sollte es in diesem Fall sein? Sollten Sie anstelle von #include <Trade.mqh> den vorgeschlagenen Code einfügen?
 
Artyom Trishkin:
Vererben Sie diesen Code von CTrade.

D.h., machen Sie CTrade in der ersten Zeile Ihres Codes zu einer Basisklasse:

class ORDERSEND  : public CTrade

Dementsprechend sollten Sie Trade\Trade.mqh nicht mehr in Ihr Programm einbinden, sondern einen Inluder, zum Beispiel #include <aTradeSync.mqh>, das Ihre Klasse enthält und #include <Trade\Trade.mqh>, das dort ganz am Anfang steht.

Ich würde es nicht auf diese Weise tun, da dies eine Änderung der zuvor geschriebenen EAs erfordern würde. Und reiner OrderSend wird nicht synchronisiert, nur SB-OrderSend. Nicht jeder verwendet SB-only. Manche Leute verwenden sogar reines MQL5.

Daher scheint die nachstehende Lösung vorerst optimal zu sein. Alle EAs werden ohne Änderungen funktionieren.

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

Ich würde es nicht auf diese Weise machen, da es eine Änderung der zuvor geschriebenen EAs erfordern würde. Und der reine OrderSend wird nicht synchronisiert, sondern nur der SB-OrderSend. Nicht jeder verwendet SB-only. Manche Leute verwenden sogar reines MQL5.

Daher scheint die nachstehende Lösung vorerst optimal zu sein. Alle EAs werden ohne Änderungen funktionieren.

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