今回は、BBands_Stops_mtfというインジケーターを使って、下記の機能がついたEAの作り方を知りたいといったお便りを頂きましたので、記事にしていこうと思います!
・シグナルが出た瞬間か次の始値かの取引タイミング選択
・インジケーターのシグナルによる決済のON/OFF
インジケーター【BBands_Stops_mtf.mq4】をダウンロード
今回のように、インディケータにマルチタイムフレーム機能(違う時間足のものを表示させる機能)が付いたものは、バックテストのビジュアルモードで表示できなかったり、バックテストできなかったりしますので、注意が必要です。
MTF機能付きのカスタムインジケーターをEAにするには
MTF機能付きのカスタムインジケーターをEAにするには、次の手順で進めます。
- インジケーター用配列のインデックスを把握する
- iCustom()関数で売買シグナルの値を取得する
インジケーター用配列のインデックスを把握する
通常のインジケーターでは、インジケーター用配列に値を格納してラインや矢印などを描画します。
BBand_Stops_mtfの場合も、インジケーター設定ダイアログの色の設定タブを見ると#の0~5の6つのインジケーター配列が使用されていることがわかります。
今回、シグナルとして使用できそうな一際大きな★マークは#の何番かを確認するために(微妙な色の違い等で分かる人もいますが)、#2のYellowと#3のMagentaの幅を1に変更して再表示させてみると、★マークがグンと小さくなることがわかるかと思います。
iCustom()関数で売買シグナルの値を取得する
iCustom()関数の()括弧内の書き方は、次の通りです。
iCustom(通貨ペア, 時間足, インジケーター名, ..., インデックス, シフト数);
インジケーター名は、文字列で入力します。
その後ろの【, …,】にはインジケーターのパラメーターが入ります。
インデックスはインジケーター用配列のインデックス(#番号)です。
シフト数は、何本前のローソク足の値かを指定します。現在変動中のローソク足の値を取得する場合は、0を入力します。
新規EA作成で【BBands_Stop_checkEA】などの名前にして、BBands_Stops_mtfを利用する練習用のEAを作成します。
インジケーターのパラメーターをEAでも指定できるように、次のようにインジケーターのパラメーター(今回は上から3つ)を設置します。場所は、#property … の下あたりにしましょう。
extern int TimeFrame = 0; extern int Length = 13; extern double Deviation = 1.62;
そして、OnTick()関数内でiCustom関数()を使って、買いシグナルの値を取得してComment()関数で値を確認してみます。
double up_sign = iCustom(NULL, 0, "BBands_Stops_mtf", TimeFrame, Length, Deviation, 2, 0); Comment(up_sign);
バックテストのビジュアルモードで確認してると、TimeFrameを変えるとうまく値が取得できないようです。
そんなときは、iCustom()関数の時間足指定部分にTimeFrameを指定して、インジケーターのパラメーターTimeFrameは0固定で値を取得するようにします。
double up_sign = iCustom(NULL, TimeFrame, "BBands_Stops_mtf", 0, Length, Deviation, 2, 0); Comment(up_sign);
Comment()関数による表示から、★マークが出ているときはその価格(レート)の値になり、そうでないときは、
-1という値になることがわかります。
このComment()関数を使った確認方法はいろんなケースで使えますのでぜひ覚えておいてくださいね!
売りシグナルも取得した全体のコードにゃ
extern int TimeFrame = 0; extern int Length = 13; extern double Deviation = 1.62; void OnTick() { double up_sign = iCustom(NULL, TimeFrame, "BBands_Stops_mtf", 0, Length, Deviation, 2, 0); double dn_sign = iCustom(NULL, TimeFrame, "BBands_Stops_mtf", 0, Length, Deviation, 3, 0); Comment(up_sign, "\n", dn_sign); }
次回(後編)は、今回取得した売買シグナルの値を使って、EAを組み立てていきます。
ケイジさん
早速の御教授ありがとうございます。
丁寧に説明されているのでメタトレ初心者の私にとってとても理解しやすく、読んでいてうれしくなりました。
続編、よろしくお願い致します・・・m(_ _)m
ぶぅーさん
こんにちわ!
お便り・コメントありがとうございます^-^
先はまだまだ長いので、じっくりいきましょうね!
ごたごたしている年末のこの時期に申し訳ありません・・・(^_^;
お世話になります。
ケイジさん
ごたごたしている年末のこの時期に申し訳ありませんがお世話になります・・・(^^;
じっくりですね!了解しました。
よろしくお願い致します。
こんにちわ( ´∀`)
相変わらず、わかり易い講座ですね。
icustomは汎用性が広いので、参考になる人がたくさんいらっしゃると思います。
年末年始で忙しいですが、お互いにがんばりましょう。
では、よいお年をw
ぶぅーさん
年内に続きを書きたいと思いますが、それでも年内に完成できないかもです^^;
ゴメンナサイ・・・。
「完全自動売買への道のり」の記事で復習しながらお待ちくださいm(..)m
えぎさん
こんにちわ。
>相変わらず、わかり易い講座ですね。
お褒めのお言葉ありがとうございます^-^
少しでも、記事を読んでくださる方のお役に立てればうれしいです。
いそがしいですが、がんばりましょうね!
よいお年を!
慶次さん
「完全自動売買への道のり」の復習ですね(>_<)了解しました。熟読いたします。
急ぎませんので年内に完成しなくても大丈夫ですよ。
お忙しい中、ぶぅーの質問に答えるために時間を割いていただき感謝、大感謝しております。
慶次さん、ありがとうございます。
慶次さん
先程、書き込みをしたのですがコメント欄に反映されていないため再度書き込ませていただきます。
「完全自動売買への道のり」の記事で復習ですね(^_^/・・・了解いたしました。熟読いたします。
年内に完成しなくても大丈夫ですよ。
慶次さんの忙しい時間を割いてまでしてぶぅーの質問に対処しようとしていただいて、その気持ちだけでもう十分に感謝、大感謝しております・・・m(_ _)m・・・ありがとうございます。
はじめまして。
最近、FXに興味を持ったのですが、調べていると、よくこちらに行き着きます。ポイントごとの説明が、大変参考になっています。
VQのことも、2週間前にこちらのブログの記事で知りました。VQを利用したEAを作ろうと思い、文法を調べていたところ、またこの記事で数歩前進です。
度々ありがとうございます。
できあがったら報告します!
fxjoeさん
はじめまして!
お役に立てて光栄です^^
VQを利用したEAの完成、応援してます^0^)/
がんばりましょうね!
お元気ですか?
EAが出来ましたので、ご報告しますね^-^
結局VQベースではないのですが・・・試行錯誤の結果、3つ目で使えそうな感じのができました!
どのみちiCustomさまさまです^-^b
昨年1年間で、PF1.5~3.5くらいです。今は汎用性を詰めていく検証をしていて、細かいノイズ除去のロジックを追加できれば、けっこう使えそうな気がします。
貴重な情報を、ありがとうございました。とりあえずお礼まで。
fxjoeさん
こんにちわ。
EA完成したのですね!
劇的大ジャンプって感じですね!
がんばりましょうね^-^
BBband_stops_EAについて、steretagytesterでバックテストができません。
なぜでしょうか?
SEさん
操作履歴にエラー表示はありませんでしょうか?
慶次さん
始めまして。
最近、勉強を始めました。とても記事が参考になります。
***************************
さて、インディケータのコードの・・・
の部分をコピーして、EAのコードに貼り付けてしまいましょう!
***************************
とありましたので、MetaEditorでコピー操作をしたところ、何度やってもMetaEditorが異常終了してしまいます。OSはVistaです。
こういう質問をしても良いものかと思いましたが、もし、何か情報をお持ちであれば、教えていただけると大変助かります。
今後ともよろしくお願いします。
ひろぽんさん
こんにちわ!
Office2007などがインストールされている環境では、IME 2007 に問題がある場合があります。
私の場合は、Microsoft IME に戻すことで解決できました^^;
慶次さん
コメントありがとうございます。今回の投稿が初めてだったのですが、返信をいただけて感激しております。
また、アドバイス通りにしてみたところ、エラーも無くなりました。感激の2乗です。
ありがとうございました。
少しずつですが、勉強を進めていきますので、今後ともご指導を頂けるとありがたいです。
慶次さん
何度もすみません。
早速ですが、iCustom関数の使い方についてご教授いただけると幸いです。
*****************
インディケータのパラメータの最後のものをEAで変更して使いたいというときは、
インディケータのパラメータを全部並べてあげる必要があるわけですね
*****************
とありますが、
1.EAで変更する運用ではなく、インジケータでパラメータを変更するという運用を考えた場合、iCustom関数には、パラメータを省略してもよいという考えでよいでしょうか?
2.インジケータのパラメータを全部並べるとありますが、全部のパラメータはどのように識別するのでしょうか?たとえば、今回のケースで、TimeFrame,Length,deviationと3つを指定されていますが、パラメータには他にも、MoneyRiskなども設定されています。また、パラメータとは、externで宣言されている変数という理解でよろしいでしょうか?
初歩的な質問ばかりで恐縮ですが、アドバイスを頂けると大変助かります。
どうぞよろしくお願いします。
ひろぽんさん
こんにちわ!
1.インディケータ表示時にパラメータを変更した場合は、インディケータにのみ、パラメータ変更が適応されます。
そして、EA内のiCustom関数でパラメータ省略すると、パラメータ初期値のインディケータの値を取得します。
上記の方法ですと、表示インディケータとEAで取得したインジケータでは、値が違うものになってしまいます。
2.今回は、シグナルの位置を特定するパラメータを上から順に並べたのですが、ストップの位置なども取得する場合は、MoneyRiskなども必要になってきますね^^
externで宣言されている変数がパラメータ用変数でOKです^^
慶次さん
いつもご丁寧な返信ありがとうございます。
物分りが悪くて恐縮ですが、頂いた返信内容について、再度確認させていただけると幸いです。
1.パラメータ変更をソース内でのみで実施する運用であれば、ソースで初期値設定した値がEAで適用されるため、iCustom関数のパラメータは省略するという形でもよいという理解でよいでしょうか?
2.インジケータのパラメータを全部並べるというのは、インジケータで設定されているパラメータのうち、EA内で使用するパラメータはすべてという理解でよろしいでしょうか?
お手数をおかけして申し訳ありませんが、お時間があるときにでも、ご返信をいただけると助かります。
ひろぽんさん
こんにちわ。
1.パラメータ変更をソース内でのみで実施する運用
は、インディケータのソースのパラメータの初期値を変更して、運用するといった感じでしょうか?それならば、EAのソース内のiCustom関数の中のパラメータは省略してもOKです。
2.「1つ目のパラメータを省略して2つ目から並べる」ということができません。
あくまでも、「以下省略」といったことができるのみです。
インディケータのパラメータの最後のものをEAで変更して使いたいというときは、
インディケータのパラメータを全部並べてあげる必要があります。
慶次さん
いつもご返信ありがとうございます。何だか理解できたような気がします。私の理解は下記のとおりです。
まず、iCustom関数に入るインジケータのパラメータとは、externで宣言されている変数であること。
次に、EA内で変数を調整したい場合には、インジケータのパラメータを前から順番に記述すること。
たとえば、今回のインジケータには、下記の9個のパラメータがありますが、
1.TimeFrame
2.Length
3.Deviation
4.MoneyRisk
5.Signal
6.Line
7.Nbars
8.IndicatorCorrectName
9.note___Ind_Name
たとえば、EA内で、Lengthの変数を可変にしたい場合には、
iCustom(NULL,0,”BBands_Stops_mtf”,TimeFrame,Length,2,1);
となり、
たとえば、SignalをEA内で可変にしたい場合には、
iCustom(NULL,0,”BBands_Stops_mtf”,TimeFrame,Length,Deviation,MoneyRisk,Signal,2,1);
となるのですね。
このときの前提としては、EA内でExternを使って変数の宣言をすることですね。
重ね重ね恐縮ですが、もし、私の理解が誤っているようでしたら、ご指導いただけると助かります。
慶次さん
何度もすみません。いつも参考にさせていただいています。
さて、下記の記述がありますが、簡単なヒントをいただくことはできないでしょうか?
*****************************
インディケータにマルチタイムフレーム機能がついたものは、バックテストのビジュアルモードでちゃんと表示できなかったり、ちゃんとバックテストできなかったりしますので、気をつけなければなりません。
バックテストでもちゃんと表示させるようにするにはインディケータを修正する必要がありますので省略させていただきますね^^;
*****************************
また、もし、よろしければ、次回のテーマで取り上げていただけないでしょうか?
ご検討いただければ幸いです。
追伸
おかげさまで、インジケーターを利用してEAを作成できるようになりました。やはり、ビジュアル的に売買を確認できたほうが、初心者にとってはわかりやすいです。ありがとうございました。
ひろぽんさん
こんにちわ。
パラメータの件ですが、カンペキです^^
>このときの前提としては、EA内でExternを使って変数の宣言をすることですね。
EA内で、パラメータにする必要のないものは、externをつけなくてもOKです。
>また、もし、よろしければ、次回のテーマで取り上げていただけないでしょうか?
はい、検討しておきますね^^;
慶次さん
ご返信ありがとうございます。
何度もすみませんでした。こういう風に疑問に答えていただけると初心者にとっては、大変ありがたいです。
今後ともよろしくお願いします。
はじめまして、お世話になります。
EA作ろうとして調べていたらこちらのサイトにたどりつきました。
初心者の質問でおそれいりますが、ご教授いただけるとさいわいです。
eaに取り込みたいインディケーターはアラートを表示するもので、ここで説明されているようにiCustom(NULL,0,….,buf番号、シフト)といれると最大バー数?の2147483647がコメントにでてしまいどうしたらよいかほとほとこまっています。
アラートが表示されたときにordersendをだしたいのですが、ご教授いただけるとたすかります。
以上 よろしくお願いいたします。
mimiさん
こんにちわ!
2147483647が表示されている場合は、EMPTY_VALUEが返ってきてますね^^
アラートが表示されたときに、コメント表示に変化がありませんか?
慶次様
お世話になります。ご連絡ありがとうございます。
ビジュアルモードでBTして確認したところ、buyサインの時buy側のバッファーが0でsell側のバッファーが2147483647になり、sellサインの時はその逆になりました。途中83とか85がでますが、0の時にオーダーをだすようにすればなんとかなりそうです。他のフィルターを追加して練って見ます。
念のため他のアラートの出るインディケーターをみてみましたが、こちらは0と2147483647が固定になってしまっていてうまくいきませんでした。あとで、よくみてみます。
数値のインディは問題なくいくのですが、アラートのものはむずかしいです。
またいきずまったら、ご教授お願いいたします。
ありがとうございました。
mimi
またまた、こんにちは。
別のページで質問させて頂いたEAについてなのですが、以前こちらのぺージを参考にして、インジケーターを別のものと差し替えようと
iCustom(Symbol(),0,”3_level_ZZ_Semafor”,
Period1,Period2,Period3,Dev_Step_1,Dev_Step_2,Dev_Step_3,
Symbol_1_Kod,Symbol_2_Kod,Symbol_3_Kod,4,shift+1);
としてみましたが、shift+1としても、サインが出ているとなりの足でエントリーせず、同じ足の中でサインが上下に動いたときにエントリーしてしまいます。
このインジケーターは、予告サイン的で、右方向にも移動するので、サインの動きが止まったときが、エントリーのタイミングのようなのです。
このようなインジケーターからシグナルを受け取る方法はありますか?
さつき
さつきさん
こんにちわ!
>右方向にも移動するので、サインの動きが止まったときが、エントリーのタイミングのようなのです。
右方向に移動するということは、前に出たサインをなかったことにして、新たにサインを出すということですね。
そして、その動きが止まったことが確定するのは、次の反対サインが出たときでしょうか?
その場合は、もうエントリタイミングとしては遅いですね^^;
そうしますと、
『〇本前にシグナルがあって、その後反対シグナルが出ていなければエントリ』
という条件にすることも考えられます。。。
その場合でも、やはりダマシ(〇本前のシグナルが消えてしまう)が起きると思います。
右に移動するサインは、過去の部分では有効に見えますが、有効に見せているということも認識する必要がありますね^^;
慶次様
早速のご回答ありがとうございます。
先ほど上手くリンクがはれなかったのですが、
http://fc888.blog40.fc2.com/blog-entry-436.html
にそのインジケーターの画像があります。
1、2、3の3段階のサインが少し早めに表示されて、右方向に移動する場合もあれば、その足で止まる場合があります。
ダマシもありますが、大体はピークで止まります。
よって、サインが何も出ていない状態になったときがエントリーのタイミングです。
その後、しばらくして反対サインが出てきて、また、止まります。
shift+1では、ダメなようなので、どのように条件設定をすればいいでしょうか?
さつき
さつきさん
こんにちわ!
このインディケータを使ってEAを作る前に、インディケータのコードを解読して、
どのようにシグナルを表示させているかを知る必要があるかと思います^^;
がんばってくださいね^^
慶次 様
ご教示ありがとうございます。
考えてみます。
さつき