mql5语言的特点、微妙之处以及技巧 - 页 6

 
fxsaber:
到目前为止,提议的解决方案还没有击中其他东西。因此,我不能再建议它更好了。
谢谢你的分享。
 
fxsaber:
如果你现在把解决方案放在SB前面,它就会变成同步的。
我可以给你一个小例子吗?连接班级时--你的和SB的。
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
汇编的骂声开始了
 
阿尔乔姆-特里什金
我可以举个小例子吗?连接班级时--你的和SB的。
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
编译时开始说脏话

进入主题)

摘自这里

 
维塔利-穆齐琴科

进入主题)

摘自这里

已经完成。

刚刚调换了线路...
 
阿尔乔姆-特里什金
我可以给你一个小例子吗?插班时--你的和SB的。
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
我得到一个编译时的脏话。
我的错,过于自信,没有检查。
维塔利-穆齐琴科

我正在进入这个主题)。

是的,我忘了这个细微差别。然而,这种限制在那里不存在了......

如果你重新安排嵌套,当然就不会发誓了。但效果将是无效的--SB将不会被同步。

不幸的是,我没有看到一个漂亮的解决方案。到目前为止

// Вместо #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:
我的错,过于自信的说法,没有检查。

是的,我忘了这一点。然而,这种限制在那里不存在了......

当然,如果你重新安排嵌套,它就不会发誓。但效果将是无效的--SB将不会被同步。

不幸的是,我没有看到一个漂亮的解决方案。到目前为止,所以

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

...
如果需要从Trade\Trade.mqh继承呢?如何?

那么,也就是说,要插入你的类,Trade\Trade.mqh就已经拉出来了。
 
阿尔乔姆-特里什金
如果需要从Trade\Trade.mqh继承呢?如何?

嗯,也就是连接你的班级,Trade\Trade.mqh会被拉出来。
继承权将像以前一样工作。但你最好澄清一下你的问题。
 
fxsaber:
继承权将像以前一样工作。但你最好澄清一下你的问题。
这段代码 应继承自 CTrade。

也就是说,在你的代码的第一行中,使CTADR成为基类。

class ORDERSEND  : public CTrade
尊敬的是,你的程序中不应该再包含Trade\Trade.mqh。 相反,你应该,例如,在最开始的时候包含一个包含你的类的#include <TradeSync.mqh>,以及#include <TradeTrade.mqh>。

在这种情况下应该如何?你应该插入建议的代码,而不是#include <Trade\Trade.mqh>?
 
阿尔乔姆-特里什金
从CTrade继承这段代码

也就是说,在你的代码的第一行中,使CTADR成为基类。

class ORDERSEND  : public CTrade

因此,你不应该再把Trade\Trade.mqh连接到你的程序中,而应该是一个inluder,例如#include <TradeSync.mqh>,它包含你的类,并且#include <Trade\Trade.mqh>写在最开始。

我不会这样做,因为这需要改变以前编写的EA。而纯粹的OrderSend不会被同步,只有SB-OrderSend。不是每个人都只使用SB。有些人甚至使用纯MQL5。

因此,下面的解决方案目前看来是最佳的。所有的EA都能正常工作,不需要改变。

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

不会这样做,因为这需要改变以前写的EA。纯粹的OrderSend将不会被同步,只有SB-OrderSend。不是每个人都只使用SB。有些人甚至使用纯MQL5。

因此,下面的解决方案目前看来是最佳的。所有的EA都能正常工作,不需要改变。

#include <OrderSendSync.mqh> // Если хочется, чтобы OrderSend был синхронизированным.
#include <TradeSync.mqh>     // Если подключен OrderSendSync.mqh - СБ станет синхронизированной, иначе - стандартной.
我明白了,谢谢你。