🔰 はじめに|EAの全てはOrderSend()から
「自動で注文を出してくれるEAってどうやって作るの?」
そんな疑問を持つEAプログラミング初心者の方へ、今回は EAで新規注文を行う方法 を解説します。
マウスでクリックして発注していたロングやショートも、EAならワンタッチ…どころか 自動で発注 できます。
その鍵を握るのが OrderSend() 関数。
さらに、今回学ぶ OrdersTotal() 関数 を組み合わせれば、
「ポジションがある時は新規注文しない」という、実用的な仕組みも作れます。
この記事を読み終えるころには、EAが勝手に新規注文してくれるだけでなく、
ムダなポジションを持たない安全な設計 までできるようになっていますよ。
🔗 前回の記事:
▶ 超初心者向けEAプログラミング入門⑥|関数とは?プログラミング効率がグッと上がる仕組み
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の動かし方がわからないという場合はこちら。
ポジションを増やしすぎないための工夫
ただ、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文で囲った中の新規注文処理を行うわけですね。
※0==0というのは、最初は少し違和感があるかもしれませんが0は0なので正しいという意味です。ただ、日常生活で考えたら箸は箸だと言っているようなものなので、プログラムミング独特の考えな気もします
逆にポジションが1つある場合は、if(1==0)となります。これは誤りなので、if文で囲った中の新規注文処理を行わないという形になります。
以上、3行追加しただけで、すでにポジションがある場合は新規注文しないようになりました。
✅まとめ:関数を使いこなそう!
これであなたは、自動で新規注文しつつ、無駄なポジションを作らない安全仕様のEAを作る事が可能になりました。
- OrderSend() 関数 でEAの新規注文は超簡単
- 引数は多いが、まずは主要部分だけ覚えればOK
- OrdersTotal() 関数 を使えば、ポジション管理も自動化できる
- 「ムダなポジションを作らない仕組み」を加えると実用性UP
▶ 次回予告
次回は、いよいよ移動平均線の値を使った売買ロジックを実装します。
EAが チャートの形状を読み取って注文する世界 へ進みましょう。
コメント