【MQL5】BarsCalculated関数について

MQL5リファレンス
スポンサーリンク

BarsCalculated関数の働き・役割

BarsCalculated関数は、指定されたインジケータの計算されたデータ数を返すために使用されます。この関数を使用することで、インジケータのデータがどれだけ計算されたかを確認することができます。特に、インジケータハンドルが利用可能になった直後にインジケータデータを取得する際に便利です。

BarsCalculated関数の引数について

BarsCalculated関数引数構成は以下の通りです。

int BarsCalculated(
  int indicator_handle  // 指標ハンドル
);

各引数の説明

  1. 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関数を使用して成功メッセージをエキスパートログに出力します。ここでは、以下の情報を出力します。

  • 成功メッセージ(”Upper fractals copied”)
  • 再試行の回数を示す変数iの値
  • 実際にコピーされたデータの数を示すcopied変数の値

初回のデータのコピーが成功した場合の処理

最初のCopyBuffer関数呼び出しでデータのコピーが成功した場合、Print関数を使用して、コピーされたデータのサイズをエキスパートログに出力します。ここでは、Ups配列のサイズをArraySize関数を使用して取得し、その値を出力します。

この一連の処理により、データのコピーが成功したかどうかを確認し、結果に応じて適切なメッセージをログに出力することができます。データのコピーが成功した場合には、取得したデータを使用してさらに処理を進めることができますし、失敗した場合にはエラーメッセージを参考にして問題を解決することができます。

タイトルとURLをコピーしました