最終更新: 2026年6月
ATR(Average True Range)は、相場のボラティリティ——つまり「価格がどれくらい動きやすいか」——を定量的に示すインジケーターだ。方向性は一切持たず、純粋に値動きの大きさだけを測定する。
なぜATRがEA開発者にとって重要なのか。ひとことで言うと、「損切り幅をマーケットの実態に合わせて動的に決定できる」からだ。固定pipsの損切りでは、ボラティリティが低い局面では過剰なリスクを、高い局面では狭すぎる損切りを設定してしまうことになる。ATRを使えば、この問題を原理的に解決できる。
Claudeと会話しながらインジケータが作れるhedgrow.ioはこちら
ATRの計算式——True Rangeから始まる3ステップ
ATRの計算は「True Range(TR)」の算出から始まる。
True Rangeの算出(3つの候補の最大値)
| 候補 | 計算式 | 意味 |
|---|---|---|
| TR1 | 当日高値 − 当日安値 | 通常の値幅 |
| TR2 | |当日高値 − 前日終値| | ギャップアップの場合に大きくなる |
| TR3 | |当日安値 − 前日終値| | ギャップダウンの場合に大きくなる |
True Range = max(TR1, TR2, TR3)
なぜ前日終値との差分を含むのか。通常の高値−安値だけでは、ギャップ(窓開け)で発生したボラティリティを捉えられないためだ。例えば、前日終値が100円で当日の値動きが99〜99.5円の範囲に収まっていても、ギャップダウン分の1円を無視すると実態と乖離した小さな値幅しか計算されない。
ATRの計算
ATR = TRのn期間移動平均
デフォルト期間はn=14。ワイルダーが最適とした数値であり、MT4/MT5の両プラットフォームで標準設定されている。
具体的な計算例(5日間):
Day1 TR = 0.75、Day2 TR = 0.50、Day3 TR = 0.60、Day4 TR = 0.50、Day5 TR = 0.60
ATR(5) = (0.75 + 0.50 + 0.60 + 0.50 + 0.60) ÷ 5 = 0.59
実際にはRMA(Wilder's Moving Average)を使って指数的に平滑化されるが、本質的な意味は「過去N本のローソク足が平均的にどれくらい動いたか」だ。
MQL5でのiATR実装コード
MQL5でATRを取得する実装は、ADXなどと同じハンドル方式になる。
input int ATRPeriod = 14; // ATR計算期間
input double ATRMultiplier = 1.5; // 損切り倍率
int ATRHandle;
double ATRBuffer[];
int OnInit()
{
ATRHandle = iATR(_Symbol, _Period, ATRPeriod);
if(ATRHandle == INVALID_HANDLE)
{
Print("ATRハンドル取得失敗");
return INIT_FAILED;
}
ArraySetAsSeries(ATRBuffer, true);
return INIT_SUCCEEDED;
}
// ATR値の取得関数
double GetATRValue()
{
if(CopyBuffer(ATRHandle, 0, 0, 3, ATRBuffer) < 3)
return 0.0;
return NormalizeDouble(ATRBuffer[0], _Digits);
}
// ATRベースの損切り幅を計算
double GetStopLossPips()
{
double atr = GetATRValue();
return atr * ATRMultiplier / _Point; // pips換算
}
void OnDeinit(const int reason)
{
IndicatorRelease(ATRHandle); // ハンドルの解放を忘れずに
}
MQL4ではiATR(_Symbol, _Period, ATRPeriod, 0)と直接値が返ってくる設計だが、MQL5ではハンドル管理が必要になる。OnDeinit()でIndicatorRelease()を呼ぶのが重要で、これを忘れるとメモリリークの原因になる。
ATRの4つの主要活用パターン
1. 動的損切り設定(最重要用途)
損切り幅 = エントリー価格 ± (ATR × 倍率)
倍率の目安:
- スキャルピング(1〜5分足): 0.5〜1.0倍
- デイトレード(15分〜1時間足): 1.0〜1.5倍
- スイングトレード(日足以上): 1.5〜3.0倍
筆者の検証では、1.5倍程度の損切りを使うと、ランダムなノイズによる損切り(いわゆる「狩り」)の頻度が有意に減少する傾向があった。ただし、これは通貨ペアと時間足によって最適値が変わる。自分の戦略で必ずバックテストして確認してほしい。
2. ボラティリティフィルター
// ATRが閾値以上の場合のみエントリー(ボラティリティが低すぎる局面を除外)
double atrThreshold = 0.0010; // 10pips相当(USDJPYなら適切に調整)
if(GetATRValue() >= atrThreshold)
{
// エントリーロジック
}
レンジ相場では損切りを何度も刈られやすい。ATRが一定値を下回る局面ではエントリーを見送ることで、レンジ内でのダマシを大幅に削減できる。
3. ポジションサイジング
ロット数 = リスク許容額(円) ÷ (ATR × 倍率 × 通貨換算係数)
例: 資金100万円でリスク1%(1万円)、ATR=50pips、倍率1.5、換算係数=1000円/pip(USDJPY1ロット)の場合: ロット数 = 10,000 ÷ (50 × 1.5 × 1,000) = 0.13ロット
ボラティリティが高い局面では自動的にポジションサイズが縮小され、リスクが一定に保たれる。
4. トレーリングストップへの応用
// 含み益がATRの2倍を超えたらトレーリング開始
double trailStart = GetATRValue() * 2.0;
double trailStep = GetATRValue() * 1.0;
if(currentProfit > trailStart)
{
// トレーリングストップをtrailStep刻みで更新
}
固定pipsのトレーリングストップではボラティリティの変化に対応できないが、ATRベースにすることで相場環境に適応したエグジット管理が実現できる。
ATRの数値を正しく読む方法
ATRはその値単体よりも「文脈」で読むことが重要だ。
ATRが上昇している局面: ボラティリティが拡大中。ブレイクアウトや強いトレンド発生の可能性がある。損切り幅を広めに設定することを検討。
ATRが横ばいの局面: ボラティリティが安定した状態。現在のトレンドが継続しているか、レンジが続いているか。
ATRが低下している局面: ボラティリティが縮小中。大きな動きの前の「静けさ」である可能性もある。コイルが圧縮されているイメージで、次の大きな動きへの準備期間と解釈することもできる。
重要なのは、ATR単体では「次に上がるのか下がるのか」は全く分からない点だ。方向性の判断には他のインジケーターとの組み合わせが必須になる。
期間設定のガイドライン
| トレードスタイル | 推奨ATR期間 | 主な時間足 |
|---|---|---|
| スキャルピング | 7〜10 | M1〜M5 |
| デイトレード | 14(標準) | M15〜H1 |
| スイング | 20〜25 | H4〜D1 |
| ポジション | 50 | W1〜MN |
短い期間を使うと直近の価格変動に敏感に反応し、損切り幅が頻繁に変化する。長い期間は平滑化効果が強くなり、損切り幅の変動が緩やかになる。
スキャルピングEAにおけるATR期間設計(M1/M5足)
「ATRはデフォルトの14期間を使えばよい」という常識は、スキャルピングには当てはまらないケースが多い。ATR(14)が参照する時間範囲を時間足ごとに確認してみる。
| 時間足 | ATR(14)が参照する時間範囲 |
|---|---|
| M1 | 過去14分 |
| M5 | 過去70分(約1時間10分) |
| M15 | 過去210分(3.5時間) |
| H1 | 過去14時間 |
| H4 | 過去2.3日 |
| D1 | 過去14日(約2週間) |
M5足のスキャルピングEAの場合、ATR(14)は「過去70分の平均的な値動き」を損切り幅の基準にしていることになる。スキャルピングでは1トレードの保有時間が5〜30分程度であることが多いため、70分前のボラティリティを参照するのは相場環境の変化に遅れた損切り設定になる可能性がある。
短期・中間期間の特徴
短い期間(5〜7): 直近のボラティリティ変化に即時対応できる一方、ATR値が不安定で損切りラインが頻繁に変動する。単発の大きなローソク足(ニュース発表時など)でATRが急上昇し、次の数本で損切りが過大になることもある。
中間期間(10〜12): スキャルピングとデイトレードの中間。M5足での使用では過去50〜60分のボラティリティを参照し、急激なノイズへの過剰反応と長期参照による遅延の両方をある程度バランスできる。
推奨アプローチ:短期・長期ATRの比率を使う
input int ATRPeriodShort = 7; // 短期ATR(直近ボラティリティ)
input int ATRPeriodLong = 14; // 長期ATR(参照基準)
int ATRHandleShort, ATRHandleLong;
double ATRBufferShort[], ATRBufferLong[];
// ボラティリティ比率の取得
double GetVolatilityRatio()
{
if(CopyBuffer(ATRHandleShort, 0, 0, 3, ATRBufferShort) < 3) return 1.0;
if(CopyBuffer(ATRHandleLong, 0, 0, 3, ATRBufferLong) < 3) return 1.0;
double shortATR = ATRBufferShort[0];
double longATR = ATRBufferLong[0];
if(longATR <= 0.0) return 1.0;
return shortATR / longATR; // 1.0が通常、>1.5で高ボラ、<0.5で低ボラ
}
短期ATRと長期ATRの比率(VolatilityRatio)を計算することで、「現在のボラティリティが通常より高いか低いか」をリアルタイムに判定できる。この比率をもとに、適応型損切り(高ボラ時は倍率を小さく、低ボラ時は倍率を大きく)やセッションフィルター(最低・最高ボラティリティの範囲内でのみエントリー許可)を設計できる。
スプレッドとATRの比率チェックも実用上重要だ。スプレッドがATRの20%を超える局面ではスキャルピングの優位性が著しく低下するため、spread / atr < 0.20 のようなガード条件を入れておくとよい。
ATR期間別バックテスト比較の進め方
M5足スキャルピングEAでATR期間を変えた場合の検証設計:
| テスト | ATR期間 | 損切り倍率 | 評価指標 |
|---|---|---|---|
| Test1 | 5 | 1.0倍 | PF、DD、シャープ比 |
| Test2 | 7 | 1.0倍 | 同上 |
| Test3 | 10 | 1.0倍 | 同上 |
| Test4 | 14 | 1.0倍 | 同上 |
まず損切り倍率を1.0倍に固定してATR期間だけを変え、純粋な参照ウィンドウの影響を見る。次に最良の期間を固定して倍率を最適化するという二段階設計が、過剰最適化リスクを低減しやすい。一般的な傾向として、M5足ではATR(7〜10)が、H1足ではATR(14〜20)が損切り設定の参照として機能しやすいことが複数のEA開発者のレポートで指摘されている。ただしこれは統計的傾向であり、全ての戦略に当てはまるわけではない。
バックテストとリアル運用でATRベース損切りの効果が乖離する主な原因は、スプレッド変動(リアルでは流動性の低い時間帯にスプレッドが拡大する)・スリッページ(急激な価格変動時にSL注文が意図した価格で執行されない)・データ品質(ブローカーのヒストリカルデータの精度)の3点だ。
Claudeと会話しながらインジケータが作れるhedgrow.ioはこちら
ATRと他インジケーターの組み合わせ
ATRだけではエントリーシグナルを生成できない。組み合わせのパターンをいくつか示す。
ATR + ADX: ADXでトレンドの強さを確認し、ATRで損切り幅を設定。最も一般的な組み合わせ。
ATR + ボリンジャーバンド: バンド幅がATRに連動して変化するため、スクイーズ(収縮)とエクスパンション(拡大)を複合的に分析できる。
ATR + SuperTrend: SuperTrendの計算にATRが内包されているため、ATRパラメータを通じてSuperTrendのバンド幅を制御できる。
関連して、ボリンジャーバンドEAのスクイーズ・エクスパンション判定やATR FXとは(計算式・MT4/MT5設定)も参考にすると理解が深まる。
よくある質問(FAQ)
Q: ATRはpipsで表示されますか?
A: MT4/MT5のATR値はポイント単位(基本通貨の最小単位)で表示されます。USDJPY(5桁表示)の場合、ATR=0.500なら50pipsに相当します。EAで計算する際は_Pointで割る換算が必要です。
Q: ATRが0になることはありますか?
A: 理論上は価格が全く動かない場合に0になりますが、FX市場では実際には発生しません。ただし、週末のデータが混入している場合や、流動性が極端に低い時間帯では異常値になることがあります。EAではif(atr <= 0) return;のようなガード処理を入れることを推奨します。
Q: ATR倍率の最適値はどうやって決めますか? A: バックテストで倍率0.5〜3.0をステップ0.1刻みで最適化し、プロフィットファクターと最大ドローダウンのバランスで決定します。ただし1つの期間だけで最適化すると過剰適合のリスクがあるため、複数期間でのアウトオブサンプルテストを行うことが重要です。
Q: ATRとボラティリティの関係を数式で教えてください。 A: ATRは実現ボラティリティの近似値です。年率換算ボラティリティ≈ATR(日足) × √252 / 現在価格という近似式があります。ただしATRは標準偏差ベースの統計的ボラティリティとは異なる概念なので、オプション取引のIVとは別物として扱ってください。
Q: M1足スキャルピングEAには何期間のATRが適していますか? A: M1足では5〜7期間が一般的に試されますが、M1足のATRは個別ティックのノイズに非常に敏感です。M1足スキャルピングでは固定pips損切りとATRベース損切りを比較検証して、自分の戦略に合う方を選ぶことを推奨します。
Q: ATR期間を短くしすぎると何が起きますか? A: ATR(3)程度まで短くすると、単一の大きなローソク足(ニュース発表時など)が次の数本で損切り幅を大きく引き上げてしまい、損切り設定が不安定になります。最低でもATR(5)以上を推奨します。
Q: リアルタイムでATR期間を自動切り替えするEAは設計できますか? A: 技術的には可能です。VolatilityRatioやセッション時間帯に基づいてATR期間を動的に変更する設計も実装できます。ただし複雑さが増すほど最適化パラメーターが増え、過剰適合リスクが高まります。シンプルな設計から始めることを推奨します。
Q: ATRはMT5の標準インジケーターとして使えますか? A: はい。MT4/MT5両方で標準搭載されています。チャート上の「インジケーター」→「オシレーター」→「Average True Range」から追加できます。
著者情報
本記事は金融工学・アルゴリズム取引の実務経験を持つライターが執筆しています。
免責事項: 本記事はFXの教育・情報提供を目的としており、投資勧誘を行うものではありません。FX取引には元本割れリスクがあります。実際の取引は自己責任で行ってください。バックテスト結果は将来の運用成果を保証しません。
