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

 
Reshetov:

今のところ、上記のデメリットを解決する方法は一つしかありません。

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

シグナルモジュールクラスのインスタンスを参照し、シグナルモジュールのDirection()メソッドの結果を返す、例えば、識別子doubleのgetMainSingnal()というメソッドをもう一つ追加する。この情報交換は読み取り専用であるため、セキュリティは何ら損なわれない。

そのために

  1. CExpertSignalクラス(シグナルのメインモジュール)のインスタンスを格納するために、CExpertMoneyクラスとCExpertTrailingクラスのフィールドを割り当てること。
  2. このCExpertSignalクラスのインスタンス、すなわちシグナルモジュールは、ポジション管理モジュールと資金管理モジュールに、これらのモジュールクラスのインスタンスの初期化時に渡され、ステップ1で指定されたフィールドに保存される必要があります。もちろん、その前に、シグナルモジュールクラスのインスタンスがすでに存在すること、つまり作成されていることをチェック(確認)する必要があります。
  3. CExpertMoney クラスと CExpertTrailing クラスに、double 型の getMainSignal() メソッドを追加し、これらのクラスの該当フィールドに格納されたシグナルモジュールクラスインスタンスを参照し、結果として、シグナルモジュール Direction() メソッドの結果を返すようにします。

ほぼすべてクリア。ただひとつはっきりさせたいのは、「なぜ、MMと末尾のレベルでシグナルを見たいというあなたのこの欲求が、ベースクラスレベルで実装されなければならないのか」ということです。

それは良いこと(=悪いこと)ではないと思います。アルゴリズムは(私から見て)典型的なものではありません。私の理解では、あなたは独自のMMとトレイリングモジュール(信号に結びついた独自のアルゴリズムを持っている)を持っています。

ここに、1.、2.、3.に対応するものを入れてください。

 
uncleVic:

ほぼすべてクリア。ただ一つはっきりさせたいのは、「なぜMMや末尾レベルで信号を見たいというあなたのこの欲求を、ベースクラスレベルで実装しなければならないのか」ということです。

それが良いこと(=悪いこと)だとは思わない。アルゴリズムは(私から見て)典型的なものではありません。私の理解では、MMとトレーリングの独自のモジュール(シグナルに連動した独自のアルゴリズム)をお持ちのようです。

そこで、適当な1、2、3を入れておく。

ポイントは、マスターがクラスSEhregtをベースにしていることです。そして、その結果、私が作成したモジュールでは、必要な関数をオーバーライドすることができません。なぜなら、それらはシグナルモジュールクラスのインスタンスにアクセスできないため、すでにこの非常に基本的なCEhregtクラスと最初から互換性がないのです。

Expert.mqhファイルの67行目には、シグナルモジュールクラスのインスタンスがSEhregtクラスのフィールドにのみ格納されているため

CExpertSignal    *m_signal;                   // trading signals object

であり、このフィールドは、そこから生成される他のクラスやモジュールと共有されない(アクセス不能となる)。

このため、CExpertMoneyとCExpertTrailing クラスをオーバーライドして、ウィザードに対応させることはできません。

結局、親クラスでアクセスが拒否されれば、子孫はどうやっても手に入らない。


根源に迫る (c) "Aphorisms" by Kozma Prutkov

 

CExpertSignalのインスタンスを渡すことなく、シグナルモジュールからポジション維持モジュールや資金・リスク管理モジュールに売買シグナルを渡す方法を考えました。

CExpertMoneyクラスとCExpertTrailingクラスにそれぞれ2行ずつ追加してみましょう。

  double m_signaldirection; // Direction from signals module
 
  void              setSignalDirection(double value)  { m_signaldirection = value; }
  

ExpertMoney.mqh ファイルについて。

class CExpertMoney : public CExpertBase
  {
protected:
   //--- Direction from signals module  
   double m_signaldirection;
   //--- input parameters
   double            m_percent;

public:
                     CExpertMoney();
   void              setSignalDirection(double value) { m_signaldirection = value; }        
   //--- methods of setting adjustable parameters
   void              Percent(double percent)    { m_percent=percent; }
   //--- method of verification of settings
   virtual bool      ValidationSettings();
   //---
   virtual double    CheckOpenLong(double price,double sl);
   virtual double    CheckOpenShort(double price,double sl);
   virtual double    CheckReverse(CPositionInfo* position,double sl);
   virtual double    CheckClose(CPositionInfo* position);
  };

