エラー、バグ、質問 - ページ 2347

 
Andrey Khatimlianskii:

しかし、異なるライブラリに対応した実装もできていないんです。このようなマクロを持つ複数のライブラリを1行で接続し、すべてのライブラリでOnTickを呼び出すこと。

何を手に入れたいのか、例題すらよくわからない。見せてもらえますか?


ZZZ マネージャーについては、ご覧のとおりです。EventBase.mqhはこちら。愚かにも全員を相続人にし、新しいオブジェクトが現れると、そのポインタは共通のリストに移動し、Onイベントごとにforループで呼び出されるようにしました。

 
fxsaber:

欲しいものの見本も手に入らない。見せてもらえますか?

MyClass_1.mqh:

class Myclass_1
  {
public:
   void              OnInit(){Print("Init 1");};
  };


MyClass_2.mqh:

class Myclass_2
  {
public:
   void              OnInit(){Print("Init 2");};
  };


Expert.mq5。

#include <MyClass_1.mqh>
#include <MyClass_2.mqh>

Myclass_1 m_class_1;
Myclass_2 m_class_2;

void OnInit( void )
{
  Print( "Init EA" );
}


実行結果として3つのプリンターをすべて取得する場合:"Init 1"、"Init 2"、"Init EA"

 

皆さん、こんにちは。

エキスパートからIndicatorParameters 関数を呼び出すと、エラー4014が発生します。それは何でしょうか?1960年製造。

 
Andrey Khatimlianskii:

このようなマクロで複数のライブラリを1行で接続し、OnTickを呼び出すことで全てのライブラリのOnTickを呼び出せるようにする。

ライブラリ名(class##libname)でクラスを形成し、ラッパー内の呼び出しにコンテキストを使用するインポート 周りのマクロラッパーを作成する(libname::oninit)。

で、そのクラスは上記のマネージャにダンプされます。

が、それぞれのリブには別の行が必要です。

 
TheXpert:

ライブラリ名でクラスを形成するimportのマクロラッパーを作る(class##libname)

これは私にはちょっと難しいので、ググってみます。

 
Kuzmich:

皆さん、こんにちは。

エキスパートからIndicatorParameters 関数を呼び出すと、エラー4014が発生します。それは何でしょうか?1960年製造。

あなたは3 inludniksを持っている場合は、私のコードが動作するはずですが、各クラスのマクロ置換を処方する必要があり、ここで私の例です、それは動作するように見えるが、私はまだチェックします。

class Myclass
  {
public:
                     Myclass(){};
                    ~Myclass(){};
   void              OnInit()  {Print(__FUNCSIG__," выполнен");};
   void              OnDeinit(int Reason){Print(__FUNCSIG__," выполнен");}
   void              OnTick()  {Print(__FUNCSIG__," выполнен");};
   void              OnTimer() {Print(__FUNCSIG__," выполнен");};
  } m_class;
//+------------------------------------------------------------------+
#define  MyClassOnInit m_class.OnInit();
void OnInit( void ){ MyClassOnInit; EventSetMillisecondTimer(300); ::MyClassOnInit_(); }
#define OnInit MyClassOnInit_
//+------------------------------------------------------------------+
#define  MyClassOnDeinit(Reason) m_class.OnDeinit(Reason);
void OnDeinit( const int Reason ){ MyClassOnDeinit(Reason); ::MyClassOnDeinit_(Reason); }
#define OnDeinit MyClassOnDeinit_
//+------------------------------------------------------------------+
#define  MyClassOnTimer m_class.OnTimer();
void OnTimer( void ){ MyClassOnTimer; ::MyClassOnTimer_(); }
#define OnTimer MyClassOnTimer_
//+------------------------------------------------------------------+
#define  MyClassOnTick m_class.OnTick();
void OnTick( void ){ MyClassOnTick; ::MyClassOnTick_(); }
#define OnTick MyClassOnTick_
//+------------------------------------------------------------------+

Expert Advisor のコードでは、1つの #include <fileMyclass.mqh> をインクルードするだけです。

この例では、3つのファイルすべてを、私のマクロ置換で(コードの一番下に)閉じなければなりません(そして、m_class2 , m_class3... の名前を置換してください)。

アンドレイ・ハチムリアンスキー

CObjectを継承し、クラスマネージャにマクロを追加することで、追加された全てのインスタンスをCArrayObjに格納し、それをループして必要なOnXXX関数を呼び出すというものです。

私も異なるライブラリに対応した実装はできていません。このようなマクロを持つ複数のライブラリを1行で接続し、すべてのライブラリのOnTickを呼び出すこと。

の例が必要ですが、方法がわからず、"クラスマネージャでのマクロ置換 "ではうまくいきませんでした。

 
Andrey Khatimlianskii:

実行結果として「Init 1」「Init 2」「Init EA」の3つのプリンターを全て取得する場合

マネージャーをやってください。上記のソースコードの例で示した。マクロは別のことに使うんですけどね。

 
Andrey Khatimlianskii:

私にはちょっと複雑なので、ググってみました。

きれいな形にはなりませんが、こんな風に切り取ることができるんです。

// for libsample
#import "libsample.ex5"
IMPORT_EA_INTERFACE // здесь список импортируемых функций. они по идее одинаковые, поэтому можно в отдельный дефайн
#import
 DECLARE_AND_REGISTER(libsample) // здесь генерация класса-обертки для libsample который обернет импортированные функции и зарегистрируется в менеджере
 

ここでは、マネージャーを使用しない直接の呼び出しと実装例を紹介します。

#define  IMPORT_EA_INTERFACE \
void f1(); \
void f2(); \

#define  DECLARE_AND_REGISTER(x) \
class ImportFrom_##x \
{ \
public: \
   static void f1() { x::f1();} \
   static void f2() { x::f2();} \
}; \

#import "libsample.ex5"
IMPORT_EA_INTERFACE
#import
 DECLARE_AND_REGISTER(libsample)

#import "libsamplesecond.ex5"
IMPORT_EA_INTERFACE
#import
 DECLARE_AND_REGISTER(libsamplesecond)

void OnStart()
{
   ImportFrom_libsample::f1();
   ImportFrom_libsample::f2();

   ImportFrom_libsamplesecond::f1();
   ImportFrom_libsamplesecond::f2();
}

ImportFrom クラスにマネージャ登録と非静的関数があれば、インポートされたすべての関数に対して自動的に呼び出すことができます。

 
TheXpert:

ここでは、マネージャーを使用しない直接の呼び出しと実装例を紹介します。

ImportFrom クラスにマネージャ登録と非静的関数があれば、インポートされたすべての関数に対して自動的に呼び出すことができます。

アイデアを得た、ありがとう。

100%透明というわけではありませんが、現時点よりはマシです。

理由: