カスタムインディケータをEAにする方法

カスタムインディケータをEAにする方法


今回は、
BBands_Stops_mtf
というインディケータを使って
・途転売買を実行する/しない、の切り替え
・シグナルが出た瞬間の売買/シグナルが出た次のバーの初値で
売買の切り替え
の機能がついたEAの作り方を知りたいといったお便りを頂きましたので、
書いていこうと思います!

まずはインディケータダウンロード
BBands_Stops_mtf.zip(mq4ファイルのダウンロード)


今回のように、インディケータにマルチタイムフレーム機能(違う時間足のものを表示させる機能)がついたものは、
バックテストのビジュアルモードでちゃんと表示できなかったり、ちゃんとバックテストできなかったりしますので、気をつけなければなりません。
バックテストでもちゃんと表示させるようにするにはインディケータを修正する必要がありますので省略させていただきますね^^;


では、早速。
手順としましては、

①インディケータのインデックスを大体把握する。
②iCustom関数で必要なインデックスの値を取得する。
③シグナルに換える。

といった具合です。


①インディケータのインデックスを大体把握する。

通常のインディケータは、特別な配列(インディケータ用配列)をつかって計算します。
普通の配列とは違い、新しい足ができる度に同じように配列の先頭に1つ記憶スペースができるといった機能があります。

そのインディケータ用配列には、

SetIndexBuffer(インデックス番号,インディケータ用配列);
という形でインデックス(番号)が割り当てられています。

BBand_Stops_mtfの場合も、

init()関数の中に

SetIndexBuffer(0,UpTrendBuffer);
SetIndexBuffer(1,DownTrendBuffer);
SetIndexBuffer(2,UpTrendSignal);
SetIndexBuffer(3,DownTrendSignal);
SetIndexBuffer(4,UpTrendLine);
SetIndexBuffer(5,DownTrendLine);


といった具合に、0~5のインデックスがそれぞれ割り当てられています。

この中のどれかを使うわけですが、幸いこのインディケータの場合、

・シグナル系だということ
・インディケータ用配列の名前が分かりやすいということ

で、インディケータの表示と照らし合わせても
買いシグナルにはインデックス2番
売りシグナルにはインデックス3番
を使えばよさそうですね!


②iCustom関数で必要なインデックスの値を取得する。

では早速、Newボタンで新規EA作成しましょう!
ファイル名は、何でもよいですが、BBands_Stops_EAとしましょうか。

iCustom関数の()内の書き方は、

iCustom(通貨ペア,時間足,インディケータ名,,...,インデックス,バーシフト);

です。

インディケータ名は、文字列で入力してあげましょう。

その後ろの【,,...,】が気になりますが、ここにはインディケータのパラメータ(インディケータのプロパティで表示されるもの)が入ります。
省略することもできますが、正確には、『以下省略』という具合に、後ろ側を省略するという感じです。
なので、「1つ目のパラメータを省略して2つ目を入力する」ということができません。
インディケータのパラメータの最後のものをEAで変更して使いたいというときは、
インディケータのパラメータを全部並べてあげる必要があるわけですね^^;

インデックスはインディケータ用配列に割り振られたインデックスです。

バーシフトは、何本前の足の値を使うかという値です。
現在変動中の足での値を取得する場合は、0と入力してあげます。

以上のことを考えると、インディケータで使っているパラメータを
EAでもパラメータ化してあげる必要がありますね!

インディケータのコードの

//---- input parameters
extern int TimeFrame = 0;
extern int Length=13; // Bollinger Bands Period
extern double Deviation=1.62; // Deviation was 2

の部分をコピーして、EAのコードに貼り付けてしまいましょう!
場所は、#property ... の下あたりにしましょう。

そして、start関数の中でiCustom関数を使って、買いシグナルの値を取得してみましょう!