ExpertTrailing.mqh ファイルについて。

class CExpertTrailing : public CExpertBase
  {
protected:
   
    //--- Direction from signals module
   double m_signaldirection;
public:
   //---
   void              setSignalDirection(double value) { m_signaldirection = value; }        
   virtual bool      CheckTrailingStopLong(CPositionInfo *position,double& sl,double& tp)  { return(false); }
   virtual bool      CheckTrailingStopShort(CPositionInfo *position,double& sl,double& tp) { return(false); }
  };


これにより、売買シグナルを受け渡すために必要なフィールドとメソッドを定義しました。さて、これらの売買シグナルをモジュールクラスに渡す必要があります。Expert.mqhで行います。つまり、CExpertクラス用です。

私たちの取引シグナルをポジション・サポート・クラスに渡すために、次の1行を記述します。

m_trailing.setSignalDirection(m_signal.Direction());

を作成し、すべてのトレーリングストップの前に呼び出されるメソッド (すなわち CheckTrailingStop()) の先頭に挿入します。

bool CExpert::CheckTrailingStop()
  {
//--- Set signal direction to trailing stops module
   m_trailing.setSignalDirection(m_signal.Direction()); 
//--- position must be selected before call
   if(m_position.PositionType()==POSITION_TYPE_BUY)
     {
      //--- check the possibility of modifying the long position
      if(CheckTrailingStopLong()) return(true);
     }
   else
     {
      //--- check the possibility of modifying the short position
      if(CheckTrailingStopShort()) return(true);
     }
//--- return without operations
   return(false);
  }

トレーディングシグナルをマネー&リスクマネジメントクラスに渡すための1行を記述することにします。

m_money.setSignalDirection(m_signal.Direction());

を、各ポジションを開く 前に呼び出されるメソッド、つまり CheckOpen() の先頭に挿入します。

bool CExpert::CheckOpen()
  {
//--- set signal direction to money management module
   m_money.setSignalDirection(m_signal.Direction());
   if(CheckOpenLong())  return(true);
   if(CheckOpenShort()) return(true);
//--- return without operations
   return(false);
  }

そして、それで問題は解決です。

さて、m_signaldirectionフィールドの値にアクセスすることで、ポジション管理モジュールと株式・リスク管理モジュールの取引シグナルの現在値を取得することができます。あとは、CExpertMoneyクラスとCExpertTrailingクラスの新しいフィールドとメソッドをドキュメントに登録し、変更したファイルをアップデートに追加するだけです。

 

以下はそのファイルです。Expertでは、100行目と123行目が手書きで書かれている。

その他、ご不明な点がございましたら、ご遠慮なくお問い合わせください。

 
uncleVic:

以下はそのファイルです。Expertでは、100行目と123行目が手書きで書かれている。

その他、ご不明な点がございましたら、お気軽にお問い合わせください。

開発者はどんな人たちなのでしょうか?いつになったら、トレーディングシステムを作った経験のあるトレーダーが何を必要としているかに耳を傾けるようになるのでしょうか?手動で乗り込んで修正すればいいし、それでも何が何だか理解するのに時間がかかると、プログラミングに詳しい私が何度説明すればいいのでしょう。また、エンドユーザーはプログラミングを理解していないため、コードに手を入れることはまずありません。あなた自身が宣言したのですから、引用します。

"取引ロボットを作るのに、プログラミング言語の知識はもはや必須 条件ではありません。"https://www.mql5.com/ru/articles/240 "をご覧ください。

