Q: 何が欠けていますか?
プログラム可能なクライアント側の取引アクセスデバイスである MT4 ターミナルは、(歴史的な理由から) レジスタの時間反転インデックスを使用し{ open, high, low, close, volume }、それぞれの時間単位 (各 TimeFRAME の期間に固有) の実際の値と履歴値を格納します。
他の値は、これらのカーディナル値から「派生」/計算されます (「事前定義された」(実装された) 指標{ iRSI(), iMFI(), ... }によって、または MQL4 コードによってプログラムによって)。
最初の一般的な問題は、時間が経過することです... (明白な... しかし、驚くべきことに、PriceDOMAIN には人為的な副作用がいくつかあります。これは、驚くべきことに TimeDOMAIN に由来し、価格設定データを可能な限り高速に処理するための歴史的な単純化によって導入されました。リアルタイムで、それはあなたのアイデアがにストロークするのと同じようにトラブルを引き起こします)。
表示されるaNewBarEVENTと、非常に特殊なケースが発生します (常に)...
レジスターopen[0] == high[0] == low[0] == close[0] & volume[0] == 1
anFxMarketEVENT時間が経過し、MT4-Terminal ソフトウェアへの後続の到着を介して、 volume[0]> 1 が成長し、レジスタclose[0]がどんどん新しい値を取得します (通常は 以外open[0])
したがって、そのメカニズムは、の「ちょうど現在の」値にバインドされた意思決定を「複雑にします」。これは、次の( a new / Prices from Broker )close[0]の到着が、レジスタ値を以前の (milli -)2番目。anFxMarketEVENTAskBid
このように、あなたのコードは、 の (派生した) 値iRSI( ..., PRICE_CLOSE, ... )が確かに 70 を超えていた瞬間にanEndOfBAR何らかのアクティビティを開始した可能性がclose[0]ありますiRSI()。 70未満でした...((スケールなしで切り取られた)PrintScreenで描写しようとしているようです)
2 番目のclose[aBarPTR]問題は、ろうそくレベルの「上」にあるマーカーの aPriceDOMAIN 距離にあるようです。
LONG 取引は&の両方で指定された価格で入力されましたが、グラフはローソク足の価格を- ベースの価格として示しています。ブローカーの利用規約によって異なります)、LONG 取引エントリのポジションは公平で正しいものです。Bid == close[0]SpreadBidSpreadSpread
この場合、有効である必要はないが有効である可能性がある3 つ目のStrategy Tester問題は、a と呼ばれる MT4 ターミナル機能が、バックテスト中に複数の TimeFRAME 計算を処理する際に公平で便利ではなかったことです。数年前、私たちのチームは組み込み関数の使用をあきらめ、独自のレジスタ処理の使用を開始して、本当に信頼できる独自の独立した複数の TimeFRAME 値を維持しました。
Q: どうすれば修正できますか?
ホットバー イベントの処理の性質上、[0]コードには他のフィルターまたは追加のインジケーターが必要です。これらは遅延せず (追加のレイテンシーを追加せず、取引決定がトリガーされたときに時間のずれを生じさせません)、次のことを行います。フラッターを取得しない (同じ小節中にトリガーを繰り返す)。
MQL4それを行うためのいくつかのツールを提供します。さらに必要な場合は、追加の外部機能 (完全に分散されたマルチエージェント グリッド/クラウド/GPU ベースのコンピューティング) に頼ることができます。
それでは、FX/MT4の素晴らしい世界をお楽しみください。
これらの可能性はすべてあなたの指先にあります。