1. MQL5の iATR とは何か
1.1 ATR(Average True Range)の基本
ATR(Average True Range)は、**価格の変動の大きさ(ボラティリティ)**を測定するテクニカル指標です。
ボラティリティとは「どれくらい価格が動いているか」を示す指標であり、トレンド方向ではなく値動きの強さを数値化します。
ATRは次のような用途でよく使われます。
- ストップロス(損切り幅)の決定
- 相場のボラティリティ判定
- ポジションサイズ調整
- ボラティリティフィルター
例えば、ATRが大きい場合は「値動きが大きい相場」であり、ATRが小さい場合は「値動きが小さい相場」と判断できます。
典型的なトレード例としては、次のようなロジックがあります。
- ATR × 2 をストップロスにする
- ATRが一定以上のときだけエントリーする
- ATRが小さいときはトレードを避ける
このようにATRは、リスク管理や相場環境の判断に使われることが多い指標です。
ただし、初心者がよく誤解する点があります。
注意点
- ATRはトレンド方向を示さない
- ATRは価格予測の指標ではない
- ATRはボラティリティのみを測定する
つまりATRが上昇しても「上昇トレンド」という意味ではなく、単に値動きが大きくなっているだけです。
1.2 MQL5の iATR 関数の役割
MQL5では、ATRを取得するために iATR 関数が用意されています。
iATR は、MetaTrader 5 に標準で搭載されている ATRインジケーターをプログラムから呼び出す関数です。
この関数の特徴は次の通りです。
- MT5標準ATRインジケーターを利用する
- 任意の通貨ペアと時間足に対応
- ATRの計算処理を自動で行う
- EAやカスタムインジケーターから使用可能
ただし、MQL5では少し重要な仕様があります。
iATR は ATRの数値を直接返しません。
代わりに返されるのは **インジケーターハンドル(indicator handle)**です。
ハンドルとは、簡単に言うと
「ATRインジケーターへの参照ID」
のようなものです。
実際のATR値は、このハンドルを使って CopyBuffer() 関数で取得します。
この仕組みはMQL4と大きく異なるため、多くの初心者がここで混乱します。
1.3 iATR を使う典型的な場面
iATR はEA(自動売買)やインジケーターで、次のような目的で使われます。
1. ATRベースのストップロス
例:
StopLoss = ATR × 2
ボラティリティが大きいとストップ幅を広くし、
小さいとストップ幅を狭くする設計です。
2. ボラティリティフィルター
ATRが小さい相場ではトレードしないロジックです。
例:
ATR > ある閾値ならエントリー
レンジ相場を避ける目的で使われます。
3. ブレイクアウト戦略
ATRが急激に増加したときは、
相場が動き始めた可能性があります。
そのため
- ATR増加 → トレンド発生
- ATR低下 → レンジ
という環境判定にも利用できます。
よくある失敗
初心者が特につまずくポイントを整理しておきます。
① ATRをトレンド指標だと思う
ATRは方向を示しません。
② iATR の戻り値をATR値だと思う
iATR は ハンドルを返す関数です。
ATR値は次の関数で取得します。
CopyBuffer()
③ ATRの時間足を間違える
例えば
- EAがM5で動いている
- ATRをH1で取得する
といった設計も可能です。
この場合、ATR値は大きく変わるため注意が必要です。
2. iATR 関数の基本構文
2.1 iATR の構文
MQL5でATR(Average True Range)を利用する場合、まず iATR 関数を使ってATRインジケーターのハンドルを作成します。
基本構文は次の通りです。
int iATR(
string symbol,
ENUM_TIMEFRAMES period,
int ma_period
);
この関数は ATRインジケーターのハンドル(識別ID) を返します。
ここで重要なのは、iATR は ATRの数値そのものを返さないという点です。
実際のATR値は、このハンドルを利用して CopyBuffer() 関数で取得します。
典型的な使用手順は次のようになります。
iATR()でインジケーターハンドルを作成CopyBuffer()でATRデータを取得- 配列からATR値を参照
EAの基本構造では、通常 OnInit() 内でハンドルを作成します。
例:
int atrHandle;
int OnInit()
{
atrHandle = iATR(_Symbol, PERIOD_CURRENT, 14);
return(INIT_SUCCEEDED);
}
このコードでは
- 通貨ペア:現在のチャート
- 時間足:現在の時間足
- ATR期間:14
という設定でATRを作成しています。
2.2 各パラメータの意味
iATR 関数には3つのパラメータがあります。
| パラメータ | 説明 |
|---|---|
| symbol | 対象となる通貨ペア |
| period | 時間足 |
| ma_period | ATRの計算期間 |
それぞれ詳しく見ていきます。
symbol
ATRを計算する通貨ペアを指定します。
よく使われる指定方法:
_Symbol
これは 現在のチャートの通貨ペアを意味します。
例:
iATR(_Symbol, PERIOD_CURRENT, 14);
別の通貨ペアを指定することも可能です。
iATR("EURUSD", PERIOD_H1, 14);
ただし、チャートと異なるシンボルを指定する場合は
ヒストリーデータが読み込まれている必要があります。
period
ATRを計算する時間足を指定します。
例:
PERIOD_M5
PERIOD_M15
PERIOD_H1
PERIOD_D1
現在のチャート時間足を使う場合は
PERIOD_CURRENT
を指定します。
注意点として、EAがM5で動いていても H1のATRを取得することは可能です。
ma_period
ATRの計算期間です。
一般的に使われる設定は次の通りです。
- 14(最も一般的)
- 20
- 10
例:
iATR(_Symbol, PERIOD_CURRENT, 14);
この場合は 14期間ATRになります。
2.3 戻り値(インジケーターハンドル)
iATR の戻り値は **ATRの値ではなくハンドル(整数値)**です。
int atrHandle;
このハンドルは、内部的には
ATRインジケーターのインスタンスID
のようなものです。
実際のATR値は次のように取得します。
double atr[];
CopyBuffer(atrHandle,0,0,1,atr);
配列 atr[0] に 最新ATR値が入ります。
よくある失敗
iATR 使用時に初心者がよく起こすミスをまとめます。
① ハンドルをATR値として使う
次のコードは間違いです。
double atr = iATR(_Symbol, PERIOD_CURRENT, 14);
iATR の戻り値は ATR値ではありません。
② CopyBufferを使わない
ATR値は 必ず CopyBuffer() を使って取得します。
③ ハンドル作成を毎Tick行う
次のようなコードはパフォーマンス低下の原因になります。
int atr = iATR(_Symbol, PERIOD_CURRENT, 14);
毎Tick実行するのではなく
- OnInit()で作成
- 使い回す
のが基本です。
④ ハンドル生成失敗の確認をしない
ハンドル生成に失敗することもあります。
安全なコード例:
atrHandle = iATR(_Symbol, PERIOD_CURRENT, 14);
if(atrHandle == INVALID_HANDLE)
{
Print("ATR handle creation failed");
}
3. iATR の基本的な使い方(サンプルコード)
3.1 ATRハンドルを作成する
MQL5でATRを利用する場合、最初に iATR 関数でインジケーターハンドルを作成します。
一般的な設計では、EAの初期化処理である OnInit() 内で作成します。
理由は次の通りです。
- 毎Tick作成すると処理が重くなる
- 同じインジケーターを何度も作る必要がない
- ハンドルは再利用できる
基本的なコードは次の通りです。
int atrHandle;
int OnInit()
{
atrHandle = iATR(_Symbol, PERIOD_CURRENT, 14);
if(atrHandle == INVALID_HANDLE)
{
Print("ATR handle creation failed");
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
このコードのポイントは以下です。
_Symbol
→ 現在のチャートの通貨ペアPERIOD_CURRENT
→ 現在のチャート時間足14
→ ATR期間
また、ハンドル生成失敗のチェックを必ず入れることが重要です。
失敗するケースはそれほど多くありませんが、例えば次のような状況で発生する可能性があります。
- データ不足
- 不正なパラメータ
- メモリ不足
そのため、INVALID_HANDLE のチェックを入れるのが安全です。
3.2 ATR値を取得する(CopyBuffer)
iATR で取得できるのは インジケーターハンドルだけです。
実際のATR値は CopyBuffer() を使って取得します。
基本コードは次の通りです。
double atr[];
CopyBuffer(atrHandle,0,0,1,atr);
CopyBuffer のパラメータは次の意味になります。
| パラメータ | 説明 |
|---|---|
| atrHandle | ATRインジケーターハンドル |
| 0 | バッファ番号(ATRは0) |
| 0 | 開始位置(最新バー) |
| 1 | 取得するデータ数 |
| atr | データ格納配列 |
このコードでは 最新ATR値を1つ取得しています。
ATR値は次のように参照できます。
double currentATR = atr[0];
3.3 ATR値を利用する例
取得したATR値は、EAの様々なロジックに利用できます。
例えば、ボラティリティが一定以上のときだけトレードする条件です。
double atr[];
if(CopyBuffer(atrHandle,0,0,1,atr) > 0)
{
double currentATR = atr[0];
if(currentATR > 0.0010)
{
Print("High volatility market");
}
}
このコードでは
- ATR取得
- ATR値判定
という処理を行っています。
もう1つの典型例は ATRベースのストップロスです。
double stopLossDistance = currentATR * 2;
このようにATRを使うことで、相場のボラティリティに応じた
動的なリスク管理が可能になります。
注意点(重要)
ATRを使用する際に、初心者がよくつまずくポイントがあります。
① CopyBufferの戻り値を確認しない
CopyBuffer は取得成功数を返します。
安全なコード:
if(CopyBuffer(atrHandle,0,0,1,atr) <= 0)
{
Print("ATR copy failed");
}
② 配列サイズの問題
配列は事前に宣言しておく必要があります。
double atr[];
③ ATR値の単位を誤解する
ATRは 価格差です。
例(EURUSD)
ATR = 0.0012
これは
12 pips
を意味します。
④ バー確定前の値を使う
start_pos = 0 の場合は 未確定バーです。
戦略によっては 1 を使う方が安全な場合もあります。
例:
CopyBuffer(atrHandle,0,1,1,atr);
4. ATR値の取得方法(CopyBufferの理解)
4.1 CopyBufferの基本構文
MQL5では、iATR のようなインジケーター関数は ハンドル(handle) を返します。
そのため、実際のインジケーターデータを取得するには CopyBuffer() 関数を使用します。
CopyBuffer は、インジケーター内部に保存されているデータを 配列へコピーする関数です。
基本構文は次の通りです。
CopyBuffer(
int indicator_handle,
int buffer_num,
int start_pos,
int count,
double buffer[]
);
各パラメータの意味は次の通りです。
| パラメータ | 説明 |
|---|---|
| indicator_handle | インジケーターハンドル |
| buffer_num | インジケーターバッファ番号 |
| start_pos | 取得開始位置 |
| count | 取得するデータ数 |
| buffer[] | データ格納配列 |
CopyBuffer は 取得したデータ数を戻り値として返します。
つまり、
CopyBuffer(...) > 0
であれば、データ取得成功と判断できます。
4.2 ATRで使うパラメータ
ATRインジケーターの場合、バッファ構造は非常にシンプルです。
| 設定項目 | 値 |
|---|---|
| buffer_num | 0 |
つまりATRの値は バッファ0 に格納されています。
最も一般的な使用例は次の通りです。
double atr[];
CopyBuffer(atrHandle,0,0,1,atr);
このコードの意味は以下になります。
- ATRハンドルから
- バッファ0を
- 最新バーから
- 1個取得
- 配列
atr[]に保存
4.3 最新ATR値の取得コード
実際にEAで使う場合は、次のような書き方が一般的です。
double atr[];
if(CopyBuffer(atrHandle,0,0,1,atr) > 0)
{
double currentATR = atr[0];
}
このコードでは次の処理が行われています。
- ATRデータを取得
- 取得成功を確認
- 最新ATR値を変数に保存
このとき配列の意味は次のようになります。
| 配列 | 意味 |
|---|---|
| atr[0] | 最新バー |
| atr[1] | 1本前のバー |
| atr[2] | 2本前のバー |
つまり複数取得することも可能です。
例:
double atr[3];
CopyBuffer(atrHandle,0,0,3,atr);
この場合は
- 現在
- 1本前
- 2本前
のATRが取得されます。
よくあるエラー
CopyBuffer() はMQL5で非常につまずきやすい部分です。
特に初心者が遭遇するエラーを整理しておきます。
① CopyBufferの戻り値を確認しない
データ取得が失敗するケースがあります。
例:
- インジケーターデータ未生成
- チャートデータ不足
- ハンドル無効
安全なコード:
double atr[];
if(CopyBuffer(atrHandle,0,0,1,atr) <= 0)
{
Print("CopyBuffer failed");
}
② array out of range エラー
配列サイズ不足で発生します。
例:
double atr[1];
CopyBuffer(atrHandle,0,0,5,atr);
この場合は 5個取得なのに配列が1個なのでエラーになります。
③ 最新バー問題
start_pos = 0 は 現在進行中のバーです。
EA設計によっては、未確定バーのATR値が問題になる場合があります。
その場合は
CopyBuffer(atrHandle,0,1,1,atr);
とすることで 確定バーのATRを取得できます。
④ 毎Tick大量取得
例えば次のようなコードです。
CopyBuffer(atrHandle,0,0,1000,atr);
毎Tick大量取得すると パフォーマンス低下の原因になります。
通常は 1〜3本程度で十分です。
5. ATRを使った実践トレードロジック
5.1 ATRを使ったストップロス計算
ATR(Average True Range)は、ボラティリティに応じてストップロス幅を調整するために非常によく使われます。
固定値のストップロス(例:20pips)では、相場の状況によっては狭すぎたり広すぎたりする問題があります。
そこでATRを使うことで、相場の変動幅に適応したストップロスを設定できます。
典型的なロジックは次の通りです。
StopLoss = ATR × 2
つまり
- ATRが大きい → ストップロスを広くする
- ATRが小さい → ストップロスを狭くする
という設計になります。
MQL5の例は次の通りです。
double atr[];
if(CopyBuffer(atrHandle,0,0,1,atr) > 0)
{
double currentATR = atr[0];
double stopLossDistance = currentATR * 2;
}
このようにATRを利用することで、市場環境に応じた柔軟なリスク管理が可能になります。
5.2 ATRボラティリティフィルター
ATRは **トレードするかどうかの判断(環境フィルター)**としても利用できます。
多くのトレード戦略では、次のような問題があります。
- ボラティリティが低い相場
- レンジ相場
- 値動きがほとんどない時間帯
このような状況では、トレードの期待値が下がるケースが多いです。
そこでATRを利用して ボラティリティが一定以上のときのみトレードする設計にします。
例:
double atr[];
if(CopyBuffer(atrHandle,0,0,1,atr) > 0)
{
double currentATR = atr[0];
if(currentATR > 0.0010)
{
Print("Volatility OK");
}
}
このようなフィルターを入れることで
- 無駄なトレード削減
- レンジ相場回避
といった効果が期待できます。
ただし、ATRの適切な閾値は
- 通貨ペア
- 時間足
- 市場環境
によって変わるため、バックテストで調整する必要があります。
5.3 ATRを使ったポジションサイズ調整
ATRは **ポジションサイズ計算(ロット調整)**にも使われます。
ボラティリティが大きい相場では
- ストップロスが広くなる
- 損失額が増える
可能性があります。
そのためATRを使って リスクを一定に保つポジションサイズ調整を行うことがあります。
基本的な考え方は次の通りです。
LotSize = Risk / ATR
例として
- ATR = 20 pips
- 許容リスク = 100ドル
の場合、ロットサイズをATRに応じて調整します。
簡単なイメージコード:
double atr[];
if(CopyBuffer(atrHandle,0,0,1,atr) > 0)
{
double currentATR = atr[0];
double lotSize = riskAmount / currentATR;
}
この方法は ボラティリティベースの資金管理として、多くのプロトレーダーが使用しています。
注意点(重要)
ATRをトレードロジックに組み込む場合、いくつか注意点があります。
① 通貨ペアによってATR値が違う
例えば
| 通貨ペア | ATR傾向 |
|---|---|
| EURUSD | 比較的小さい |
| GBPJPY | 非常に大きい |
そのため ATRの閾値は通貨ペアごとに調整する必要があります。
② 時間足でATRが大きく変わる
ATRは時間足に大きく依存します。
例:
| 時間足 | ATR |
|---|---|
| M5 | 小さい |
| H1 | 中程度 |
| D1 | 大きい |
そのため戦略に応じて 適切な時間足を選ぶ必要があります。
③ ATRは方向性を持たない
ATRが上昇していても
- 上昇トレンド
- 下降トレンド
どちらでも発生します。
ATRは ボラティリティのみを測定する指標です。
6. iATR 使用時の注意点
6.1 インジケーターハンドル管理
MQL5では、インジケーターは ハンドル(handle)方式で管理されます。
そのため iATR を使用する場合は、ハンドルのライフサイクル管理を適切に行う必要があります。
基本的な設計は次の通りです。
| 処理 | 場所 |
|---|---|
| ハンドル生成 | OnInit() |
| データ取得 | OnTick() |
| ハンドル解放 | OnDeinit() |
例:
int atrHandle;
int OnInit()
{
atrHandle = iATR(_Symbol, PERIOD_CURRENT, 14);
if(atrHandle == INVALID_HANDLE)
{
Print("ATR handle creation failed");
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
IndicatorRelease(atrHandle);
}
IndicatorRelease() を使用すると、不要になったインジケーターハンドルを解放できます。
ハンドル解放を行わなくてもMT5が自動処理する場合もありますが、明示的に解放する方が安全です。
特に
- 複数インジケーター
- マルチタイムフレーム
- 多数シンボル
などを扱うEAでは、ハンドル管理が重要になります。
6.2 CopyBufferの呼びすぎ問題
CopyBuffer() は便利ですが、毎Tick大量のデータを取得すると処理負荷が増加します。
例えば次のコードです。
double atr[1000];
CopyBuffer(atrHandle,0,0,1000,atr);
これを毎Tick実行すると、EAのパフォーマンスが低下する可能性があります。
一般的には以下の設計が推奨されます。
- 最新ATRのみ取得
- 必要な本数だけ取得
例:
double atr[];
CopyBuffer(atrHandle,0,0,1,atr);
また、バー更新時のみ処理する設計も有効です。
例えば
- 新バー判定
- ATR更新
という構造にすることで、無駄な計算を減らせます。
6.3 マルチタイムフレーム使用
MQL5では、EAが動作している時間足とは 異なる時間足のATRを取得することが可能です。
例:
iATR(_Symbol, PERIOD_H1, 14);
この場合
- EAはM5で動作
- ATRはH1
という設計になります。
マルチタイムフレーム分析ではよく使われる方法です。
例えば
| 用途 | 時間足 |
|---|---|
| エントリー | M5 |
| トレンド判断 | H1 |
| ATR | H1 |
のような設計も可能です。
ただし、次の点に注意してください。
つまずきポイント
① ATR時間足を間違える
例:
- EA = M5
- ATR = D1
この場合、ATR値が非常に大きくなります。
② シンボル指定ミス
次のようなコード
iATR("EURUSD", PERIOD_H1, 14);
では、チャートが別通貨ペアの場合でも
EURUSDのATRが取得されます。
③ ヒストリーデータ不足
別時間足や別シンボルを使用する場合、
ヒストリーデータが不足していると
CopyBuffer失敗- ATR取得不可
になる場合があります。
④ ハンドル作成を毎Tick行う
これは初心者が非常によくやるミスです。
悪い例:
int atrHandle = iATR(_Symbol, PERIOD_CURRENT, 14);
このコードを毎Tick実行すると
- 不要なインジケーター作成
- パフォーマンス低下
につながります。
必ず OnInit()で作成してください。
7. iATR と MT4(MQL4)との違い
7.1 MT4の iATR の仕様
MetaTrader 4(MQL4)にも iATR 関数がありますが、MQL5とは仕様が大きく異なります。
MT4では iATR を呼び出すと、直接ATR値を取得できます。
基本構文は次の通りです。
double iATR(
string symbol,
int timeframe,
int period,
int shift
);
例:
double atr = iATR(Symbol(), PERIOD_CURRENT, 14, 0);
このコードでは
- ATR期間:14
- 最新バー:shift = 0
のATR値が 直接 double 型で返されます。
つまりMT4では
CopyBuffer- インジケーターハンドル
といった概念はありません。
この仕様のため、MT4は インジケーターデータ取得が非常にシンプルです。
7.2 MT5(MQL5)の違い
MetaTrader 5では、インジケーター処理が ハンドル方式に変更されています。
そのため iATR の戻り値は ATR値ではなくインジケーターハンドルです。
MT5の基本手順は次のようになります。
① インジケーターハンドル作成
int atrHandle = iATR(_Symbol, PERIOD_CURRENT, 14);
② CopyBufferでデータ取得
double atr[];
CopyBuffer(atrHandle,0,0,1,atr);
③ ATR値取得
double currentATR = atr[0];
この設計は一見複雑に見えますが、次のようなメリットがあります。
| メリット | 内容 |
|---|---|
| 高速処理 | インジケーターを再計算しない |
| 複数取得 | 大量データ取得が可能 |
| 共有 | 同じインジケーターを再利用できる |
つまりMT5は パフォーマンスを重視した設計になっています。
7.3 MT4コードをMT5へ移植する際の注意点
MT4からMT5へEAを移植する際、iATR は 最もよく問題になる部分の1つです。
典型的な間違いは次のコードです。
MT4コード:
double atr = iATR(Symbol(), PERIOD_CURRENT, 14, 0);
このコードをそのままMT5で書くと コンパイルエラーになります。
MT5では次のように書き直す必要があります。
int atrHandle = iATR(_Symbol, PERIOD_CURRENT, 14);
double atr[];
CopyBuffer(atrHandle,0,0,1,atr);
double currentATR = atr[0];
つまりMT5では
- ハンドル作成
- データコピー
という 2段階処理が必要です。
よくある移植ミス
MT4からMT5へ移植する際、特によく発生する問題をまとめます。
① shift パラメータが消えている
MT4では
shift
が存在しましたが、MT5では CopyBufferの start_pos で指定します。
例:
| MT4 | MT5 |
|---|---|
| shift=0 | start_pos=0 |
| shift=1 | start_pos=1 |
② ATR値を直接取得しようとする
次のコードはMT5では間違いです。
double atr = iATR(_Symbol, PERIOD_CURRENT, 14);
③ CopyBufferを使わない
MT5では 必ず CopyBuffer を使って値を取得します。
④ ハンドルを毎Tick作成
移植時によくある問題です。
正しい設計:
- OnInit() → ハンドル作成
- OnTick() → CopyBuffer
MT4経験者ほど、この違いに最初は戸惑いますが、
慣れると MT5の方が柔軟な設計が可能です。
8. iATR の応用(EA設計)
8.1 ATRトレーリングストップ
ATRは **トレーリングストップ(Trailing Stop)**の設計にもよく使われます。
トレーリングストップとは、価格が有利に動いたときに ストップロスを自動的に追従させる仕組みです。
固定値トレーリングの場合は
TrailingStop = 20 pips
のように一定値になります。
しかし相場のボラティリティは常に変化するため、固定値トレーリングには次の問題があります。
- ボラティリティが大きい → ストップが狭すぎる
- ボラティリティが小さい → ストップが広すぎる
そこでATRを使うことで、市場環境に適応したトレーリングストップが実装できます。
典型的なロジックは次の通りです。
TrailingStop = ATR × 2
MQL5の簡単な例:
double atr[];
if(CopyBuffer(atrHandle,0,0,1,atr) > 0)
{
double currentATR = atr[0];
double trailingDistance = currentATR * 2;
}
このようにATRベースのトレーリングを使うことで
- 相場が荒い → ストップを広げる
- 相場が静か → ストップを狭める
という 適応型リスク管理が可能になります。
8.2 ATRブレイクアウト戦略
ATRは **相場のエネルギー(ボラティリティ)**を測定する指標です。
そのため、ATRの増加を利用して ブレイクアウト戦略を構築することもできます。
例えば次のようなロジックです。
ATRが一定値以上に増加 → トレンド発生の可能性
簡単な判定例:
double atr[];
if(CopyBuffer(atrHandle,0,0,1,atr) > 0)
{
double currentATR = atr[0];
if(currentATR > atrThreshold)
{
Print("Breakout volatility detected");
}
}
このような条件を追加すると
- レンジ相場を回避
- トレンド発生時のみトレード
といったフィルタリングが可能になります。
ただしATR単体では方向が分からないため、通常は
- 移動平均
- 高値更新
- モメンタム指標
などと組み合わせて使います。
8.3 ATRボラティリティスイッチ
ATRは トレードON / OFFのスイッチとしても使われます。
例えば次のような戦略があります。
ATRが小さい → トレード停止
ATRが大きい → トレード開始
これは特に
- スキャルピングEA
- ブレイクアウトEA
でよく使われます。
実装例:
double atr[];
if(CopyBuffer(atrHandle,0,0,1,atr) > 0)
{
double currentATR = atr[0];
if(currentATR < minATR)
{
Print("Market too quiet, trading disabled");
return;
}
}
このような設計にすることで
- ノイズ相場回避
- トレード品質向上
につながる可能性があります。
ただしATRの閾値は
- 通貨ペア
- 時間足
- 市場環境
によって大きく変わるため、バックテストやフォワードテストで調整することが重要です。
応用設計での注意点
ATRをEA設計で使う場合、次のポイントに注意してください。
① ATRは方向を持たない
ATRが増加しても
- 上昇トレンド
- 下降トレンド
のどちらでも発生します。
そのため トレンド判定には別指標が必要です。
② ATRは通貨ペア依存
例:
| 通貨ペア | ATR特徴 |
|---|---|
| EURUSD | 比較的小さい |
| GBPJPY | 非常に大きい |
そのため 固定閾値は通貨ペアごとに調整する必要があります。
③ ATRは時間足依存
時間足が変わるとATR値も大きく変わります。
| 時間足 | ATR |
|---|---|
| M5 | 小さい |
| H1 | 中程度 |
| D1 | 大きい |
EA設計では どの時間足のATRを使うかを明確にする必要があります。
FAQ
Q1. iATR はATRの値を直接返しますか?
いいえ。
iATR が返すのは **ATR値ではなくインジケーターハンドル(indicator handle)**です。
ATRの実際の値を取得するには、次の手順が必要です。
iATR()でハンドル作成CopyBuffer()でデータ取得
例:
int atrHandle = iATR(_Symbol, PERIOD_CURRENT, 14);
double atr[];
CopyBuffer(atrHandle,0,0,1,atr);
double currentATR = atr[0];
Q2. ATRの値はどの関数で取得しますか?
ATRの値は CopyBuffer() 関数で取得します。
例:
double atr[];
CopyBuffer(atrHandle,0,0,1,atr);
この場合
atr[0]
が最新のATR値になります。
Q3. ATRのおすすめ期間は?
一般的には 14期間が最もよく使われます。
これはATRの開発者である J. Welles Wilder が提案した設定です。
ただし実際のトレードでは、戦略によって調整されます。
例:
| 期間 | 用途 |
|---|---|
| 10 | 短期トレード |
| 14 | 標準設定 |
| 20〜30 | 長期トレード |
最適な設定は バックテストやフォワードテストで検証する必要があります。
Q4. ATRはトレンド指標ですか?
いいえ。
ATRは ボラティリティ指標です。
つまりATRは
- 価格変動の大きさ
- 相場の活発さ
を測定するものであり、上昇・下降の方向は示しません。
そのため実際のEAでは、次の指標と組み合わせることが多いです。
- 移動平均(MA)
- RSI
- MACD
- ブレイクアウト条件
Q5. CopyBuffer が失敗する原因は何ですか?
CopyBuffer() が失敗する主な原因は次の通りです。
| 原因 | 内容 |
|---|---|
| ハンドル無効 | INVALID_HANDLE |
| ヒストリーデータ不足 | チャートデータ未取得 |
| 配列サイズ不足 | array out of range |
| インジケーター未計算 | 初期化直後など |
安全なコード例:
double atr[];
if(CopyBuffer(atrHandle,0,0,1,atr) <= 0)
{
Print("ATR copy failed");
}
Q6. ATRはどの時間足を使うべきですか?
ATRの時間足は トレード戦略によって異なります。
例:
| 用途 | ATR時間足 |
|---|---|
| スキャルピング | M5 / M15 |
| デイトレード | H1 |
| スイングトレード | H4 / D1 |
EA設計では、次のような構造もよく使われます。
| 処理 | 時間足 |
|---|---|
| エントリー | M5 |
| ATR | H1 |
Q7. iATR と iCustom の違いは?
iATR は MT5標準インジケーターを呼び出す関数です。
一方 iCustom は ユーザー作成インジケーターを呼び出す関数です。
比較:
| 関数 | 用途 |
|---|---|
| iATR | 標準ATR |
| iMA | 移動平均 |
| iRSI | RSI |
| iCustom | カスタムインジケーター |
つまり
- 標準指標 →
iATR - 自作指標 →
iCustom
になります。
Q8. ATRをEAで使うメリットは何ですか?
ATRを使う最大のメリットは ボラティリティ適応型トレードです。
具体的には次の用途があります。
- ATRストップロス
- ATRトレーリングストップ
- ボラティリティフィルター
- ポジションサイズ調整
これにより
- 相場環境に適応
- リスク管理向上
といった効果が期待できます。
ただしATRは 方向を示さない指標なので、
通常は トレンド指標と組み合わせて使用します。