記事"マルチモジュールEAの作成"についてのディスカッション

 

新しい記事 マルチモジュールEAの作成 はパブリッシュされました:

MQLプログラミング言語によって、取引戦略のモジュール設計の概念を実装することができます。この記事では、別々にコンパイルされたファイルモジュールからなるマルチモジュールEAの作成例をご紹介します。

モジュールに代わる唯一のものは、モノリシックプログラムです。これはあまり便利ではありません。プログラムの機能の一部を変更または補足する必要がある場合、EAのコードを編集する必要があります。コードの作成者または経験豊富なプログラマーであれば、ほとんどの場合これを行うことができると思います。モノリシックプログラムがさらにコンパイルされた場合、製品は著作権者によってのみ編集可能であり、製作者と同意すればいいというものではありません。このような背景から、プログラムの重要な機能を変更する為に、製作者に問い合わせるのではなく、自分自身や第三者の開発者のサービスを使用する方がよっぽど便利に思えます。


図 1. モジュール式取引ロボットの抽象化

作者: Sergey Pavlov

 
補助(外部)モジュールはインジケーターである」とは何とも変わった論文だ。著者はこのような設計のパフォーマンス、特にリソース消費をテストしたのだろうか?
 

取引システムの多峰性は、主にプロセスの性質によって決まります(金融市場にとって、価格の動きは非定常プロセスです)。

そして、このような複雑なプロセスのモデリングは(EAの開発は 常にプロセスのモデリングであるため)、単一の、たとえ非常に複雑な入力アルゴリズムの助けを借りても不可能です。精度の面でプロセスに近づくためには、それぞれが独立したモデルである一連のアルゴリズム(モジュール)が必要です。

 
Aleksandr Masterskikh:

取引システムの多峰性は、主にプロセスの性質によって決まる(金融市場の場合、価格の動きは非定常プロセスである)。

そして、このような複雑なプロセスのモデリングは(EAの開発は 常にプロセスのモデリングであるため)、単一の、たとえ非常に複雑な入力アルゴリズムの助けを借りても不可能です。精度の点でプロセスに近づくためには、それぞれが独立したモデルである一連のアルゴリズム(モジュール)が必要です。

関数やクラスを通して実装し、極端な場合は別のファイルからコードの一部を差し込むだけです。ただ、上記のアプローチと比較して、インジケータでのデータ処理の利点は何なのでしょうか?

 
モジュール化のためのモジュール化?
trallとlosslessを2つの異なる別モジュールに入れる? 本当に?
著者はおそらく最適化、特にMt4での最適化に携わったことがないのだろう。
著者のほとんどはそのような手法を使って書いている。最も単純な関数は、1ティックごとに何十回も呼び出される別モジュールに入れられる。
そのような解決策は、最適化時間を数十倍から数千倍に増加させる。
 
Aleksey Vyazmikin:
補助(外部)モジュールはインジケーターである」という珍しい論文で、著者はそのような設計のパフォーマンス、特にリソース消費をテストしたのだろうか?

この論文は、あるインジケータの性能に関する問題に直面した後に生まれた。リソースとテスト時間を消費しました。そして、そのインジケータは売買シグナルの生成に使用されていたため、その代わりに、何も描画しない外部モジュール(シグナル・インジケータ)を作成しました。その結果、外部モジュールを使ったExpert Advisorは、すべての計算がフルに残っているにもかかわらず、「飛んだ」のです。

どんな技術にもオーバーヘッドがあることに同意します。ここで妥協し、より重要なものを選択する必要がある。パフォーマンスよりもアルゴリズムを隠すことの方が重要な場合もある。モジュラープログラミングによって性能は低下するが、それは重要なことではない。図では、すべての外部モジュールを1つのグラフに「ぶら下げた」:


次に、エキスパート・アドバイザー自体の負荷をチェックした:外部モジュールなしとありの動作モードで。結果は満足のいくものだった:


次に、ストラテジー・テスターで動かして みた。

外部モジュールなし:

2018.03.26 06:32:23.684 Core 1  EURUSD,M1: 2378530 ticks, 24349 bars generated. Environment synchronized in 0:00:00.140. Test passed in 0:00:07.769 (including ticks preprocessing 0:00:00.171).


外部モジュールあり

2018.03.26 06:33:49.859 Core 1  EURUSD,M1: 2378530 ticks, 24349 bars generated. Environment synchronized in 0:00:00.047. Test passed in 0:00:06.349.

見ての通り、外部モジュールを使った方がテストが早く終わった。

