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

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

MQL5におけるPoint(または_Point)は、現在のチャート通貨ペアにおける価格の最小単位(1ポイントの価格)を取得するための組み込み関数、あるいは定義済み変数です。

実務開発において、Pointは単に「一番小さな桁の数値」を取得するだけのものではありません。EA(エキスパートアドバイザー)が注文を出す際の「ストップロス(SL)」や「テイクプロフィット(TP)」、あるいは「トレーリングストップ」の幅を、価格の絶対値ではなく相対的な値幅として指定するために必須の要素となります。

初心者が最もつまずきやすいのは、「Point = Pip(ピップ)」ではないという点です。現在のFX業界では、小数点第5位(対円なら第3位)まで表示するブローカーが主流です。この場合、1ポイントは0.1ピップに相当します。この違いを理解せずにコードを書くと、利確幅を「30」と指定したつもりが、実際には「3ピップ」で決済されてしまうといった計算ミスに繋がります。

2. 構文と戻り値

MQL5では、関数としての Point() と、定義済み変数としての _Point の両方が使えますが、通常は処理の軽い _Point を利用するのが一般的です。

構文

double Point();
// または
double _Point;

戻り値

  • : double
  • 内容: 現在の通貨ペアの最小価格変化量。
    • 例1(ドル円 3桁表示の場合): 0.001
    • 例2(ユーロドル 5桁表示の場合): 0.00001

この値は、後述する計算において「整数値を価格幅に変換する」ために乗算して使用します。

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

以下は、Pointを使用して、現在価格から「100ポイント」離れた位置にストップロスとテイクプロフィットを設定して買い注文を出すシンプルなサンプルコードです。

//+------------------------------------------------------------------+
//|                                              PointExampleEA.mq5 |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>

CTrade trade; // 取引クラスのインスタンス

void OnTick()
{
   // すでにポジションを持っている場合は処理しない
   if(PositionsTotal() > 0) return;

   // 現在の銘柄のAsk価格(買値)を取得
   double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

   // 設定したい値幅(ポイント単位)
   int stopLossPoints = 1000;      // 1000ポイント(100pips相当)
   int takeProfitPoints = 2000;    // 2000ポイント(200pips相当)

   // ポイントを実際の価格幅に変換して計算
   // _Pointを掛けることで、整数を価格スケールに合わせる
   double slPrice = ask - (stopLossPoints * _Point);
   double tpPrice = ask + (takeProfitPoints * _Point);

   // 価格を正規化(ブローカーの桁数に合わせる)
   slPrice = NormalizeDouble(slPrice, _Digits);
   tpPrice = NormalizeDouble(tpPrice, _Digits);

   // 買い注文の実行
   if(trade.Buy(0.1, _Symbol, ask, slPrice, tpPrice, "Point Example"))
   {
      Print("注文成功: SL=", slPrice, " TP=", tpPrice);
   }
   else
   {
      Print("注文失敗: エラーコード=", GetLastError());
   }
}

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

① NormalizeDouble() を忘れない

Pointを使って計算した価格(例: ask - 100 * _Point)は、浮動小数点演算の影響で、非常に小さな誤差(0.00000000001など)が含まれることがあります。そのまま注文を出すと、サーバー側で「不正な価格」としてリジェクトされる原因になります。必ず NormalizeDouble(価格, _Digits) を使って、その通貨ペアの正しい桁数に丸めてください。

② 3桁・5桁業者の差異

「10ピップス」の幅を計算したいとき、4桁表示の業者なら 10 * _Point で済みますが、現代の5桁表示の業者では 100 * _Point にする必要があります。プログラムを汎用的にするためには、以下のように「ピップス単位」を「ポイント単位」に自動変換するロジックを組み込むのがクオンツとしての定石です。

// PipsをPointに変換する倍数の取得
int GetPipsMultiplier()
{
   if(_Digits == 3 || _Digits == 5) return 10; // 5桁業者は10倍
   return 1; // 4桁業者は1倍
}

③ SYMBOL_TRADE_TICK_SIZE との混同

厳密には Point(最小価格単位)と TickSize(最小価格変動幅)は異なります。ほとんどのFXペアでは一致しますが、エキゾチック通貨やCFD(日経225など)では、「1ポイント=0.001」だが「最小変動幅=0.005」というケースがあります。より堅牢なEAを作る場合は、注文価格の計算に Point ではなく SYMBOL_TRADE_TICK_SIZE を参照する設計も検討してください。

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

アルゴリズム取引において、Pointを駆使した精密なロジックを組んだとしても、その執行環境が脆弱であればすべては無意味になります。自宅のPCや一般的な光回線から注文を出す場合、ネットワークの物理的な距離と不安定な遅延(レイテンシ)により、画面上の価格とサーバー内での価格に「乖離(スリッページ)」が発生します。わずか数ポイントの差で利益を積み上げるシステムトレードにおいて、この遅延は致命的な損失に直結します。

プロのクオンツエンジニアが例外なく導入しているのが、FX専用のVPS(仮想専用サーバー)です。証券会社のサーバーが設置されているデータセンターに近い場所にVPSを配置することで、ネットワーク遅延を極限まで排除し、ミリ秒単位での超高速約定が可能になります。24時間稼働の安定性とスピードを確保することは、ロジックを磨くこと以上にトレードの期待値を左右する絶対条件です。本気でシストレでの収益を目指すなら、まずはインフラ環境をプロ仕様に整えることから始めてください。

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

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

コメント

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