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. 使用上の注意点とよくあるエラー
-
「度」と「ラジアン」の混同
最も多いミスはsin(90)と記述して 90度のサインを得ようとすることです。sin関数にとって90は「約14.3回転した後の角度」として処理されるため、意図しない値が返ります。必ずM_PI(円周率)を用いた変換を行ってください。 -
ゼロ除算の回避
周期を外部パラメータ(input)にする際、誤って0を入力すると、ラジアン変換の計算でゼロ除算が発生し、EAが停止する原因になります。必ず入力値のチェックを行いましょう。 -
戻り値の範囲
sinの戻り値は常に-1.0 〜 1.0です。これを価格(例:150.50円)に加算・比較する場合は、適切なスケーリング(例:sin(r) * 0.1で10ピップスの変動にする等)が必要です。
5. 【重要】自動売買における約定スピードと環境の罠
クオンツエンジニアの視点から断言しますが、どれほど完璧な数学モデル(sin関数を用いた高度な周期分析など)を構築しても、執行環境が劣悪であればその優位性はすべて消滅します。特に自宅のPCと家庭用ネット回線を使った自動売買は、プロの現場から見れば非常にリスクの高い行為です。
家庭用回線では、プロバイダー経由の複雑なルートによる物理的な距離と、ネットワークの揺らぎ(ジッター)が避けられません。わずか数十ミリ秒の約定遅延(レイテンシ)が、本来得られるはずだった利益をスリッページによって削り取り、結果としてバックテスト通りのパフォーマンスが出ない「勝てないEA」を作り出してしまいます。極限まで約定スピードを高め、相場のノイズに翻弄されずに戦略を完遂するには、ブローカーのサーバーに物理的に近いデータセンター内に設置された「専用のVPS」を利用することが、シストレにおける最低限のインフラ条件となります。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント