複数のシグナル・複数のフィルタを搭載し選択できるEA

複数のシグナル・複数のフィルタを搭載し選択できるEA

今回のテーマは、EAの中で複数のシグナル・複数のフィルタを搭載し、
それを使うかどうかパラメータで選択できるようにする方法です。

サンプルファイルはこちら→Sample_SwitchSignal.zip
(↑'10.01.22 午前 一部修正)

Start()関数の中身は上から、

  • シグナル計算2つ
  • フィルタ計算3つ
  • エントリシグナル計算
  • エグジットシグナル計算
  • ポジション確認
  • エグジット処理
  • エントリ処理

という感じです。

シグナルが2種類、フィルタが3種類あり、
それぞれどれを使うか[Use~]というパラメータで選択できるようにしています。

シグナル計算やフィルタ計算はそれぞれ[~sign]や[~filter]といった
個別の変数に計算結果を代入します。

そして、サンプルファイル132行目~140行目を見てください。

   int sign;
   
   if((!UseMaCrossSignal || MaCrossSign==1) &&
      (!UseMacdCrossSignal || MacdSign==1) &&
      (!UseMaTrendFilter || MaFilter==1) &&
      (!UseAdxFilter || AdxFilter) &&
      (!UseAtrFilter || AtrFilter)) sign=1;
      
   if((!UseMaCrossSignal || MaCrossSign==-1) &&
      (!UseMacdCrossSignal || MacdSign==-1) &&
      (!UseMaTrendFilter || MaFilter==-1) &&
      (!UseAdxFilter || AdxFilter) &&
      (!UseAtrFilter || AtrFilter)) sign=-1;

エントリ用のシグナルを代入する整数変数 sign を宣言。
もし、
UseMaCrossSignal が false または、MaCrossSign が1で
UseMacdCrossSignal が false または、MacdSign が1で
UseMaTrendFilter が false または、MaFilter が1で
UseAdxFilter が false または、AdxFilter が true で
UseAtrFilter が false または、AtrFilter が true の場合、
signに1を代入
もし、
UseMaCrossSignal が false ・・・(省略)
・・・の場合、
signに-1を代入

といった感じにします。

これで、選択されたシグナルやフィルタのみを使ったシグナルが
sign に入ります^^

フィルタのシグナル用の変数でtrue/falseのbool型の場合は、
外でif文で書いてもいいですね^^

その下のエグジット用のシグナルの条件では
サンプルではフィルタ用の条件は含めてませんが、
書き方としては、同じ感じですね^^

そのほかで、ちょっと分かりづらいところがありますが^^;
コメントで質問してくださいね^^;

でわ、このへんで^^

タグ

トラックバック(0)

このエントリーのトラックバックURL:
http://www.dr-ea.com/base/mt-tb.cgi/94

コメント (6)

慶次さん、こんにちは。
どうもありがとうございます。
勉強になりました。
この書き方は時間フィルター等いろいろな場面で使える表現方法ですね。
早速、自作EAの修正を行いました。
プログラムがぐんと短くできました。
それでは、今後ともよろしくお願いします。

投稿者:よっし~ |2010年1月22日 21:06

よっし~さん

こんにちわ^^
私もいろいろな分岐の書き方をやってみましたが、
この書き方が一番修正等が楽です^^;

また、シグナルとフィルタを分けて考えることでエントリシグナルやエグジットシグナルの作成がやりやすくなりますね!

投稿者:慶次 |2010年1月23日 08:13

慶次さん。

こんばんは!

いつも、お世話になっております。

私も、シグナル、フィルター、トレイル、クローズ毎に
個々に選択できるように書いてます。

最近のODLでは、成り行き注文時に、初期SL値が設定不可に
なってしまった為、逆指値注文を行うようにしていたので、
オーダー時の仕掛値の設定方法も、複数設定できるように、選択式にしています。

ところで。
MT4でバックテストを行っている際に、
テスト期間が長いと、後半になるにつれて、非常に遅くなることは
ありませんか。

単に、テスト期間を分割して行えばいいのかと思ったのですが、
もし、なにか御存じでしたらと思いまして。

投稿者:マーサー |2010年1月26日 21:26

マーサーさん

こんにちわ!

MT4のバックテストでは、
データのVolume(ティック数)によってバックテストのティック数が決められているようです。
Volumeが多いところでは、その分次の足に進むのが遅くなるようです。

また、EA内に繰り返し文で過去すべてのデータから計算されるような部分がありますと、
期間が長ければ長いほど、後の方は処理に時間がかかってしまいます^^;

投稿者:慶次 |2010年1月27日 12:35

いつもコメント、ありがとうございます。

確かに、volume(ティック数)も関連しているようですが、
やっぱり後半の方が、遅いような感じです。。

変なこと言って、失礼いたしました。。 ^^;


最近は、以前に作成したR倍数の自動計算するシステムを
改善しまして、複数のシステム・通貨ペア毎の結果より
R倍数の計算結果を、ポートフォリオで、検証を行えるようにして、
ポジションサイズの調整をできるように致しました。

今度のは、かなり、スピードも改善されていますので、
お手隙の時に、チェックしていただけると幸いです!

そういえば、タープ博士の本が、また発売されましたね!
「ポジションサイジング入門」

途中までしか読んでいないのですが、
NLPをもとにしたトレード心理面の強化と、
R倍数をもとにしたポジションサイズの検証方法
をメインにしているようです。

「魔術師たちの心理学」に比べると、
かなり読みやすそうです。

投稿者:マーサー |2010年1月28日 02:35

マーサーさん

こんにちわ!

バックテストを繰り返していると、確かに遅くなりますね^^;
メモリを圧迫しているような感じです。
また、何か分かりましたら連絡しますね^^

>複数のシステム・通貨ペア毎の結果より
>R倍数の計算結果を、ポートフォリオで、検証を行えるようにして、
>ポジションサイズの調整をできるように致しました。

すばらしいです!
ぜひ使ってみたいですm(_ _)m

タープ博士「ポジションサイジング入門」が出たんですね^^
ポジションサイジングは最重要項目ですからね^^
早速読んでみます。ありがとうございました!

投稿者:慶次 |2010年1月28日 16:20

コメントを投稿する






画像の中に見える文字を入力してください。

Captchaの認証で入力ミスがありますと、コメントが消えてしまいますのでご注意ください。
コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。