人間なら容易に理解できるが、コードは複雑になる例
移動平均線(MA)の上昇/下降をトレードの仕掛けないし手仕舞い(今まで”仕切り”という表現を使ってきましたが、”手仕舞い”の方が一般的かなと思い、表現を変更しました)条件に使うことはよくあると思います。
移動平均線(MA)が上昇/下降しているというのは、人間にとっては非常に簡単に分かることなのですが、これをMQL4でプログラミングしようとすると、意外と複雑だったりします。
「FXメタトレーダー4 MQLプログラミング」のP164-165によれば、移動平均線(MA)の上昇/下降は、以下のように記述すればよいとあります。
double MA = iMA(NULL, 0, MAPeriod, 0, MAMethod, MAPrice, 0); double LastMA = iMA(NULL, 0, MAPeriod, 0, MAMethod, MAPrice, 1); if(MA > LastMA) { // MAは上昇している } else if(MA < LastMA) { // MAは下降している }
これは、最新のMA(MA)と1つ前のMA(LastMA)の大小関係で上昇/下降を判断していることを意味します。最新のMAの方が1つ前のMAより大きければ上昇、小さければ下降ということですね。
確かに、これが最もシンプルではあるものの、果たしてこれだけでMAが上昇/下降していると判断してよいものでしょうか?
我々がチャートを見る時に、直近2つのMAの価格だけでMAの上昇/下降を判断しているでしょうか?
答えはNOです。過去ずっと上昇しているのに、たまたま最新のMAだけが1つ前のMAより小さくなっただけで、「MAは下降だ!」と判断するのには無理があると思いませんか?
普通は、そんな”点”でMAの上昇/下降を判断せずに、線で判断しますよね。
では、どうすれば、MAの上昇/下降をより実践的に表現できるか考えてみます。
上昇と下降は逆の関係ですので、以降は上昇のケースだけを検討していきます。下降は上昇の内容をひっくり返してください。
まず、移動平均線(MA)というのは、厳密には点の集合だということを念頭におきます。つまり、連続値ではなく離散値だということです。チャート上の曲線は人間が理解しやすいように点の間を補間しているに過ぎません。
言葉だと分かりにくいと思いますので、イメージを載せておきます。黄色の●がMAの値を示しています(初心者でも使い勝手の良いペイントソフトはないものでしょうか。これ作るのに結局1時間もかかりました…)。
MAが上昇しているということはどういう状態でしょうか?私は次のように解釈しました。
ある一定期間内で、あるMAがその1つ前のMAより大きい間隔の割合が多い
具体例で説明します。上図では、24点のMAがあります。あるMAとその1つ前のMAの間隔は23個になります。うち、15個が右肩上がり(あるMAがその1つ前のMAより大きくなっている間隔が15個)になっています。上昇しているということは、点間の間隔の右肩上がりの割合が多いということですね。
ただ、この条件では、MAの点間の上下幅は考慮されていないので、以下のようなケースの場合はミスジャッジしてしまいます。
6点5間隔のうち、右肩上がりが3個、右肩下がりが2個なので右肩上がりの方が割合が多い(3/5)です。しかし、最新のMA(一番右)の方が最古のMA(一番左)より下に位置しているのが分かりますでしょうか?
これを「MAが上昇している」と判断するのは危険な気がします。なので、以下の条件を追加します。
ある一定期間内で、最新のMAが最古のMAより大きい
これにより、上図のケースを排除できます。最終的に上昇していないと、MAが上昇していると言えないので、意味的にも妥当な条件です。
この2つの条件で十分だと思いますが、より厳しく判定するなら以下の条件も追加します。
最新のMAがその1つ前のMAより大きい
冒頭のコードですね。最新のMAが下降したということは、今後も下降するかもしれないということを意味しますので、この条件を追加することでそのリスクを回避できます。
さて、これで条件は揃ったことになります。次回はこれらをMQL4でプログラミングしてみます。