ソースコードを見やすくしよう!リファクタリング③

こんにちは~。

MQLをマスターしたくて横断歩道の白いところを歩く(無意味)りょうです。

今回は前回前々回に引き続きリファクタリングをやっていきます!

りょう

これ以上僕の愚かなコードをさらされると泣いちゃう!

にゃんぽこ

どんどん見ていくよ

TOC

いらない関数を削除しよう

今回手を付けるコードはこちらです。

//エントリー状態であればエントリー許可を出さない
if( ENTRIED() == true ) {
   EntriePermission = false;
} else {
   EntriePermission = true;
}

//条件を満たせばエントリーする(終値監視オフの時)
if( EntriePermission == true && switchonoff == SWITCH_OFF )
//上昇パーフェクトオーダーおよび下ヒゲピンバー発生時、下ヒゲが中期化長期のSMAに触れるとロングエントリー
   if(PerfectOrder1increace( smashort, smamiddle, smalong ) == true &&
         PositivePinBar( ClosePrice, OpenPrice, HighPrice, LowPrice ) == true ) {
      if((MathMin(OpenPrice, ClosePrice) >= smamiddle && smamiddle >= LowPrice ) ||
            (MathMin(OpenPrice, ClosePrice) >= smalong && smalong >= LowPrice)) {
         EntriePermission = false;
         int result = OrderSend( Symbol(), OP_BUY, buy_lot, Ask, Slippage, Ask - buy_stoploss_pips * Point, 0, MagicNumber, 0, clrBlue );
      }
   }


これはエントリーを行う部分のコードです。
条件がそろえばエントリーを出します。

まず、↓こちらについてです。

//エントリー状態であればエントリー許可を出さない
if( ENTRIED() == true ) {
   EntriePermission = false;
} else {
   EntriePermission = true;
}

これは、

ENTRIED()がtrueのときEntriePermissionがfalse
ENTRIED()がfalseのときEntriePermissionがtrue

という意味で、そしてその下のコードの

//条件を満たせばエントリーする(終値監視オフの時)
if( EntriePermission == true && switchonoff == SWITCH_OFF )

の部分にかかってくるので、

EntriePermissionがtrueのときif文の中が実行される

という意味になります。

にゃんぽこ

・・・あれ?

りょう

ん?

にゃんぽこ

ということは・・・

//条件を満たせばエントリーする(終値監視オフの時)
if( ENTRIED() == false && switchonoff == SWITCH_OFF )

これでよくなります。

りょう

ほわぁーーーーー!!!

また、ENTRIED()関数ですが、どのような判定の関数なのか見ますと、

bool ENTRIED() {
   if(OrdersTotal() > 0) return true;
   else return false;
}

OrdersTotal()が1以上ならtrue
OrdersTotal()が0以下ならfalse


↑という意味です。なので

//条件を満たせばエントリーする(終値監視オフの時)
if( OedersTotal() == 0 && switchonoff == SWITCH_OFF )

↑関数を作らなくてもこれでオッケーです。

りょう

ほ、ほんとうだ・・・

ムゥ

これで無駄な関数が1個減ったにゃ

//エントリー状態であればエントリー許可を出さない
if( ENTRIED() == true ) {
   EntriePermission = false;
} else {
   EntriePermission = true;
}


↑このif文はまるまる要りませんでした。

りょう

ガーン・・・

にゃんぽこ

またやってらぁ

りょう

うぅ・・・

関数を作ってわかりやすくしよう


つづいて続きのコードです。

//上昇パーフェクトオーダーおよび下ヒゲピンバー発生時、下ヒゲが中期化長期のSMAに触れるとロングエントリー
   if(PerfectOrder1increace( smashort, smamiddle, smalong ) == true &&
         PositivePinBar( ClosePrice, OpenPrice, HighPrice, LowPrice ) == true ) {
      if((MathMin(OpenPrice, ClosePrice) >= smamiddle && smamiddle >= LowPrice ) ||
            (MathMin(OpenPrice, ClosePrice) >= smalong && smalong >= LowPrice)) {
         EntriePermission = false;
         int result = OrderSend( Symbol(), OP_BUY, buy_lot, Ask, Slippage, Ask - buy_stoploss_pips * Point, 0, MagicNumber, 0, clrBlue );
      }
   }

このコードはそれぞれ何をしているのかというと、
まずコード部分1行目の

if(PerfectOrder1increace( smashort, smamiddle, smalong ) == true &&


は、『上昇のパーフェクトオーダーが発生しているか』を判定します。
ちなみにパーフェクトオーダーとは↓



次のコード部分2行目の

 PositivePinBar( ClosePrice, OpenPrice, HighPrice, LowPrice ) == true ){


は、『陽線のローソク足に下ヒゲのピンバーが発生しているか』を判定します。

ちなみにピンバーとは↓


次のコード部分3,4行目の

   if((MathMin(OpenPrice, ClosePrice) >= smamiddle && smamiddle >= LowPrice ) ||
         (MathMin(OpenPrice, ClosePrice) >= smalong && smalong >= LowPrice)) {


は、『下ヒゲが中期か長期のSMAに触れているか』を判定しています。

以上がエントリーをするための3つの条件です。

ここまでで1点改善すべきポイントがあります。

ムゥ

明らかに見た目が違うのがあるにゃ

3つ目の条件の『下ヒゲが中期か長期のSMAに触れているか』だけ、関数にしていないのです。

これを別に関数を作ってしまって、スッキリさせます!

//下ヒゲが中期か長期のSMAに触れているかを判定する
bool UpperShadowTouchMA(double OpenPrice, double ClosePrice, double smamiddle, double smalong, double LowPrice) {
   if((MathMin(OpenPrice, ClosePrice) >= smamiddle && smamiddle >= LowPrice) ||
         (MathMin(OpenPrice, ClosePrice) >= smalong && smalong >= LowPrice)) return true;
   else return false;
}


↑これを別で作っておいて、エントリー部分を整理します。
エントリーの部分はこんな感じ↓

//上昇パーフェクトオーダーおよび下ヒゲピンバーが発生時、下ヒゲが中期か長期のSMAに触れるとロングエントリー
   if(PerfectOrderIncrease( smashort, smamiddle, smalong ) == true &&
         PositivePinBar( ClosePrice, OpenPrice, HighPrice, LowPrice ) == true &&
         UpperShadowTouchMA( OpenPrice, ClosePrice, smamiddle, smalong, LowPrice)) == true {
りょう

そうか~関数化したらよかったんだ

にゃんぽこ

そもそも上2つの条件は関数化させてたのになんで1個だけやっとらんかったのだ

りょう

いや・・・、なんででしょう
覚えてないです・・・

未熟なもので頭がこんがらがってくるとコードもぐちゃぐちゃになってきますね・・・(汗)。

つづいて、↓こちら

EntriePermission = false;

こちらですが、これは『エントリーをするとエントリー許可をオフにする』という処理です。
元々は『条件が継続していれば連続してエントリーしてしまうことを防ぐ』つもりで作ったものでした。

が、当記事の前半部分でいらないことが判明していますので削除します。

りょう

・・・あばよ・・・

ムゥ

EntriePermissionちゃんはもっと生きたかったはずにゃ

にゃんぽこ

これ以上不幸なコードを生み出すんじゃないよ・・・

そんなこんなでリファクタリングが終了しました。
最終的な姿がこちらです↓。

//条件を満たせばエントリーする(終値監視オフの時)
if( OedersTotal() == 0 && switchonoff == SWITCH_OFF ) {
//上昇パーフェクトオーダーおよび下ヒゲピンバーが発生時、下ヒゲが中期か長期のSMAに触れるとロングエントリー
   if(PerfectOrderIncrease( smashort, smamiddle, smalong ) == true &&
         PositivePinBar( ClosePrice, OpenPrice, HighPrice, LowPrice ) == true &&
         UpperShadowTouchMA( OpenPrice, ClosePrice, smamiddle, smalong, LowPrice)) == true {
      int result = OrderSend( Symbol(), OP_BUY, buy_lot, Ask, Slippage, Ask - buy_stoploss_pips * Point, 0, MagicNumber, 0, clrBlue );
   }
}
りょう

かなりスッキリしたぞ!

にゃんぽこ

めちゃくちゃ無駄があったね

りょう

ほんと無駄だらけ・・・

関数を使いこなす & リファクタリングのまとめ

結果的に今回のテーマになってしまったのが『関数化』というところだと思います。

修正箇所の1つ目が『不要な関数を削除することで簡潔化』できており、
修正箇所の2つ目が『新たな関数をつくることで簡潔化』できています。

まだまだやりたいことを頭の中で整理して関数をうまく使いこなすという事が出来ていません。

りょう

関数・・・奥が深い・・・

ムゥ

頑張って使いこなすにゃ


前回前々回とリファクタリングのお話をしてきたのですが、ここでこれまでの僕なりのポイントをまとめておきます。

リファクタリングは小分けで修正作業をし、その都度こまめにコンパイル→テストを行う!

入れ子(ネスト)を深くしすぎるのは要注意!

DRY (Don’t repeat yourself) 重複は悪!

頭の中を整理してうまく関数を使いこなす!


これらを守れば今までよりはきれいにリファクタリングされたソースコードが作れそうです!

まだまだ使いこなすには道のりが遠いですが・・・。

おまけ

りょう

はぁー、今回も愚かなソースコードをいっぱいさらしたなぁー・・・


今回リファクタリングという観点で色々修正していましたが、それ以外で修正しなければいけない部分があります。

にゃんぽこ

ほんっとあーたって奴は

りょう

え?まだなんかやってた・・・?


EntriePermission



りょう

あ、 EntriePermission ちゃん・・・



エントリーの正しいスペルは『Entry』です






りょう

りょう

うぎゃあああああぁー!!!

にゃんぽこ

はずかしいのう

ムゥ

はずかしいにゃ

りょう

あぁぁ・・・



プログラミングは英語も覚えなきゃいけないので要注意ですね(汗)。

にゃんぽこ

必要なく生み出され、そして消され、
スペルも間違えられていた EntriePermission ちゃん

りょう

・・・・・

ムゥ

EntriePermission ちゃん かわいそうにゃ

りょう

・・・

にゃんぽこ

これからはグーグルでしっかり調べて正しい英語を使うんだよ

りょう

・・・

にゃんぽこ

ん?

りょう

・・・

にゃんぽこ

あ、しんでる

ムゥ

愚かすぎてしんだにゃ

TOC
閉じる