错误、漏洞、问题 - 页 2347

 
Andrey Khatimlianskii:

但我也没有设法为不同的库实现它。要在一行中用这样的宏连接几个库,并为所有库调用OnTick。

我真的不明白,甚至一个例子,我想得到什么。你能给我看看吗?


ZZZ 至于管理者,见EventBase。这里是 EventBase.mqh。愚蠢地让每个人都成为继承人,当一个新的对象出现时,它的指针会进入一个公共列表,这个列表在每个On-event中被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");};
  };


专家.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:

要在一行中用这样的宏连接几个库,并调用OnTick来调用所有库的OnTick。

import 周围做一个宏包装器,通过库的名字(class##libname)形成一个类,并在包装器内使用上下文进行调用(libname::oninit)。

并且该类被转储到上述管理器中。

但对每个解放军来说是一个单独的行。

 
TheXpert:

在导入时做一个宏包装,通过库的名称形成一个类(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_
//+------------------------------------------------------------------+

而在专家顾问的代码中,我只包括一个#include <fileMyclass.mqh>。

在你的例子中,所有三个文件都必须关闭(在代码的最底部),用我的宏替换(并替换名称m_class2 , m_class3...)。

安德烈-哈蒂姆连斯基

已经建议了单类型类的解决方案:从CObject继承,并在类管理器中添加宏替换,将所有添加的实例存储在CArrayObj中,循环查看并调用所需的OnXXX函数。

我也没有设法为不同的库实现这一点。在一行中用这种宏连接几个库,并调用所有库的OnTick。

需要一个例子,我不知道怎么做,也没有用 "类管理器中的宏替换 "来工作。

 
Andrey Khatimlianskii:

导致所有3个打印:"Init 1"、"Init 2 "和 "Init EA"

做经理。上面的源代码的例子已经表明。不过,宏是用来做其他事情的。

 
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%的透明,但比目前要好。