FMIC: No! On the forum, you will find that many users have shown that the "Bars" method is very old and unreliable because the number of bars can be changed by the "Options" for charts or it can be constant when the maximum number of bars per chart has been reached. So, it is wrong to use it. Use either "Time[0]" or if you want it to be compatible with MQL5 as well, use "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Please see my example.
Bars is unreliable (a refresh/reconnect can change the number of bars on the chart) volume is unreliable (miss ticks) Always use time.Bars is unreliable (a refresh/reconnect can change bar on the chart).新しいキャンドル - MQL4フォーラム
アドバイスありがとうございます。これは私のコードの非常にシンプルなバージョンです。
このスレッドを開いた理由はDetectExistingPattern()関数 です。
OnTick() の最初の実行でコードを実行する方法については、すでにサンプルコードをお渡ししましたので、OnInit() の中ではなく、OnTick() の最初の呼び出しでDetectExistingPattern() を実行するように、それに応じてあなたのコード投稿を更新してください。
また、"Bars "を使用して新しいバーを検出することはできません。これは不正解です。Time[0]」または「SeriesInfoInteger( _Symbol, _Period,SERIES_LASTBAR_DATE)」のどちらかを使用する必要があります。以下はその例です。
OnTick() の最初の実行でコードを実行する方法については、すでにサンプルコードをお渡ししましたので、それに従ってコード投稿を更新し、OnInit() 内ではなくOnTick() の最初の呼び出しでDetectExistingPattern() が実行されるようにしてください。
また、"Bars "を使用して新しいバーを検出することはできません。これは不正解です。Time[0]」または「SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )」のどちらかを使用する必要があります。以下はその例です。
FMICさん、ありがとうございます。ちなみに、Barsの 使い方は、私の記憶では、みんながそう書いていたので、私もそうしていました。なぜいけないのでしょうか?また、動作がおかしいのでしょうか?
ps:メタトレーダー4を使っているので、mql4でいいんですよね?
ありがとうございます!@FMICさん、@jjcさんに頼まれたので簡単なコードを追加しました。ちなみに、Barsの使い方は、私の記憶では、みんながそう書いていたので、私もそうしていました。なぜいけないのでしょうか?また、動作がおかしいのでしょうか?
ps:メタトレーダー4を使っているので、mql4でいいんですよね?
FMIC:
No! On the forum, you will find that many users have shown that the "Bars" method is very old and unreliable because the number of bars can be changed by the "Options" for charts or it can be constant when the maximum number of bars per chart has been reached. So, it is wrong to use it. Use either "Time[0]" or if you want it to be compatible with MQL5 as well, use "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Please see my example.
このスレッドを開いた理由はDetectExistingPattern()関数 です。
最初の質問に戻って...この例では、CheckTrendPattern()関数を変更して、特定のバーから開始するようにするのが一つの方法でしょう。1 から 10 までの固定の範囲を使用する代わりに、指定された開始点から 1 から 10 までのオフセットを使用します。
既存の注文がなく、現在パターンが満たされているかどうかをチェックしたい場合は、CheckTrendPattern() の代わりに CheckTrendPattern(0) を使用します。
起動時に、もし既存の注文があれば、以下のように、その注文のトリガーとなったパターンを探すことができます。これは、私が最初に提案したのと同じで、既存の注文のオープン 時間に相当するバーインデックスを取得し、そこから逆算して探すのです。
しかし、FMICが言うように、このチェックはOnInit()ではなく、OnTick()の最初の呼び出しで行うことが望ましいです。私がこれを提案する理由は、「初期化を中断する」こととは全く関係がありません。むしろ、EAがすでにチャートにアタッチされている状態でMT4が再スタートするとき、ブローカーからの注文リストや更新されたバー履歴をまだ100%確実に持っていないことを懸念しているのです。
もう一つの考慮すべき点は、次のようなシナリオで、すべて1本のバーでカバーされる時間内に発生します。
これを防ぐために、オープンオーダーだけでなくクローズドオーダーもチェックするとよいでしょう。
最初の質問に戻りますが...この例では、CheckTrendPattern()関数を変更して、特定のバーから開始するように指示することが1つの選択肢となります。1 から 10 までの固定の範囲を使用する代わりに、指定された開始点から 1 から 10 までのオフセットを使用します。
既存の注文がなく、現在パターンが満たされているかどうかをチェックしたい場合は、CheckTrendPattern() の代わりに CheckTrendPattern(0) を使用します。
起動時に、もし既存の注文があれば、以下のように、その注文のトリガーとなったパターンを探すことができます。これは私が最初にした提案と同じで、既存の注文のオープン時間に相当するバーインデックスを取得し、そこから逆算して探し始めます。 しかし、FMICが言うように、このチェックはOnInit()ではなく、最初のOnTick()の呼び出しで行うことが望ましいのです。私がこれを提案する理由は、「初期化を中断する」こととは全く関係がありません。むしろ、EAがすでにチャートにアタッチされている状態でMT4が再スタートするとき、ブローカーからの注文リストや更新されたバー履歴をまだ100%確実に持っていないことを懸念しているのです。
もう一つの考慮すべき点は、次のようなシナリオで、すべて1本のバーでカバーされる時間内に発生します。
この部分は本当に重要で、私は冗長な注文を出す可能性があります。この部分は本当に重要で、冗長な注文を出す可能性があります。
WHRoederさんの新しいバーチェック・コントロールはとてもシンプルで美しいです。私は私のコードにあなたのメソッドを追加しました、ありがとうございます。
皆さん、こんにちは。
FMICがアドバイスしてくれたように、私は自分のパターンを見つけてシグナルを出し、さらにいくつかのデータを私の注文に使用するインジケータを書きました(私は異なる価格で複数の注文を出すかもしれません)。今、私は自分のEAでそれを使用したいのですが、私は質問があります、私は実際にあなたの経験を必要としています。このインディケータからシグナルを得たとき、注文を出したり(売り指値、買い指値など)、mt4が何らかの理由でクラッシュした場合、その出した注文がこのインディケータのどのシグナルのものかをどうやって見つけることができますか? その際、バーシフトを使って良いですか?以前話したように、注文作成時刻を見つけて、そのバーシフトを見つけて、このシフトを使ってインディケータ値を取得しようとすれば良いですか?この注文とインジケーターのシフトは どのように一致させればいいのでしょうか?
ありがとうございます。
はい、iBarShift() を使用することができます。ちょうどjjcが 以前の投稿であなたに説明したように、その後iCustom() 関数経由であなたのインジケータのデータを参照します。