記事「多通貨エキスパートアドバイザーの開発(第4回):仮想注文の保留と状況の保存」についてのディスカッション

 

新しい記事「多通貨エキスパートアドバイザーの開発(第4回):仮想注文の保留と状況の保存」はパブリッシュされました:

多通貨EAの開発を始めてから、すでに一定の成果を上げ、コードの改良を何度か繰り返すことができました。ただし、EAは保留中注文を扱うことができず、端末の再起動後に動作を再開することができませんでした。これらの機能を追加しましょう。

前回の記事では、複数の並行戦略を持つ多通貨EAを構築するために、コードアーキテクチャを大幅に修正しました。シンプルでわかりやすくするために、これまでは、ある最低限の機能だけを考えてきました。私たちのタスクの限界を考慮して、以前の記事からコードを大幅に変更しました。

これで、すでに書かれているコードを抜本的に変更することなく、機能性を高めるのに十分な下地ができたと思います。本当に必要な部分のみ、最低限の編集をおこなうようにします。

さらなる発展として、以下のことに挑戦します。

  • 仮想ポジション(買い、売り)だけでなく、仮想予約注文(買い逆指値、売り逆指値、買い指値、売り指値)を出す機能を追加する
  • 発注された仮想注文とポジションを可視化する簡単な方法を追加し、使用する取引戦略のポジション/注文を建てるルールの正しい実装をテストする際に視覚的にコントロールできるようにする
  • EAが現在の状態データを保存することで、端末が再起動されたり、EAが別の端末に移動したりしても、作業が中断された時点の状態から作業を継続できるようにする

最も簡単なことから始めましょう。仮想予約注文の処理です。

作者: Yuriy Bykov

 

そんなアーキテクチャは使わないだろう。


MQがバーチャルコマースを言語に組み込んだとしよう。そうすれば、他のエンティティを埋め込むという発想は出てこないだろう。なぜなら、それは単にOOP継承ではできないからだ。別のアーキテクチャを作ることになる。

仮想化におけるグラフィカル・オブジェクトは、また同じ山の中だ。

アーキテクチャーはとても扱いにくくなり、不快な気分にさせられる。単純なレンガから組み立てる代わりに、あなたはユニバーサル・レンガを作ることにした。

 

この実装はあまり好きではないが、他の実装(まだ実装されていないが、考えられているもの)はもっと好きではない、という状態に戻ってしまった。おそらく、さらなる開発の過程で、別の方法が可能になるだろう。

アクセスできないソースの状況について:今回の実装では、ソースが利用可能で、一度に追加する必要のない何かを追加できるという事実を利用するだけにしました。そのような追加は最小限にしようとした。別の方法としては、CVirtual*クラスファミリーのために、いくつかの新しい継承クラスを作るという方法がありました。この方法は私にはさらに面倒に思えた。しかし、クラスが増え、それらを1つのフォルダに格納するのが醜くなったとき、そうなる可能性は十分にある。

私は取引戦略の開発をコントロールするためにグラフィカル・オブジェクトが必要だったので、それを実装した。そしてCVirtualOrderクラスは全く変更しなかった。しかし、CVirtualReceiverクラスに4行の新しいコードを追加しなければならなかった。様々な可能性の中から、私はこの選択肢を選びました。

もし仮想位置をグラフィカルに表示する必要がなければ,これを使わないか,前の記事のライブラリの変形に戻るかのどちらかです.

 
Yuriy Bykov #:

この実装はあまり好きではないが、他の実装(まだ実装されていないが、考えられているもの)はもっと好きではない、という状態に戻ってしまった。おそらく今後の開発で違うことができるようになるだろうが、今のところはこんな感じだ。

残念ながら、部分的なリファクタリングの例で私のビジョンを示すには時間が足りない。


最初の起動後、Expert Advisorは仮想ポジションとリアルポジションをオープンし、価格データからいくつかの指標を計算します。EA全体の状態を構成するのはこの情報です。ターミナルをリロードすると、EAはオープンポジションを自分のものとして認識するだけでなく、すべての仮想ポジションと必要な計算値を復元します。オープンポジションに関する情報がターミナルから取得できる場合、仮想ポジションと計算値に関する情報は、Expert Advisor 自身が保存する必要があります。

Expert Advisor が 1 つのブローカーの 2 つの取引口座で動作しているとします。片方の端末の電源が切れている。この間、稼動中の方の仮想ポジションは変更されています。どうすれば、Expert Advisorの動作を、動作を停止しなかった端末と一致させることができるでしょうか?


どうすればよいでしょうか。仮想ポジションを一切保存しない。Expert Advisorを起動すると、現在のTimeCurrentの前に、すべての内部TSが仮想テスターで起動されます。従って、リロードされたEAでは、現在の時点のすべてのデータがリロードなしのバージョンと一致します。


リロード」とは、Expert Advisor の動作が一時停止している状態を意味します。例えば、長いOrderSendやRepingなどです。そのため、最後のリクエストの時点から価格データをリクエストする必要があります。そして、仮想マシンでそれらを実行します。

 
fxsaber #:

部分的なリファクタリングの例で私のビジョンを示すには、残念ながら時間がない。

あなたはすでに他の人のコードをレビューすることに多くの注意を払っています。

あるExpert Advisorが同じブローカーの2つの取引口座で動作しているとします。片方の端末がダウンした。この間、稼動している方の仮想ポジションが変更されました。どうすればExpert Advisorの動作を停止していない方の端末と一致させることができますか?

そのような状況に遭遇したことがありますが、取引結果に影響を与える些細な要因でした。それに、ポジションの決済を「スリープ・スルー」した端末が、より有利な価格で決済したこともあった。したがって、完全な同一性を確保すること自体が目的ではなかった。

また、異なるブローカーが存在する場合、同期して動作するExpert Advisorでさえ、相場のわずかな違いにより、わずかに異なる結果を示すことがある。同一性を保つ努力は必要だが。

私のやり方バーチャル口座は一切保存しない。Expert Advisorを起動するとき、すべての内部TSは、現在のTimeCurrentの前に仮想テスターで起動されます。こうしてリロードされたExpert Advisorでは、現在の時点のすべてのデータがリロードなしのバージョンと一致する。

これは興味深いアプローチです。私の理解が正しければ、これを使用する場合、仮想取引の開始日を固定し、異なる端末の異なるExpert Advisorのインスタンスで同じにする必要があります。これは難しいことではありません。また、仮想テスターを実装するか、既製のものを使用する必要があります。これはより複雑です。

 

Yuriy Bykov #:

仮想テスターの実装が必要

テスター "ティックをすでに実装されているバーチャル・トレードに投入するのだ。