1. iTriX関数の概要と実務での活用法
iTriXは、MQL5に組み込まれている「TriX(Triple Exponential Moving Average)」インジケーターのハンドルを取得するための関数です。TriXは、価格の指数移動平均(EMA)を3回繰り返して計算した値の「変化率」をオシレーター化したもので、ノイズを極限まで排除しつつ、トレンドの方向性を明確に示す特性を持っています。
実務での活用法
実務開発において、TriXは主に「トレンドの転換点」や「勢いの減速」を捉えるために使用されます。
* ゼロラインとの交差: TriXの値が0を上抜ければ買い、下抜ければ売りのシグナル。
* 方向の変化: TriXの傾きが上向きから下向きに変わるタイミングを、高値圏での利益確定ポイントとする。
つまずきやすいポイント
初心者が最もつまずくのは、「iTriX関数自体はインジケーターの値(数値)を返さない」という点です。iTriXが返すのはあくまで「ハンドル(識別番号)」であり、実際の数値を取得するには、その後さらにCopyBuffer関数を組み合わせる必要があります。この2段構えのフローがMQL4経験者や初心者にとっての最初の壁となります。
2. 構文と戻り値
iTriX関数の構文は以下の通りです。
int iTriX(
string symbol, // 通貨ペア(NULLで現在のチャート)
ENUM_TIMEFRAMES period, // 時間軸(PERIOD_CURRENTで現在の足)
int ma_period, // 平均期間(計算に使用する期間)
ENUM_APPLIED_PRICE applied_price // 適用価格(CLOSE, OPENなど)
);
パラメーター解説
- symbol: 対象となる通貨ペアを指定します。
- period: 計算対象の時間軸(1分足、1時間足など)を指定します。
- ma_period: 指数移動平均を計算する際の期間です。一般的には「14」などがよく使われます。
- applied_price: 終値(PRICE_CLOSE)を使うのが一般的ですが、高値や安値を指定することも可能です。
戻り値
- 成功した場合:インジケーターのハンドル(int型)を返します。
- 失敗した場合:
INVALID_HANDLEを返します。
3. 具体的な使い方・実践サンプルコード
以下は、iTriXを使用して現在の値と1本前の値を比較し、買い・売りの判断を行うシンプルなEAのサンプルです。
//+------------------------------------------------------------------+
//| SimpleTriXEA.mq5 |
//+------------------------------------------------------------------+
#property strict
// 入力パラメーター
input int TriX_Period = 14; // TriXの期間
input ENUM_APPLIED_PRICE TriX_Price = PRICE_CLOSE; // 適用価格
// グローバル変数
int handleTriX; // TriXのハンドルを格納する変数
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 1. TriXのハンドルを取得(一度だけ実行)
handleTriX = iTriX(_Symbol, _Period, TriX_Period, TriX_Price);
// ハンドル取得に失敗した場合はエラー
if(handleTriX == INVALID_HANDLE)
{
Print("TriXハンドルの取得に失敗しました。");
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double trixValues[]; // 値を格納する動的配列
// 時系列として扱う設定(最新の値を0番目にする)
ArraySetAsSeries(trixValues, true);
// 2. ハンドルを使って最新の2本分データをコピーする
if(CopyBuffer(handleTriX, 0, 0, 2, trixValues) < 2)
{
Print("データのコピーに失敗しました。");
return;
}
double currentTriX = trixValues[0]; // 最新のTriX値
double prevTriX = trixValues[1]; // 1本前のTriX値
// 3. ロジック判断(例:ゼロラインのクロス)
if(prevTriX < 0 && currentTriX >= 0)
{
Print("ゴールデンクロス:買いシグナル");
// ここにオーダー処理を記述
}
else if(prevTriX > 0 && currentTriX <= 0)
{
Print("デッドクロス:売りシグナル");
// ここにオーダー処理を記述
}
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 使用したハンドルを解放(メモリ管理)
IndicatorRelease(handleTriX);
}
4. 使用上の注意点とよくあるエラー
-
IndicatorReleaseの忘れ:
OnInitで作成したハンドルは、EAの終了時(OnDeinit)にIndicatorReleaseで解放するようにしましょう。メモリリークを防ぐためのクオンツエンジニアとしての基本作法です。 -
配列の時系列設定:
CopyBufferで取得したデータは、デフォルトでは古い順に並んでいます。ArraySetAsSeries(array, true)を呼び出すことで、array[0]が最新のデータになるため、ロジックが組みやすくなります。 -
計算期間の不足:
TriXは内部で指数移動平均を3回繰り返すため、計算に必要なバーの数が他のインジケーターより多くなります。チャート上のデータ数が少なすぎると値が取得できず、CopyBufferがエラーを返すことがあります。
5. 【重要】自動売買における約定スピードと環境の罠
自動売買プログラムにおいて、アルゴリズムの優位性と同じくらい、あるいはそれ以上に重要なのが「実行環境」です。自宅のPCや一般的なWi-Fi環境でEAを稼働させることは、プロの現場では推奨されません。ネットワークの物理的な距離に起因する遅延(レイテンシ)は、数ミリ秒単位で約定価格を滑らせ、バックテストでは利益が出ていたロジックを実運用で破綻させる致命的な要因となります。
特にiTriXのようなトレンドの勢いを測る指標は、ボラティリティが高い局面で威力を発揮しますが、そのような相場では一瞬の遅延が大きな損失に直結します。プロのクオンツエンジニアが極限まで約定スピードを追求するように、一般の開発者もFX業者のサーバーに近いデータセンターに設置された「専用のVPS」を利用することが必須です。安定した電源と超低遅延なネットワーク環境を確保することこそが、システムトレーダーとしての第一歩であり、勝率を安定させるための不可欠な投資と言えます。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント