2016年5月6日金曜日

[MQL超入門] その019 クラスとインスタンス

簡単EAの説明で、さんざん注文クラスというものが出てきました。さらにはインスタンスという言葉も出てきました。
「クラス」と「インスタンス」とは何か、そしてなぜ注文クラスというものを使っているのでしょうか。その辺を説明していきたいと思います。

なお、クラスを作らなくてもMQLでプログラムはいくらでも作れます。
より本格的なプログラムらしく作るための考え方ですので、興味のない方は読み飛ばしてください。


まず一般的によく言われるのは、
クラスが「型」で、その「実体」がインスタンス。
というものです。
さらにはクラスは「設計図」「雛形」などとも言われます。

という説明だけで分かれば苦労はしないので、もう少し分かりやすくいきましょう。

これもよく取り上げられる例ですが、「車」に例えましょう。
まず先に図で見てみます。
車の設計図が「クラス」。それを元に実際に作られた車が「インスタンス」です。

当たり前ですが、車の設計図だけでは車として乗ることはできません。
実際に作られて車という「モノ」になって初めて乗ることができます。設計図の時点では車としての役には立ちません。

では設計図は何のためにあるのでしょう。設計図は必要ないのでしょうか?
もし設計図がなければ、全く同じものは作れないでしょう。
既に作られた1台を元に、何とかそれらしいものを作ることは出来るかもしれませんが、その全ての車が全く同じに作られていて、全く同じ動きをする保障はできないでしょう。何か問題があった時に、解決するのにも大変な労力がかかることは容易に想像できると思います。


同じ車の設計図からは、当然同じ車が作られます。
ただし同じ設計図から作られていても、作られた2台の車は当然別の「モノ」です。
車Aのアクセルを踏んだら、車Bも一緒に動くなんてこともありません。

つまり車としての作りや機能は保障しながら、「モノ」としては完全に独立させることができます。


さらに、運転者はアクセルを踏んだらなぜ車が進むのかを知っている必要はありません。
内部的な仕組みを知らなくても、使い方を知っていれば使える、というは大きなメリットです。
仕組みがどうなっていて、どのような根拠があって、どのような試験をしてきたか、というのはメーカーが情報を持っていて、必要があれば提供できればそれでよいでしょう。

注文クラスに話を戻すと、例えばSendOrder()は「注文をする」という関数ですが、その中では証拠金不足のチェックやトレードが許可されているか等、様々な考慮をしています。しかし使う側にはそのことを一切知らなくても、全て考慮された上で注文することができます。

複雑な処理でも使う側はそのことを知らずにシンプルに使える、というようにプログラムを作れるということです。


このように、ただ想定どおり動くだけでなく、問題が発見しやすい、後から修正がしやすいなども考えることができると、質の高いプログラムが作れると思います。
ものすごーーーく簡単に、色々すっ飛ばして説明したので、興味のある方は「オブジェクト指向」というものを調べてみてください^^;

次の回へ


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

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

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

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

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へ
にほんブログ村

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