「MQL5ウィザードの最初のバージョンでは、MQL5のソースコードの形でシンプルなモジュールのセットとして、すぐに使えるExpert Advisorを素早く作成することが可能でした。MQL5を知らなくても「MQL5ウィザードでExpert Advisorを作ろう」(https://www.mql5.com/ru/articles/275)を読むだけでよかったのです。

ウィザードの後にコードを入力し、そこで何かを編集しなければならないので、プログラミング言語の知識が必要であることがわかりました。つまり、これまでの宣言はすべて開発者の捏造であり、欺瞞である。

例えば、私が資金とリスク管理のモジュールを書いた場合、他のモジュール開発者が書いたモジュールが発行する取引シグナルのレベルに応じてポジションを開かなければなりません。その結果、私のモジュールはウィザードと互換性がありません。モジュールを動作させるためには、コードのどこかに行って、文字列を挿入しなければならないことを、ユーザーにどのように説明すればよいでしょうか。結局、モジュール開発者がモジュールを作り、マスターがそれを自動的に組み合わせて一つの一貫したシステムにすることで、最低限モジュール同士が衝突せず、完全な互換性が保たれるようにすることが必要です。また、ウィザードがないのは、ウィザードの後にコードに入り、すべてを手動でやり直す必要があるからです。

前回の記事で指摘した、親クラスファイルにたった6行を 入れることがそんなに難しいことなのでしょうか?そして、問題はそれ自体で解決され、誰もソースに入り込んでそこの何かを変更する必要はありません。あなたの手は何を落とすのか?なぜ、ウィザードの後に手動で何かを修正しなければならないことを示すちんぷんかんぷんなことに時間を使うのですか? 同じ時間をもっと有用な作業に使うことはできないのですか?そうすれば、誰も後で同様の問題を解決するためにコードに入り込む必要はなくなるのではありませんか?

一方では完全自動化を宣言しながら、いざ実践となると、いわゆる「自動化」の後にコードに入り込んですべて手作業でやり直せというのは、御社のイデオロギーなのでしょうか?

結局のところ、私が理解している限りでは、これらをすべて説明するのは無駄なことなのです。トレーダーがMT5に乗り換えたがらないのは、プラットフォームが粗雑で、オートトレーディングの利便性のためではなく、まさにそのプラットフォームの開発者の利便性のために開発されたものだからです。そして、ユーザーがプログラミングを徹底的に勉強しない限り、自動売買には手を出さない方がいい。

嫌なら、しなくていいんです。他にやることがないなら、ここに座って、各ユーザーがどこでどのように手を動かしてソースコードに入り、具体的に何を直せばいいのかを説明することだ。

Собери свой торговый советник в Мастере MQL5
Собери свой торговый советник в Мастере MQL5
  • 2011.01.14
  • MetaQuotes Software Corp.
  • www.mql5.com
Знание языков программирования теперь не является обязательным условием для создания торговых роботов. Если раньше это действительно служило непроходимым препятствием для реализации своих торговых стратегий, то появление Мастера MQL5 в корне изменило ситуацию. Начинающие трейдеры могут перестать тревожиться из-за отсутствия опыта программирования - с новым визардом, позволяющим быстро генерировать код советника, он не понадобится.
 
あなたは、最大公約数的な考え方にとらわれているか、単にツールの適用限界を理解していないかのどちらかだと思います。

いずれにせよ、この程度の論法で、ほとんどすべての問題を誇張の限界を超えているのですから、あなたとの仕事はありえません。本当の仕事には、言葉によるデマゴギーではなく、意識的な意思決定が必要です。
 
Renat:
あなたは最大公約数的な考え方にとらわれているか、単に道具の適用限界を理解していないのだと思います。

いずれにせよ、この程度の論調で、ほとんどすべての質問を誇張の許容範囲を超えているのですから、あなたとの仕事はありえません。本当の仕事とは、言葉によるデマゴギーではなく、意識的な意思決定が必要なのです。

私は基本的に仕事、つまりお金を稼ぐことを求めず、自発的に協力することを良しとしていました。どこでどう生計を立てるかは、自分で決める。

まあ、そうならないし、そうする必要もないんですけどね。私たちのビジネスは提供することであり、お客様には拒否する権利があります。よく言われるように、マスターはボスです。

あなたの会社はすでにすべてを理解し、さらにいわゆる "既製 "のExpert Advisorを作成するためにダミーを教えている場合。 さらに、ポイントは、彼らはウィザードのデモにのみ良いですが、彼らは非常にオートトレーディングに有用ではない、なぜなら過去のデータでも株式曲線は、モジュール性が実装されているので不便そうですが、完全な取引システムのためのモジュール整合性が不足していることです。

がんばってください。

 
Reshetov:
...

例えば、私が資金と リスクの管理モジュールを 書いたとして、そのモジュールは他のモジュール開発者が書いたモジュールが発した取引シグナルのレベルに応じてポジションをオープンする必要があります。その結果、私のモジュールはすでにウィザードと互換性がないことになります。モジュールを動作させるためには、コードのどこかに行って、文字列を挿入しなければならないことを、ユーザーにどのように説明すればよいでしょうか。結局、モジュール開発者がモジュールを作り、ウィザードがそれを自動的に組み合わせて一つの一貫したシステムにすることで、最低限モジュール同士が衝突せず、完全な互換性が保たれるようにすべきなのです。ウィザードがあっても、それを実行することはできません。ウィザードの後では、コードに入り、すべてを手動でやり直さなければならないからです。

前回の記事で指摘した、親クラスファイルにたった6行を 書き込むことが、そんなに難しいことなのだろうか。そして、問題はそれ自体で解決され、誰もソースに入り込んで何かを変更する必要はありません。あなたの手は何を落とすのか?なぜ、ウィザードの後に手動で何かを修正する方法を示す、ちんぷんかんぷんなことに時間を使うのですか? 同じ時間をもっと役に立つことに使えば、誰も同じような問題を解決するために後でコードを書く必要がなくなるのではありませんか?

...

あなたのやり方は、クラスのカプセル化に違反し、結果として階層的な混乱をもたらします。

Steve McConellの著書「The Perfect Code」をゆっくり読んでみてください。

手袋を生産する工場で、右手用と左手用の5本指のハンコがあるとして、そこに6本指の手袋の小さな注文が来たと想像してください。やっぱりそういう人はいるんですね。しかし、そのためにハンコを作るのではなく(バッチを作ってしばらくはそのまま)、5本指のハンコを改造して指をスライドさせることを提案するのですね。普遍的で何もかもが素晴らしいように思えますが、普遍性のために(たまに6本指の手袋を作るという小さなニーズのために)5本指のハンコの強さが弱くなるのでしょう。そして、300本の4本指のバッチが発注され、またしても実績のある信頼できるテンプレートが崩れるのです。

上記のように言われていますね。

"なぜMMやトレイリングレベルでシグナルを見たいという欲求がベースクラスレベルで実装される必要があるのか?"

良い(=悪い)とは思わない。アルゴリズムは(私から見て)典型的なものではありません。私の理解では、あなたは独自のMMとトレイリングモジュール(信号に結びついた独自のアルゴリズムを持っている)を持っています。

標準的なバイブルを変更するのではなく、(継承によって)拡張するような開発をするのがよいでしょう。そうすれば、本当に面白いことになる。

HZZ さらに、(上で書かれているような)複雑なコードを扱う必要がないように、用意したモジュールをビブリオで包んでシャロバを流し、レシェトフからモジュールを差して[生地をダウンロード]ボタンを押すだけでいいんですよ。

 
Urain:

あなたのやり方は、クラスのカプセル化に違反し、その結果、階層的な混乱が生じます。

Steve McConellの著書「Perfect Code」をゆっくり読んでみてください。

簡単に言うと、ウィザードを手袋工場に見立てて、右手と左手用の5本指のハンコがあるが、そこに6本指の手袋の小さな注文が入るということだ。やはり、そういう人がいるんですね。しかし、そのためにハンコを作るのではなく(バッチを作ってしばらくはそのまま)、5本指のハンコを改造して指をスライドさせることを提案するのですね。普遍的で何もかもが素晴らしいように思えますが、普遍性のために(たまに6本指の手袋を作るという小さなニーズのために)5本指のハンコの強さが弱くなるのでしょう。そして、300本の4本指のバッチが発注され、またしても実績のある信頼できるテンプレートが崩れるのです。

上記のように言われていますね。

標準的なバイブルに変更を加えるのではなく、(継承によって)拡張するような開発をするのがよいでしょう。そうしたら、本当に面白くなりますよ。
親クラスにないものは継承できない、と何度言えばわかるのでしょうか。スティーブ・マコーネル自身が書いた「コード・コンプリート」という本に、最終的に触れるのはいつになるのでしょうか。
  1. なぜなら、私が提案したバージョンでは、余計なものはすべて隠され、モジュールにはdouble型の値としてのみトレードシグナルが与えられ、読み取りモードでのみ使用されるからです。私は一部の人と違って、OOPに関する本を読むだけでなく、丁寧に勉強してきました。
  2. 私は、テンプレートに6本指の手袋を作ろう、つまり6本目の指を追加モジュールとして付けようと提案したのではなく、既存のモジュールすべてにシグナルモジュールからのシグナルを合わせようと提案しただけなのです。指を交換できる手袋など、モジュール化を提案したのはあなたでしたね。しかし、右手は左手が何をしているのかわからないようにしたため、つまり他のモジュールがシグナルモジュールから情報を得て、それに行動を同期させることができないため、ユーザーが手袋を手にはめたとき、その指の1本は小さくて入らないが、もう1本は大きくて余るというように、手袋の大きさが異なる指(モジュール)ができてしまうのである。

例えば、移動波やパラボリックなど、モジュールの第三者開発者が開発した別のシグナルシステムに従ってトレーリングストップが実行され、そのシグナルがモジュールのシグナルと矛盾する箇所があり、取引システムが矛盾して動作し始めるというものです。資金とリスク管理モジュールは、取引シグナルが弱く、オープンポジションの量を減らし、シグナルモジュールとは独立した何らかのルールに従って行動する時期であることをテレパシーで推測することはできません。そして、あなたの師匠と呼ばれる人の助けを借りて作られた取引システム全体が、クリロフ爺さんの「白鳥、ザリガニ、カマス」という寓話のようになるのです。それ以上でも以下でもない。そして、この無謀なアドバイザーを集めるという寓話的なイデオロギーこそ、御社がオートトレードのために私たちに押し付けようとしているものです。必要なのか?

その結果、トレーダーや投資家を恐怖に陥れるだけのエクイティとバランスのチャートを持つ取引システムが生まれるのです。https://www.mql5.com/ru/code/833 をご覧ください。




これは、モジュールの作成者(この場合はNikolay Kositsin)が何か間違ったことをしたからではなく、残りの取引システムのモジュールが互いに連携できず、矛盾して動作しているためです。

しかし、説明しても無駄です。プラットフォームの開発者は、問題を解決するために惨めな6行を書く代わりに、フォーラムで何キロもの脚注を書き、取引システムの開発者がデマゴギーやカプセル化違反やその他の大罪を広めたと非難しますが、自分たちの欠陥や誤解を正すことには指一本触れようとしません。

だから、これ以上議論しても仕方がない。自分の意見を貫いて、好きなようにやってください。私はうんざりしているし、役に立たない。なぜなら、プラットフォーム開発者は、自分たちのものを作らないので、まさにこれらのツールをプラットフォームユーザーがオートトレードに使えるかどうか、開発者は気にしていないのである。餓鬼に満つる者は、餓鬼に満つるを知らざるなり。

Модуль торговых сигналов, выполненный на основе индикатора Heiken_Ashi_Smoothed
Модуль торговых сигналов, выполненный на основе индикатора Heiken_Ashi_Smoothed
  • 投票: 7
  • 2012.02.23
  • Nikolay Kositsin
  • www.mql5.com
Модуль торговых сигналов для Мастера MQL5. Сигналом для открытия позиций служит изменение цвета свечи, формируемой индикатором Heiken_Ashi_Smoothed.
 
Reshetov:
...

レシェトフ、お前の感情的な落書きを読む気も起きないよ。議論したいのなら、自分の意見を主張しなさい。

ウィザードのポイントは、ほとんどのトレーダーのニーズを満たすテンプレートを作成することです。CherverにEAテンプレートがあり(自分で書いた)、基本的な機能が設定されています。そして、実際には常に修正しなければならない。しかし、編集は最小限です。もし、全く編集しないテンプレートを作っていたら、あらゆる場面で、人が溺れるような巨大なコードになっていたことでしょう。

ウィザードでは、すでに動作しているテンプレートを作成し、プログラミングを知らない人でもそのまま利用することができます。コーディングを理解していれば、簡単に好きなものに変えることができます。標準ライブラリの中で、ものがどのように作られ、どこで区切られているかを理解するのは、一度だけで十分です。また、標準ライブラリをテンプレートとして利用し、気に入った部分を自分のコードにコピーするだけでもよい。