mql5言語の特徴、微妙なニュアンスとテクニック - ページ 61

 
ウラジスラフ・アンドルシェンコ

このたび、履歴に1000件以上の案件が含まれており、履歴の利益を計算するために履歴処理機能などを呼び出すと 問題が発生しました。+ チャート上の情報が遅くなり始め、端末がハングアップする。すなわち、見積もりには遅れが生じる。

コードがなければ推測するしかない。

 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

mql5の特性、ヒントとコツ

アレクセイ・ナヴォイコフ さん 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);
}

もちろん、クラスは同時継承(真の多重継承)ではなく、順次(設定した順序で)継承されるという事実があるため、微妙な部分もある。特に、過負荷が発生したときの優先順位が違ってきます。また、同じテンプレートクラスが何度も継承の連鎖に参加すると、互いに何の関係もない全く別のクラスになってしまいます。だから、ここで気をつけなければならないことがある。しかし、インターフェースは何の問題もなく、制限なく継承することができます。

しかし、テンプレートのような形で宣言しない場合はどうでしょうか。

例えば、自給自足のライブラリーは2つ用意されています。

class CLib1 : public CClass1 { };および
class CLib2 : public CClass2 { };

プログラムクラスでそのような継承を行うようにする必要があります。

CLib1--> CLib2 --> CProgram で、両方のライブラリが利用できるようにする。また、CLib1のライブラリはCLib2で利用できるようになります。

両ライブラリのコードは一切変更できません。

可能なのでしょうか?

多重継承の場合、おそらく次のようになります。
class CProgram : public CLib1,CLib2 { };

 
アルチョム・トリシキン

テンプレート宣言がない場合はどうでしょうか?

例えば、自給自足のライブラリーは2つ用意されています。

class CLib1 : public CClass1 { };および
class CLib2 : public CClass2 { };

このような継承をプログラムクラスで行う必要があります。

CLib1--> CLib2 --> CProgram で、両方のライブラリが利用できるようにする。また、CLib1のライブラリはCLib2で利用できるようになります。

両ライブラリのコードは一切変更できません。

これは可能なのでしょうか?

多重継承の場合、おそらく次のようになります。
class CProgram : public CLib1,CLib2 { };


そうすれば、何も失われることはないでしょう。

class CProgram
{
  CLib1 lib1;
  CLib2 lib2;
};
 
コルドゥン・ズロイ

そうすることで損をすることはないのです。

はい、そうです。ただ、不要なモノは避けたかったんです。
 

非同期コピー関数(CopyRates、CopyTicksなど)からデータを取得するには、おそらくEventChartCustomを 使用するのが最適です。

特に指標に関連する。

 

OnDeinit (EA, not indicator) のAccountInfoString(ACCOUNT_SERVER) は、新しい取引サーバーを返します。

 

メモ

アクション/プログラムの種類TFまたはシンボルの変更アカウント変更
インジケーターOnDeinitとOnInitを実行すると、グローバルクラスのオブジェクトが変更されます(フルリセット)。prev_calculatedがリセットされる以外は何も起こりません。
電子ブック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を使って いないので、よくわからないのですが
理由: