記事"クロスプラットフォームEA: CExpertAdvisor と CExpertAdvisors クラス"についてのディスカッション

 

新しい記事 クロスプラットフォームEA: CExpertAdvisor と CExpertAdvisors クラス はパブリッシュされました:

この記事では、クロスプラットフォームのEAについて扱っています。主にクラス CExpertAdvisor と CExpertAdvisors は、この記事で説明した他のすべてのコンポーネントのコンテナとして機能します。

CExpertAdvisor の OnTick メソッドは、クラス内で最も使用される関数です。 アクションのほとんどがこのメソッドからです。 このメソッドの中核となる操作を次の図に示します。


CExpertAdvisorBase OnTick

作者: Enrico Lambino

 

エンリコ、こんにちは。プロジェクトは 完了したようだね。私はあなたの最後の記事を見ていて、エラーと思われるものに気づきました:

bool CExpertAdvisorBase::Init(string symbol,int period,int magic,bool every_tick=true,bool one_trade_per_candle=true,bool position_reverse=true)
  {
   m_symbol_name=symbol;
   CSymbolInfo *instrument;
   if((instrument=new CSymbolInfo)==NULL)
      return false;
   if(symbol==NULL) symbol=Symbol();
   if(!instrument.Name(symbol))
      return false;
   instrument.Refresh();
   m_symbol_man.Add(instrument);
   m_symbol_man.SetPrimary(m_symbol_name);
   m_period=(ENUM_TIMEFRAMES)period;
   m_every_tick=every_tick;
   m_order_man.Magic(magic);
   m_position_reverse=position_reverse;
   m_one_trade_per_candle=one_trade_per_candle;
   CCandle *candle=new CCandle();
   candle.Init(instrument,m_period);
   m_candle_man.Add(candle);
   Magic(magic);
   return false;
  }

上でオレンジ色で強調しました。return文はfalseではなくtrueであるべきだと思います。PCをリセットしているところですが、ひどいウイルスに感染して一日が台無しになったので、少し読書をすることにしました。あなたの仕事は、このフォーラムで最高の読み物のひとつです。あなたはこのプロジェクトで自分自身を出し抜いた。

僕のアイデアも君と同じようなもので、君の仕事から本当に素晴らしいアイデアをいくつか得たよ。完成したら、時間をとってここでシェアしたいと思います。

 
Shephard Mukachi:

エンリコ、こんにちは。プロジェクトは完了したようだね。前回の記事を見ていて、エラーと思われる箇所に気づきました:

上でオレンジ色で強調しました。return文はfalseではなくtrueであるべきだと思います。PCをリセットしているところですが、ひどいウイルスに感染して一日が台無しになったので、少し読書をすることにしました。あなたの仕事は、このフォーラムで最高の読み物のひとつです。あなたはこのプロジェクトで自分自身を出し抜いた。

僕のアイデアも君と同じようなもので、君の仕事から本当に素晴らしいアイデアをいくつか得たよ。完成したら、時間をとってここでシェアしたいと思います。

 

こんにちは、シェップ、

Shephard Mukachi:

エンリコ、こんにちは。プロジェクトは完了したようだね。私はちょうどあなたの最後の記事を見ていて、エラーと思われるものに気づきました:

上でオレンジ色で強調しました。return文はfalseではなくtrueであるべきだと思います。PCをリセットしているところですが、ひどいウイルスに感染して一日が台無しになったので、少し読書をすることにしました。あなたの仕事は、このフォーラムで最高の読み物のひとつです。あなたはこのプロジェクトで自分自身を出し抜いた。

僕のアイデアも君と同じようなもので、君の仕事から本当に素晴らしいアイデアをいくつか得たよ。完成したら、時間をとってここでシェアしたいと思う。

今回のことは残念ですが、ご意見ありがとうございました。そうだね。今まで気づきませんでした。修正します。サンプル上のInit()メソッドの呼び出しはチェックされていませんが、ライブラリに対する私の将来の計画の一部は、関数やメソッドの呼び出しを(標準ライブラリと 同じように)より正式にすることと、より簡単なコーディングのためのEAテンプレートです。後日、ライブラリの最新版をコードベースにアップロードし、リポジトリを公開する予定です。さらなるフィードバックやプルリクエストをお待ちしています。

あなたのライブラリーを見るのを楽しみにしています。

 
Enrico Lambino:

こんにちは、シェップ、

今回のことは残念だが、ご意見ありがとう。そうですね。今まで気づきませんでした。修正します。サンプルのInit()メソッドの呼び出しはチェックされていませんが、ライブラリの今後の計画の一部として、関数やメソッドの呼び出しを(標準ライブラリと 同じように)より正式にすることと、コーディングをより簡単にするためのEAテンプレートがあります。後日、ライブラリの最新版をコードベースにアップロードし、リポジトリを公開する予定です。さらなるフィードバックやプルリクエストをお待ちしています。

あなたのライブラリーを見るのを楽しみにしています。


こんにちは、エンリコ。ようやく新しいシステムのインストールが完了しそうです。昨夜はシステムのコントロールが全くできず、何時間も苦労しましたが、今はほぼ完了しました。タブレットを使ってブラウズしながら読書をしているよ。あなたのライブラリーは本当に素晴らしい。完成した今、ロジックの全貌を見ることができる!

私のアイデアはこうだ。

- EAは、マジック、シンボル、タイムフレーム(ウォッチウィンドウを使用)の組み合わせに基づいて、ロボット(AIエンティティのようなもの)のリストを作成します。

- その後、AIエンティティがバッグ・オブ・トリック(MA、PSARなどのシグナル)に入り、最良のシグナルまたはシグナルの組み合わせを決定する。ここでのベストは、シグナル間の比較を可能にする内部バックテストエンジンに基づいています。

- その後、AIはシグナルをリストに追加し、それに基づいて取引し、必要であれば再学習します。

- 各AIは個別に管理するストップ、オーダー、ポジションのオブジェクトを持ち、学習のためにオプティマイザー(GA)オブジェクトにアクセスする。AIの意思決定に効用理論(MQL5のEAシステムで使われている重み付けに似ている)を使うことも考えたのですが、恣意的な適用が気に入らなかったので、代わりに仮想取引を通じて学習することにしました。


いくつかのアイデアを実装する方法を理解するのに苦労しましたが、あなたのような記事やフォーラム上の他の多くの記事、書籍を読むことで、本当にクールなプロジェクトを完成させるところまでたどり着きました。

あなたがおっしゃった大きな問題のひとつにシリアライゼーションがあります。ライブの注文やポジションは、それをオープンしたオブジェクトのすべての属性を持っていないため、システムクラッシュはAIを無効な状態にし、多くの孤児取引を残します。そこで、注文コメントを使用することを考えました。そこで、注文を送信する際に、Timeframe、SignalName、SignalSettingsを連結したコメントを作成します。しかし、すぐに扱いにくくなり、実装上の問題が発生しやすいことに気づきました。そのため、ファイルに書き込むのが唯一の理にかなっているようです。


もし興味があれば、僕の進捗状況を教えてあげるよ。でも、君の仕事は本当に素晴らしいよ。プロジェクトに時間を割いてくれてありがとう。


シェップ

 

こんにちは、シェップ、

Shephard Mukachi:

エンリコ、こんにちは。ようやく新しいシステムのインストールが完了しそうだ。昨夜はシステムのコントロールがまったくできず、何時間も格闘したけれど、もうほとんど終わったよ。タブレットを使ってブラウズしながら読書をしているよ。あなたのライブラリーは本当に素晴らしい。完成した今、ロジックの全貌を見ることができる!

私のアイデアはこうだ。

- EAは、マジック、シンボル、タイムフレーム(ウォッチウィンドウを使用)の組み合わせに基づいて、ロボット(AIエンティティのようなもの)のリストを作成します。

- その後、AIエンティティがバッグ・オブ・トリック(MA、PSARなどのシグナル)に入り、最良のシグナルまたはシグナルの組み合わせを決定する。ここでのベストは、シグナル間の比較を可能にする内部バックテストエンジンに基づいています。

- その後、AIはシグナルをリストに追加し、それに基づいて取引し、必要であれば再学習します。

- 各AIは個別に管理するストップ、オーダー、ポジションのオブジェクトを持ち、学習のためにオプティマイザー(GA)オブジェクトにアクセスする。AIの意思決定に効用理論(MQL5のEAシステムで使われている重み付けに似ている)を使うことも考えたのですが、恣意的な適用が気に入らなかったので、代わりに仮想取引を通じて学習することにしました。


いくつかのアイデアを実装する方法を理解するのに苦労しましたが、あなたのような記事やフォーラム上の他の多くの記事、書籍を読むことで、本当にクールなプロジェクトを完成させるところまでたどり着きました。

あなたがおっしゃった大きな問題のひとつにシリアライゼーションがあります。ライブの注文やポジションは、それをオープンしたオブジェクトのすべての属性を持っていないため、システムクラッシュはAIを無効な状態にし、多くの孤児トレードを残します。そこで、注文コメントを使用することを考えました。そこで、注文を送信する際に、Timeframe、SignalName、SignalSettingsを連結したコメントを作成します。しかし、すぐに扱いにくくなり、実装上の問題が発生しやすいことに気づきました。だから、ファイルに書き込むのが唯一理にかなっているようだ。


もし興味があれば、僕の進捗状況を教えてあげるよ。でも、君の仕事は本当に素晴らしいよ。プロジェクトに時間を割いてくれてありがとう。


シェップ

面白そうなプロジェクトだね。しかし、それはとても大規模なプロジェクトに見えます(おそらく、このプロジェクトよりも大規模で困難なものでしょう)。あなたのお役に立てるかもしれないので、私の考えをお話しさせてください:

以前、バックテスターのスクリプトを書いたことがある。私は以前、バックテスタースクリプトを書いたことがあります。バーチャルトレードで何とか思い通りに動作させることができましたが、実際のEA(自己最適化は言うまでもありません!)で使用するとパフォーマンスが低下してしまいます。どうにかして他のCPUコア(あるいはGPU)にも計算させる(DLLやOpenCLなど)ことができれば、もっとうまくいくかもしれません。

ロボットのリストは機能するが、並列実行されないという大きな欠点がある。数が数台から数台であれば遅延は問題ないが、それ以上になると、リストの最後にあるものが最後に処理されることになる。また、これらはEAが実際の作業を行うために必要なリソースと競合しなければならない。

仮想取引は素晴らしいモデルを作ることはできるが、市場の実際のノイズ(ニュースなど)を捉えることはできない。このことを私は苦労して学びました。

標準ライブラリの CSignalクラスで使用されている計量システムに関しても、あなたと同じ考えを共有しています。私の意見では、このシステムはオプティマイザにかけるとオーバーフィッティングを起こしやすい。私はマーケット・スコアリング・モデル(LMSRですが、在庫リスクの改善に取り組んでいます)を使用したマーケット・メイカー・ボットを持っています。買いシグナルと売りシグナル(そしてシグナルなしも)の重みをまとめて考慮することができ、出力は確率で表されるため、これは非常に優れた代替案だと思います。また、ディープラーニングよりもはるかに少ないリソースで済みます。

揮発性のデータを保存するには、ファイルに保存するのが今のところ最良の選択肢だろう。GVを使用するのも一つの方法ですが、注文コメントを使用するよりもさらに面倒になる可能性があります。また、一部のブローカーは注文コメントに他のコードを挿入する(バイナリーオプションなど)ので、これも私の意見ではあまり良い方法ではありません。もう一つの方法は、すべてのデータを辞書オブジェクトに保存することです。そうすれば、いくつものLoadメソッドやSaveメソッドを実装するコード行を書く必要がなくなりますが、ディスクにも保存する必要があります。しかし、ユーザーがEAで新しいセッションを開始したい場合、大きな問題があります。これは手動で対処しなければなりません(保存ファイルを削除するか、新しい保存ファイル名を割り当てるか)。

このライブラリのファイルクラスを実装する際に、OOPのルールをいくつか破りました。メソッドや関数間で(const修飾子付きでも)ファイル・ハンドルが渡されると、その値を失う(INVALID_HANDLEになる)という問題を経験しました。現在もそうなのかどうかはわかりませんが、現在の解決策にはかなり満足しています。正直なところ、ライブラリのCFileの子孫を使用することはエレガントではありませんでしたが、うまくいっていますし、コードもかなり少なくなっています。

ありがとうございました、

エンリコ

 

ご意見ありがとうございました。君のアイデアはいつでも歓迎するよ。

そうだね、君の言う通り、大きなプロジェクトになるだろうね。でも私はプログラミングが大好きで、実はファイナンシャル・アナリストなんです。複雑な財務モデルを自動化する必要があったので、必要に迫られてプログラミングを始めました。私にはクレイジーで奇抜なアイデアを思いつく不思議な能力がある。あなたのようにコーディングができればいいのですが!

今は辞書とList<T>に注目しています。List<T>は特に、オブジェクトのリストを共有するための簡単な手段として。そしてDictionaryはストレージとシリアライズのために使っています。コードベースが軽くなるように、いくつかのアイデアを試している。リストに関するご指摘は本当に貴重で、このアイデアはそれほど理想的なものではありません。

スラグの処理に関しては、並列実行を採用しなければ、あなたの言うとおりです。これは私がテストで発見した問題のひとつだ。リストの最後のオブジェクトはかなり遅く、特に市場が本当に不安定な場合、OnTickはリストの最初のオブジェクトが呼び出される前に何度も呼び出される可能性があります。ご指摘の通り、OpenCLを可能な解決策として検討しました。カスタムメイドのシステムに投資しなければならないだろう。

確かにバーチャル・トレーディングは、ノイジーな市場で口座を完全に消し去ることができる素晴らしいモデルを作っている。ある日、私のEAがニュース中に取引を成立させるどころか、約定させるのにも苦労しているのをパニック状態で見ていた。これがトレーディングに関する冷酷で厳しい現実ですが、私たちは挑戦しなければなりません。

スコアリングモデル・アプローチの方が良いという意見には同意します。特に、強気と弱気の動きは商品ごとに大きく異なることを考えると、LMSRは間違いなく優れたアプローチです。確率加重アプローチは、間違いなく精度を向上させます。

自己学習では、かなり時間がかかります。AIエージェントをセットアップし、適切なシグナルで武装させるために最初に使用され、その後、5分足エージェントは終日、1時間足エージェントは金曜日など、一定の間隔で使用されます。バーチャル・トレーニングで何十億ドルも稼いでも、実際の取引では全財産を失うという指摘は、確かにその通りです。だから、スピードを失わないように、非常にシンプルで速いシグナルを見つけることが私の探求です。私は、スプレッドと手数料を差し引いても数ピップスのスキャルピングができるシステムを求めています。つまり、直近の20バーで最も低い位置にあるハンマーのような、本当に確率の高いセットアップでなければなりません。

スキャルピングに集中したいので、トレードを監視する必要はあまりないかもしれません。エージェントはセットアップをチェック し、ストップとテイクプロフィットを注文する。繰り返しますが、まだ実験中です。

シグナル周りのアイデアを試しているところです。本当に素晴らしい結果が得られるものを見つけたら、また紹介します。

あなたはいくつかのルールを破りましたが、それがプログラミングの素晴らしさではないでしょうか!ルールに固執して、完全に行き詰って、壁を乗り越えられそうな気分になることがあるのは驚きだ。そして時には、ルールを破ることが進歩するために必要なことなんだ。君の仕事は素晴らしいし、その点では尊敬しているよ。エンリコ プログラミングは大変な仕事だ。スムーズなときはいいし、計画通りにいかないときは本当に苦しい。

あなたの意見にとても感謝している。とても感謝しています。

本当にありがとう、

シェップ

 
Shephard Mukachi:

ご意見ありがとうございました。君のアイデアはいつでも歓迎するよ。

そうだね、君の言う通り、大きなプロジェクトになるだろうね。でも私はプログラミングが大好きで、実はファイナンシャル・アナリストなんです。複雑な財務モデルを自動化する必要があったので、必要に迫られてプログラミングを始めました。私にはクレイジーで奇抜なアイデアを思いつく不思議な能力がある。あなたのようにコーディングができればいいのですが!

今は辞書とList<T>に注目しています。List<T>は特に、オブジェクトのリストを共有するための簡単な手段として。そしてDictionaryはストレージとシリアライズのために使っています。コードベースが軽くなるように、いくつかのアイデアを試している。リストに関するご指摘は本当に貴重で、このアイデアはそれほど理想的なものではありません。

スラグの処理に関しては、並列実行を採用しなければ、あなたの言うとおりです。これは私がテストで発見した問題のひとつだ。リストの最後のオブジェクトはかなり遅く、特に市場が本当に不安定な場合、OnTickはリストの最初のオブジェクトが呼び出される前に何度も呼び出される可能性があります。ご指摘の通り、OpenCLを可能な解決策として検討しました。カスタムメイドのシステムに投資しなければならないだろう。

確かにバーチャル・トレーディングは、ノイジーな市場で口座を完全に消し去ることができる素晴らしいモデルを作っている。ある日、私のEAがニュース中に取引を成立させるどころか、約定させるのにも苦労しているのをパニック状態で見ていた。これがトレーディングに関する冷酷で厳しい現実ですが、私たちは挑戦しなければなりません。

スコアリングモデル・アプローチの方が良いという意見には同意します。特に、強気と弱気の動きは商品ごとに大きく異なることを考えると、LMSRは間違いなく優れたアプローチです。確率加重アプローチは、間違いなく精度を向上させます。

自己学習では、かなり時間がかかります。AIエージェントをセットアップし、適切なシグナルで武装させるために最初に使用され、その後、5分足エージェントは終日、1時間足エージェントは金曜日など、一定の間隔で使用されます。バーチャル・トレーニングで何十億ドルも稼いでも、実際の取引では全財産を失うという指摘は、確かにその通りです。だから、スピードを失わないように、非常にシンプルで速いシグナルを見つけることが私の探求です。私は、スプレッドと手数料を差し引いても数ピップスのスキャルピングができるシステムを求めています。つまり、直近の20バーで最も低い位置にあるハンマーのような、本当に確率の高いセットアップでなければなりません。

スキャルピングに集中したいので、トレードを監視する必要はあまりないかもしれません。エージェントはセットアップをチェックし、ストップとテイクプロフィットを注文する。繰り返しますが、まだ実験中です。

シグナル周りのアイデアを試しているところです。本当に素晴らしい結果が得られるものを見つけたら、また紹介します。

あなたはいくつかのルールを破りましたが、それがプログラミングの素晴らしさではないでしょうか!ルールに固執して、完全に行き詰って、壁を乗り越えられそうな気分になることがあるのは驚きだ。そして時には、ルールを破ることが進歩するために必要なことなんだ。君の仕事は素晴らしいし、その点では尊敬しているよ。エンリコ プログラミングは大変な仕事だ。スムーズなときはいいし、計画通りにいかないときは本当に苦しい。

あなたの意見にとても感謝している。とても感謝しています。

本当にありがとう、

シェップ

シェアしてくれてありがとう。また、最近、データ・ストレージ(具体的には、動的に作成されるグラフィカル・コントロール)を扱う中で、Dictionary<T>に取り組み始めました。これはハッシュ関数としてFNV1-aを使い、プリミティブとオブジェクトへのポインタの両方を格納することができます(構造体は格納できません)。保存と読み込みの部分はまだ完成していませんが、完成次第CodeBaseで共有します。エージェントごとに最適化をスケジューリングするのであれば(同時に処理するのではなく)、エージェントをハッシュで取得し、別スレッドで処理することで実行速度を向上させることができると思います。そのためには、辞書オブジェクトや関連するデータ構造が 必要でしょう。また、スキャルピングを目的としているのであれば、できる限りのスピードが必要でしょう。
 

こんにちは、エンリコ、

取引がトリガーされたシグナルに応じて、注文/ポジションに特定のコメントを追加する方法をご存知ですか?例えば、シグナル1が機能したとします。

ありがとうございます。

 

私はまだ到着したばかりなので、ついていくのは容易ではないが、彼らの知識を通して進歩させてくれるすべての人々に感謝している。

 

多くの作業が行われました。

ありがとうございました!