【MQL5】 MT5のEA作成の勉強 その8 MACD Sample を書き換えてみる (2/2)

【MQL5】 MT5のEA作成の勉強 その8 MACD Sample を書き換えてみる (2/2)

まえがき

 前回の投稿で、公式サイトのMACD Sampleの説明を読みつつ、Parabolic SARを使った判定を行うEAを作成しました。エラーもなく、無事にコンパイルとテスターでの実行まで漕ぎ着けたのですが、どういうわけか、想定した条件が満たされても注文が行われないという状況に陥りました。
 そこで今回はMQL5のデバッグ機能を使い、うまく行かない原因の究明&解決を目指したいと思います。

目標とする動作

 今回目指す取引条件は以下です。

  • ロングポジションオープン 
    Parabolic SAR の値が価格を下抜いたら
    (=Parabolic SAR の値が、現在のバーで開始価格より下にあり、前回のバーでは開始価格より上にある場合 )
  • ショートポジションオープン
    Parabolic SAR の値が価格を上抜いたら
    (=Parabolic SAR の値が、現在のバーで開始価格より上にあり、前回のバーでは開始価格より下にある場合)
  • ロングポジションクローズ
    ショートポジションオープンと同じ条件
  • ショートポジションクローズ
    ロングポジションオープンと同じ条件

ロング/ショートポジションオープン処理

 やっとある程度自前のコードになってきました。ざっくり言うと、以下の流れです。

  1. CopyRatesMqlRates構造体(価格情報)を取得する。
  2. 取得したMqlRates構造体の最新の「tick_volume」 が1以下であることを以て新規バーの判定を行う。
  3. Parabolic SAR の値と価格情報を比較し、判定を行う。

 ちなみに、価格取得と新規のバーでのみ取引をする判定の処理については、公式サイトのMoving Averageを参考にしました。他の処理についても、 Parabolic SAR の値に関する判定条件以外は概ね同じ書き方です。
 しかし、残念なことに、このコードでバックテストを行うと、一度もポジションがオープンされないという結果になりました。

動作確認と原因究明

 ロングポジションをオープンする条件を満たすチャートの周辺を、各変数の値を確認しながら見て行くと、以下のようになりました。

 上記の図からわかることとして、まず、指標と価格の変数はいずれも想定したものを取得できていることが分かります。また、それらの変数を使った判定も、想定どおりの結果を返しています。一方、問題になっているのは、下から二番目の画像の、Parabolic SAR が価格バーの上から下に移動したタイミングです。図を見ると、ここだけ一気に日本バーが進んでいます。何度も確認しましたが、何故かこのタイミングのみ判定処理に入れず、その結果、買い注文が行われないという結果になっているようです。
 そこで、テスト期間を伸ばし、取引ができるタイミングを探してみました。その結果、以下の画像のような時にのみ、取引ができることが分かりました。

全てに共通する条件として、以下の二点があります。

  1. Parabolic SAR が価格バーの上から下に移動するタイミングの直前の終値が、移動前 Parabolic SAR の値を超えてる。
  2. Parabolic SAR が価格バーの下から上に移動した直後に上から下に移動している。

これはめったに起こらないチャートパターンなので、動作確認用の短期間のチャートでは条件にあてはまるパターンが含まれなかったようです。ちなみに、条件2については、ここには載せていませんが、必ずしも満たしていない場合もありました。ただし、そのすべてが所謂「窓」と呼ばれる週初めの値動きの空白をまたぐ形になっていたため、必須かどうかは不明です。
 どちらにせよ、問題になっているのは「取引が起こるはずのバーで判定が行われていない」という点です。そこで、試しに、新規バーでのみ取引を行う判定を外してみたところ、以下の様に、バーの価格変動の最中(tick_volumeが1より大きい)に取引が実行されました。

ここで注目したいのは、まだ終値の確定していないバー(右端)におけるParabolic SARが既に計算されている点です。多くのインジケーターは始値や終値を使うので、てっきり終値が確定してから計算されるイメージを持っていましたが、じつは Parabolic SAR の計算にはこれらは必要ありません。(詳しくは以下をご覧ください。)
https://www.oanda.jp/lab-education/beginners/technical_analysis/parabolic/
そのため、どうやら Parabolic SAR はバーの中でリアルタイムに計算されているようです。つまり、あとから見て取引が行われる条件を満たしているバーでも、そのバーについて判定を行うタイミングでは、実は条件を満たしていない、ということになっているようです。

処理の改善

 これまでの調査で、Parabolic SARを使う判定を、バーの最初でしか動かないようにするのは問題ということが分かりました。そこで、各処理の新規バーでのみ取引を行う判定を削除してデバッグしたところ、Parabolic SAR が価格と交差するタイミングで取引を行うことができるようになりました。利食い、損切の設定もきちんと動作しています。

バックテスト

 試しにバックテストを行ってみます。期間は2019/1/1~2020/12/31です。単一のインジケーターを使っている割にはそこまで大きな損失もなく、意外に良い感じです。最も、勝てる時にしか勝てない、階段状のチャートになっているのでまだまだ実用には堪えませんが。

まとめ

 無事に 、Parabolic SARを使う判定をEAに導入することができました。ちなみに、画像を取り忘れてしまったのですが、 新規バーでのみ取引を行う判定を削除し た直後は、一本のバーで無数のショートポジションオープンとクローズが繰り返されるという現象が発生していました。これは、ショートポジションのオープン条件とクローズ条件が同じになっていたため、ティックごとにそれらが繰り返された結果起こった現象です。この例はただのミスですが、現状のソースでは、口座設定で複数ポジションを許可した場合、ポジションオープンの条件を満たすバーで、ティックの数だけポジションがオープンされてしまうことが想定されます(もしかしたら、ベースとして参考にした MACD Sample で対策済みかもしれませんが)。いずれにせよ、きちんと確認しなければ恐ろしくて使えないので、次回は複数ポジションに関する制御を確認してゆきたいと思います。