MQL5 Wizardとトレーディングクラスの標準ライブラリに関する質問 - ページ 11

 
Reshetov:

3つの質問です。

  1. シグナルモジュールを始値のみで動作させ、各ティックで動作させない方法は?
  2. 位置追跡モジュールで、信号モジュールの投票値を取得する方法を教えてください。すでに計算されたシグナルでトロールする必要があり、フォローするために別のシグナルモジュールを作る必要はないのです。
  3. 資金・リスク管理 モジュールのアラームモジュールの投票値を取得する方法を教えてください。すでに計算された取引シグナルに従って出来高を開く必要があり、出来高計算のために別のシグナルモジュールを作成する必要はありません。

理論的には、もちろんウィザードを使ってEAを構築し、これらの機能をすべて手動でコードに追加することができます。しかし、これらはすべて標準的なメソッドの形で、つまりウィザードを使いたいダミーのために実装されていることが望ましく、例えば、ある信号モジュールを別のものに置き換えたい場合に、コードに入り込んで編集する必要がないようにするためです。

あなたは自分の質問にすべて答えています。"...ウィザードの助けを借りてEAを構築し、次に...手動で ...」ということです。他の選択肢はまだありません。ウィザードは、近い将来、開発されない可能性が高いです。標準ライブラリのクラスは、ドグマではなく、典型的な(私の考える)解決策のセットを提供する試みです。継承(ウィザードで使用)、オーバーロード、独自メソッドの追加。そして、あなたは「幸せ」になる...。
 
uncleVic:
すべての質問に自分で答えていますね。"......ウィザードの助けを借りてEAを構築し、その後...手動で ...」ということです。他の選択肢はまだありません。ウィザードは、近い将来、開発されない可能性が高いです。

このような良い事業が、遠い片隅で見捨てられるのは残念なことです。

もし、それが最新のものであれば、多くのことができたでしょう。つまり、ダミーや他のユーザーが、コードを通さなくても様々な既製のEAを組み立てることができるモジュールを作成することができたのです。しかし、この場合、アルゴリズムによるmql4と同じ混乱が生じます。つまり、アルゴリズムを取り出して、コードに入り込み、それを手動で使用することになるのです。ここでもOOPの原則に反している。例えば、あるモジュールを別のモジュールに置き換えたい場合、コードに戻ってすべて手動でもう一度変更する必要があります。せめて、どこをどう修正すればいいのかを理解するために、コードを "クロール "するだけでも、かなりの時間を費やすことになりますから。

幸先の良いスタートとなりました。可哀想に。昨日シグナルモジュールを作成 したところですが、いちいちソースコードを見に行かなくてもEA全体が動くようにするにはどうしたらいいのか、まだ戸惑っています。使い方の記事を書きたかったのです。 今、ポジション管理、マネー管理、リスク管理を挿入、追加しましたが、すべてうまくいっています。でも、ダメなんです。ユーザーがウィザードを使用してEAを構築した場合、動作しない。彼は、コードのどこを見ればいいのか、何を変えればいいのか、膨大な量の指示書を書かなければならない。もちろん、インストラクションを書く前に、まだ自分自身でこれらのことを処理しなければならないのは言うまでもありません。

そのため、ユーザーにはオートトレードに対応するためにmql5やOpenCLなどを学ぶしか残されていないのです。そうでなければ、運がない。

さて、このプロジェクトは頓挫したので、これからは別の方向で考えていこうと思います。

 
Reshetov:

このような良い試みが、遠い片隅に捨てられてしまうのは残念なことです。

見捨てられたのではなく、棚上げされたことを期待しよう。私自身は、マスターの開発について、いろいろと興味深い考えを持っています。でも...
 
uncleVic:
放棄ではなく、延期であることを期待したい。ウィザードの開発については、私自身、いろいろと興味深い考えを持っています。でも...

希臘

最初の質問、すなわち、始値で シグナルモジュールをテストし、ティックで取引する方法について、私はコードを掘り下げる必要がないように解決策を見つけ、さらに一般的に受け入れられているものよりも優れていることがわかりました。

ポジション管理、株式・リスク管理モジュールでシグナルモジュールの表示を読み取る方法がまだわかっていないのです。ソースコードを検索して見て回りました。シグナルモジュールは、direction()メソッドを通じてその結果を取得します。つまり、私はポジション管理、株式・リスク管理モジュールにおいて、まさにこのモジュールクラスのインスタンスをアドレスし、その値を読み取るためにまさにこのメソッドを呼び出す必要があるだけなのです。どのようにすれば、コードを変更することなく、このようなことができるのか、まだ明確にはなっていません。

 
Reshetov:

じごくのさたもえ

