こんにちは~。
MQLをマスターしたくて横断歩道の白いところを歩く(無意味)りょうです。
今回は前回、前々回に引き続きリファクタリングをやっていきます!
これ以上僕の愚かなコードをさらされると泣いちゃう!
どんどん見ていくよ
いらない関数を削除しよう
今回手を付けるコードはこちらです。
//エントリー状態であればエントリー許可を出さない
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 ちゃん かわいそうにゃ
・・・
これからはグーグルでしっかり調べて正しい英語を使うんだよ
・・・
ん?
・・・
あ、しんでる
愚かすぎてしんだにゃ