EA(自動売買)の注文処理の中心となるのが OrderSend() と OrdersTotal() の2つです。
これらを使いこなせるようになると、EAが実際にポジションを“持つ”動きを理解でき、一気に実践レベルへ近づきます。
OrderSend()の基本(新規注文の出し方)OrdersTotal()を使ったポジション数の確認方法- EAが「いつ注文するか」を判断する流れ
本記事はEAプログラミング入門シリーズ「STEP7」です。
STEP6で関数の基本を学んだら、次はいよいよEAが実際にトレードする心臓部分を触っていきます。
ではまず、EAで「新規注文」を行うための中心機能である OrderSend() のイメージから整理していきましょう。
🚀 OrderSendとは?|EAが実際に注文を出すためのコア関数
EAで新規注文をする場合、ゼロから命令文を書く必要はありません。
MQL4にはあらかじめ用意された便利な関数 があり、それが OrderSend() 関数 です。
この関数を使えば、ロング注文・ショート注文・指値注文・逆指値注文まで一括で設定可能。
() の中に必要な情報(引数)を入れるだけで、EAが自動的に注文を出します。
OrderSend() 関数の書き方例
void OnTick()
{
//---
// 新規エントリー注文
int CNo = OrderSend(
NULL, // 通貨ペア(ドル円等、NULLでチャートの通貨)
OP_BUY, // オーダータイプ[OP_BUY / OP_SELL]
1, // ロット数(FXTFは0.01で1000通貨)
Ask, // 新規注文価格
20, // スリッページ上限
Ask-50 * Point, // 逆指値
Ask+50 * Point, // 指値
"EAテスト", // オーダーコメント
0, // マジックナンバー(識別用)
0, // オーダーリミット時間
clrRed // オーダーアイコンカラー
);
}引数が多いので縦に並べてコメントを書いていますが、以下の書き方でも動きは全く同じです。
int CNo = OrderSend(NULL,OP_BUY,1,Ask,20,Ask - 50 * Point,Ask + 50 * Point,"EAテスト",0,0,clrRed);はい、これだけで値動きする度に『ロング』で『10万通貨分』を『現在の買い値』で新規注文してくれます。さらに、『5pips下がったら損切り』『5pips上がったり利益確定』もしてくれます。立派なEAが完成しましたね!
この、『』で囲まれている所ってどうやって決めてるの?と思われるかもしれませんが、ここを引数で指定しているわけですね。OrderSend()関数の()の中をよく見てみると、カンマ区切りの順でそれらしき情報が含まれている事がわかります。詳しく引数を見ていくと、
- 引数1・・・通貨ペアです(NULLでチャートの通貨になります)
- 引数2・・・ロングorショートを決めれます(OP_SELLでショート)
- 引数3・・・ロット数です(1で10万通貨です)
- 引数4・・・注文価格です(ロング時はAsk,ショート時はBidでOKです)
- 引数5・・・スリッページです(注文値と現在値の差異を幾らまで許容するか)
- 引数6・・・逆指値です(Ask-50*Pointで現在値から5pips下になります)
- 引数7・・・指値です(Ask+50*Pointで現在値から5pips上になります)
- 引数8・・・オーダーコメントです(メモみたいな感覚で使えます)
- 引数9・・・マジックナンバーです(EAを複数動かすときに使います)
- 引数10・・・オーダーリミット時間です(注文の有効期限です)
- 引数11・・・オーダーカラーです(注文時、チャート上にこの色の矢印が出ます)
重要なのは黄色マーカーの箇所で、それ以外は特に今は触る必要はありません。
※スリッページにこだわりがある場合は変更してください
と、引数は多いですが新規注文に必要なものが殆どです。これを、実際にコンパイルしてチャート上でEAとして動かすと上記の動きの通りに新規注文してくれますよ。
コンパイルとかEAの動かし方がわからないという場合はこちら。
📊 OrdersTotal()|ポジション数をチェックして無駄な注文を防ぐ
ただ、EAを動かしてみたらわかりますがこのままだと、価格が動くたびに注文が発生してしまい、
ポジションがどんどん増えてしまいます。
そこで使うのが OrdersTotal() 関数 です。
この関数は「現在のポジション数」を返してくれるので、
ポジションが0のときだけ新規注文する という制御が可能です。
例:ポジションがないときだけ注文する
void OnTick()
{
//---
if(OrdersTotal()==0) //ポジションを保有していない時だけエントリーする
{
// 新規エントリー注文
int CNo = OrderSend(
NULL, // 通貨ペア
OP_BUY, // オーダータイプ[OP_BUY / OP_SELL]
1, // ロット[0.01単位](FXTFは0.01で1000通貨)
Ask, // オーダープライスレート
20, // スリップ上限 (int)[分解能 0.1pips]
Ask-50 * Point, // ストップレート
Ask+50 * Point, // リミットレート
"EAテスト", // オーダーコメント
0, // マジックナンバー(識別用)
0, // オーダーリミット時間
clrRed // オーダーアイコンカラー
);
}
}if(OrdersTotal()==0)を追加しました。そして、{}で新規注文処理を囲っています。

これだけで、
- ポジションがあるとき → 何もしない
- ポジションがないとき → 新規注文
というシンプルで安全な動きにできます。
OrdersTotal()は、ポジションがない場合0が返ってくるので、0と同じ扱いです。つまりif(0==0)となるので、if文で囲った中の新規注文処理を行うわけですね。
OrdersTotal() が 0 を返す場合、if 文は if(0 == 0) という意味になります。
STEP3 で学んだように、== は「等しいか?」を判定する演算子です。
0 は 0 と等しいので、この場合は true になり、中の処理(新規注文)が実行されます。
逆にポジションが 1 つある場合は if(1 == 0) となり、等しくないため false。
その結果、新規注文の処理はスキップされます。
✅まとめ:関数を使いこなそう!
これであなたは、自動で新規注文しつつ、無駄なポジションを作らない安全仕様のEAを作る事が可能になりました。
- OrderSend() 関数 でEAの新規注文は超簡単
- 引数は多いが、まずは主要部分だけ覚えればOK
- OrdersTotal() 関数 を使えば、ポジション管理も自動化できる
- 「ムダなポジションを作らない仕組み」を加えると実用性UP
▶ 次回予告
次回は、いよいよ移動平均線の値を使った売買ロジックを実装します。
EAが チャートの形状を読み取って注文する世界 へ進みましょう。
🧩 EAプログラミング入門シリーズ(超初心者向け)
- STEP0:EAとは?仕組みとプログラムの基礎
- STEP1:MT4の基本ソースコードを理解する
- STEP2:実際にコードを書いて動かす
- STEP3:if文の仕組みを理解する
- STEP4:演算子で条件分岐を強化する
- STEP5:変数の基礎を理解する
- STEP6:関数でコードを整理する
- STEP7:OrderSendとOrdersTotalの基礎
- STEP8:移動平均線でエントリーする方法













コメント