2016年5月2日月曜日

[MQL超入門] その018 とりあえずやってみよう!簡単EA作成5

作成した簡単EAのコード説明の後半です。
長くなりましたが、これで簡単EA作成は終わります。

さて、いよいよ実際に取引を行うコードを見てみます。
   bool hasPosition = ( m_wrapper.GetPositionCount() > 0 );
   if ( !hasPosition )
   {
      // ポジションを保持していなければ注文する
      int orderCmd = ( isBuy ? OP_BUY : OP_SELL );
      m_wrapper.SendOrder( orderCmd, Lot, 0, Slippage, StopLoss, TakeProfit );

      // 売/買を反転      
      isBuy = !isBuy;
   }
   else
   {
      // ポジションを保持していれば決済する
      m_wrapper.CloseOrder( 0, Slippage );
   }
順を追って見ていきましょう。

   bool hasPosition = ( m_wrapper.GetPositionCount() > 0 );
注文クラスのGetPositionCount()関数を呼んで、保有ポジションがあるかどうかを判断しています。
GetPositionCount()関数は名前のとおり保有ポジション数を取得する関数です。
ここで、取得した数が0より大きいかというif文のような書き方をしていますが、これはこの条件を満たすかどうかのbool型の値を返すという意味になります。

bool型が分からない方はこちらを見てください。
[MQL超入門] その007 変数の型

   if ( !hasPosition )
ここで、!(びっくりマーク)が出てきました。
これは論理否定演算子、NOT演算子と言い、論理(bool)値を反転させるという意味です。
この場合、hasPositionがfalseの場合に条件を満たすことになりますので
   if ( hasPosition == false )
と同じ意味になります。
つまり保有しているポジションがない場合、という条件です。

      int orderCmd = ( isBuy ? OP_BUY : OP_SELL );
今度は?(はてなマーク)が出てきました。
これは三項演算子と言い、?の前の条件が真の場合は1つ目、偽の場合は2つ目の値を返すという意味なので、
      int orderCmd;
      if ( isBuy )
      {
         orderCmd = OP_BUY;
      }
      else
      {
         orderCmd = OP_SELL;
      }
と同じ意味になります。
実はこの書き方には、「1行で書けるから良い」「いや読みにくいから嫌だ」など賛否ありますが、個人的にはすっきり書けるので好きです。

さて、ここでorderCmdに代入している値が、今から行う取引の種類です。
OP_BUYが成行買い、OP_SELLが成行売りです。
急に取引のプログラムらしくなってきましたね。

      m_wrapper.SendOrder( orderCmd, Lot, 0, Slippage, StopLoss, TakeProfit );
注文クラスのSendOrder()関数が、実際に注文を行う命令です。
引数は以下のとおりです。
・int cmd
  売買種別。種別には以下のものがあります。
   ・OP_BUY : 成行買い
   ・OP_SELL : 成行売り
   ・OP_BUYLIMIT : 指値買い
   ・OP_SELLLIMIT : 指値売り
   ・OP_BUYSTOP : 逆指値買い
   ・OP_SELLSTOP : 逆指値売り
・double volume
  売買ロット。
・double price
  注文価格(成行き時は現在値を自動設定)。
・uint slippage
  許容スリッページ(Pips単位)。
・uint stoploss
  ストップロス(Pips単位)。
・uint takeprofit
  利益確定値(Pips単位)。

売買種別と注文価格以外は、入力パラメータとしています。(このEAでは成行注文しかしないので注文価格は固定で0としています)
このへんもパラメータになっていたほうが後で調整しやすいので、こうしておくのがよいと思います。

      // 売/買を反転      
      isBuy = !isBuy;
買いと売りを交互に行わせるために売買のフラグを反転させています。これも特に意味はありません。

      // ポジションを保持していれば決済する
      m_wrapper.CloseOrder( 0, Slippage );
最後が、決済を行う命令です。注文クラスのCloseOrder()関数で決済をします。
引数は以下のとおりです。
・int index
  決済するポジションのインデックス。(0~)
・uint slippage
  許容スリッページ(Pips単位)。

注文クラスでは、保有ポジションのリストを注文した順に管理しています。
1つめの引数には、0から始まるこの順番で、どのポジションを決済するかを指定します。このEAでは必ず1ポジションしか持たないので、固定で0を指定しています。
また、注文クラスにはCloseOrderAll()という全てのポジションを決済する関数もありますので、全決済の場合にはこちらを使っても構いません。

という事で、やっと一通りの説明が終わりました。
取引自体は結局はSendOrder()とCloseOrder()を呼ぶだけなので、あとはどういうルールで取引するか、つまりどんな条件でこれらの関数を呼ぶか、という話になります。

このEAではその取引ルールが適当で役に立ちませんので、これからはテクニカル指標などを使いながら取引するプログラムを書いていきましょう。

次回はひとまず、説明を飛ばしていたクラスとインスタンスについてのお話をしようかなと思います。

次の回へ

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ MetaTraderへ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。