MQL4 数学関数リファレンス|MathAbs・MathRound・NormalizeDouble・MathMax・乱数

MQL4 数学関数はMathAbs・MathRound・NormalizeDouble・MathMax・乱数生成など、EA開発で使う数値処理を一通りカバーする。各関数のシンタックスと実用パターンをコード付きで扱う。

MQL4 数学関数 リファレンスカード
目次

MQL4とMQL5の数学関数の違い

機能MQL4MQL5
基本関数完全に同じ完全に同じ
NormalizeDoubleNormalizeDouble()NormalizeDouble()
乱数MathRand() / MathSrand()MathRand() / MathSrand()
統計関数なしMathStats系(追加)

MQL4の数学関数はMQL5と完全に互換性があります。コードの移植がそのままで可能な唯一のカテゴリです。

基本数学関数

関数説明
MathAbs(x)絶対値MathAbs(-5.3) = 5.3
MathSqrt(x)平方根MathSqrt(9) = 3.0
MathPow(base, exp)累乗MathPow(2, 10) = 1024.0
MathExp(x)eのx乗MathExp(1) = 2.718…
MathLog(x)自然対数(ln)MathLog(2.718) ≈ 1.0
MathLog10(x)常用対数MathLog10(100) = 2.0
MathMod(x, y)剰余MathMod(10, 3) = 1.0

丸め関数

関数説明
MathRound(x)四捨五入MathRound(2.5) = 3, MathRound(2.4) = 2
MathFloor(x)切り捨て(小さい方向)MathFloor(2.9) = 2, MathFloor(-2.1) = -3
MathCeil(x)切り上げ(大きい方向)MathCeil(2.1) = 3, MathCeil(-2.9) = -2
void RoundingExample()
  {
   double value = 2.567;

   Print("MathRound:", MathRound(value));   // 3
   Print("MathFloor:", MathFloor(value));   // 2
   Print("MathCeil:", MathCeil(value));    // 3

   // ロット計算での使い分け
   double rawLots = 0.157;
   double lotStep = 0.01;

   // 切り捨て(安全側)
   double safeLots = MathFloor(rawLots / lotStep) * lotStep;  // 0.15

   // 四捨五入
   double roundLots = MathRound(rawLots / lotStep) * lotStep;  // 0.16

   Print("切り捨て:", safeLots," 四捨五入:", roundLots);
  }

MathMax / MathMin

void MaxMinExample()
  {
   // 基本的な使い方
   double a = MathMax(10.5, 20.3);  // 20.3
   double b = MathMin(10.5, 20.3);  // 10.5

   // ロットの範囲制限
   double lots = 0.05;
   double minLot = MarketInfo(Symbol(), MODE_MINLOT);
   double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);

   lots = MathMax(lots, minLot);  // 最小ロット以上
   lots = MathMin(lots, maxLot);  // 最大ロット以下

   // 複数値の最大値(ネスト)
   double highest = MathMax(High[1], MathMax(High[2], High[3]));

   // SLの安全距離確保
   double stopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL) * Point;
   double slDistance = MathMax(30 * Point, stopLevel);
  }

NormalizeDouble – 価格の正規化

double NormalizeDouble(
   double value,   // 正規化する値
   int    digits   // 小数点以下の桁数
);
// 浮動小数点の誤差を除去し、指定桁数に丸める
void NormalizeExample()
  {
   // 浮動小数点の罠
   double a = 1.1 + 2.2;  // 3.3000000000000003 (!=3.3)

   // NormalizeDoubleで正規化
   double b = NormalizeDouble(1.1 + 2.2, 1);  // 3.3

   // EA開発では価格計算に必須
   double sl = Ask - 30 * Point;
   sl = NormalizeDouble(sl, Digits);  // 必ず正規化

   double tp = Ask + 50 * Point;
   tp = NormalizeDouble(tp, Digits);

   // ロットも正規化
   double lots = 0.123456;
   lots = NormalizeDouble(lots, 2);  // 0.12

   // 価格比較にも使う
   double price1 = NormalizeDouble(1.23456, 5);
   double price2 = NormalizeDouble(1.23457, 5);
   if(MathAbs(price1 - price2) < Point)
      Print("ほぼ同じ価格");
  }
NormalizeDoubleを使うべき場面
  • OrderSend()のprice, sl, tp引数に渡す前
  • OrderModify()のsl, tp引数に渡す前
  • 価格の比較(==を使う前に正規化)
  • ロット数の計算後