最初の質問、すなわち、始値で シグナルモジュールをテストし、ティックで取引する方法について、私はコードに入る必要がないように解決策を見つけ、さらに一般的に受け入れられているものよりも優れていることを発見しました。

また、ポジション管理、株式・リスク管理モジュールのシグナルモジュールの読み込みの読み方が、コードを掘らないとわからないのですが、どうしたらいいでしょうか?ソースコードを検索し、下調べをした。シグナルモジュールは、direction()メソッドを通じてその結果を取得します。つまり、私はポジション管理、株式・リスク管理モジュールにおいて、まさにこのモジュールクラスのインスタンスをアドレスし、その値を読み取るためにまさにこのメソッドを呼び出す必要があるだけなのです。どのようにすれば、コードを変更することなく、このようなことができるのか、まだ明確にはなっていません。

コードを変更しないと、おそらく動作しないでしょう。

 
uncleVic:

コードを変えないというのは、おそらくうまくいかないと思います。

まだ、すべてが失われたわけではありません。CExpert、CExpertMoneu、CExpertTrailing を継承したクラスを作成し、シグナルモジュールクラスのインスタンスにアクセスするために必要なメソッドを追加することが可能です。しかし、ここでも問題があります。ウィザードは作成されたEAに#include <ExpertExpert.mqh> と書き、その子孫には書きません。

まだまだ考えなければならないことがあります。

もし開発者が、1つのシグナルモジュールをメインとして他のすべてのモジュールに使用でき、(このバージョンのウィザードのように)追加のシグナルをポジションサポートと株式とリスク管理のモジュールに追加できることをすぐに推測し、コードでそれを提供していたら、もっと簡単だったでしょう。しかし、我々の場合、各モジュールは信号の条件を追加で指定する必要があるため、さらに外部設定が必要になり、その結果、最適化すべきパラメータが多いこのようなモンスターになってしまうのです。例えば、シグナルモジュールがポジションをオープンし、付随するモジュールが次のティックでそれをクローズするというように、市場のエントリーとエグジット条件が矛盾する場合、1つのモジュールからのシグナルが競合することは言うまでもありません。

 
Reshetov:

まだ、すべてが失われたわけではありません。結局、CExpert、CExpertMoneu、CExpertTrailingを継承したクラスを作り、そこにシグナルモジュールクラスのインスタンスにアクセスするための必要なメソッドを追加すればいいのです。しかし、ここでも問題があります。ウィザードは作成されたEAに#include <ExpertExpert.mqh> と書き、その子孫には書きません。

まだ、考えていないのです。

もし開発者が、1つのシグナルモジュールをメインとして他のすべてのモジュールに使用でき、(このバージョンのウィザードのように)追加のシグナルをポジションサポートと株式とリスク管理のモジュールに追加できることをすぐに推測していたら、コードはより簡単になっていたでしょう。しかし、我々の場合、各モジュールは信号の条件を追加で指定する必要があるため、さらに外部設定が必要になり、その結果、最適化すべきパラメータが多いこのようなモンスターになってしまうのです。1つのモジュールからのシグナルが競合する可能性があることは言うまでもありません。つまり、シグナルモジュールがポジションをオープンし、付属モジュールが次のティックでそれをクローズすることができます。



そういう設計になっているんです。ウィザードはEA「fish」を作成します。さらに

  • インクルージョンの交換は問題ありません。
  • は、主信号を意図的に外部に作っている(代用する都合上)。
  • intを追加し、メソッドコールを設定する?
 
uncleVic:

そういう意図で作られたものです。マスターはアドバイザーの「魚」を作る。次のページ

  • インラインの交換は問題ありません。
  • は、主信号を意図的に外部に作成しています(代用しやすいように)。
  • intutsとsettingメソッドコールを追加してください。


みたいなのが醜い。

  1. 取引システムに含まれるモジュールのクラスのメソッドへの アクセスは、読み取りさえも拒否され、その作業の調整の可能性は完全に排除されます。
  2. 信号モジュールと位置追跡モジュールは信号が異なるため,容易に競合する可能性があり,非互換性を排除することはできない。
  3. モジュール内のシグナルが異なるため、それぞれ個別の設定が可能であり、その結果、1つのEAの入力設定は少なくなく、多くの設定項目があります。設定の種類が多いほど、履歴にフィットする確率が高くなります。
  4. ウィザードの操作後、問題を解決するためにソースを確認する必要がある場合があります。プログラミングに不慣れなエンドユーザーにとっては、プラグアンドプレイが必要なので、まったく適しません。このような混乱は、プログラマーにとっても問題である。なぜなら、ウィザードで積み上げられたコードよりも、自分のコードを扱う方がはるかに簡単だからである。さらに難しいのは、クラスが継承されることである。つまり、誤解の原因が子孫のレベルにあることは少なく、親クラスを深く探らなければならないのである。