この記事の目的は、他人のコードを使ってアルゴリズムを隠す方法を紹介することだ。

 
Nikolay Khrushchev:
モジュラリティのためのモジュラリティ? トラールとノーロスを2つの異なる別個のモジュールで取り出す?本当に? ...

この記事は、モジュラー・プログラミングの技術を示している。必要な関数や関数群は、外部モジュールに隠すことができる。

 
Sergey Pavlov:

この記事は、ある指標のパフォーマンスに関する問題に直面したことから生まれた。リソースとテスト時間を浪費していた。そして、そのインジケーターは売買シグナルの生成に使用されていたため、その代わりに何も描画しない外部モジュール(シグナル・インジケーター)を作成しました。その結果、外部モジュールを使ったExpert Advisorは、すべての計算がフルで残っているにもかかわらず、「飛んだ」のです。

どんな技術にもオーバーヘッドがあることに同意します。ここで妥協し、より重要なものを選択する必要がある。パフォーマンスよりもアルゴリズムを隠すことの方が重要な場合もある。モジュラープログラミングによって性能は落ちるが、それは重要なことではない。図では、すべての外部モジュールを1つのグラフに「ぶら下げた」:


次に、エキスパート・アドバイザー自体の負荷をチェックした:外部モジュールなしとありの動作モードで。結果は満足のいくものであった:


次に、ストラテジー・テスターで 実行した。

外部モジュールなし:


外部モジュールあり

見ての通り、外部モジュールを使った方がテストが早く終わった。

この記事の目的は、他の人のコードでどのようにアルゴリズムを隠すことができるかを示すことです。

詳細な回答ありがとうございます。コードの一部を隠す可能性としては、おそらく選択肢の一つでしょう。しかし、誰がそのようなモジュールを必要とするのでしょうか?つまり、市場を通して売ることはできませんし、フリーランスの人々はソースコードを要求するでしょう。

使用するインジケータによって計算を高速化する機能 - おなじみのトピックですが、時には本当に便利で、Expert Advisorのサイクルをなくすことができます。私はちょうど今、そのようなインジケータの開発に着手しているところです。

 
Aleksey Vyazmikin:

関数やクラスを通して実装し、極端な場合は別のファイルからコードの一部を差し込むだけです。ただ、インジケーターでデータ処理することの利点は、上記のアプローチと比較して何なのでしょうか?

以下の点を区別することが重要である:

- プログラムのモジュール性(1つの単純なモデルをモジュールに分割する場合)

- 複雑なモデルのモジュール性(各モジュールが独立したモデルである)。


従来の指標はどれも単純なモデルであり、複雑なモデルが必要である、

なぜなら、単純なモデルだけでは、プロセスを十分に正確に表現することができないからである。

なぜなら、単純なモデルだけではプロセスを十分に正確に表現できないからである。

 
Aleksandr Masterskikh:

この2つを区別することが重要だ:

- プログラムのモジュール性(1つの単純なモデルをモジュールに分解した場合)

- 複雑なモデルのモジュール性(各モジュールが独立したモデルである場合)。


従来の指標はどれも単純なモデルだが、私たちには複雑なモデルが必要だ、

なぜなら、単純なモデルだけでは十分な精度が得られないからです。

複雑なモデルが必要なのです。

複雑なモデルのモジュール性とは何かを私が知らないとしましょう。

指標に組み込まれた複雑なモデルの例を挙げてください。

 

専門家ではない私にとっては、参考になる記事でした。 初心者には良い記事だと思います。

しかし、モジュール化については、例が完全ではないと思います。同じ例で、メインモジュールの各関数を別々のファイルに書き、条件付きコンパイルとinludesの助けを借りて1つのファイルにまとめたとしたら、これはモジュール化された書き方だと思う。この場合、メインのコードに影響を与えることなく、別々の部分を書き換えることができる。

例えば

 if(on_lot)
     { // 追加モジュールがある場合
      double buffer_m1[];
      ArraySetAsSeries(buffer_m1,true);
      if(CopyBuffer(handle_m1,0,0,1,buffer_m1)<0) return;
      lot=buffer_m1[0];
     }

というコードに置き換えることができる:

 if(on_lot)
     { 
        LotCulcFuntion(lot);//この関数は別のファイルに実装されている。
     }

追伸:メイン・ファイル内のモジュラー・インディケーターの名前は、ファイル名と一致しません。例えば、次のようになります:「Module_training_module_Filter_ind」です。 であって、 " Module_training_module_Filter" ではありません。