私たちのファンページに参加してください
- ビュー:
- 13
- 評価:
- パブリッシュ済み:
-
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
インジケーターがリペイントするかどうかを、単に主張を鵜呑みにするのではなく、実際に測定します。 チャートにアタッチし、テスト対象のインジケーターのバッファを、すでにクローズした バーについて再読み込みし、そこで確認されたすべての変化(値の変動、値の出現、値の消失)をカウントするとともに、その変化が最後に発生した過去最遠の時点も記録します。

例:XAUUSDのM1チャート上のZigZag(12,5,3)。このパネルは、実行開始から1時間25分12秒後、停止の87秒前に撮影されたものであるため、以下の表の合計値は若干高くなっている。 スクリーンショットではパネルの色を白地に黒に設定していますが、デフォルトでは暗いパネルに明るい文字が表示されます。
問題点
「再描画なし」は、インジケーターの説明で最も頻繁に見られる主張であり、検証が最も難しいものです。一般的なテスト方法は、チャートを見て矢印がどこにあったかを大まかに記憶し、インジケーターを再読み込みして再度確認することです。しかし、このテストでは、実際に損失を招く2つのケースが見逃されてしまいます。
1つ目は、チャートが開いたままの状態でも、しばらく前にクローズしたバー上の値が変化してしまうケースです。これは目では気づきにくいものです。矢印が数ピクセル移動したり、チャートの右端に注目している間に矢印が消えてしまったりするからです。
2つ目は、インジケーターが有効な間は正常に動作しているものの、再読み込み後に異なる履歴を表示してしまうケースです。これは、時間枠の切り替え、ターミナルの再起動、あるいはチャートの新規作成によってユーザーに起こる現象と全く同じです。
どちらも測定可能です。必要なのは、インジケーターが最初に公開したデータを記録し、その後も継続的にチェックし続ける仕組みです。
測定対象
- バーはシフトではなく、始値の時刻 によって識別されるため、新しいバー、スクロール、履歴の再描画が変化と誤認されることはありません。
- 比較の対象となるのは、シフト1以上のクローズ済みバーのみです。形成中のバーは定義上変化し続けるものであり、リペイントについては何も示しません。
- クローズされたバーについて最初に観測された値が基準となります。それ以降のすべての観測値は、イベントをカウントする前の観測値との比較と、ドリフトを測定する最初の観測値との比較が行われます。
- 3種類のイベントは、その悪影響の度合いが異なるため、個別にカウントされます:
- 変更— 値が別の値に変化した。
- 出現— 空のスロットに値が入り、すでにクローズ済みのバーにシグナルが現れた。
- 消失— 公開された値が消去された。これは最も深刻なケースである。トレーダーが取引の根拠としたシグナルが、次の読み取り者が確認する履歴から消えてしまっている。
- 注目すべき数値は「MaxShift」 であり、これはこれまでに観測されたイベントの中で最大のシフト値です。直近のクローズバーのみを再描画するインジケーターと、15バー分の履歴を書き換えるインジケーターとは、全く異なるものです。
- すべてのイベントは、バーの時間、バッファ、検出時のシフト、および新旧の値とともにCSVファイルに書き込まれるため、レポートを鵜呑みにするのではなく、監査することが可能です。
- テスト対象のインジケーターは、解析済みのパラメータリストからIndicatorCreateを使用して作成されるため、何も編集したり再コンパイルしたりすることなく、あらゆるカスタムインジケーターを検査できます。解析されたパラメータは起動時にジャーナルに出力されるため、誤ったパラメータリストがあっても黙ってスルーされることなく、可視化されます。
- オプションで、N分ごとにハンドルを解放して再作成することも可能です。記録された履歴は意図的にリセットされない ため、実行中はインジケーターが静止している状態も捕捉され、リロード後に異なる過去のデータが公開される現象も検出されます。
- インジケーターのハンドルがまだ存在しない場合、インジケーターがまだ計算されていない場合、指定された深度よりもクローズドバーの数が少ない場合、バッファをコピーできない場合、または時刻の読み取りと値の読み取りの間にシリーズが移動した場合、そのチェックは破棄され、証拠としてではなく「スキップ」としてカウントされます。
サンプリングの特性として、チェック間隔よりも短い時間しか存在しない値は見逃される可能性があります。これは実際の制限であり、その測定値については後述します。
測定例
以下ではすべて、ターミナルに標準搭載されているインジケーターを使用しているため、誰でも再現可能です。
実取引環境、XAUUSD M1、1時間26分
同じターミナルおよび同じデータフィード上の4つのチャートに4つのコピーを配置し、2026年9月30日 サーバー時間 02:19~03:46の間に、300本のクローズバーを監視し、1秒に1回のチェックを行いました。
| テスト対象のインジケーター | バッファ | 比較 | 変更点 | 出現 | 消滅 | MaxShift | 判定 |
|---|---|---|---|---|---|---|---|
| 例\ジグザグ (12,5,3) | 0 | 1 315 713 | 0 | 0 | 17 | 15 | 再描画 |
| 例\ジグザグ (12,5,3) | 1 | 1 315 713 | 0 | 0 | 3 | 1 | 再描画 |
| 例\ジグザグ (12,5,3) | 2 | 1 315 713 | 0 | 0 | 10 | 3 | 再描画 |
| 例\カスタム移動平均 (13,0,2) | 0 | 1 305 513 | 0 | 0 | 0 | - | 安定 |
| 例\フラクタル、確認が遅れる | 0 | 1 303 713 | 0 | 13 | 0 | 3 | 再塗装 |
| 例\フラクタル、確認が遅れたもの | 1 | 1 303 713 | 0 | 12 | 0 | 3 | 再描画 |
それぞれ4387、4353、4347回のチェック、スキップされたチェックは0 / 0 / 1回、再同期は0回、ハンドルの再読み込みは0回。イベントファイルには30行、0行、25行が記録されており、それぞれの場合において3つのイベント列の合計と一致している。
比較回数は整数ではありませんが、そうあるべきでもありません。実行中に87本の新しいM1バーが開かれ、開かれたばかりのバーにはまだクローズされたバーの履歴がありません。各インスタンスについて、(チェック数 - 1)× 300 - 87 を計算すると、報告された比較回数が正確に再現されます。
1つのテーブルに3つの異なるシグネチャ:
- ZigZagは自身の過去を削除します。 プロットされたZigZagバッファから17個の値が消去され、そのうち1つはバーがクローズしてから15バー後に、さらに13個はその直後の2つの計算バッファから消去されました。 何も移動していない:ZigZagの極値はそのバーの高値または安値であり、ずれることはできないため、削除されて別の場所に再公開される。そのため、イベントは「Vanished」となり、デルタ列は空のままとなる。
- 終値バーの移動平均は変動しません。 1,305,513回の比較が行われましたが、イベントは1件もありませんでした。
- フラクタルは3つ目のケースであり、ツールはこれを最初のケースとは区別しています。 25件のイベントがあり、すべて「Appeared」で、「Changed」も「Vanished」もなく、すべてシフト3です。 これはリペイントではなく、確認の遅れです。フラクタルは描画されるまでにさらに2本のバーを必要とするため、その値は正当に3バー前に現れ、その後そのまま残ります。「判定」列には依然として「REPAINTS」と表示されていますが、これはツールが検知した事実を報告し、判断は読者に委ねているためです。 イベントがすべて1つの固定シフトで「Appeared」となるインジケーターは、その遅延が組み込まれているため使用可能です。一方、イベントが散在するシフトで「Vanished」となるインジケーターは使用できません。
ストラテジーテスター、10秒間の同一測定
例\ZigZag(12,5,3)、XAUUSD M1、2026年9月28日~2026年9月29日、1分足OHLCモデリング、300本の終値バーを観察:
| カウンター | 値 |
|---|---|
| 判定 | リペイント |
| チェック | 5 512 |
| クローズドバーの比較数 | 1 651 923 |
| 変更/出現/消失 | 0 / 3 / 342 |
| 値が失われた異なるバーの数 | 341 |
| 少なくとも1つのイベントを持つ異なるバーの数 | 343 |
| MaxShift | 28 |
| スキップされたチェック/再同期 | 0 / 0 |
| CSV行数 | 345 (= 342 + 3) |
ある取引日において、ZigZagは、その時点でクローズ済みのバーに対して既に公開していた342個の値を削除しましたが、そのうちの1件は、当該バーがクローズしてから28バー後に削除が行われました。 すでにクローズ済みのバーに3つの値が現れました。この3つのうち、戻ってきた値は1つだけでした。17:06のバーでは4126.184を失い、20秒後にまったく同じ数値が戻り、その1分後に再び失われました。 これが、この実行において Max |delta| の値が 0.00000000 となる理由でもあります。これは測定値であり、ギャップではないからです。

その日の345件のイベントを、検出されたシフト別に分類したものです。再描画のほとんどは1~2バー前に発生しているため、最後のクローズ済みバーだけを見ていても不十分なのです。

例:カスタム移動平均(13,0,2)。上記のジグザグと同じ銘柄、同じ実行ウィンドウを使用:スクリーンショット撮影時点で1,291,114回の比較が行われており、値が変更されたものは1つもない。 比較回数は意図的に判定結果の横に表示されています。「STABLE」の価値は、その横にある数値によってのみ決まります。
「0.0を無値として扱う」設定が何を変えるのか、そしてサンプリングのギャップがどれほど大きいか
4番目のコピーでは、そのスイッチをオフにして同じジグザグを実行したため、0.0は通常の値として扱われます: 1,308,513回の比較、18 + 3 + 11 = 32件のイベント、すべて「Changed」、MaxShiftは同じく15、メインバッファのMax |delta|は4184.08800000でした。 この数値こそが「真の値」である。なぜなら、「変更」とはピークが0.0に置き換わることだからだ。どちらの設定も同一の再描画を表しているが、デフォルト設定の方が正しく名称を付けている。
2つのコピーはまったく同じリストを認識していなかったが、これは知っておく価値がある。4つ目のコピーは、最初のコピーが見逃した2つのイベントを記録した。バッファ0および2の03:32:00のバーで、03:33:01に検出されたものである。 2つのコピーは14秒の間隔を置いて開始され、その値は1チェック間隔未満しか存在しなかったため、一方はそれをサンプリングしたが、もう一方はサンプリングしなかった。M1で1秒間隔の場合、それがこのインスツルメントの分解能となる。

0.0と読み取られた同じZigZagも値としてカウントされました。現在、削除されるたびに「Changed」として表示され、そのデルタ値は価格の大きさと同じになります。照合用としては有用ですが、説明としては誤解を招く恐れがあります。
数値の検証
カウンタについても、そのまま信用したわけではありません。ターミナルから取得した生のローソク足データに対して、Examples\ZigZagをPythonで独自に再実装し、その結果をイベントファイルと比較しました:
- 実稼働時:プロットされたバッファで値が欠落していた17本のバーすべてについて、その値は本日のリプレイから欠落しており、17本すべてにおいて、ツールの最終読み取り値はリプレイされた値と一致していた。
- テスター実行:イベントを含む343本のバーについて、同じ2つのチェックを行ったところ、不一致はなかった――リプレイに欠落していた341個の値はすべて存在せず、343本中343本すべてで最後の読み取り値がそれと同じであった。
入力
| 入力 | デフォルト | 説明 |
|---|---|---|
| 検査対象のインジケータ(iCustom パス、.ex5 は含まない。例:Examples\ZigZag) | 空 | MQL5\Indicators を基準としたカスタムインジケータのパス。拡張子は含めず、iCustom が期待する形式と完全に一致させる必要があります。 意図的に空欄にする:何も入力しない場合、ツールはジャーナルおよびパネルにその旨を表示し、ターミナル上に存在しない可能性のあるインジケーターを指定する代わりに、何も測定しません。ライブチャート上でパスが間違っている場合、ツールは接続されたままとなり、30秒ごとに再試行を行うため、ツールを削除することなく入力を修正できます。 XAUUSDのM1チャートで誤ったパスを指定して測定した結果:ツールはエラーコードを1回表示し、ターミナルは試行のたびに(30.4秒および30.7秒間隔で)独自の「読み込めません」という行を追加しました。パスを修正すると、何も切り離すことなく測定が開始されました。 |
| パラメータ(カンマ区切り、空欄の場合はインジケーターのデフォルト値) | 空 | テスト対象のインジケータの入力リスト。例:12,5,3。各項目はその内容に応じて型が判定されます。true および false は bool、小数点や指数を含む数値は double、単純な数値は int、それ以外は string となり、囲んでいる引用符は削除されます。 解析されたリストは開始時にジャーナルに出力されるため、誤ったリストはすぐに確認できます。空の場合は、インジケータは独自のデフォルト設定で実行されます。 |
| 監視対象のバッファ数(1~32) | 1 | 読み込まれるバッファの数。計算用バッファもカウントされます。インジケータが持っていないバッファがあると、チェック全体が失敗となります。これは「スキップされたチェック」としてカウントされ、最初の数回はエラーコードと共にジャーナルに記録されるため、黙ってスルーされることなく確認できます。 |
| シンボル(空 = チャートシンボル) | 空 | チャートを表示せずに、別の銘柄のインジケーターを検査します。 |
| 時間足 | 現在 | 別の時間枠でインジケータを確認します。 |
| 監視対象のクローズ済みバー(シフト 1..N) | 300 | チェックの深度。バー数にバッファ数を乗じた値は 200,000 スロットに制限されます。それを超える場合、深度は縮小され、ジャーナルに 1 行が書き込まれます。 |
| チェック間の最小秒数。テスター内のモデル化された時間(0 = 毎ティック) | 1 | スロットリング。1秒間隔であれば、人間が反応できる再描画をすべて捕捉でき、毎ティックよりもはるかに少ないCPU負荷で済みますが、この間隔より短い時間存在した値は見逃される可能性があります。ストラテジーテスターでは、実時間ではなくシミュレーション内の時計が使用されるため、ここでも同じ設定が有効です。 |
| この値より小さい|変更|を無視する(0 = すべての変更をカウント) | 0.0 | 浮動小数点から再計算され、末尾の桁に揺らぎがあるインジケーターに対する、バッファ単位での絶対許容誤差。0に設定すると、すべての差異がカウントされます。許容誤差以下の変化は一切記録されません — イベントも、CSV行も、Max |delta|への寄与もありません。 |
| 0.0を「値なし」として扱う(矢印/ジグザグ形式のバッファ) | true | 多くのシグナルインジケーターは、「シグナルなし」の場合、EMPTY_VALUE ではなく 0.0 を出力します。これをオンにすると、0.0 は空とみなされ、それらのイベントは「出現」および「消失」として報告されます。正確にゼロが有効な値であるバッファでは、これをオフにしてください。 |
| N分ごとにインジケーターハンドルを再作成する(0 = 実行しない) | 0 | ハンドルを解放し、ターミナルに新しいハンドルを要求します。これにより、別のプログラムが同じパラメータで同じインジケーターを保持していない限り、完全な再計算がトリガーされます。記録された履歴はクリアされないため、これにより、実行中は安定しているが、再読み込み後に異なる値となるインジケーターを捕捉することができます。 |
| N分後に測定を停止する(0 = 削除されるまで実行) | 0 | 計測を終了し、レポートを固定します。これは無人実行に便利です。 |
| すべてのイベントを MQL5\Files に書き込む (CSV) | true | イベントファイル。 |
| CSV ファイル名(空 = 自動) | 空 | 自動生成されるファイル名は、シンボル、時間枠、開始時刻から構成されます。同じ分内に別のコピーが開始されたために、その名前のファイルが現在開かれている場合、ファイルなしでコピーを実行する代わりに、数字の接尾辞が追加されます。 同じ分内に実行された以前の実行で、同じ名前のファイルが閉じられている場合は上書きされるため、実行結果が重要な場合は独自の名前を指定してください。 |
| この行数に達したら書き込みを停止する | 100000 | ティックごとに再描画されるインジケーターへの対策です。制限に達した後もカウントは続きますが、ファイルの増大は停止し、ジャーナルに1行その旨が記録されます。 |
| チャート上にレポートパネルを表示する | true | 無人実行やテスター実行の際は、これをオフにしてください。 |
| パネルX方向の距離(96 dpi でのピクセル数) | 12 | 位置。パネルのスケールは、画面の dpi に応じて変化します。 |
| パネルの Y 方向の距離(96 dpi でのピクセル数)12位置。パネルは画面の dpi に応じて拡大・縮小されます。 | 20 | 位置。 |
| フォントサイズ、ポイント(4以上。パネルは画面のDPIに合わせて拡大縮小されます) | 9 | パネルは等幅フォントの表です。高 dpi の画面や小さなチャートでは、これを小さくしてください。上記のスクリーンショットでは 4 が使用されています。 |
| パネルの角 | 左上 | アンカーの角。 |
| パネルの背景色 | ダークグレー | パネルの色。他のエキスパート・アドバイザーと同様に、チャートごとに1つのコピーが実行されます。複数のチャートで同時に複数のコピーを実行できます。 |
| パネルの枠の色 | 薄グレー | |
| パネルのテキスト色 | 薄いグレー | |
| すべてのバッファが安定しているときのヘッダーの色 | ライムグリーン | |
| バッファが再描画された際のヘッダーの色 | トマト色 |
レポート
これは、上記のライブZigZagの実行が停止された際に、ツールがジャーナルに出力した要約ブロックを、そのまま転記したものです。チャート上のパネルには同じ表が表示されており、実行時間は右揃えになっています:
=== リペイント・インスペクターの概要 ===================================== リペイント・インスペクター Examples\ZigZag (12,5,3) XAUUSD M1 300本のクローズバーを監視 実行時間 01:26:39 チェック数 4 387 スキップ数 0 再同期数 0 リロード処理数 0 バッファ 判定 比較数 変更数 出現数 消失数 最大シフト 最大 |デルタ| 0 再描画 1 315 713 0 0 17 15 - 1 再描画 1 315 713 0 0 3 1 - 2 REPAINTS 1 315 713 0 0 10 3 - CSV: RepaintInspector_XAUUSD_M1_20260930_0219.csv (30 行) 開始日時:2026.09.30 02:19:31(サーバー時間)、チェック数:4387、スキップ数:0、再同期数:0、ハンドル再読み込み数:0 イベント合計 30、CSV行数 30 バッファ 0: REPAINTS、比較回数 1315713、変更 0、出現 0、消失 17、影響を受けたバー 17 バッファ 0: 最大シフト 15(2026年09月30日 02:59 のバーで VANISHED) バッファ 0: 最大 |delta| なし バッファ 0: 最初のイベント 2026.09.30 02:23:02、最後のイベント 2026.09.30 03:46:03
MQL5\Files にあるイベントファイルには、イベントごとに1行が記録されています:
detect_time;bar_time;shift_at_detect;buffer;event;old_value;new_value;delta;drift_from_first;after_reload 2026.09.28 17:11:20;2026.09.28 17:06:00;5;0;VANISHED;4126.18400000;EMPTY;;;0
空の値は「EMPTY」と記述され、定義されていない差分は空白のままにされるため、読者が欠落した数値をゼロと誤認することはありません。 2つ目のファイル <name>_summary.csv には、バッファごとに1行ずつ、すべてのカウンターとインジケータ、そのパラメータ、シンボル、時間枠、深度が記録されており、実行中は15秒ごとに更新されるため、ログを解析することなくイベントファイルから数値を再集計することができます。 ツールが削除されると、ジャーナルには開始ブロック、最初の20件のイベントの全文、および上記の要約が記録されます。
使用方法
- 確認したいインジケーターを MQL5\Indicators フォルダに配置し、そのパラメータリストを確認してください。
- 実際に取引を行う銘柄と時間枠のチャートに「Repaint Inspector」をアタッチし、パスとパラメータを入力して、バッファの数を設定します。
- 取引を行う時間帯に実行させてください。リペイントは市場活動の特性であり、時計の特性ではありません。静かな日曜日の夕方は、何も証明するものではありません。
- まず MaxShift を確認し、次に「Changed」、「Appeared」、「Vanished」の区分を確認してから、CSV ファイルを開いて数行を確認してください。
- インジケーターがそれをクリアしたら、ハンドルのリロードを30分に設定して、再度実行してください。
制限事項、率直に言えば
- このツールは、リペイントがないことを証明することはできません。測定期間中にリペイントが見つからなかったという結果を示すことしかできないため、各判定の横には比較回数が表示されています。
- このツールはチェック間隔ごとにサンプリングを行います。1つの間隔の間に現れては消える値は見逃される可能性があり、上記の測定結果では、1時間半の間にそれが2回発生していることが示されています。
- このツールは、インジケーターがバッファを通じて出力するデータを測定します。バッファを埋めるのではなく、チャート上にオブジェクトを描画するインジケーターは、このツールからは認識されません。
- ストラテジーテスターは1日を数秒に圧縮するためここで有用ですが、テスターでのリペイントと実取引でのリペイントは必ずしも同じとは限りません。結果が重要な場合は、実取引環境で実行してください。
- ストラテジーテスターでは、テスト対象のインジケーターが実行開始前に存在し、コンパイル済みである必要があります。テスターは、IndicatorCreateの失敗を致命的なエラーとして扱い、エキスパートをアンロードします。これは、ツール内のエラー処理では変更できません: 意図的に誤ったパスで測定した場合、OnInit内でハンドルを作成すると「インジケーター作成エラー」 followed by 「OnInit重大エラー」が発生し、代わりに最初のチェック時に作成すると、「OnTester重大エラー」で終わる同じ6つのエラーレコードが記録されます。 ライブチャート上では、同じ誤ったパスでも致命的ではありません。ツールは接続されたまま再試行を行い、修正されたパスでその場で測定が開始されました。
- これは、インジケーターが利益を生むかどうかについては何も示していません。リペイントしないインジケーターでも役に立たないものはあり、また、リペイントするインジケーターの中には意図的かつ適切に使用されるものもあります。
- 取引機能、DLL、ネットワークアクセス、外部ファイルは一切必要ありません。バッファを読み取り、MQL5\FilesにCSVファイルを書き込みます。
MetaQuotes Ltdによって英語から翻訳されました。
元のコード: https://www.mql5.com/en/code/77842
ATS Liquidity City - liquidity pools and sweeps, drawn as a neon city
ストップがどこに設定されている可能性が高いか、またどのストップがちょうど発動されたかを示します。流動性プールとは、価格がまだ突破していない確認済みのスイング高値・安値、同値の高値・安値(より大きなプール)、および昨日の高値・安値のことです。 バーがプールを越えて取引されると「スイープ」とマークされ、同じバーが再びプールの内側で引けた場合は「グラブ&リジェクト」とマークされます。再描画なし:スイングは、両側でN本のバーが引けた後にのみ使用されます。 パネルはCCanvas上に描かれたネオン街です。価格は空飛ぶ車、売りストップはその下のタワー、買いストップはその上の浮遊プラットフォーム、昨日の水準は金色の看板、サーチライトが空を照らし、ティッカーが今日の「獲物」を表示します。 2つのバッファが、エキスパートアドバイザーで使用するための、上側および下側の最も近いアクティブなプールを提供します。インジケーター専用:取引は一切行いません。
Symbol Spec Auditor
ポジションサイズや取引コスト(ポイント価値、スプレッドコスト、証拠金、スワップ、約定ルール)を決定する契約仕様の詳細を口座通貨で表示し、ロットサイズのルールを無断で破るブローカーの設定について警告し、マーケットウォッチのすべての銘柄に関する監査結果をCSV形式でエクスポートするチャートパネルです。
Adaptive Moving Average (AMA)
適応移動平均線は、ノイズの影響を受けにくい移動平均線を作るときに使われ、トレンドを検知する際にラグが最小に抑えられるという特徴を持ちます。
Accelerator Oscillator (AC)
アクセルレーション/デセレレーションインジケーター(AC)は現在の市場を動かす力の加速と減速を測ります。