EAでBarsを逆引きして分析する

 

皆さん、こんにちは。

これは本当に愚かな質問かもしれませんが、私は本当にそれを行う方法を見つけることができませんでした。私はEAを作ろうとしています。いくつかのバーを分析した後、それは注文を開くかどうかを決定します。EAが停止したり、メタトレーダーがシャットダウンした場合、EAを再び開いたときに、注文を開いた原因となるバーを見つけたいのです。そこで、私は注文を探し、私の注文(そのEAはちょうど開いた)を見つけ、私は戻ってバーを分析し始めたいと思います。どのようにそれを行うのでしょうか? どのように私は私の注文が開いたバーを見つけ、バーをさかのぼり始めることができます。

例えば

例えば、H1期間中に12:00, 13:00, 14:00, 15:00のバーを探し、16:00に注文を入れることにしました。

時間配列などを使うことも考えましたが、バーを見つけようとしている間に、新しいバーが出てきたらどうなるのでしょうか? シフトが変更され、私の検索は非論理的になります。

また、この情報をファイルに書きたくありません。それはあまりにも多くの時間と多くの例外処理などを必要とします。

ありがとうございます。

 
paranoyakX:

時間配列などを使うことも考えましたが、バーを探している間に新しいバーが出てきたらどうなるのでしょうか? シフトが変更され、検索が非論理的になります。


EAがコードを実行している間は、新しいバーが出現することはないはずです。OnTick() が呼ばれたときに読み込まれたデータで動作します。

しかし、RefreshRates()が使用された場合、何が起こるかはわかりません。

 
GumRai: しかし、RefreshRates()を使用した場合、どうなるかはわかりません。

あまりないことですが、RefreshRates() を使っているときに、新しいバーが形成されたためにバーのデータが移動してしまったことがあります。この問題を回避するために、私は、最初に必要なデータをすべて変数にコピーし、残りのイベント実行中はヒストリーデータ配列や同等の関数に 再び依存しないようにしています。そうすれば、たとえRefreshRates() を使う必要があったとしても、初期状態を安全に参照することができます。

ParanoyakX: RefreshRates() を使う使わないにかかわらず、同じような方法を試すことができるんですね。実はMQL5では、MQL4のような機能はなく、データを独自の配列にコピーして処理する必要があります。つまり、この方法で、MQL4とMQL5の両方に互換性のあるコードを作ることができるようになります。

しかし、最良の解決策は、EAにこれらのロジックを書き込むのではなく、代わりにインジケータにこれらのロジックのほとんどを書き込むことです。シグナルのロジックは、できるだけインジケータでプログラムするようにしてください。これは、インジケータが思い通りに動作するまで、視覚的に使用し、テストすることができるため、有用です。もう一つ、インジケーターはEAだけでなく、マニュアル取引にもシグナルを提供します。EA は売買の管理に集中すればよく、シグナリングのことは考えなくてよいのです。

 
paranoyakX:

[しかし、新しいバーが現れたらどうなるのでしょうか? シフトが変更され、私の検索は非論理的になります。

あなたが求めていることは、潜在的にとてもシンプルなので、私はポイントを逃しているのではないかと思っています。以前のOrderSelect()があれば、そのOrderOpenTime()に関連するバーシフトを、次のようにするだけで調べることができます。

int BarShiftOfOrderOpen = iBarShift(Symbol(), Period(), OrderOpenTime(), false);

例えば

  • H1チャート
  • 現在の時刻は 16:32
  • 注文は14:23にオープンされた
  • 上記のコードはBarShiftOfOrderOpen = 2、すなわち14:00のH1バーを返すはずで、Time[BarShiftOfOrderOpen]は14:00になります。
 
jjc: あなたが質問していることは、潜在的にとてもシンプルなので、私はポイントを見逃しているのではないかと思っています。以前のOrderSelect()があれば、そのOrderOpenTime()に関連するバーシフトを、次のようにするだけで調べることができます。

例えば

  • H1チャート
  • 現在の時刻は16:32
  • 注文は14:23にオープンされた
  • 上記のコードはBarShiftOfOrderOpen = 2、つまり14:00のH1バーを返すべきで、Time[BarShiftOfOrderOpen]は14:00になります。

しかし、彼が質問しているのは、その方法ではなく、データを処理している間に、新しいティックが新しいバーを形成することによって引き起こされるバーのシフトによって、それが無効になるのを防ぐ方法です。

しかし、RefreshRates() を使用した場合を除き、そのようなことは起こらないはずです。その可能性(めったにないことですが)のために、MQL5が行うのと同じ方法で代替方法を提案しました。

 
FMIC:

しかし、新しいバーを形成する新しい受信ティックによるバーシフトのために無効になることを防止する方法

OPのどこにそんなことが書いてあるんだ?という質問かも しれませんが、蹄鉄の音を聞いて、馬ではなくシマウマを思い浮かべているのではないでしょうか。MT4の再起動時にEAの状態をファイルに保存するという記述は、この質問が実際にはもっとずっと単純であることを示唆しています。
 

こんにちは、皆さん。

回答ありがとうございました。

もちろん、私の注文とペアになるインジケータの値をどのように見つけるかなど、新たな疑問も出てくるでしょう。また、毎回この処理をするわけではなく、OnInit()を一回するだけなので、EAを使ってもいいかもしれませんね。

jjcさん、こちらこそ解決策をありがとうございます。実は、"new bar "の件、少し気になっていたのですが、皆さんがおっしゃるように、EAが動いている間はシフトが変化しないので(RefreshRates()関数も使って いません)、皆さんのコードも使えそうです。ただ、@FMICさんのおっしゃる通り、これをインジケータとして作成した方がいいのでしょうか?

 
jjc:
OPのどこにそんなことが書いてあるのでしょうか?という質問かも しれませんが、蹄鉄の音を聞いて、馬というよりシマウマを思い浮かべているのではないでしょうか?MT4の再起動時にEAの状態をファイルに保存するという記述は、この質問が実際にはもっとずっと単純であることを示唆しています。

GumRai氏もそれを拾って引用してくれたので、ここでもう一度引用しておきます。

paranoyakX さん。

時間配列などを使おうと思ったのですが、棒を探そうとしているときに、新しい棒が出てきたらどうなるのでしょうか? シフトが変わってしまい、検索が非論理的になって しまいます。

 
paranoyakX:

もちろん、私の注文とペアになるインジケータの値をどのように見つけるかなど、新たな疑問も出てくるでしょう。また、毎回この処理をするわけではなく、OnInit()を一回するだけなので、EAを使ってもいいかもしれませんね。

jjcさん、こちらこそ解決策をありがとうございます。実は、"new bar "の件、少し気になっていたのですが、皆さんがおっしゃるように、EAが動いている間はシフトが変化しないので(RefreshRates()関数も使っていません)、皆さんのコードも使えそうです。ただ、@FMICさんのおっしゃる通り、これをインジケータとして作成した方がいいのでしょうか?

もし、複雑すぎるのであれば、私の提案を気にしないでください。今は一番簡単な方法でやって、慣れてきたら他の方法も試してみてください。

PS!OnInit()は初期化するところであり、履歴データシリーズ配列のデータを扱うものではありません。すべてのロジックとメインコードは、OnTick()またはOnCalculate()の中にあるべきです。

 
FMIC:

グムライ氏もそれを拾って引用していますが、ここでもう一度引用します。

あなたとGumraiさんは、「新しいバーが現れたら」の意味について、証拠がまだないにもかかわらず、大きな仮定をしています。OPはまだ「OnStart中に 新しいバーが出てきたら」とは言っていません。

私は、paranoyakXがEA内のグローバル変数にトレード/シグナルの詳細を保存していると疑っています。問題は、OnStart()の呼び出し中に新しいバーができることではなく、EAのライフタイム中に 新しいバーができることだと私は考えています。

 
jjc:

あなたとGumraiさんは、「新しいバーが出てきたら」の意味について、証拠がまだないにもかかわらず、大規模な仮定をしています。OPはまだ「OnStart中に 新しいバーが現れたら」とは言っていません。

私は、paranoyakXがEA内のグローバル変数にトレード/シグナルの詳細を保存していると疑っています。問題は、OnStart()の呼び出し中に新しいバーが形成されることではなく、EAのライフタイム中に 新しいバーが形成されることだと思われます。

EAにはOnStart() はありませんが、言いたいことはわかります。しかし、OPは皆さんのコメントに対しても、次のように言っていますので、引用します。

実は「新しいバー」については少し心配していたのですが、みなさんがおっしゃるように、EAが動いている間はシフトが変わることはありません(RefreshRates()関数も使っていませんしね)。

理由: