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> использовать этот код
// Это сделает СБ синхронизированным и не потребует каких-либо изменений в экспертах.

...
TradeTrade.mqhを継承する必要がある場合はどうすればよいですか?どうやって?

まあ、つまり、自分のクラスを入れると、TradeTrade.mqhがすでに出てくるということです。
 
アルチョム・トリシキン
TradeTrade.mqhを継承する必要がある場合はどうすればよいですか?どうやって?

まあ、つまり、自分のクラスを接続すると、TradeTrade.mqhが引き出されるわけです。
継承は従来通り行われます。でも、質問ははっきりさせたほうがいいですよ。
 
fxsaber
継承は従来通り機能します。でも、質問ははっきりさせたほうがいいですよ。
このコードは CTradeから継承される必要があります。

すなわち、コードの最初の行でCTradeをベースクラスとする。

class ORDERSEND  : public CTrade
例えば、クラスを含む#include <aTradeSync.mqh> とそこに書かれた#include <TradeTrade.mqh> を一番最初にインラインで挿入してください。

この場合、どうあるべきなのでしょうか?<TradeTrade.mqh> の代わりに、推奨されるコードを挿入する必要がありますか?
 
アルチョム・トリシキン
このコードは CTradeから継承してください。

すなわち、コードの最初の行でCTradeをベースクラスとする。

class ORDERSEND  : public CTrade

したがって、TradeTrade.mqh をプログラムに接続するのではなく、例えば、クラスを含む #include <aTradeSync.mqh> とそこに書かれた #include <TradeTrade.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 - СБ станет синхронизированной, иначе - стандартной.
なるほど、ありがとうございます。
理由: