最終更新: 2026年06月
ATR(Average True Range:平均真の値幅)は、FXトレードにおける「相場のボラティリティ(価格変動の激しさ)」を数値化するテクニカルインジケーターです。
J・ウェルズ・ワイルダー(J. Welles Wilder Jr.)が1978年に著書『New Concepts in Technical Trading Systems』で発表したこの指標は、現在もEAの損切り設定・ポジションサイジング・トレンド強度フィルタリングに広く使われています。
「ATRって損切りに使うんでしょ」という認識は正しいのですが、ATRがなぜ損切り設定に有効なのか、その数理的な理由を理解している人は意外と少ない。本記事では計算式から始め、MT4/MT5での設定方法、EA設計での具体的な活用パターンまでを解説します。
ATR FX とは?計算式と直感的な意味
直接回答: ATRとは、ギャップ(前日終値と当日の高値・安値の差)を含む「真の値幅(トゥルーレンジ、True Range)」のN期間移動平均で、相場がどの程度動いているかを数値化するボラティリティ指標です。
免責事項: FX取引は元本割れリスクを伴う金融取引です。本記事はATRインジケーターの仕組みと活用法を解説することを目的としており、特定の取引手法の有効性を保証するものではありません。
True Range(トゥルーレンジ、TR)の計算
ATRの計算は2ステップです。まずTrue Range(トゥルーレンジ)を計算し、次にそのN期間平均がATRになります。
True Range = MAX(
高値 - 安値, // 当日の値幅
|高値 - 前日終値|, // 上方ギャップを含む値幅
|安値 - 前日終値| // 下方ギャップを含む値幅
)
3つの値の最大値がTRです。これにより、窓(ギャップ)を空けた翌日の値動きも正確に計測できます。通常の「高値 - 安値」だけでは前日比の急落・急騰を捉えられないという問題を、このMAX計算で解決しています。
ATRの計算式
ATR(n) = TRのn期間移動平均
ワイルダー本人はEMA(指数移動平均)の特殊形(スムーズ係数 = 1/n)を使っていましたが、MT4/MT5のデフォルトはWilderのスムーズEMAです(出典: J. Welles Wilder Jr., New Concepts in Technical Trading Systems, 1978)。
直感的な意味
ドル円のH1チャートでATR(14)が0.50(50pips相当)を示しているとします。これは「過去14本の1時間足で、平均して50pipsの値幅で動いた」ことを意味します。
この値を知ることで「今の相場は1時間で50pips動く環境にいる」という認識が得られます。損切りを20pipsに設定すると「平均的な1時間の動きの半分以下で損切りが発動する」ことがわかり、ノイズで引っかかるリスクの大きさが定量化できます。
MT4/MT5 での ATR 設定方法
直接回答: MT4/MT5でATRを表示するには「挿入」→「インジケーター」→「オシレーター」→「ATR」を選択し、期間(通常14)を設定します。
MT4 での ATR 追加手順
- チャートを開いた状態で、メニュー「挿入」→「インジケーター」→「オシレーター」→「ATR」を選択
- 期間(Period)に 14 を入力(デフォルト)
- 「OK」でサブウィンドウにATRが表示される
チャート下部のサブウィンドウに波形で表示されます。値が高い(上昇している)ほどボラティリティが高い状態、低い(下降または水平)ほど低ボラティリティ状態です。
期間設定の使い分け
| 期間 | 感度 | 向いているトレードスタイル |
|---|---|---|
| 5〜7 | 高(最近の値動きに敏感) | スキャルピング・短期デイトレード |
| 14(デフォルト) | 中 | スイングトレード・中期デイトレード |
| 20〜21 | 低(ノイズに強い) | スイングトレード・トレンドフォロー長期 |
筆者がM15のEAで検証したところ、ATR(7)を損切り設定に使った場合、ATR(14)より損切り発動頻度が高いものの、1回あたりの損失額は小さい傾向がありました。どちらが優れているかはEAの戦略ロジックに依存します。
EA への ATR 実装:損切り・利確への活用
直接回答: ATRベースの損切り(ストップ)は「固定pips損切りより相場環境に適応した損切り幅」を設定できます。基本形は「エントリー価格 ± ATR × 倍率(係数)」で、倍率は1.5〜2.0が一般的です(出典: OANDA Japan, ATRを活用した利益確定目標や損切りの幅を決めるトレードアイデア)。
Claudeと会話しながらインジケーターが作れる Hedgrow FX に「ATRの1.5倍で損切り、ATRの2倍で利確するEAを作りたい」と伝えると、以下のような実装が得られます。
ATRベース損切りの実装(MQL4コード例)
// ATRベースの動的損切り設定
double atrValue = iATR(NULL, 0, 14, 1); // 1本前の確定足のATR値
double stopLossMultiplier = 1.5; // ATRの1.5倍を損切り幅に設定
// 買いエントリーの場合
double stopLossPrice = Ask - atrValue * stopLossMultiplier;
double takeProfitPrice = Ask + atrValue * stopLossMultiplier * 2; // リスクリワード2:1
この実装により、ボラティリティが高い時期(ATRが大きい)は損切り幅が自動的に広がり、低ボラ時期には狭まります。固定pips損切りより市場環境への適応性が高い設計です。
損切り係数(倍率)の選択基準
ATRの何倍をストップ(損切り幅)にするかという倍率の選び方は、相場のボラティリティやトレードスタイルによって変わる。
| 係数(倍率) | 特性 | 向いているケース |
|---|---|---|
| × 1.0 | 損切りが狭い(ノイズでかかりやすい) | 低ボラ相場・スキャルピング |
| × 1.5 | バランス型(最も一般的) | 多くのスイングトレード戦略 |
| × 2.0 | 損切りが広い(ノイズに強い) | 高ボラ相場・トレンドフォロー |
| × 2.5以上 | ロット数を下げてリスク管理が必要 | 大きなスイング狙い |
ATR と他のインジケーターとの組み合わせ
直接回答: ATRはボラティリティ指標であり方向性を持たないため、トレンド系(移動平均線・ADX)やオシレーター(RSI・MACD)と組み合わせて「方向 + 動きの大きさ」の両方を判断するのが有効です。
ATR × ADX の組み合わせ
ADXがトレンドの強度を示し(ADX25以上でトレンドあり)、ATRがその動きの幅を示す組み合わせです。
エントリー条件(例):
ADX > 25(トレンドあり)
かつ +DI > -DI(上昇トレンド)
かつ ATR > ATR(14)の20本平均(十分な値幅がある)
損切り:
エントリー価格 - ATR × 1.5
利確:
エントリー価格 + ATR × 2.5
ATRをボラティリティフィルターに使う方法
ATRの水準を見て「今は動いている相場か、動いていない相場か」を判定するフィルターとして使う方法も実用的です。
// ATRが過去20本の平均より高い場合のみエントリーを許可(高ボラフィルター)
double currentATR = iATR(NULL, 0, 14, 1);
double avgATR = iATR(NULL, 0, 20, 1);
bool isHighVolatility = currentATR > avgATR * 1.2;
// 逆に低ボラ時のみエントリーを許可(レンジ戦略用)
bool isLowVolatility = currentATR < avgATR * 0.8;
ATR を使ったポジションサイジング(資金管理)
直接回答: ATRベースのポジションサイジングは「1回の最大許容損失額 ÷ (ATR × pips単価)」でロット数を計算し、相場のボラティリティに合わせたリスク管理ができます。
適正ロット数 = (口座残高 × リスク率) ÷ (ATR × pips単価 × 損切り係数)
計算例:
口座残高: 100万円
リスク率: 1%(1万円を1トレードの最大損失に設定)
ATR(14): 0.8(80pips)
損切り係数: 1.5倍
ドル円のpips単価(0.1ロット): 約100円
適正ロット数 = 10,000円 ÷ (80 × 100 × 1.5) = 0.083ロット ≈ 0.08ロット
この計算により、ボラティリティが高い時期は自動的にロット数が小さくなり、低ボラ時は大きくなります。固定ロットより一貫したリスク管理が実現できます。
ATRベース損切りのバックテスト検証と過剰適合の回避
損切り倍率をATRの何倍に設定するかは、勘や慣習だけで決めず、バックテストで検証しながら決めるのが望ましい。ここではMQL5でのロットサイジング込み実装、倍率最適化の手順、そしてカーブフィッティング(過剰適合)を避けるための設計原則を解説する。
MQL5でのポジションサイジング込み実装
input int ATRPeriod = 14;
input double SLMultiplier = 1.5; // 損切り倍率
input double RiskPercent = 1.0; // 資金に対するリスク割合(%)
int ATRHandle;
double ATRBuffer[];
double GetATR()
{
if(CopyBuffer(ATRHandle, 0, 0, 3, ATRBuffer) < 3) return 0.0;
return ATRBuffer[0];
}
// ===== ATRベースのポジションサイジング =====
double CalcLotSize(bool isBuy)
{
double atr = GetATR();
double slDistance = atr * SLMultiplier;
double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE);
double riskAmount = accountBalance * RiskPercent / 100.0;
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
double pipValue = tickValue / tickSize;
double slPips = slDistance / _Point;
double lotSize = riskAmount / (slPips * pipValue);
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
lotSize = MathRound(lotSize / lotStep) * lotStep;
lotSize = MathMax(minLot, MathMin(maxLot, lotSize));
return lotSize;
}
MT5ではハンドル方式のためOnDeinit()でIndicatorRelease(ATRHandle);を呼び、ハンドルを解放することを忘れないこと。
バックテストでのATR倍率最適化手順
Step 1: 最適化パラメーターの設定
| パラメーター | 開始 | ステップ | 終了 |
|---|---|---|---|
| SLMultiplier | 0.5 | 0.25 | 3.0 |
| TPMultiplier | 1.0 | 0.25 | 5.0 |
Step 2: 最適化実行とデータ分割
| 期間 | 用途 |
|---|---|
| 直近3年 | 最適化用インサンプル |
| 3〜5年前 | 第1バリデーション |
| 5〜7年前 | 第2バリデーション(アウトオブサンプル) |
Step 3: 評価指標の確認
| 指標 | 合格基準の目安 | 意味 |
|---|---|---|
| プロフィットファクター | 1.5以上 | 総利益÷総損失 |
| 勝率 | 40〜65% | ただし単独では意味をなさない |
| 最大ドローダウン | 20%以下 | 最大下落幅 |
| リカバリーファクター | 2.0以上 | 純利益÷最大ドローダウン |
| シャープレシオ | 0.5以上 | リスク調整後リターン |
プロフィットファクターだけに注目すると過剰最適化の罠にはまりやすい。複数指標を並べて「総合的にバランスが良い」倍率を選ぶことが重要だ。
過剰適合(カーブフィッティング)を避けるための設計原則
回避策1: ロバスト性の確認 — 最適値の前後±0.25のパラメーターでもバックテスト結果が大きく劣化しないことを確認する。
SL=1.25倍: PF=1.4
SL=1.50倍: PF=1.8(最適値)
SL=1.75倍: PF=1.6
このようにパラメーター周辺でなだらかな分布になっていれば、過剰最適化のリスクが低い。
回避策2: 複数通貨ペアでの検証 — 特定の通貨ペアだけで最適化したATR倍率は、その通貨ペアの過去の値動きに特化している可能性が高い。同じパラメーターを複数の通貨ペアで試し、安定して機能するかを確認する。
回避策3: 時間足を変えて検証 — 日足で最適化した倍率をH4に適用してみる。大きく劣化するようなら、倍率が時間足特有のノイズに過剰適合している可能性がある。
ATR損切りのよくある実装ミス
ミス1: エントリー時のATRではなく現在のATRを使う — 損切り価格をリアルタイムのATRで更新し続けると、損切りが予期せず動いてしまう。損切り価格はエントリー時に確定させるのが原則だ。
ミス2: ATRが0の場合の処理をしていない
double atr = GetATR();
if(atr <= 0.0)
{
Print("ATR取得エラー: エントリーをスキップ");
return;
}
ミス3: スプレッドをATR損切り幅に含めていない
double spread = SymbolInfoDouble(_Symbol, SYMBOL_ASK) -
SymbolInfoDouble(_Symbol, SYMBOL_BID);
double slDistance = atr * SLMultiplier + spread; // スプレッドを加算
実際の損切りトリガー価格にはスプレッドが加算される。これを無視すると、計算上の損切り幅より実際の損失が大きくなる場合がある。
免責事項: FX取引は元本割れリスクを伴う金融取引です。本記事はATRインジケーターの仕組みと活用法を解説することを目的としており、特定の取引手法の有効性を保証するものではありません。バックテスト結果は将来の運用成果を保証しません。取引判断はご自身の責任で行ってください。
あわせてATRとは何か(ボラティリティ指標の解説)も参照すると理解が深まる。
よくある質問(FAQ)
Q: ATR FX とは何ですか? A: ATR(Average True Range)はFXのボラティリティ(価格変動の激しさ)を数値化するテクニカルインジケーターです。損切り設定・ポジションサイジング・相場環境フィルタリングに使います。
Q: ATRは何を見ればいいですか?値が高いほどいいですか? A: ATRに「高い=良い」という評価はありません。ATRはボラティリティの現状把握に使います。戦略によって「高ボラが有利」か「低ボラが有利」かが変わります。
Q: ATRの期間14はなぜ標準なのですか? A: ワイルダーが1978年に著書で使用した期間をそのまま業界標準として採用しています。多くのトレーダーが同じ設定を見ているという自己実現的な側面もあります。
Q: ATRは通貨ペアによって単位が変わりますか? A: はい。ドル円のATR=0.50は50pips相当ですが、ユーロドルのATR=0.0050も50pips相当です。単位の違いを意識した上で解釈してください。
Q: ATRベースの損切りで損失が大きくなりすぎることはありますか? A: 高ボラ相場ではATRが拡大するため、損切りが広がりすぎる場合があります。最大損切り幅の上限(例:ATR × 2.0 または 100pips、いずれか小さい方)を設定する安全弁の実装を推奨します。
Q: MQL4/MQL5でATRの値を取得するコードを教えてください。
A: MT4なら double atr = iATR(NULL, 0, 14, 1);、MT5なら int atrHandle = iATR(_Symbol, _Period, 14); double atrBuffer[]; CopyBuffer(atrHandle, 0, 1, 1, atrBuffer); double atr = atrBuffer[0]; で取得できます。Claudeと会話しながらインジケーターが作れる Hedgrow FX でATR実装を依頼することも可能です。
Q: ATR損切りとトレーリングストップは組み合わせられますか? A: 組み合わせ可能です。エントリー時の損切りはATR×1.5倍で確定し、含み益が一定以上になったらATR×1.0倍のトレーリングストップに切り替えるという実装が一般的です。ただし複雑化するほど最適化パラメーターが増え、過剰適合のリスクが高まります。
Q: バックテストでの最適倍率とフォワードテストで乖離した場合はどうすべきですか? A: まず市場環境の変化を確認してください(バックテスト期間とフォワード期間のボラティリティ水準の違いなど)。乖離が大きい場合は、インサンプル期間を見直して再最適化するか、倍率を固定せずATRの相対的な水準(ATRの移動平均との比率)を使う適応的な設計に変更することを検討します。
Q: 損切りをATRだけで決めるのは危険ですか? A: ATR単体は最低限の損切り幅の目安を与えますが、サポート・レジスタンスラインや重要な価格水準を無視することになります。理想的には「ATR×倍率で計算した幅」と「直近の高値・安値から少し外側」の広い方を損切りに採用するハイブリッドアプローチが有効です。
Q: 高ボラティリティの指標発表時はATR損切りをどう扱いますか? A: 経済指標発表の直前にATRが急上昇し、損切り幅が一時的に過大になることがあります。指標発表前後の一定時間はエントリーを停止する「ニュースフィルター」をEAに組み込むことを推奨します。
著者情報: 金融工学専攻。アルゴリズム取引ファンド経験後、FXシステム開発・教育コンテンツ執筆に従事。
