拙作のMQL4/MQL5共通ライブラリですが、これはもともとEAで自動売買を行うために作ったものです。ポジションのオープン・クローズはEA内で完結することを前提としています。

ただ、EAの使い方は人それぞれです。EAのエントリーを一時的に裁量で行いたいとか、そもそもエントリーは手動で行って、決済だけをEAで自動化したいとか、いろいろな方法が考えられます。

では、共通ライブラリを使ったEAで、手動で発注した注文やポジションを扱いたい場合、どうすればよいでしょうか?

残念ながら、共通ライブラリでは、MT4やMT5のターミナルから手動で発注した注文やポジションは直接処理できないようになっています。手動で発注したポジションが複数あった場合、それぞれ区別できないし、EAが間違って決済してしまうことを防ぐためです。

スクリプトで共通ライブラリを使う

ただ、解決方法はあります。手動で発注する代わりに、スクリプトプログラムを使って発注すればよいのです。スクリプトで発注すれば、ポジションにマジックナンバーを付けられるので、EAで扱うことができます。

以下、その方法を紹介します。

まず、EAのように共通ライブラリのヘッダファイル「LibEA.mqh」をインクルードします。ただ、インクルードするだけでは、うまくいきません。

共通ライブラリには、EAのスタート関数の「OnTick()」が含まれており、そのなかで使う**Tick()**関数が未定義だとエラーになってしまいます。

そこで、「OnTick()」を無効にするために、以下のようにライブラリをインクルードする前に「_SCRIPT」という識別子を定義します。

#define _SCRIPT
#include "LibEA.mqh"

あとは、スクリプトのスタート関数「OnStart()」を記述すればよいわけですが、もう一つ、ポジションの管理を行うために必要なコードがあります。

ポジションの初期化InitPosition()」と、ポジションの更新UpdatePosition()」の二つの関数、これらはEAでは自動的に実行されますが、スクリプトの場合、**OnStart()**の最初に別途記述する必要があります。

void OnStart()
{
	InitPosition();
	UpdatePosition();
}

あとは、適当に発注するコードを記述すれば、裁量発注用のスクリプトとなります。

 MyOrderSend(OP_BUY, 0.1, 0, 0);

このスクリプトを実行して約定したポジションは、マジックナンバーが付加されます。ポジションのマジックナンバーは、「基本マジックナンバー」と「ポジション番号」が同じであれば、同じポジションと見なされるので、EAで処理することができるわけです。

共通ライブラリ特有のマジックナンバーなど詳しいことは、MQL4/MQL5共通ライブラリCodeBase をご参照ください。

Block EAでスクリプトを作成する