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

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

MQL5におけるsin関数は、指定した角度(ラジアン)の正弦(サイン)を計算するための数学関数です。高校数学で学ぶ三角関数のひとつですが、アルゴリズムトレードの世界では非常に強力な武器となります。

実務レベルでは、主に「相場の周期性(サイクル)」を分析するために活用されます。価格チャートは一見ランダムに見えますが、一定の周期で上下動を繰り返す性質(サイクル理論)があり、sin関数を用いることで、その波の動きを数式でモデル化することが可能です。

初心者の方が最初につまずきやすいポイントは、引数として渡す数値の単位です。日常で使う「度(0度〜360度)」ではなく、「ラジアン(0〜2π)」で指定する必要があるため、ここでの変換ミスが計算結果のバグに直結します。

2. 構文と戻り値

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

double sin(
   double value      // 角度(ラジアン)
);
  • パラメーター: value には、サインを求めたい角度を「ラジアン」単位で渡します。
  • : 引数、戻り値ともに double(浮動小数点数)型です。
  • 戻り値: -1.0 から 1.0 の範囲の値を返します。

※ 角度(度)をラジアンに変換するには、度 * (M_PI / 180.0) という計算式を用います。

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

以下のサンプルは、チャート上のローソク足のインデックスを利用して、-1.0から1.0の間で綺麗にスイングする「サイン波」を計算し、エキスパートログに出力するコードです。これを応用すれば、独自のオシレーター指標を作成できます。

//+------------------------------------------------------------------+
//|                                              SineWaveSample.mq5  |
//|                                  Copyright 2024, Quant Engineer  |
//+------------------------------------------------------------------+
#property strict

//--- 周期の設定(例:20本分で1サイクル)
input int InpPeriod = 20;

void OnTick()
{
   // 直近のローソク足のインデックスを取得
   // 0は現在の足、1は1本前の足
   int barIndex = 0; 

   // 1. 度単位の角度を計算 (例: インデックスを元に360度を周期で割る)
   // インデックスが進むごとに角度が増えるように調整
   double degrees = (double)(RatesTotal() % InpPeriod) * (360.0 / InpPeriod);

   // 2. 度からラジアンへ変換 (sin関数にはラジアンが必要)
   double radians = degrees * (M_PI / 180.0);

   // 3. sin関数を実行
   double sinValue = sin(radians);

   // 結果を表示
   PrintFormat("Index: %d, Angle: %.2f, Sin Value: %.4f", barIndex, degrees, sinValue);

   // 実務的な応用例: 
   // sinValueが 0.9 を超えたら「周期の頂点」とみなして逆張りの判断材料にする等
}

// データ総数を取得するための補助関数
int RatesTotal()
{
   return(iBars(_Symbol, _Period));
}

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

  1. 「度」と「ラジアン」の混同
    最も多いミスは sin(90) と記述して 90度のサインを得ようとすることです。sin関数にとって 90 は「約14.3回転した後の角度」として処理されるため、意図しない値が返ります。必ず M_PI(円周率)を用いた変換を行ってください。

  2. ゼロ除算の回避
    周期を外部パラメータ(input)にする際、誤って 0 を入力すると、ラジアン変換の計算でゼロ除算が発生し、EAが停止する原因になります。必ず入力値のチェックを行いましょう。

  3. 戻り値の範囲
    sinの戻り値は常に -1.0 〜 1.0 です。これを価格(例:150.50円)に加算・比較する場合は、適切なスケーリング(例:sin(r) * 0.1 で10ピップスの変動にする等)が必要です。

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

クオンツエンジニアの視点から断言しますが、どれほど完璧な数学モデル(sin関数を用いた高度な周期分析など)を構築しても、執行環境が劣悪であればその優位性はすべて消滅します。特に自宅のPCと家庭用ネット回線を使った自動売買は、プロの現場から見れば非常にリスクの高い行為です。

家庭用回線では、プロバイダー経由の複雑なルートによる物理的な距離と、ネットワークの揺らぎ(ジッター)が避けられません。わずか数十ミリ秒の約定遅延(レイテンシ)が、本来得られるはずだった利益をスリッページによって削り取り、結果としてバックテスト通りのパフォーマンスが出ない「勝てないEA」を作り出してしまいます。極限まで約定スピードを高め、相場のノイズに翻弄されずに戦略を完遂するには、ブローカーのサーバーに物理的に近いデータセンター内に設置された「専用のVPS」を利用することが、シストレにおける最低限のインフラ条件となります。

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

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

コメント

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