1. iTEMA関数の概要と実務での活用法
MQL5のiTEMA関数は、3重指数移動平均(Triple Exponential Moving Average)のインジケーターハンドルを取得するための関数です。TEMAは、1重・2重・3重のEMA(指数平滑移動平均)を組み合わせることで、従来の移動平均線の弱点であった「追従の遅れ(ラグ)」を極限まで排除しつつ、価格のノイズを滑らかにする性質を持っています。
実務での活用法
実務開発において、TEMAは「反応の速さ」を武器にします。
– 短期スキャルピングのトレンド判断: SMAやEMAではエントリーが遅れてしまうような急激な価格変動に対し、TEMAは素早く反応します。
– フィルタリング: オシレーター系指標のシグナルに対し、TEMAの傾きをフィルターとして加えることで、ダマシを減らす使い方が一般的です。
開発者がつまずきやすいポイント
MQL5のiTEMAは、関数を呼び出した瞬間に「計算値」を返すわけではありません。「計算を行うためのハンドル(識別番号)」を返すだけです。初心者の方は「iTEMAの戻り値をそのまま価格と比較しようとして、意図しない数値(ハンドル番号)が取得されてしまう」というミスをよく犯します。実際の数値取得にはCopyBuffer関数を併用する必要がある点を理解しておきましょう。
2. 構文と戻り値
iTEMA関数の基本的な構文は以下の通りです。
int iTEMA(
string symbol, // 通貨ペア名(NULLで現在のチャート)
ENUM_TIMEFRAMES period, // 時間足(0またはPERIOD_CURRENTで現在の足)
int ma_period, // 平均化期間
int ind_shift, // 左右へのシフト(通常は0)
ENUM_APPLIED_PRICE applied_price // 適用価格(PRICE_CLOSEなど)
);
戻り値
- 成功した場合:インジケーターのハンドル(int型)を返します。
- 失敗した場合:
INVALID_HANDLEを返します。
取得したハンドルは、EAの初期化時(OnInit)に一度だけ取得し、ティックごとの計算にはそのハンドルを使い回すのがクオンツ運用の鉄則です。
3. 具体的な使い方・実践サンプルコード
以下に、iTEMAを使用して「現在の値」と「1本前の値」を比較し、トレンドの向きを判定する実践的なEAのコード例を示します。
//+------------------------------------------------------------------+
//| TEMA_Sample_EA.mq5 |
//| Copyright 2024, Quant Engineer |
//+------------------------------------------------------------------+
#property strict
// 入力パラメーター
input int InpTEMAPeriod = 14; // TEMAの期間
input int InpTEMAShift = 0; // TEMAのシフト
input ENUM_APPLIED_PRICE InpPrice = PRICE_CLOSE; // 適用価格
// グローバル変数
int temaHandle; // TEMAのハンドルを格納
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// TEMAハンドルの取得
temaHandle = iTEMA(_Symbol, _Period, InpTEMAPeriod, InpTEMAShift, InpPrice);
// ハンドルの取得に失敗した場合の処理
if(temaHandle == INVALID_HANDLE)
{
Print("TEMAハンドルの取得に失敗しました。エラーコード:", GetLastError());
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// メモリ解放のためにハンドルをリリース
IndicatorRelease(temaHandle);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double temaValues[]; // 値を格納する配列
ArraySetAsSeries(temaValues, true); // 最新の足をインデックス0にする
// CopyBufferを使用してハンドルから値を取得(最新の2本分)
if(CopyBuffer(temaHandle, 0, 0, 2, temaValues) < 0)
{
Print("データコピー失敗。エラーコード:", GetLastError());
return;
}
double currentTEMA = temaValues[0]; // 最新のTEMA値
double prevTEMA = temaValues[1]; // 1本前のTEMA値
// ロジック例:TEMAの傾きによるトレンド判定
if(currentTEMA > prevTEMA)
{
Comment("トレンド: 上昇中 (TEMA: ", DoubleToString(currentTEMA, _Digits), ")");
}
else if(currentTEMA < prevTEMA)
{
Comment("トレンド: 下降中 (TEMA: ", DoubleToString(currentTEMA, _Digits), ")");
}
}
4. 使用上の注意点とよくあるエラー
ハンドルの重複取得に注意
OnTick内で毎回iTEMA関数を呼び出してはいけません。これをやると、ティックが動くたびに新しい計算リソースがメモリ上に確保され、PCやVPSのメモリを食いつぶし、プラットフォームのフリーズやクラッシュを引き起こします。必ずOnInitで一度だけ取得するようにしてください。
データの準備待ち
EAの起動直後や時間足の切り替え直後は、ヒストリカルデータの読み込みが終わっておらず、CopyBufferがエラーを返すことがあります。実運用コードでは、CopyBufferの戻り値が取得したい個数と一致しているかチェックするバリデーションを必ず入れましょう。
シフトの設定
ind_shiftパラメーターを正の値にするとインジケーターが右へ(未来方向)、負の値にすると左へ(過去方向)ずれます。初心者が意図せずここを触ると、バックテストで「未来の価格を見てトレードしている」という聖杯のような誤った結果が出る原因になります。基本は「0」で運用すべきです。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズム取引において、iTEMAのような反応の早い指標を採用する最大の目的は「一瞬のチャンスを逃さないこと」にあります。しかし、どれだけコードを最適化しても、物理的なネットワーク環境が脆弱であればすべてが無意味になります。自宅PCから家庭用回線で発注を行う場合、ブローカーのサーバーとの間に数十ミリ秒(ms)から数百msの通信遅延(レイテンシ)が発生します。この「コンマ数秒の遅れ」の間に価格は動き、意図した価格から乖離した場所で約定する「スリッページ」を引き起こします。
クオンツエンジニアの視点では、この遅延は統計的な期待値を著しく低下させる致命的なリスクです。極限まで約定スピードを高め、エッジを維持するためには、ブローカーのサーバーと物理的に距離が近いデータセンター内に設置された「専用VPS(仮想専用サーバー)」の利用が必須条件となります。プロのトレーダーにとって、VPSは単なる利便性のためではなく、インフラレベルでの「損失回避策」であることを肝に銘じてください。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント