今回の記事はhandleについて説明していきます。
iCustom関数を使用したくていろいろ調べましたが、iCustom関数を使うためにはhandleを取得してうんたらかんたら~(心ポッキリ)という感じで2日間かけて調べました。笑
handleについてやっと理解することができましたので、結果は簡潔に、説明はある程度しっかりしていきたいと思います。
handleは一言でいうと数字の入った「変数」
いきなり何を言ってるの?と思われるかもしれませんが、とりあえず「handleは数字の入った変数だと思ってください。」
下記のコードを実行(OnInit内で実行)すると、どちらも「10」という数字が返ってきます。
int handle = iRVI(NULL,0,10);
Print(handle);
Print(iRVI(NULL,0,10));
//結果 2行目:10 3行目:10
「いや、iCustom関数ちゃうやんと思われた方」これを理解できればiCustom関数も使えるようになります。笑
ちなみに、iRVI関数もiCustom関数の一部です。
次のコードは数字が違う結果「10と11」が返ってきます。
int handle1 = iRVI(NULL,0,10);
Print(handle1);
int handle2 = iADX(NULL,0,10);
Print(handle2);
//結果 2行目:10 4行目:11
1つ目のコードは同じiCustom関数、2つ目は違うiCustom関数を出力しています。
上記の2つのコードからiCustom関数が保存されている場所が数字として返ってきていることが予想できます。(ここ重要)
つまり、handleというのはiCustom関数自体が保存されている配列の番号です。(答え)
正確にはhandleというのは関数が実行されていない状態で保存されている配列の番号です。(ここまで理解しなくてもいいかなとは思います。)
いやいや、「見出しと違うやん」と思われた方その通りです。すみません笑
一応視覚的に理解してもらうために下記に画像を添付しておきます。
handleの使い方~CopyBuffer関数~を使う。
handleはざっくりわかったけど、どうやって使うの?って話ですよね。数字が返ってきても全然使えないし、知りたいのは結果ですし。
CopyBuffer関数を使ってhandleを呼び出し、結果を配列で取得します。
まずは結果からみてください。下記のコードを実行(OnCalculate内で実行)すると値を取得できます。
double _RVI[]; //結果を格納する動的配列の準備
Print(CopyBuffer(handle,0,0,1,_RVI));
Print(CopyBuffer(handle,0,0,10,_RVI));
Print(_RVI[0]);
//結果 2行目:1 3行目:10 4行目:最新のバーのRVI値
2行目、3行目の結果からCopyBufferの返り値は配列の長さと見て取れます。
また、4行目の出力の結果から計算結果は配列で保存されていることが確認できます。
さらに、配列のインデックスは0が最新のバーの数値、数字が大きくなるにつれて古いバーになっていきます。
CopyBufferの引数について
CopyBufferの引数について簡単に説明します。
CopyBuffer(int indicator_handle,
int buffer_num,
int start_pos,
int count,
double &double_array[]);
int indicator_handle:取得したhandleの番号を入力します。
int buffer_num:iCustom関数で取得したいBufferの番号を入力します。(例)RVIでは「0」はRVI値、「1」はシグナル値という感じです。
int start_pos:取得したいバーの開始位置を指定します。最新のバーから計算したい場合「0」一本前のバーから計算したい場合「1」というような感じです。
int count:何本計算するか指定します。値は1以上を入力しないとエラーになります。例、「1」の場合start_posの部分だけを計算します。「2」の場合start_posと一本前を計算します。
doule &double_array[]:計算結果を格納する配列を指定します。
まとめ
ハンドルとは?
・handleはhandleというのはiCustom関数自体が保存されている配列の番号
ハンドルの使い方
・CopyBuffer関数の引数としてhandleを使用して計算結果を取得する。
について説明しました。
コメント