int start()
{
//----
double upsign=iCustom(NULL,0,"BBands_Stops_mtf",TimeFrame,Length,Deviation,2,0);

...

といった感じです。

その後、

Comment(upsign);

として、バックテストのビジュアルモードで確認してみましょう!

んが(T□T;)!!このインディケータ、バックテストではTimeFrameの機能がちゃんと作動しないようです。

こんなときは、インディケータのTimeFrameの機能をつかわず、
iCustom関数のTimeFrameの機能を使いましょう!

int start()
{
//----
double upsign=iCustom(NULL,TimeFrame,"BBands_Stops_mtf",0,Length,Deviation,2,0);

...

という具合です。

これで、TimeFrameで設定した時間足のシグナルが取得できるようになりました。
おまけに、シグナルが出ているときはシグナルの高さ(レート)の値になり、
そうでないときは、-1という値になることがわかりました(^0^)/

このComment関数を使った確認方法はいろんなケースで使えますので、
ぜひ覚えておいてくださいね!


まだ、途中ですが続きは次回とさせていただきますm(..)m

でわでわ。

カスタムインジケータをEAにする方法の関連記事

2008年12月28日|コメント (33)

カテゴリー:EAの作成方法

コメント (33)

ケイジさん

早速の御教授ありがとうございます。
丁寧に説明されているのでメタトレ初心者の私にとってとても理解しやすく、読んでいてうれしくなりました。
続編、よろしくお願い致します・・・m(_ _)m

投稿者:ぶぅー |2008年12月28日 22:30

ぶぅーさん

こんにちわ!
お便り・コメントありがとうございます^-^

先はまだまだ長いので、じっくりいきましょうね!

投稿者:慶次 |2008年12月29日 09:00

ごたごたしている年末のこの時期に申し訳ありません・・・(^_^;
お世話になります。

投稿者:ぶぅー |2008年12月29日 17:13

ケイジさん

ごたごたしている年末のこの時期に申し訳ありませんがお世話になります・・・(^^;
じっくりですね!了解しました。
よろしくお願い致します。

投稿者:ぶぅー |2008年12月29日 17:23

こんにちわ( ´∀`)

相変わらず、わかり易い講座ですね。
icustomは汎用性が広いので、参考になる人がたくさんいらっしゃると思います。

年末年始で忙しいですが、お互いにがんばりましょう。

では、よいお年をw

投稿者:えぎ |2008年12月30日 09:41

ぶぅーさん

年内に続きを書きたいと思いますが、それでも年内に完成できないかもです^^;
ゴメンナサイ・・・。
「完全自動売買への道のり」の記事で復習しながらお待ちくださいm(..)m


えぎさん
こんにちわ。

>相変わらず、わかり易い講座ですね。
お褒めのお言葉ありがとうございます^-^

少しでも、記事を読んでくださる方のお役に立てればうれしいです。

いそがしいですが、がんばりましょうね!
よいお年を!

投稿者:慶次 |2008年12月30日 14:06

慶次さん


「完全自動売買への道のり」の復習ですね(>_<)了解しました。熟読いたします。

急ぎませんので年内に完成しなくても大丈夫ですよ。
お忙しい中、ぶぅーの質問に答えるために時間を割いていただき感謝、大感謝しております。
慶次さん、ありがとうございます。

投稿者:ぶぅー |2008年12月30日 19:39

慶次さん

先程、書き込みをしたのですがコメント欄に反映されていないため再度書き込ませていただきます。
「完全自動売買への道のり」の記事で復習ですね(^_^/・・・了解いたしました。熟読いたします。

年内に完成しなくても大丈夫ですよ。
慶次さんの忙しい時間を割いてまでしてぶぅーの質問に対処しようとしていただいて、その気持ちだけでもう十分に感謝、大感謝しております・・・m(_ _)m・・・ありがとうございます。

投稿者:ぶぅー |2008年12月30日 22:02

はじめまして。

最近、FXに興味を持ったのですが、調べていると、よくこちらに行き着きます。ポイントごとの説明が、大変参考になっています。

VQのことも、2週間前にこちらのブログの記事で知りました。VQを利用したEAを作ろうと思い、文法を調べていたところ、またこの記事で数歩前進です。

度々ありがとうございます。
できあがったら報告します!

投稿者:fxjoe |2009年1月 9日 23:48

fxjoeさん

はじめまして!

お役に立てて光栄です^^
VQを利用したEAの完成、応援してます^0^)/

がんばりましょうね!

投稿者:慶次 |2009年1月10日 07:47

お元気ですか?
EAが出来ましたので、ご報告しますね^-^

結局VQベースではないのですが・・・試行錯誤の結果、3つ目で使えそうな感じのができました!

どのみちiCustomさまさまです^-^b

昨年1年間で、PF1.5~3.5くらいです。今は汎用性を詰めていく検証をしていて、細かいノイズ除去のロジックを追加できれば、けっこう使えそうな気がします。

貴重な情報を、ありがとうございました。とりあえずお礼まで。

投稿者:fxjoe |2009年1月21日 05:12


fxjoeさん

こんにちわ。

EA完成したのですね!
劇的大ジャンプって感じですね!
がんばりましょうね^-^

投稿者:慶次 |2009年1月21日 08:24

BBband_stops_EAについて、steretagytesterでバックテストができません。
なぜでしょうか?

投稿者:SE |2009年1月29日 21:26

SEさん

操作履歴にエラー表示はありませんでしょうか?

投稿者:慶次 |2009年2月 1日 01:11

慶次さん

始めまして。

最近、勉強を始めました。とても記事が参考になります。

***************************
さて、インディケータのコードの・・・
の部分をコピーして、EAのコードに貼り付けてしまいましょう!
***************************

とありましたので、MetaEditorでコピー操作をしたところ、何度やってもMetaEditorが異常終了してしまいます。OSはVistaです。

こういう質問をしても良いものかと思いましたが、もし、何か情報をお持ちであれば、教えていただけると大変助かります。

今後ともよろしくお願いします。

投稿者:ひろぽん |2009年9月 5日 18:24

ひろぽんさん

こんにちわ!
Office2007などがインストールされている環境では、IME 2007 に問題がある場合があります。
私の場合は、Microsoft IME に戻すことで解決できました^^;

投稿者:慶次 |2009年9月 5日 23:40

慶次さん

コメントありがとうございます。今回の投稿が初めてだったのですが、返信をいただけて感激しております。

また、アドバイス通りにしてみたところ、エラーも無くなりました。感激の2乗です。

ありがとうございました。

少しずつですが、勉強を進めていきますので、今後ともご指導を頂けるとありがたいです。

投稿者:ひろぽん |2009年9月 8日 00:25

慶次さん

何度もすみません。

早速ですが、iCustom関数の使い方についてご教授いただけると幸いです。

*****************
インディケータのパラメータの最後のものをEAで変更して使いたいというときは、
インディケータのパラメータを全部並べてあげる必要があるわけですね
*****************

とありますが、
1.EAで変更する運用ではなく、インジケータでパラメータを変更するという運用を考えた場合、iCustom関数には、パラメータを省略してもよいという考えでよいでしょうか?

2.インジケータのパラメータを全部並べるとありますが、全部のパラメータはどのように識別するのでしょうか?たとえば、今回のケースで、TimeFrame,Length,deviationと3つを指定されていますが、パラメータには他にも、MoneyRiskなども設定されています。また、パラメータとは、externで宣言されている変数という理解でよろしいでしょうか?

初歩的な質問ばかりで恐縮ですが、アドバイスを頂けると大変助かります。

どうぞよろしくお願いします。

投稿者:ひろぽん |2009年9月 8日 00:51

ひろぽんさん

こんにちわ!

1.インディケータ表示時にパラメータを変更した場合は、インディケータにのみ、パラメータ変更が適応されます。
そして、EA内のiCustom関数でパラメータ省略すると、パラメータ初期値のインディケータの値を取得します。
上記の方法ですと、表示インディケータとEAで取得したインジケータでは、値が違うものになってしまいます。

2.今回は、シグナルの位置を特定するパラメータを上から順に並べたのですが、ストップの位置なども取得する場合は、MoneyRiskなども必要になってきますね^^
externで宣言されている変数がパラメータ用変数でOKです^^

投稿者:慶次 |2009年9月 8日 08:16

慶次さん

いつもご丁寧な返信ありがとうございます。

物分りが悪くて恐縮ですが、頂いた返信内容について、再度確認させていただけると幸いです。

1.パラメータ変更をソース内でのみで実施する運用であれば、ソースで初期値設定した値がEAで適用されるため、iCustom関数のパラメータは省略するという形でもよいという理解でよいでしょうか?

2.インジケータのパラメータを全部並べるというのは、インジケータで設定されているパラメータのうち、EA内で使用するパラメータはすべてという理解でよろしいでしょうか?

お手数をおかけして申し訳ありませんが、お時間があるときにでも、ご返信をいただけると助かります。

投稿者:ひろぽん |2009年9月 9日 23:59

ひろぽんさん

こんにちわ。

1.パラメータ変更をソース内でのみで実施する運用
は、インディケータのソースのパラメータの初期値を変更して、運用するといった感じでしょうか?それならば、EAのソース内のiCustom関数の中のパラメータは省略してもOKです。

2.「1つ目のパラメータを省略して2つ目から並べる」ということができません。
あくまでも、「以下省略」といったことができるのみです。
インディケータのパラメータの最後のものをEAで変更して使いたいというときは、
インディケータのパラメータを全部並べてあげる必要があります。

投稿者:慶次 |2009年9月10日 17:19

慶次さん

いつもご返信ありがとうございます。何だか理解できたような気がします。私の理解は下記のとおりです。

まず、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を使って変数の宣言をすることですね。

重ね重ね恐縮ですが、もし、私の理解が誤っているようでしたら、ご指導いただけると助かります。


投稿者:ひろぽん |2009年9月12日 21:04

慶次さん

何度もすみません。いつも参考にさせていただいています。

さて、下記の記述がありますが、簡単なヒントをいただくことはできないでしょうか?

*****************************
インディケータにマルチタイムフレーム機能がついたものは、バックテストのビジュアルモードでちゃんと表示できなかったり、ちゃんとバックテストできなかったりしますので、気をつけなければなりません。
バックテストでもちゃんと表示させるようにするにはインディケータを修正する必要がありますので省略させていただきますね^^;
*****************************

また、もし、よろしければ、次回のテーマで取り上げていただけないでしょうか?

ご検討いただければ幸いです。

追伸
おかげさまで、インジケーターを利用してEAを作成できるようになりました。やはり、ビジュアル的に売買を確認できたほうが、初心者にとってはわかりやすいです。ありがとうございました。

投稿者:ひろぽん |2009年9月12日 23:56

ひろぽんさん

こんにちわ。

パラメータの件ですが、カンペキです^^
>このときの前提としては、EA内でExternを使って変数の宣言をすることですね。

EA内で、パラメータにする必要のないものは、externをつけなくてもOKです。

>また、もし、よろしければ、次回のテーマで取り上げていただけないでしょうか?

はい、検討しておきますね^^;

投稿者:慶次 |2009年9月13日 19:24

慶次さん

ご返信ありがとうございます。

何度もすみませんでした。こういう風に疑問に答えていただけると初心者にとっては、大変ありがたいです。

今後ともよろしくお願いします。

投稿者:ひろぽん |2009年9月14日 00:08

はじめまして、お世話になります。
EA作ろうとして調べていたらこちらのサイトにたどりつきました。
初心者の質問でおそれいりますが、ご教授いただけるとさいわいです。
eaに取り込みたいインディケーターはアラートを表示するもので、ここで説明されているようにiCustom(NULL,0,....,buf番号、シフト)といれると最大バー数?の2147483647がコメントにでてしまいどうしたらよいかほとほとこまっています。
アラートが表示されたときにordersendをだしたいのですが、ご教授いただけるとたすかります。
以上 よろしくお願いいたします。

投稿者:mimi |2010年9月 9日 10:11

mimiさん

こんにちわ!

2147483647が表示されている場合は、EMPTY_VALUEが返ってきてますね^^
アラートが表示されたときに、コメント表示に変化がありませんか?

投稿者:慶次 |2010年9月 9日 11:38

慶次様
お世話になります。ご連絡ありがとうございます。
ビジュアルモードでBTして確認したところ、buyサインの時buy側のバッファーが0でsell側のバッファーが2147483647になり、sellサインの時はその逆になりました。途中83とか85がでますが、0の時にオーダーをだすようにすればなんとかなりそうです。他のフィルターを追加して練って見ます。

念のため他のアラートの出るインディケーターをみてみましたが、こちらは0と2147483647が固定になってしまっていてうまくいきませんでした。あとで、よくみてみます。
数値のインディは問題なくいくのですが、アラートのものはむずかしいです。

またいきずまったら、ご教授お願いいたします。

ありがとうございました。
mimi

投稿者:mimi |2010年9月 9日 16:01

またまた、こんにちは。

別のページで質問させて頂いた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としても、サインが出ているとなりの足でエントリーせず、同じ足の中でサインが上下に動いたときにエントリーしてしまいます。
このインジケーターは、予告サイン的で、右方向にも移動するので、サインの動きが止まったときが、エントリーのタイミングのようなのです。

このようなインジケーターからシグナルを受け取る方法はありますか?

さつき

投稿者:さつき |2010年10月23日 15:49

さつきさん

こんにちわ!

>右方向にも移動するので、サインの動きが止まったときが、エントリーのタイミングのようなのです。

右方向に移動するということは、前に出たサインをなかったことにして、新たにサインを出すということですね。
そして、その動きが止まったことが確定するのは、次の反対サインが出たときでしょうか?
その場合は、もうエントリタイミングとしては遅いですね^^;

そうしますと、
『〇本前にシグナルがあって、その後反対シグナルが出ていなければエントリ』
という条件にすることも考えられます。。。
その場合でも、やはりダマシ(〇本前のシグナルが消えてしまう)が起きると思います。

右に移動するサインは、過去の部分では有効に見えますが、有効に見せているということも認識する必要がありますね^^;

投稿者:慶次 |2010年10月23日 17:48

慶次様

早速のご回答ありがとうございます。
先ほど上手くリンクがはれなかったのですが、
http://fc888.blog40.fc2.com/blog-entry-436.html
にそのインジケーターの画像があります。
1、2、3の3段階のサインが少し早めに表示されて、右方向に移動する場合もあれば、その足で止まる場合があります。
ダマシもありますが、大体はピークで止まります。
よって、サインが何も出ていない状態になったときがエントリーのタイミングです。
その後、しばらくして反対サインが出てきて、また、止まります。
shift+1では、ダメなようなので、どのように条件設定をすればいいでしょうか?

さつき


投稿者:さつき |2010年10月23日 18:19

さつきさん

こんにちわ!

このインディケータを使ってEAを作る前に、インディケータのコードを解読して、
どのようにシグナルを表示させているかを知る必要があるかと思います^^;
がんばってくださいね^^

投稿者:慶次 |2010年10月24日 09:45

慶次 様

ご教示ありがとうございます。
考えてみます。

さつき

投稿者:さつき |2010年10月25日 06:57

コメントを投稿する

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)






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

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