私たちは、最高のものを求めていました。いつもと同じであることがわかった(c)チェルノムルディン

一般に、誤解のほとんどは修正することができますが、これはルートの親クラスレベルで行う必要があり、その後、プラットフォームの更新によって修正されたクラスを配布することができます。つまり、ポジションサポートと株式・リスク管理モジュールからシグナルモジュールのDirection()メソッドにアクセスできるようにする必要があります。なぜなら、個々のモジュール開発者が親クラスのソースコードを編集すると、結果的にソースコードの互換性がなくなり、作成したモジュールが他のコンピュータで動作しなくなるからです。モジュールの開発者がオーバーライドされたメソッドを持つ親クラスを作成した場合、後者が独自のインクルードを書くため、非互換性は依然としてマスターレベルにあり、その結果、エンドユーザは再び命令を書く必要があります。

 
Reshetov:

それが問題なのです。最初から、考えられていないことがあるのです。

  1. 取引システムに含まれるモジュールのクラスのメソッドへの アクセスは、読み取りさえも拒否され、その作業の調整の可能性は完全に排除されています。
  2. 信号モジュールと位置追跡モジュールは信号が異なるため、容易に競合する可能性があり、非互換性を排除することはできない。
  3. モジュール内の信号が異なるため、それぞれ別の設定になり、結果的にEAの入力設定は少なくなく、多くなってしまいます。設定の種類が多いほど、履歴にフィットする確率が高くなります。
  4. ウィザードの操作後、問題を解決するためにソースを確認する必要がある場合があります。プログラミングに不慣れなエンドユーザーにとっては、プラグアンドプレイが必要なので、まったく適しません。このような混乱は、プログラマーにとっても問題である。なぜなら、ウィザードで積み上げられたコードよりも、自分のコードを扱う方がはるかに簡単だからである。さらに難しいのは、クラスが継承されることである。つまり、誤解の原因が子孫のレベルにあることは少なく、親クラスを深く探らなければならないのである。

私たちは最高のものを求めていた。いつもと同じであることがわかった(c)チェルノムルディン

一般に誤解の多くは修正可能であるが、ルート親クラスレベルで行い、アップデートにより修正したクラスを配布することが望ましい。なぜなら、親クラスのソースコードをモジュール開発者が修正すると、結果的にソースコードの互換性がなくなり、作成したモジュールが他のコンピュータで動かなくなるからです。開発者がオーバーライドされたメソッドを持つ親クラスを作成した場合、開発者は自分でインクルードを書くため、非互換性はすでにマスターレベルであり、したがってまたエンドユーザーへの指示を書く必要があり、彼らはソースコードに入りたいとは思わないだろうし、入ったとしても1文字かどこかでエラーとなり、などなど、さまざまです。

具体的なご意見をお聞かせください。検討させていただきます。
 
uncleVic:
いくつかの提案をさせてください。見直していきます。

今のところ、上記のデメリットを解決するものは一つしかない。

シグナルモジュールのDirection()メソッドによって返される値を、ポジション管理モジュールと資本・リスク管理モジュールから読み取るためのオープンアクセスです。

シグナルモジュールクラスのインスタンスを呼び出し、シグナルモジュールのDirection()メソッドの結果を返すメソッド、例えば識別子double getMainSingnal()を1つ追加してください。この情報交換は読み取り専用で行われるため、セキュリティが破られることは一切ない。

そのために

  1. CExpertMoneyクラスとCExpertTrailingクラスのいくつかのフィールドを、CExpertSignal(シグナルのメインモジュール)のインスタンスを格納するために割り当てること。
  2. CExpertSignalのインスタンス、すなわちシグナルモジュールは、ポジション管理モジュールと資本・リスク管理モジュールのインスタンスの初期化時に渡され、ステップ1で指定されたフィールドに格納される必要があります。もちろん、これを行う前に、シグナルモジュールクラスのインスタンスがすでに存在すること、つまり作成されていることもチェック(確認)しておく必要があります。
  3. CExpertMoney クラスと CExpertTrailing クラスに、double getMainSingnal() という識別子で、これらのクラスの対応するフィールドに格納された signal モジュールクラスのインスタンスをアドレスし、signals モジュール Direction() メソッドの結果を返すメソッドを追加作成します。

追伸:CExpertクラスは、シグナルモジュールクラスのインスタンスへの参照を持っています。

CExpertSignal    *m_signal;                   // trading signals object
CExpertMoneyクラスとCExpertTrailingクラスに同じフィールドを作成し、初期化時にCExpertクラスに前述のフィールドから同じ値を渡す必要があります。