NormalizeDouble()はMQL4プログラミングで最も頻繁に使う関数の一つです。浮動小数点の計算誤差(例: 1.1 + 2.2 = 3.3000000000000003)を除去し、ブローカーが受け入れ可能な桁数に丸めます。OrderSend/OrderModifyの引数に渡す価格・SL・TPには必ずNormalizeDouble(value, Digits)を適用してください。

NormalizeDouble()はMQL4プログラミングで最も頻繁に使う関数の一つです。浮動小数点の計算誤差を除去し、ブローカーが受け入れ可能な桁数に丸めます。OrderSend/OrderModifyの引数に渡す価格・SL・TPには必ずNormalizeDouble(value, Digits)を適用してください。

三角関数

関数説明
MathSin(x)正弦(xはラジアン)
MathCos(x)余弦
MathTan(x)正接
MathArcsin(x)逆正弦
MathArccos(x)逆余弦
MathArctan(x)逆正接
M_PI円周率 (3.14159…)

MathRand / MathSrand – 乱数

int OnInit()
  {
   // 乱数シードの初期化(起動時に1回)
   MathSrand(GetTickCount());
   return INIT_SUCCEEDED;
  }

// 0〜max の範囲の乱数
int RandomInt(int max)
  {
   return MathRand() % (max + 1);
  }

// min〜maxの範囲の乱数
double RandomDouble(double min, double max)
  {
   return min + (max - min) * MathRand() / 32767.0;
  }

// ランダムなエントリー遅延(過剰最適化防止)
void RandomDelay()
  {
   int delaySec = RandomInt(5);  // 0〜5秒のランダム遅延
   if(delaySec > 0)
      Sleep(delaySec * 1000);
  }
浮動小数点の比較テクニック
  • == での直接比較は危険: if(price1 == price2) は浮動小数点誤差で失敗する可能性がある
  • 差分比較が安全: if(MathAbs(price1 - price2) < Point)
  • NormalizeDouble後の比較: if(NormalizeDouble(a - b, Digits) == 0)
  • ゼロとの比較も注意: if(value > 0.0001) のように小さな閾値を使う
浮動小数点の比較テクニック
  • == での直接比較は危険: if(price1 == price2) は浮動小数点誤差で失敗する可能性がある
  • 差分比較が安全: if(MathAbs(price1 - price2) < Point)
  • NormalizeDouble後の比較: if(NormalizeDouble(a - b, Digits) == 0)
  • ゼロとの比較も注意: if(value > 0.0001) のように小さな閾値を使う

実践: EA開発でよく使う数学パターン

// ポイント→pips変換
double PointsToPips(int points)
  {
   if(Digits == 3 || Digits == 5)
      return points / 10.0;
   return (double)points;
  }

// pips→ポイント変換
int PipsToPoints(double pips)
  {
   if(Digits == 3 || Digits == 5)
      return (int)MathRound(pips * 10);
   return (int)MathRound(pips);
  }

// 標準偏差の計算
double StdDev(double &data[], int count)
  {
   if(count < 2) return 0;

   double sum = 0;
   for(int i = 0; i < count; i++)
      sum += data[i];
   double mean = sum / count;

   double variance = 0;
   for(int i = 0; i < count; i++)
      variance += MathPow(data[i] - mean, 2);

   return MathSqrt(variance / (count - 1));
  }

// リスクリワードレシオの計算
double RiskRewardRatio(double entry, double sl, double tp)
  {
   double risk   = MathAbs(entry - sl);
   double reward = MathAbs(tp - entry);

   if(risk == 0) return 0;
   return reward / risk;
  }

数学関数一覧(MQL5対応表)

MQL4関数MQL5対応説明
MathAbs()MathAbs()絶対値
MathSqrt()MathSqrt()平方根
MathPow()MathPow()累乗
MathExp()MathExp()指数関数
MathLog()MathLog()自然対数
MathLog10()MathLog10()常用対数
MathRound()MathRound()四捨五入
MathFloor()MathFloor()切り捨て
MathCeil()MathCeil()切り上げ
MathMax()MathMax()大きい方
MathMin()MathMin()小さい方
MathMod()MathMod()剰余
MathRand()MathRand()乱数(0〜32767)
MathSrand()MathSrand()乱数シード設定
NormalizeDouble()NormalizeDouble()価格正規化
MathSin/Cos/Tan()MathSin/Cos/Tan()三角関数

MQL4 数学関数のまとめ

MQL4の数学関数はMQL5と完全互換で、移植がそのまま可能です。EA開発で必須の関数は以下だ。

  • NormalizeDouble() – 最重要。価格やロットの計算後には必ず呼ぶ
  • MathFloor() – ロット計算で安全側に丸めるのに使う
  • MathMax()/MathMin() – 範囲制限に使う(ロット、SL距離等)
  • MathAbs() – 距離計算(SLまでのpips数等)に使う

次のステップとして、MQLリファレンス総合ガイドで他のカテゴリも学習しましょう。

MQL4数学・統計関数 よくある質問

MQL4の数学関数にはどんなものがありますか?

MathAbs()で絶対値、MathSqrt()で平方根、MathPow()でべき乗、MathLog()/MathLog10()で対数計算ができます。MathMax()/MathMin()で最大最小値の比較、MathRound()/MathFloor()/MathCeil()で丸め処理も可能です。

NormalizeDouble()の使い方は?

NormalizeDouble(value, digits)で指定桁数に丸めます。通貨ペアの価格はDigits()で桁数を取得して揃えるのが正しい方法です。例:price = NormalizeDouble(Ask + 0.0050, Digits())。ロット数も同様にNormalizeDouble(lot, 2)で2桁に揃えます。

MQL4で乱数を生成する方法は?

MathRand()で0-32767の乱数、MathSrand()でシードを設定します。MathSrand(GetTickCount())でシードを初期化してからMathRand()を使用します。0〜1の乱数が必要な場合はMathRand()/32767.0で正規化します。

MQL4でサインとコサインを使う場合は?

MathSin()/MathCos()/MathTan()は引数がラジアン単位です。度数→ラジアン変換はMathPi()/180を乗算します。例:double angle_rad = 45 * MathPi() / 180.0; double sin_val = MathSin(angle_rad)。

MQL4の統計計算に便利な関数は?

標準的な統計関数はありませんが、配列操作(ArrayMaximum/ArrayMinimum)と組み合わせて実装できます。MathAbs()で偏差の絶対値、MathSqrt()で標準偏差、MathPow()で分散計算が可能です。MQL5では統計関数が大幅に追加されています。

MQL4でロット計算に数学関数を使う方法は?

ロット計算ではMathFloor()やMathRound()で切り下げ・丸めを行い、MarketInfo(Symbol(),MODE_MINLOT)とMODE_LOTSTEPで最小ロットと刻みを取得して制約を適用します。NormalizeDouble(lot, 2)で2桁に正規化するのが標準的です。

MQL4リファレンス 関連記事

シストレ.COM編集部|200種類以上のEAをフォワード計測する運営3年の検証メディア。MetaTrader (MT4/MT5) を実運用してきた編集部が監修・執筆しています。

⚠ リスクに関する注意事項

本記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。FX取引はレバレッジ取引の特性上、預託した証拠金以上の損失が生じる可能性があります。取引の際は、ご自身の判断と責任において行ってください。詳しくは特定商取引法に基づく表記をご確認ください。

シストレ.COMで実績のあるEAが使い放題!/
無料会員登録はこちら
FX自動売買でEAを探すなら
シストレ.COM 記事下バナー
実績あるEAが無料
厳格な審査を乗り越えた実績のあるEAが無料で使えます!
自由な口座選び
有料版を購入し柔軟な口座選びが可能!
フォワードテスト公開
全EAのフォワードテスト結果を公開中!
FX初心者も安心
初心者の方も安心して取引を始められます。
多様なEA選択肢
様々な種別のEAをご用意!自分の手法にあった取引が可能です。
信頼のFX会社と提携
人気のFX会社と提携中!様々なFX会社から選べます。
1分で登録完了!EA探すならシストレ.COM!/
無料会員登録はこちら

この記事が気に入ったら
フォローしてね!

お役立ち情報をシェアする
  • URLをコピーしました!

この記事を書いた人

シストレ.COM編集部は、FX自動売買(EA)とテクニカル分析を専門とするインターネットメディア「シストレ.COM」の編集チームです。200本以上のEAのフォワードテスト結果を公開し、実際の運用データに基づいた客観的な情報を発信しています。記事の執筆・監修はMetaTrader(MT4/MT5)での実運用経験を持つスタッフが担当。

目次