1. PositionSelect関数の概要と実務での活用法
MQL5におけるPositionSelect関数は、現在保有している「ポジション」をプログラム内で操作・参照するために、特定の1つを選択(アクティブ化)するための関数です。
MQL4から移行してきた開発者が最もつまずきやすいのが、「注文(Order)」「約定(Deal)」「ポジション(Position)」の区別です。MQL4ではOrderSelect一つで全てを管理できましたが、MQL5では「現在市場に出ている持ち高」を扱うには、このPositionSelectを使う必要があります。
実務においては、主に以下のようなシーンで活用します。
– 現在のポジションの含み益・含み損を確認する
– トレーリングストップのために現在のストップロス価格を取得する
– 特定の通貨ペアのポジションが既に存在するか(二重建て防止)を判定する
この関数でポジションを選択状態にしない限り、PositionGetDoubleやPositionGetIntegerといった詳細データを取得する関数が正しく動作しないため、シストレ開発において避けては通れない最重要関数の一つです。
2. 構文と戻り値
PositionSelect関数の基本的な構文は以下の通りです。
bool PositionSelect(
string symbol // 通貨ペア名(シンボル)
);
パラメーター
- symbol: 選択したいポジションの通貨ペア名を指定します(例: “USDJPY”, “EURUSD”,
_Symbolなど)。
戻り値
- true: 指定した通貨ペアのポジションが存在し、正常に選択された場合。
- false: ポジションが存在しない、あるいはエラーが発生した場合。
注意点:
この関数は「通貨ペア名」で指定するため、同じ通貨ペアで複数のポジションを保有できる「ヘッジング(Hedging)口座」の場合、どのポジションが選択されるかはMT5の内部処理に依存します(一般的には最初に持ったポジション)。複数のポジションを厳密に区別したい場合は、チケット番号を使用するPositionSelectByTicketを使用するのがクオンツ実務での定石です。
3. 具体的な使い方・実践サンプルコード
以下は、現在のチャートの通貨ペアにポジションがあるかを確認し、もしあればその含み損益をエキスパートログに出力するシンプルなEAのコード例です。
void OnTick()
{
// 1. 現在のチャートの通貨ペア(_Symbol)のポジションを選択
// ポジションが存在しない場合は false が返る
if(PositionSelect(_Symbol))
{
// 2. ポジションが選択された状態なので、詳細情報を取得可能
// ポジションのチケット番号を取得
long ticket = PositionGetInteger(POSITION_TICKET);
// ポジションの現在の含み損益を取得
double profit = PositionGetDouble(POSITION_PROFIT);
// ポジションのタイプ(買・売)を取得
ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
string posType = (type == POSITION_TYPE_BUY) ? "買い" : "売り";
PrintFormat("チケット #%d: %s %s ポジションの現在の損益: %.2f",
ticket, _Symbol, posType, profit);
}
else
{
// ポジションがない場合はここを通る
Comment("現在、" + _Symbol + " のポジションはありません。");
}
}
4. 使用上の注意点とよくあるエラー
開発初心者が陥りやすいミスには、以下のようなものがあります。
- 「決済注文」と混同する
PositionSelectはあくまで「参照するため」の関数であり、これ自体でポジションを閉じる(決済する)ことはできません。決済にはCTradeクラスなどを用いた別の処理が必要です。 - ヘッジング口座での挙動を見落とす
前述の通り、同じ通貨ペアで複数のポジションを持つ戦略の場合、PositionSelect(_Symbol)では意図したポジションを特定できないリスクがあります。複数のポジションを扱う場合は、PositionsTotal()で全ポジションをループさせ、PositionGetSymbolで判定するロック手法を使いましょう。 - 大文字・小文字の不一致
引数に渡す文字列(”usdjpy”など)が、ブローカーの表記(”USDJPY”や”USDJPY.static”)と完全に一致していないと、falseが返ってきます。基本的には_Symbol変数を使用することを推奨します。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジックの正確さと同じくらい、あるいはそれ以上に重要なのが「物理的な取引環境」です。どれほどPositionSelectを駆使して完璧な利確ロジックを組んだとしても、ご自宅のPC環境から一般的なインターネット回線で注文を出している場合、そこには致命的な「ネットワーク遅延(レイテンシ)」が存在します。
FX市場の価格はミリ秒(1000分の1秒)単位で変動しています。自宅PCからの発注では、あなたのPCからブローカーのサーバーに注文が届くまでに数十から数百ミリ秒を要し、その間に有利な価格は消え去り、スリッページによる損失(見えないコスト)が積み重なります。プロのクオンツエンジニアが個人開発者と決定的に違うのは、取引サーバーの目と鼻の先に位置する「専用VPS(仮想専用サーバー)」を必ず利用している点です。24時間稼働の安定性はもちろん、約定スピードを極限まで高めることは、システムトレードにおける「期待値」をプラスに保つための最低限のインフラ投資と言えます。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント