1. iAMA関数の概要と実務での活用法
iAMAは、カウフマンの適応型移動平均(Kaufman’s Adaptive Moving Average)の値を算出するための関数です。一般的な移動平均線(MA)との最大の違いは、「市場のボラティリティ(変動率)に応じて、計算期間を自動的に調整する」という点にあります。
市場が一方向に強く動いている(トレンドが出ている)時は期間が短くなり価格に敏感に反応し、逆にレンジ相場でノイズが多い時は期間が長くなり反応を鈍らせます。
実務での活用法とつまずきポイント:
実務では、トレンドの押し目買い・戻り売りにおいて「今がノイズなのか、本物の反転なのか」を判断するフィルターとして非常に優秀です。
初心者がつまずきやすいのは、MQL5の仕様上、「関数を呼び出した瞬間に計算値が得られるわけではない」という点です。iAMAが返すのは「インジケーターのハンドル(識別番号)」であり、実際の数値を取得するにはCopyBuffer関数を介する必要があることを理解するのが第一歩となります。
2. 構文と戻り値
MQL5におけるiAMA関数の定義は以下の通りです。
int iAMA(
string symbol, // 通貨ペア名(NULLで現在のチャート)
ENUM_TIMEFRAMES period, // 時間軸(0で現在の時間軸)
int ama_period, // 平均化の期間(Efficiency Ratioの計算用)
int fast_ema_period, // 高速EMAの期間
int slow_ema_period, // 低速EMAの期間
int ama_shift, // 指標の横ずらし(通常は0)
ENUM_APPLIED_PRICE applied_price // 適用価格(PRICE_CLOSEなど)
);
戻り値:
– 成功した場合:インジケーターの「ハンドル」と呼ばれる整数(int)を返します。
– 失敗した場合:INVALID_HANDLE を返します。
このハンドルを使って、後述するCopyBuffer関数で実際の価格データを配列に格納します。
3. 具体的な使い方・実践サンプルコード
以下は、iAMAを使用して現在の値を取得し、簡単なエントリー判断を行うEAのスケルトンコードです。
//+------------------------------------------------------------------+
//| SampleAMA_Expert.mq5|
//+------------------------------------------------------------------+
#property strict
// 変数の宣言
int handleAMA; // AMAのハンドルを格納
double bufferAMA[]; // AMAの値を格納する動的配列
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 1. iAMAのハンドルを取得(期間9、高速2、低速30が一般的)
handleAMA = iAMA(_Symbol, _Period, 9, 2, 30, 0, PRICE_CLOSE);
// ハンドル取得に失敗した場合の処理
if(handleAMA == INVALID_HANDLE)
{
Print("AMAハンドルの取得に失敗しました。");
return(INIT_FAILED);
}
// 配列を時系列順(最新がインデックス0)にセット
ArraySetAsSeries(bufferAMA, true);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 2. 最新のAMAデータを配列にコピー(最新から2個分)
if(CopyBuffer(handleAMA, 0, 0, 2, bufferAMA) < 0)
{
Print("データコピー失敗。エラーコード:", GetLastError());
return;
}
// 3. 値の取得
double currentAMA = bufferAMA[0]; // 最新のAMA値
double prevAMA = bufferAMA[1]; // 1本前のAMA値
double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
// 実践的なロジック例:価格がAMAを上抜け、かつAMA自体が上昇していれば買い
if(currentPrice > currentAMA && currentAMA > prevAMA)
{
// ここにオーダー処理を記述
Comment("上昇トレンド:AMAの上側で推移中");
}
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 4. 使用したハンドルを解放(メモリ管理)
IndicatorRelease(handleAMA);
}
4. 使用上の注意点とよくあるエラー
-
ハンドルの重複生成を避ける:
iAMA(および他のインジケーター関数)は、必ずOnInit内で一度だけ呼び出すようにしてください。OnTick内で毎回呼び出すと、PCのメモリを急激に消費し、ターミナルがクラッシュする原因になります。 -
計算に必要なバーの数:
AMAは過去の価格変動を複雑に計算するため、十分なヒストリーデータがないと正しい値(EMPTY_VALUE)を返しません。バックテスト開始直後や、起動直後に値が取得できない場合は、BarsCalculated関数で計算が完了しているか確認する処理を入れるのがプロの作法です。 -
計算期間のバランス:
ama_periodに対してfast_emaとslow_emaの設定値が極端だと、AMAの「適応性」というメリットが失われます。まずはデフォルト値(9, 2, 30)から始め、最適化を行うことを推奨します。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、iAMAのような高機能なインジケーターを用いて精緻なロジックを組んでも、実行環境が貧弱であればすべてが無に帰します。特に、自宅のPCから一般的なインターネット回線を通じて注文を出す場合、物理的な距離に起因するネットワーク遅延(レイテンシ)は避けられません。相場が急変し、AMAが鋭く反応した瞬間にエントリーシグナルが出たとしても、その注文が証券会社のサーバーに届くまでに数ミリ秒〜数百ミリ秒の遅延が発生すれば、本来の約定価格から滑る「スリッページ」や、約定拒否(リクオート)を招きます。
プロのクオンツや専業トレーダーにとって、低遅延なVPS(仮想専用サーバー)の利用は「選択肢」ではなく「必須条件」です。証券会社のデータセンターに近い場所に設置されたVPS上でEAを稼働させることで、ネットワーク経路を最短化し、コンマ数秒を争う約定スピードを極限まで高めることができます。このわずかな差が、長期的なバックテスト結果とリアルトレードの乖離を埋め、致命的な損失を防ぐための最大の防衛策となるのです。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント