BarsCalculated関数の働き・役割
BarsCalculated関数は、指定されたインジケータの計算されたデータ数を返すために使用されます。この関数を使用することで、インジケータのデータがどれだけ計算されたかを確認することができます。特に、インジケータのハンドルが利用可能になった直後にインジケータデータを取得する際に便利です。
BarsCalculated関数の引数について
BarsCalculated関数の引数構成は以下の通りです。
int BarsCalculated(
int indicator_handle // 指標ハンドル
);
各引数の説明
BarsCalculated関数の戻り値について
BarsCalculated関数は、指定されたインジケータのバッファで計算されたデータの量を返します。エラーが発生した場合、またはデータがまだ計算されていない場合は-1を返します。
BarsCalculated関数を使う際の注意点
BarsCalculated関数は、インジケータのハンドルが利用可能になった直後にインジケータデータを取得する必要がある場合に便利です。この関数を使用して、インジケータのデータが十分に計算されているかどうかを確認できます。計算が完了していない場合、必要なデータが取得できないことがあります。
BarsCalculated関数を使ったサンプルコード
以下は、BarsCalculated関数を使用してフラクタルのデータを取得し、エキスパートログに出力するサンプルコードです。
void OnStart()
{
// 指標データを格納するための配列を定義します
double Ups[];
// 配列に時系列の索引付けを設定します
ArraySetAsSeries(Ups, true);
// フラクタル指標のハンドルを作成します
int FractalsHandle = iFractals(NULL, 0);
// エラーコードをリセットします
ResetLastError();
// 指標値をコピーを試みます
int i, copied = CopyBuffer(FractalsHandle, 0, 0, 1000, Ups);
// データのコピーに失敗した場合の処理
if(copied <= 0)
{
// 50ミリ秒待機して再試行します
Sleep(50);
for(i = 0; i < 100; i++)
{
// BarsCalculated関数を使用してデータが計算されたか確認します
if(BarsCalculated(FractalsHandle) > 0)
break;
// データが計算されていない場合、再度50ミリ秒待機します
Sleep(50);
}
// 再度データのコピーを試みます
copied = CopyBuffer(FractalsHandle, 0, 0, 1000, Ups);
// データのコピーに再度失敗した場合の処理
if(copied <= 0)
{
// エラーメッセージをエキスパートログに出力します
Print("Failed to copy upper fractals. Error = ", GetLastError(),
" i = ", i, " copied = ", copied);
return;
}
else
{
// データのコピーに成功した場合の処理
Print("Upper fractals copied",
" i = ", i, " copied = ", copied);
}
}
else
{
// 初回のデータのコピーに成功した場合の処理
Print("Upper fractals copied. ArraySize = ", ArraySize(Ups));
}
}
少し長めのコードなので、細かく区切りながらコードの解説をしていきます。
サンプルコードに使われた関数や文法要素の簡単な解説
解説その1
void OnStart()
{
// 指標データを格納するための配列を定義
double Ups[];
// 配列に時系列の索引付けを設定
ArraySetAsSeries(Ups, true);
// フラクタル指標のハンドルを作成
int FractalsHandle = iFractals(NULL, 0);
OnStart関数
OnStart関数は、スクリプトが実行されると自動的に呼び出されるエントリーポイントです。この関数の中にスクリプトの処理内容を記述します。
インジケータデータを格納するための配列を定義
Upsはdouble型の配列で、インジケータデータを格納するために使用されます。この配列にはフラクタルの値が保存されます。
配列に時系列の索引付けを設定
ArraySetAsSeries関数は、指定した配列を時系列として設定します。trueを指定すると、新しいデータが配列の先頭に追加されるようになります。これにより、最新のデータがインデックス0に格納されます。
フラクタルのハンドルを作成
iFractals関数は、フラクタルのハンドルを取得するために使用されます。ハンドルとは、インジケータを一意(1つしか存在しない)に識別するためのIDです。NULLは現在のシンボルを意味し、0は現在の時間枠を意味します。この関数が返すハンドルを使って、フラクタルのデータを取得できます。
フラクタルについて
フラクタルとは、一定の規則に従って繰り返されるパターンを示すインジケータです。トレンドの反転点や相場の転換点を見つけるのに役立ちます。フラクタルは、高値と安値のパターンを分析して、売買のシグナルを提供します。
このコードは、フラクタルのデータを取得するための準備を行っています。Ups配列を時系列として設定し、iFractals関数を使用してフラクタルのハンドルを取得しています。このハンドルを使って、後続の処理でフラクタルのデータをコピーすることができます。
解説その2
// エラーコードをリセットする
ResetLastError();
// 指標値をコピーを試みる
int i, copied = CopyBuffer(FractalsHandle, 0, 0, 1000, Ups);
エラーコードをリセットする
ResetLastError関数は、最後に発生したエラーコードをリセットします。この操作は、次にエラーが発生したときに正確なエラーコードを取得するために重要です。エラーコードがリセットされないまま次の処理に進むと、新しいエラーが発生したときに正しいエラーコードを識別できない可能性があります。
インジケータ値コピーを試みる
CopyBuffer関数は、指定されたインジケータのバッファからデータをコピーします。この場合、フラクタルのデータをUps配列にコピーします。各引数の説明は以下の通りです。
- FractalsHandleは、先に取得したフラクタルのハンドルです。
- 最初の0は、コピーするバッファのインデックスを示します。ここではフラクタルの上部データを示しています。
- 2番目の0は、コピーを開始する位置を示します。0を指定すると最新のデータからコピーを開始します。
- 1000は、コピーするデータの数を示します。この例では、最大1000個のデータをコピーしようとしています。
- Upsは、コピーしたデータを格納する配列です。
エラー処理
コピーの結果は、copied変数に格納されます。この変数は、実際にコピーされたデータの数を示します。もしcopiedが0以下の場合、データのコピーが失敗したことを意味します。この後、エラー処理や再試行のためのコードが続きます。
このコード部分では、インジケータのデータをコピーする準備を整え、実際にデータをコピーしようとしています。これにより、フラクタルの値を取得し、分析や表示に使用できるようになります。
解説その3
if(copied <= 0)
{
Sleep(50);
for(i = 0; i < 100; i++)
{
if(BarsCalculated(FractalsHandle) > 0)
break;
Sleep(50);
}
copied = CopyBuffer(FractalsHandle, 0, 0, 1000, Ups);
}
データのコピーに失敗した場合の処理
copied変数が0以下の場合、データのコピーが失敗していることを意味します。この場合、再試行のための処理を行います。
Sleep関数を使用して待機
Sleep関数を使用して、50ミリ秒間スクリプトの実行を一時停止します。これにより、インジケータデータの計算が完了するのを待ちます。
ループで再試行
forループを使用して、最大100回まで再試行を行います。各ループでは50ミリ秒待機し、インジケータデータが計算されているかどうかを確認します。
BarsCalculated関数を使用してデータが計算されたか確認
BarsCalculated関数を使用して、指定されたインジケータの計算が完了したデータの数を確認します。
BarsCalculated関数が0より大きい値を返した場合、データの計算が完了していることを意味します。この場合、ループを抜けて次の処理に進みます。BarsCalculated関数は、インジケータのデータがどれだけ計算されたかをチェックするための関数で、計算が完了していないとデータが正しく取得できない場合があります。
再試行のための待機
データがまだ計算されていない場合、再度50ミリ秒待機し、再試行します。これを最大100回繰り返します。これにより、インジケータデータが計算されるまで待機し、データの取得を試みます。
CopyBuffer関数を再度呼び出し
ループが終了した後、再度CopyBuffer関数を呼び出してデータのコピーを試みます。この時点でインジケータデータが計算されていれば、データのコピーが成功する可能性が高まります。
この一連の処理により、インジケータデータの計算が完了するまで待機し、データのコピーを再試行することで、必要なデータを確実に取得することを目的としています。
解説その4
if(copied <= 0)
{
Print("Failed to copy upper fractals. Error = ", GetLastError(), " i = ", i, " copied = ", copied);
return;
}
else
{
Print("Upper fractals copied", " i = ", i, " copied = ", copied);
}
}
else
{
Print("Upper fractals copied. ArraySize = ", ArraySize(Ups));
}
データのコピーに再度失敗した場合の処理
もし、再試行の後でもcopied変数が0以下の場合、データのコピーが再び失敗したことを意味します。この場合、エラーメッセージをエキスパートログに出力します。
Print関数でエラーメッセージを出力
Print関数を使用して、エラーメッセージをエキスパートログに出力します。ここでは、以下の情報を出力します。
- エラーメッセージ(”Failed to copy upper fractals.”)
- 最後に発生したエラーコード(GetLastError関数を使用)
- 再試行の回数を示す変数iの値
- 実際にコピーされたデータの数を示すcopied変数の値
この情報により、どのようなエラーが発生したかを確認することができます。
return文で関数を終了
エラーが発生した場合、return文を使用して関数の実行を終了します。これにより、エラー発生時には以降の処理が実行されないようにします。
データのコピーが成功した場合の処理
データのコピーが成功した場合、Print関数を使用して成功メッセージをエキスパートログに出力します。ここでは、以下の情報を出力します。
初回のデータのコピーが成功した場合の処理
最初のCopyBuffer関数呼び出しでデータのコピーが成功した場合、Print関数を使用して、コピーされたデータのサイズをエキスパートログに出力します。ここでは、Ups配列のサイズをArraySize関数を使用して取得し、その値を出力します。
この一連の処理により、データのコピーが成功したかどうかを確認し、結果に応じて適切なメッセージをログに出力することができます。データのコピーが成功した場合には、取得したデータを使用してさらに処理を進めることができますし、失敗した場合にはエラーメッセージを参考にして問題を解決することができます。