iCustom のアレの話。

Taka 2010/04/08 03:58
いつも(毎日)ですが、ほんと勉強になります。ありがとうございます。
いつも見ているだけでしたが、壁にぶち当たりコメントさせていただきます。
iCustomについてなのですが、いまいちわからないのでよろしかったら教えてください。


1.iCustomを使用したインディケーターすると関連するそのインディケーター内のオブジェクトも表示されてしまうのですが。。。
これはiCustomを使用すると、そのファイルを一度すべて実行するので、オブジェクトも実行されてしまうのでしょうか?


2.パラメーターを指定するときは、3つあるうちのひとつではなく、すべて指定と解釈しているのですが、ひとつ書いても返ってきます。違いが良くわかりませんので教えていただけないでしょうか?


3.またはiCustomのパラメーター指定は指定したBufferだけにかかわるものだけだと思っていたのですが、ファイル全体のexternを指定できるのでしょうか?するのでしょうか?


4.ファイル内でiCustomを5つ使用(ファイルは同じインディケーターで、Buffer0〜4など)する場合はインディケーター全体を5回繰り返すので、遅くなるということでしょうか?
もしそうであれば一度実行して5個の数値をとることは可能でしょうか?


この手の疑問は、自分で検証する為のコードを書いて実証実験するのが簡単です。
1番目の質問は、実際そうなるので、iCustom で呼ばれてもオブジェクトは作られてしまうということです。
先日公開した、アンディのMTF透明雲版は、MTF化するのに内部で iCustom で自分自身を呼び出す都合上、iCustom で呼ばれたときは透明雲オブジェクトを作らないようにする必要がありました。なので、さりげなく iCustom で呼び出すときの引数で オブジェクトを作るかどうかを指定するようにしています。


2〜4は、以下のようなコードで確認してみると良いです。サンプルは、こちらからダウンロードできます。
まず、呼ばれるインジケータ側は、呼び出し回数とextern の引数をプリントするようにします。

↑画像にはありませんが、

extern int a=5;
extern int b=10;
extern int c=15;

という設定がされているインジケータです。




EA側は、以下のように6回 iCustom を使います。

↑extern の引数部分を微妙に省略しています。(a,b,c)=(5,10,15)が入っています。


これで記録されたログが以下の図です。

EA Call count が1つ増えるたびに、インジケータの count も1つずつ増えています。
EA の1回の呼び出しに対して、引数部分を微妙に省略しても実質インジケータ側のデフォルト設定である (5,10,15)が正しく渡るので、インジケータ側の呼び出され回数も1回で済んでいます。つまり、4番目の質問の答えは遅くならないということです。


iCustom の実装が賢いんだねぇ。うんうん。素晴らしい…











…で、終われたら良かったのですが、iCustom のextern 引数部分の省略にはちょっとした罠があります。
以下のようなEAで、iCustom で引数省略をしてインジケータのデフォルト値を使った時の値と、別の (3,9,18) を指定した値を取得しようとしたとします。


このEAを実際に動かした時のログが下記です。

EAの1回目の呼び出しでは、省略した方が (5,10,15) で、指定した方が(3,9,18) と、別々にインジケータが呼ばれているのが分かります。ところが、2回目以降の呼び出しでは、(3,9,18)のみが呼ばれています。


これはどういうことかというと…iCustomでextern 引数を省略した場合、どんな値が使われるのかは MT4 に委ねられるということです...。^^;
extern 引数が全て省略された状態では、EAのメモリ上に(3,9,18)のインジケータが読み込まれていたら、(3,9,18)のデータを使われてもプログラマは文句を言えないのです..orz




ちなみに、最初のiCustom で引数を1つだけ指定した場合…

(5,??,??) と、(3,9,18) は、同一に扱えないので、意図したとおりに動きます。


結論としては、extern 引数を省略したり、中途半端に指定するぐらいなら、全部指定した方が安全確実!といったところでしょうか。。