【MQL5】MathArccos関数の使い方と自動売買実装コード

1. MathArccos関数の概要と実務での活用法

MQL5のMathArccos関数は、数学的な「逆余弦(アークコサイン)」を求めるための関数です。与えられた数値(コサインの値)から、その値に対応する「角度(ラジアン)」を逆算します。

実務レベルのEA(エキスパートアドバイザー)開発において、この関数は単なる計算以上に「値動きの勢い(モメンタム)を角度で数値化する」際や、「2つのベクトルの相関性を計算する」際に重宝されます。

例えば、移動平均線(MA)の傾きを視覚的な「角度」として認識し、急角度でのブレイクアウトのみをエントリー条件にするようなロジックを作成する場合、この逆三角関数の知識が不可欠です。しかし、実務では入力値の範囲制限によって計算不能(NaN)を引き起こし、EAが停止してしまうという落とし穴も多いため、正しい扱い方を理解する必要があります。

2. 構文と戻り値

MathArccos関数の基本的な構文は以下の通りです。

double MathArccos(
   double val     // -1.0 から 1.0 の範囲の数値
);

パラメーター

  • val: コサインの値を指定します。この値は必ず -1.0 以上 1.0 以下 である必要があります。

戻り値

  • 0 から π(約3.14159)の範囲の値をラジアン単位で返します。
  • もし引数が -1 から 1 の範囲外だった場合、戻り値は NaN(非数)となります。

※度数法(0〜180度)に変換したい場合は、戻り値に 180 / M_PI を掛ける必要があります。

3. 具体的な使い方・実践サンプルコード

以下は、移動平均線の「傾き」を角度で取得し、一定以上の角度がある場合のみログを出力する実践的なコード例です。

//+------------------------------------------------------------------+
//| 移動平均線の傾きを角度で計算するサンプル                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // 移動平均線の値を2点取得(現在の足と1本前の足)
   double ma_now = iMA(_Symbol, _Period, 14, 0, MODE_SMA, PRICE_CLOSE, 0);
   double ma_prev = iMA(_Symbol, _Period, 14, 0, MODE_SMA, PRICE_CLOSE, 1);

   if(ma_now == 0 || ma_prev == 0) return;

   // 2点間の変化量を計算(ベクトルの成分)
   double price_diff = ma_now - ma_prev; // 垂直方向の変化
   double time_step = 1.0;               // 水平方向(1バー分を1とする)

   // 斜辺の長さを計算(ピタゴラスの定理)
   double hypotenuse = MathSqrt(MathPow(price_diff, 2) + MathPow(time_step, 2));

   // MathArccosを使って角度(ラジアン)を算出
   // cos(θ) = 底辺 / 斜辺
   double cos_theta = time_step / hypotenuse;

   // 入力値が-1.0〜1.0の範囲に収まるよう念のためクランプ処理
   cos_theta = MathMax(-1.0, MathMin(1.0, cos_theta));

   double angle_rad = MathArccos(cos_theta);

   // ラジアンを度数法(0〜180度)に変換
   double angle_deg = angle_rad * (180.0 / M_PI);

   // 上昇か下降かを判定して表示
   if(price_diff < 0) angle_deg *= -1; // 下落時はマイナス表記に

   Comment("MAの現在の角度: ", DoubleToString(angle_deg, 2), " 度");
}

4. 使用上の注意点とよくあるエラー

MathArccosを使用する際に、初心者が最も陥りやすいバグは「引数の範囲外エラー」です。

  1. 範囲外の数値によるNaN:
    数学の定義上、コサインの値は -1.0 から 1.0 の間にしか存在しません。計算誤差(浮動小数点誤差)によって、本来 1.0 になるはずの計算結果が 1.0000000000001 になっただけで、MathArccosNaN を返します。これに気付かずトレードロジックに組み込むと、条件判定が常に失敗する、あるいはEAがクラッシュする原因になります。必ず MathMax/MathMin 等で値を丸める処理を入れましょう。

  2. ラジアンと度数法の混同:
    MathArccosが返すのは「度(0-180)」ではなく「ラジアン(0-3.14…)」です。人間が理解しやすい角度(45度など)で判定を行いたい場合は、必ず変換公式を通すようにしてください。

  3. 価格スケールの問題:
    上記のサンプルコードでは「1バー」を底辺として計算していますが、FXの価格(0.0001単位など)と時間はスケールが全く異なります。チャートの見た目上の角度と計算上の角度を一致させるには、価格をPips単位に正規化するなどの調整が必要です。

5. 【重要】自動売買における約定スピードと環境の罠

どれほど高度な数学的アルゴリズムを組み込み、MathArccosで完璧なトレンド角を算出したとしても、それを実行する「環境」が貧弱であれば、すべての努力は水泡に帰します。特に日本の一般家庭用インターネット回線を利用した自宅PCでの運用には、目に見えない「ネットワーク遅延(レイテンシ)」という致命的なリスクが潜んでいます。

FXの自動売買はミリ秒(1000分の1秒)単位の争いです。自宅からの注文は、プロバイダーや複数のネットワーク拠点を経由して海外の取引サーバーに届くため、その間に価格が滑り(スリッページ)、計算上は利益が出るはずのポイントが損失に変わります。極限まで約定スピードを高め、アルゴリズムの優位性を保つためには、取引サーバーに物理的に近いデータセンターに設置された「専用VPS」の導入が不可欠です。24時間安定稼働し、低レイテンシを保証するプロ仕様の環境を用意することこそが、クオンツエンジニアとして最初にクリアすべき技術的課題といえます。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました