【移植#75】TIIの20越え・80割れ通知 — 同じ名前でも式が違う¶

この記事の3行まとめ
- TIIの「20越え」と「80割れ」を、形成中ではなく確定した足で一度だけ検出します
- M.H. Peeの原典式と、旧
TII_RLHに見られる別の計算解釈を同じチャートへ重ねました - EURUSD H1の確定1,200本を独立計算と全件照合し、2つの式は1,116本で異なりました
今回の原典はTIIへのAlert追加¶
今回採用したのは、2010年3月25日の「Trend Intensity IndexにAlert をつける。」です。
原典では、読者から次の機能が求められていました。
- TIIが20を上回ったときに知らせる
- TIIが80を下回ったときに知らせる
- ポップアップだけでなくメールも使えるようにする
通知処理だけなら、すでに移植#19と移植#33で、確定足、初回抑制、同一バーの連打防止を扱っています。同じ説明を繰り返さないため、今回はTIIの計算式まで戻りました。
調べると、同じ「TII」という名前でも、偏差を測る基準に少なくとも2通りの実装がありました。そこで配布版は2本を同時に描き、通知に使う式を選べるようにしています。
TIIは何を0〜100へ変換しているのか¶
TII(Trend Intensity Index)は、価格が移動平均より上にある偏差と、下にある偏差の割合を0〜100へ変換した指標です。
M.H. Peeによる定義では、まず現在の60本単純移動平均を求めます。次に、直近30本の終値をその移動平均と比べ、上側と下側の距離を別々に合計します。
上方偏差 = Σ max(Close[j] − 現在のSMA60, 0)
下方偏差 = Σ max(現在のSMA60 − Close[j], 0)
TII = 100 × 上方偏差 ÷ (上方偏差 + 下方偏差)
原論文とMQL5 CodeBaseの解説では、標準例として60本SMAと30本の偏差が示されています。
上方偏差だけなら100、下方偏差だけなら0、両者が同じなら50です。今回、分母がほぼ0になる平坦な区間は中立の50としました。
「現在のMA」と「各バーのMA」は同じではない¶
原典が参照していた旧MQL4インジケーターTII_RLHは、先に各バーのClose − MAを作り、その直近30本を合計しています。
この方法では、30本の終値がそれぞれ異なる時点のMAと比較されます。
トレンド中はMA自体も動くため、この違いは小さな丸め差では終わりません。掲載画像では、金色が現在のMAを全30本へ使う原典式、水色が各バー自身のMAを使う旧実装型です。
配布版の初期設定は、M.H. Peeの定義に合わせたSMA 60 / TII 30 / CURRENT BASELINEです。MA方式は変更できますが、SMA以外を選んだ時点で原論文どおりの設定ではなく、派生形になります。
20越え・80割れをBUY/SELLと呼ばない理由¶
ここには、もう一つ意味の違いがあります。
M.H. Peeの原論文は、TIIが80を超えた状態を強い上昇、20を下回った状態を強い下降として、トレンド方向へ入る例を示しています。一方、FAI-FX記事の依頼は20を上抜けたときと80を下抜けたときの通知です。これは極端な領域へ入る瞬間ではなく、そこから戻る瞬間です。
| 表示 | 一つ前の確定足 | 新しい確定足 | 意味 |
|---|---|---|---|
20-up | 20以下 | 20より上 | 下側の極端領域から戻った |
80-down | 80以上 | 80未満 | 上側の極端領域から戻った |
したがって、配布版は矢印をBUY/SELLと名付けていません。通知は状態変化を知らせるだけで、売買の優位性や反転を保証するものではありません。
確定足だけを同一バー1回通知する¶
表示マーカーと通知判定には、形成中の0番足を使いません。最後に確定した足と、その一つ前の確定足で境界をまたいだかを調べます。
if(previous <= InpLowLevel && selected > InpLowLevel)
signal = 1;
else if(previous >= InpHighLevel && selected < InpHighLevel)
signal = -1;
インジケーターの初回読み込みでは、最新の確定足時刻を記録するだけにします。次に新しい足が確定し、その時刻が変わったときだけ通知を評価するため、過去の矢印がまとめて送られたり、同じ足で繰り返し通知されたりしません。
ポップアップとメールは初期値OFFです。必要な場合だけ端末設定を済ませて有効にしてください。Alert()とSendMail()はストラテジーテスターでは動作しないため、実通知は通常チャートで確認します。
パラメーター¶
| パラメーター | 初期値 | 役割 |
|---|---|---|
InpMajorPeriod | 60 | 基準となる移動平均の期間 |
InpMinorPeriod | 30 | 偏差を合計する期間 |
InpMAMethod | SMA | 基準MAの方式。原典設定はSMA |
InpLowLevel | 20 | 上抜けを検出する下側レベル |
InpHighLevel | 80 | 下抜けを検出する上側レベル |
InpSignalFormula | CURRENT BASELINE | 通知へ使う計算解釈 |
InpEnablePopup | false | MT5のポップアップを有効化 |
InpEnableEmail | false | MT5設定済みメールを有効化 |
ROLLING BASELINEへ切り替えると、水色の旧実装型で境界を判定します。金色と水色は常に表示するため、式を変えた影響を画面上で確認できます。
75_TII_Threshold_Reentry_Alert_v1_00.mq5 をダウンロード
EURUSD H1の確定1,200本で照合¶
専用MT5 Build 6182で、配布インジケーターと独立検証EAをコンパイルしました。どちらも0エラー・0警告です。
検証側では、配布版のバッファを読むだけで合格にせず、EURUSD H1の終値から60本SMA、2通りの偏差合計、20上抜け、80下抜けを別に計算しました。
| 検査項目 | 結果 |
|---|---|
| 照合した確定足 | 1,200本 |
| 原典式 vs 独立計算 | 不一致0 |
| 旧実装型 vs 独立計算 | 不一致0 |
| シグナルコード・矢印 | 不一致0 |
| 20上抜け | 16件 |
| 80下抜け | 11件 |
| 2つの式が異なった足 | 1,116本 |
| 2つの式の最大差 | 80.0661 |
| 2系列の値域 | 0.0000〜100.0000 |
| 計算許容差 | 1e-8 |
| 注文数・ポジション数 | 開始前後で変化なし |
| ポップアップ・メール | OFF、外部送信なし |
最大の数値誤差は1.0041e-9で、許容差内でした。これはSMAを足し合わせる順番による浮動小数点差です。一方、2つのTII間の最大差80.0661は計算基準の違いそのもので、丸め誤差ではありません。
1,200本中1,116本で値が異なったため、「どちらもTIIだから同じシグナルになる」とは扱えません。別環境のTIIと比較するときは、期間だけでなく、各終値をどのMAから測っているかも確認してください。
使い方¶
- MQ5をMT5のデータフォルダー内の
MQL5/Indicatorsへ置き、MetaEditorでコンパイルします。 - 確認したい銘柄・時間足のチャートへ適用します。
- 金色の原典式と水色の旧実装型、20・50・80の位置を確認します。
- 初期設定では、原典式が20を上抜けた足に緑、80を下抜けた足に赤の矢印が出ます。
- 通知が必要な場合だけ、ポップアップまたはメールを有効にします。
注意点¶
- 今回の件数はEURUSD H1、確定1,200本、SMA 60、偏差30本での実測です。別の銘柄・時間足・期間では変わります
- 20上抜けと80下抜けは、原論文の80超・20未満によるトレンド追随ルールとは別です
- 形成中バーは値が変わるため、配布版の通知と矢印は確定足だけを使います
- メールの成否はMT5側の設定と通信環境に依存します。戻り値がfalseならエラー番号をログへ出します
- 指標の式が一致しても、そのシグナルに収益性があることまでは確認していません
- 配布版は注文、ポジション変更、DLL、WebRequest、ファイル出力を行いません
まとめ¶
TIIへ通知を付ける前に、どのTIIを見ているのかを固定する必要がありました。
現在のMAを直近30本へ共通して使う原典式と、各バー自身のMAを使う旧実装型は、同じ0〜100の線でも一致しません。今回のEURUSD H1では1,200本中1,116本で差がありました。
配布版は2本を隠さず重ね、FAI-FX記事が求めた20越え・80割れを確定足で一度だけ知らせます。矢印の方向を売買判断へ読み替える前に、式、境界をまたぐ向き、確定タイミングの3点をそろえてください。
あわせて読みたい記事¶
前後の記事¶
前: 【移植#74】再初期化しても同じ形か — 差分計算と全計算を500本照合
次: 【移植#76】H1の5分ずれを壊さず調べる — M1再集計でOHLCを照合