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

 
弗拉迪斯拉夫-安德鲁申科

我现在遇到了一个问题,当历史记录包含超过1000笔交易时,当我调用 历史处理函数 时,例如,计算历史的利润。+ 图表上的信息开始变慢,终端挂起。也就是说,报价是有延迟的。

没有代码,人们只能猜测。

 

关于交易、自动交易系统和交易策略测试的论坛

mql5的特殊性,技巧和窍门

Alexey Navoykov, 2017.07.21 17:04

令人失望的是,MQL中没有多重继承。然而,我们可以用任何可能的方式使它工作--用模板和宏--我们怎么能避免它们呢?)

这是我所做的。所有的源类都应该被声明为定义了父类 的模板。

class CBase { };  // базовый класс

// Макросы, задающие список наследования:

#define  INHERIT1(T)  T<CBase>

#define  INHERIT2(T1, T2)  T2<INHERIT1(T1)>

#define  INHERIT3(T1, T2, T3)  T3<INHERIT2(T1,T2)>

#define  INHERIT4(T1, T2, T3, T4)  T4<INHERIT3(T1,T2,T3)>


// Различные пользовательские классы:

template<typename TParent>
class A : public TParent { public: void a() { Print("A"); } };

template<typename TParent>
class B : public TParent { public: void b() { Print("B"); } };

template<typename TParent>
class C : public TParent { public: void c() { Print("C"); } };


class X : public INHERIT3(A, B, C)  {  };   // Объявляем класс, наследуемый от A, B, C


template<typename T>
void SomeFunc(B<T>& obj)  { obj.b(); }   // Проверочная функция, принимающая класс B


void OnInit()
{
  X x;
  x.a();
  x.b();
  x.c();
  
  SomeFunc(x);
}

当然,还有一些微妙之处,与类是按顺序继承的(按照我们设定的顺序),而不是同时继承的(如真正的多重继承)这一事实有关。特别是,当发生过载时,它们会有不同的优先级。此外,如果一个相同的模板类多次参与继承链,它们将是完全不同的类,彼此之间没有任何关系。所以我们在这里必须小心。但在接口方面没有问题,你可以不受限制地进行继承。

但如果没有模板形式的声明呢?

例如,我们有两个现成的自给自足的图书馆。

class CLib1 : public CClass1 { };and
class CLib2 : public CClass2 { };

我们需要让它在程序类中有这样的继承性。

CLib1--> CLib2--> CProgram,这样这两个库就可以在CProgram类中使用。而CLib1库将在CLib2中可用。

这可以防止这两个库被以任何方式修改。

这有可能吗?

如果是多重继承,可能会是这样的
class CProgram : public CLib1,CLib2 { };

 
阿尔乔姆-特里什金

没有模板声明如何呢?

例如,我们有两个现成的自给自足的图书馆。

class CLib1 : public CClass1 { };and
class CLib2 : public CClass2 { };

我们需要在程序类中进行这样的继承。

CLib1--> CLib2--> CProgram,这样这两个库就可以在CProgram类中使用。而CLib1库将在CLib2中可用。

这两个库的代码不能以任何方式改变。

这有可能吗?

如果是多重继承,可能会是这样的
class CProgram : public CLib1,CLib2 { };


如果你这样做,你不会有任何损失。

class CProgram
{
  CLib1 lib1;
  CLib2 lib2;
};
 
科尔敦-兹罗伊

你这样做不会有任何损失。

是的,我做到了。我只是想避免不必要的对象。
 

从异步复制函数(CopyRates、CopyTicks等)获取数据的最好方法可能是通过EventChartCustom

特别是与指标有关。

 

可以知道交易服务器已经改变,而不仅仅是账户--OnDeinit(EA,不是指标)中的AccountInfoString(ACCOUNT_SERVER)将返回新的交易服务器。

 

备忘录

行动/方案类型改变TF或符号账户变更
指标运行OnDeinit和OnInit,全局类对象改变(完全重置)。除了prev_calculated被重置外,什么也没有发生。
EA运行OnDeinit和OnInit,全局类对象没有 变化。运行OnDeinit和OnInit,全局类对象改变(完全重载)。
 
文件压缩和通用执行时间测量

关于交易、自动交易系统和策略测试的论坛

我对策略测试员的不满。 对MQL开发人员的不满

fxsaber, 2017.12.04 09:11

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
} 

void OnStart()
{
  uchar Data[];
  uchar Key[1];
  uchar Result[];
  
  FileLoad("thousands_rubies_galaxy.bmp", Data);  
  BENCH(Print(CryptEncode(CRYPT_ARCH_ZIP, Data, Key, Result)))
  
  ArrayFree(Data);
  
  FileLoad("space_wind.wav", Data);  
  BENCH(Print(CryptEncode(CRYPT_ARCH_ZIP, Data, Key, Result)))
}

结果

826534
Time[Print(CryptEncode(CRYPT_ARCH_ZIP,Data,Key,Result))] = 53334
306648
Time[Print(CryptEncode(CRYPT_ARCH_ZIP,Data,Key,Result))] = 29029
 

有一整类指标在价格图上叠加其他符号的价格图。它们是以同样的方式进行的--通过指标缓冲器

然而,在MT5中,有一个很好的OBJ_CHART,它可以让你更漂亮地实现这一任务,而且没有指标缓冲区。

例如,你可以把任何指标,立即看到它在另一个符号上的样子。

从属方案 - 几个图表作为主图表的背景显示。

 
fxsaber:

例如,你可以铸造任何指标,并立即看到它在另一个符号上的样子。

从属方案 - 几个图表作为主图表的背景显示。

有没有一张这样的图片?不太清楚,我还没有使用OBJ_CHART