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

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

MQL5のDigits()関数は、現在チャートの通貨ペアの価格における「小数点以下の桁数」を整数(int型)で取得する関数です。

実務レベルの開発において、この関数は「価格の正規化(丸め処理)」を行う際に極めて重要な役割を果たします。FXではドル円(USDJPY)なら小数点以下3桁、ユーロドル(EURUSD)なら小数点以下5桁といったように、銘柄ごとに価格の精度が異なります。

初心者が陥りやすいミスとして、指値(Stop LossやTake Profit)を計算する際に、単純な計算結果(例:145.123456…)をそのまま注文関数に渡してしまうことがあります。しかし、取引サーバーは各通貨ペアで定められた桁数以上の細かい数値を「不正な価格(Invalid price)」として拒否します。

この価格不一致による注文エラーを防ぐために、Digits()で取得した桁数を用いて数値を丸める処理(NormalizeDouble関数との併用)が、安定したEA稼働には不可欠です。


2. 構文と戻り値

Digits()関数の仕様は非常にシンプルです。

構文

int  Digits();

※引数は必要ありません。

戻り値

現在のチャートの通貨ペアにおける小数点以下の桁数を返します。
例:USDJPYの場合3(149.505など)
例:EURUSDの場合5(1.08505など)
例:日経225などのCFDの場合0 または 1(業者による)

また、MQL5には定義済み変数として _Digits も用意されており、これを使用しても同じ値を取得できます。


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

以下は、現在の価格から「20ピップス」離れた位置に損切り(SL)を設定する際の、実戦的な計算コード例です。

//+------------------------------------------------------------------+
//| 損切り価格を計算して正規化するサンプルコード                            |
//+------------------------------------------------------------------+
void OnStart()
{
   // 1. 現在の買い値(Ask)を取得
   double currentAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

   // 2. 損切り幅をポイント単位で設定 (20ピップスと仮定)
   // ※3桁・5桁業者の場合、1ピップス = 10ポイント
   int stopLossPips = 20;
   double pointValue = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
   double slDistance = stopLossPips * 10 * pointValue;

   // 3. 損切り価格を計算
   double rawSLPrice = currentAsk - slDistance;

   // 4. 【重要】Digits() を使って価格を正規化する
   // 取引サーバーが受け付ける正しい桁数に丸める処理
   double normalizedSL = NormalizeDouble(rawSLPrice, Digits());

   // 結果を出力
   Print("銘柄: ", _Symbol);
   Print("現在の桁数 (Digits): ", Digits());
   Print("正規化前の価格: ", rawSLPrice);
   Print("正規化後の価格: ", normalizedSL);
}

このコードでは、Digits()NormalizeDouble() の第2引数に渡すことで、どの通貨ペアでEAを動かしても自動的に適切な価格へ調整されるように設計されています。


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

NormalizeDoubleとのセット運用が鉄則

Digits() 単体で何かを判定することは少なく、ほぼ確実に NormalizeDouble(価格, Digits()) という形で使用します。これを怠ると、バックテストでは動くのにライブ口座(リアルタイム動稼働)では「Invalid price」エラーでエントリーできないという、開発者が最も恐れる事態を招きます。

0.1と0.01の違い(ピップス計算の罠)

FX業者によって、1ピップスを「小数点第2位/4位」とするか、「第3位/5位」とするかが異なります。Digits() は単に小数点以下の桁数を返すだけなので、ピップス換算(例:100pips動かす)を行う場合は、その業者の _Point の値も併せて考慮する必要があります。

異なる通貨ペアの参照

現在のチャート以外の通貨ペアの桁数を知りたい場合は、Digits() ではなく SymbolInfoInteger("EURUSD", SYMBOL_DIGITS) を使用する必要があります。マルチカレンシー(複数通貨)対応のEAを作る際は注意しましょう。


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

アルゴリズムトレードにおいて、Digits関数を正しく使いこなして堅牢なコードを書くことは、勝つための「最低条件」に過ぎません。テクニカル指標やロジックが完璧であっても、実は「取引を実行する物理的な環境」が原因で、多くのエンジニアが資産を減らしています。

自宅のPCから一般的なインターネット回線を通じて自動売買を行う場合、FX業者のサーバーとの間には数十から数百ミリ秒の「ネットワーク遅延(レイテンシ)」が発生します。相場が急変するタイミングでは、このコンマ数秒の遅れが原因で、EAが算出した「最適な価格」での約定を逃し、不利な価格での約定(スリッページ)を招きます。これを放置することは、バグを放置したまま運用するのと同義です。

プロのクオンツや専業トレーダーにとって、FX業者のデータセンターに近い場所に位置する「専用VPS(仮想専用サーバー)」の導入は、もはやオプションではなく必須のインフラです。24時間365日の安定稼働はもちろん、物理的な距離を縮めて約定スピードを極限まで高めることが、システムトレードの期待値をプラスに維持するための最後にして最大の鍵となります。

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

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

コメント

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