超初心者向けEAプログラミング入門⑦

EA
スポンサーリンク

ここではEAプログラミング未経験者や超初心者といった方向けに、EAを使って自動で新規注文(手動ならマウス操作でロングやショートのボタンを押す動作)について説明します。EAの軸となる関数なので是非覚えましょう。

※前回の記事はこちら

新規注文

EAでの新規注文は特にプログラムをがっつりと書くわけではありません。MQL4として関数がすでに用意されているのでそれを使います。

OrderSend()関数

EAで新規注文を行うにはOrderSend()関数を使います。本当にOrderSend(・・・・)と書くだけで新規注文ができて、さらに指値・逆指値注文まで設定できてしまうので一気にEAっぽくなります!()の中の引数が多いので少し難しく感じるかもしれませんが、新規注文を行ううえで必要な情報が殆どですので難しく考えなくてOKです。

それでは早速新規注文の関数を書いてみましょう。書く場所はvoid OnTick()の箇所に書いていきます。

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を動かしてみたらわかりますが、このままでは値動きする度に新規注文をするのでポジションがどんどん増えていってしまいます。
※多分、10万通貨なのですぐに証拠金不足になってそんなには増えないと思います

そこで、「ポジションを1つ持ったら決済されるまでは追加でエントリーしたくないんだけど・・・」となった場合どうしたらいいでしょうか。

自分の現在のポジション数を確認して、1つ以上あったら新規注文プログラムの箇所を飛ばしたらいいだけですね!

ポジション数を確認する関数も当然用意されています。とても簡単ですので、確認していきましょう。

OrdersTotal()関数

自分の現在のポジション数を確認する関数は、OrdersTotal()関数になります。この関数は、引数は特にありません。これをプログラムすると、自分の現在のポジション数を教えてくれます。

では、OrdersTotal()関数と、前に習ったif文を使って書いていきます。こんな感じです。

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)を追加しました。そして、{}で新規注文処理を囲っています。

※変更前(左)と変更後(右)で比較してみると、変更された場所は3行だけですね

OrdersTotal()は、ポジションがない場合0が返ってくるので、0と同じ扱いです。つまりif(0==0)となるので、if文で囲った中の新規注文処理を行うわけですね。
※0==0というのは、最初は少し違和感があるかもしれませんが0は0なので正しいという意味です。ただ、日常生活で考えたら箸は箸だと言っているようなものなので、プログラムミング独特の考えな気もします

逆にポジションが1つある場合は、if(1==0)となります。これは誤りなので、if文で囲った中の新規注文処理を行わないという形になります。

以上、3行追加しただけで、すでにポジションがある場合は新規注文しないようになりました。

最後に

いかがでしたでしょうか。OrderSend()関数を覚えるだけで一気にEAっぽくなりましたね!

OrderSend()関数の他にも、

  • OrderClose()関数・・・決済注文
  • OrderModify()関数・・・注文変更
  • iMA()関数・・・移動平均線の値を取得

等を使っていくとさらに自分の思ったようなEAを作って行くことができるようになります。このサイトでは全ての関数を解説して行く事は考えていませんが、是非色々な関数を使えるようにしていきましょう。

次回、入門⑧では移動平均線の値を元にエントリーする方法について書いています。

コメント

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