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

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

MathCos関数は、指定した数値(角度)の余弦(コサイン)を計算するための組み込み関数です。高校数学で習う「三角関数」の一つですが、システムトレード(シストレ)のアルゴリズム開発においても非常に重要な役割を果たします。

実務での活用シーン

実務では、単に図形を計算するのではなく、主に「周期性(サイクル)」を扱うために使用されます。
サイクル分析: 相場の周期的な動きをモデル化し、現在の価格がサイクルのどの位置(頂点か底か)にいるかを判定する。
インジケーターの平滑化: 移動平均線よりも滑らかで、かつ反応の良い独自のフィルタリング計算に組み込む。
アダプティブ・アルゴリズム: 相場のボラティリティに応じて計算期間を動的に変化させる際、急激な変化を抑制する緩衝材として利用する。

開発者がつまずきやすいポイント

最も多いミスは、「度数法(0〜360度)」と「弧度法(ラジアン)」の混同です。MathCosに「90(度)」を入力しても、期待する 0 は返ってきません。MQL5の数学関数はすべてラジアン単位で動作するため、この変換を忘れると全くデタラメな売買サインが出てしまうことになります。


2. 構文と戻り値

MathCos関数の構文は非常にシンプルです。

double MathCos(
   double  value      // ラジアン単位の角度
);

引数

  • value: コサインを求めたい角度をラジアンで指定します。

戻り値

  • -1.0 から 1.0 の範囲の double 型の値を返します。

豆知識

MQL5では MathCos(x)cos(x) は同一です。どちらを使ってもパフォーマンスに差はありませんが、他の数学関数との統一感を持たせるために MathCos を使うのが一般的です。


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

以下は、MathCosを使用して、チャート上に周期的な波(コサイン波)を描画し、簡易的なサイクル・オシレーターを作成する例です。度数法からラジアンへの変換プロセスに注目してください。

//+------------------------------------------------------------------+
//|                                           SampleMathCosEA.mq5    |
//|                                  Copyright 2023, Quant Engineer  |
//+------------------------------------------------------------------+
#property strict

// 入力パラメーター
input int InpPeriod = 20; // サイクルの周期(本数)

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    // 現在のバーのインデックス(0, 1, 2...)を取得
    int barIndex = iBars(_Symbol, _Period);

    // 1. 度数法での位置を計算 (例: 周期20本の中で現在の位置を0-360度で表す)
    double degrees = (double)(series_index % InpPeriod) * (360.0 / InpPeriod);

    // 2. 重要:度数法からラジアンに変換 (公式: ラジアン = 度 * PI / 180)
    double radians = degrees * M_PI / 180.0;

    // 3. MathCosでコサイン値を算出
    double cosValue = MathCos(radians);

    // ログに出力して確認
    PrintFormat("BarIndex: %d, Degrees: %.1f, CosValue: %.4f", 
                barIndex, degrees, cosValue);

    // 実務的な応用例:
    // cosValueが 1.0 に近い時はサイクルの天井、-1.0に近い時は底と判断するロジックなど
    if(cosValue > 0.9) {
        // 天井圏での逆張りロジックなど
    }
}

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

① ラジアン変換の徹底

前述の通り、MathCos(90)cos(90度) ではなく cos(90ラジアン) として処理されます。
正解: MathCos(90 * M_PI / 180.0)
間違い: MathCos(90)
これを間違えると、意図しない周期性が生まれ、バックテスト結果が壊滅的になります。

② 計算負荷への配慮

MathCos は基本的な関数ですが、複雑なループの中で数万回呼び出すと、わずかに計算負荷がかかります。
もし特定の周期の値を繰り返し使うのであれば、あらかじめ OnInit() 内で配列(ルックアップテーブル)に計算結果を格納しておき、OnTick() 内では配列を参照するだけにすると、実行速度をミリ秒単位で高速化できます。

③ 型のキャスト

引数には double 型を渡すようにしましょう。整数(int)を渡しても自動的にキャストされますが、計算精度を保つため、明示的に (double) を指定するか、数値に .0 を付与する習慣をつけるのがクオンツ流の作法です。


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

アルゴリズムの数学的精度をいくら高めても、それを実行する「環境」が劣悪であれば、全ての努力は水の泡となります。FXの自動売買において、あなたのPCからブローカーのサーバーまでの「物理的な距離」は、ネットワーク遅延(レイテンシ)として収益を直接削り取ります。自宅の一般的なインターネット回線では、ミリ秒単位で刻々と変化する価格に対して約定が遅れ、スリッページによってバックテスト通りの利益が出ないことは周知の事実です。

プロのクオンツエンジニアが共通して行う対策は、ブローカーの取引サーバーと同じデータセンター内、あるいは極めて近距離に配置された専用のVPS(仮想専用サーバー)を利用することです。ネットワーク遅延を極限まで排除することで、MathCosで計算した理想的なエントリーポイントを、コンマ数秒の狂いもなく市場に叩き込むことが可能になります。勝率をわずか数%底上げしたいのであれば、ロジックをいじる前に、まずはVPSによるインフラの最適化を最優先すべきです。

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

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

コメント

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