【MQL5】ChartNavigate関数について

MQL5リファレンス
スポンサーリンク
  1. ChartNavigate関数の働き・役割
  2. ChartNavigate関数の引数について
    1. ENUM_CHART_POSITIONについて
      1. CHART_BEGIN
      2. CHART_CURRENT_POS
      3. CHART_END
  3. ChartNavigate関数の戻り値について
  4. ChartNavigate関数を使う際の注意点
  5. ChartNavigate関数を使ったサンプルコード
  6. サンプルコード解説1
    1. OnStart関数
    2. ChartID関数
    3. ローカル変数の宣言
    4. if文によるチェック
  7. サンプルコード解説2
    1. オートスクロールの無効化
    2. チャートの右の境界からのシフト設定
    3. ローソク足の描画
    4. ティックボリュームの表示モード設定
  8. サンプルコード解説3
    1. コメントの準備と表示
    2. 履歴開始の右に10足分スクロール
    3. チャート上で最初に見えるバーの番号を取得
  9. サンプルコード解説4
    1. 改行文字の追加
    2. バー番号をコメントに追加
    3. コメントの表示
  10. サンプルコード解説5
    1. チャートの動きを確認するための待機
    2. コメントテキストの更新
    3. チャートの右の境界から左に10足分スクロール
    4. チャート上で最初に見えるバーの番号を取得
    5. 更新されたコメントテキストの表示
  11. サンプルコード解説6
    1. チャートの動きを確認するための待機
    2. コメントテキストの更新
    3. 履歴開始の右に300足分スクロール
    4. チャート上で最初に見えるバーの番号を取得
    5. 更新されたコメントテキストの表示
  12. サンプルコード解説7
    1. チャートの動きを確認するための待機
    2. コメントテキストの更新
    3. チャートの右の境界から左に300足分スクロール
    4. チャート上で最初に見えるバーの番号を取得
    5. 更新されたコメントテキストの表示

ChartNavigate関数の働き・役割

ChartNavigate関数は、チャート内で特定の位置を基準にして、指定された数のバー(足)をシフト(移動)するために使用されます。
この関数を利用することで、チャートの表示位置をプログラムによって動的(リアルタイムで変更可能)に変更することができます。

具体例として、次のようなシナリオを考えます。

チャートの一番古いデータを確認したいとします。ChartNavigate関数を使ってチャートの開始位置(先頭)から10バー右にシフト(移動)すると、チャートの古いデータを表示しつつ、さらに少し進んだ位置も確認できます。
また、最近のデータに戻りたい場合は、チャートの終了位置(末尾)から10バー左にシフト(移動)することで、最新の動きとその直前のデータを表示できます。

このように、ChartNavigate関数を使うことで、チャートの特定の範囲を簡単に移動し、過去や最近のデータを素早く確認することが可能になります。具体的には、以下のような操作が可能です。

  • チャートの先頭から特定のバー数だけ右にシフト(移動)する。
  • チャートの末尾から特定のバー数だけ左にシフト(移動)する。
  • 現在表示されているチャートの位置を基準に、指定したバー数だけシフト(移動)する。

この機能を活用することで、は重要なデータポイントを見逃すことなく、必要な情報を迅速に取得できます。

ChartNavigate関数の引数について

bool ChartNavigate(
  long chart_id,                 // チャート識別子
  ENUM_CHART_POSITION position,  // 位置
  int shift = 0                  // シフト値
);

chart_idは、シフト(移動)を行う対象のチャートの識別子です。0を指定すると現在のチャートを意味します。特定のチャートを指定したい場合は、そのチャートのIDを使用します。

positionは、チャート内のどの位置を基準にシフト(移動)を行うかを指定します。ENUM_CHART_POSITIONのいずれかの値を使用します。

shiftは、チャートをシフト(移動)するバー(足)の数を指定します。正の値は右(未来方向)へのシフト(移動)を意味し、負の値は左(過去方向)へのシフト(移動)を意味します。0を指定すると、positionで指定された位置にチャートを移動します。

ENUM_CHART_POSITIONについて

ENUM_CHART_POSITIONは、ChartNavigate関数のpositionパラメータとして使用できる識別子を定義する列挙型です。この列挙型には、以下の3つの識別子があります。

CHART_BEGIN

CHART_BEGINは、チャートの先頭(最古の価格)を示します。この位置を基準にシフト(移動)を行います。

CHART_CURRENT_POS

CHART_CURRENT_POSは、チャートの現在の位置を示します。この位置を基準にシフト(移動)を行います。

CHART_END

CHART_ENDは、チャートの最後(最新の価格)を示します。この位置を基準にシフト(移動)を行います。

ChartNavigate関数の戻り値について

ChartNavigate関数は、操作が成功した場合にはtrueを返し、失敗した場合にはfalseを返します。以下に戻り値に関する詳細を示します。

  • 成功の場合: trueが返されます。これは、指定されたシフト(移動)が正常に実行されたことを示します。
  • 失敗の場合: falseが返されます。これは、指定されたシフト(移動)が実行されなかったことを示します。失敗の原因を調査するには、GetLastError関数を使用してエラーコードを取得することができます。

ChartNavigate関数を使う際の注意点

  1. オートスクロールの無効化:ChartNavigate関数を使用する際には、オートスクロール機能を無効にすることが推奨されます。オートスクロールが有効な場合、チャートは自動的に最新のバーにスクロールしてしまい、意図した位置へのシフト(移動)が正しく行われない可能性があります。
  2. パフォーマンスへの影響:頻繁にシフト(移動)を行うとチャートの再描画が多くなり、パフォーマンスに影響を与える可能性があります。そのため、必要な時にのみこの関数を使用し、過度に使用しないように注意が必要です。
  3. エラーハンドリング:ChartNavigate関数戻り値をチェックし、falseが返された場合にはGetLastError関数を使用してエラーコードを取得し、適切なエラーハンドリングを行うことが重要です。

ChartNavigate関数を使ったサンプルコード

// OnStart関数はスクリプトの実行が開始されたときに自動的に呼び出されます
void OnStart()
{
  // 現在のチャートのハンドルを取得
  long handle = ChartID();
  string comm = "";
  
  if(handle > 0) // 成功した場合、追加的にチャートを設定する
  {
    // オートスクロールを無効にする
    ChartSetInteger(handle, CHART_AUTOSCROLL, false);
    
    // チャートの右の境界からのシフトを設定する
    ChartSetInteger(handle, CHART_SHIFT, true);
    
    // ローソク足を描画する
    ChartSetInteger(handle, CHART_MODE, CHART_CANDLES);
    
    // ティックボリュームの表示モードを設定する
    ChartSetInteger(handle, CHART_SHOW_VOLUMES, CHART_VOLUME_TICK);
 
    // Comment() に出力するテキストを準備する
    comm = "Scroll 10 bars to the right of the history start";
    
    // コメントを表示する
    Comment(comm);
    
    // 履歴開始の右に10足分スクロールする
    ChartNavigate(handle, CHART_BEGIN, 10);
    
    // チャート上で最初に見えるバーの番号を得る(番号付けは時系列と同様)
    long first_bar = ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR, 0);
    
    // 改行文字を追加する
    comm = comm + "\r\n";
    
    // コメントに追加する
    comm = comm + "The first bar on the chart is number " + IntegerToString(first_bar) + "\r\n";
    
    // コメントを表示する
    Comment(comm);
    
    // 5秒待ってチャートの動きを見る
    Sleep(5000);
 
    // コメントテキストに追加する
    comm = comm + "\r\n" + "Scroll 10 bars to the left of the right chart border";
    Comment(comm);
    
    // チャートの右の境界の左に10足分スクロールする
    ChartNavigate(handle, CHART_END, -10);
    
    // チャート上で最初に見えるバーの番号を得る(番号付けは時系列と同様)
    first_bar = ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR, 0);
    comm = comm + "\r\n";
    comm = comm + "The first bar on the chart is number " + IntegerToString(first_bar) + "\r\n";
    Comment(comm);
    
    // 5秒待ってチャートの動きを見る
    Sleep(5000);
 
    // チャートのスクロールの新しいブロック
    comm = comm + "\r\n" + "Scroll 300 bars to the right of the history start";
    Comment(comm);
    
    // 履歴開始の右に300足分スクロールする
    ChartNavigate(handle, CHART_BEGIN, 300);
    first_bar = ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR, 0);
    comm = comm + "\r\n";
    comm = comm + "The first bar on the chart is number " + IntegerToString(first_bar) + "\r\n";
    Comment(comm);
    
    // 5秒待ってチャートの動きを見る
    Sleep(5000);
 
    // チャートのスクロールの新しいブロック
    comm = comm + "\r\n" + "Scroll 300 bars to the left of the right chart border";
    Comment(comm);
    
    // チャートの右の境界の左に300足分スクロールする
    ChartNavigate(handle, CHART_END, -300);
    first_bar = ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR, 0);
    comm = comm + "\r\n";
    comm = comm + "The first bar on the chart is number " + IntegerToString(first_bar) + "\r\n";
    Comment(comm);
  }
}

サンプルコード解説1

// OnStart関数はスクリプトの実行が開始されたときに自動的に呼び出されます
void OnStart()
{
  // 現在のチャートのハンドルを取得
  long handle = ChartID();
  string comm = "";

  if(handle > 0) // 成功した場合、追加的にチャートを設定する
  {

OnStart関数

OnStart関数は、スクリプトが実行されると自動的に呼び出される関数です。OnStart関数スクリプトのエントリーポイントであり、この関数内にスクリプトのメインロジックを記述します。

ChartID関数

ChartID関数は、現在のチャートの識別子(ID)を取得するために使用されます。取得されたチャートIDは、他のチャート操作関数で使用するために必要です。ここでは、long型変数handleにその識別子が格納されます。

ローカル変数の宣言

string型変数commを宣言しています。この変数は、後にコメントとして表示するテキストを保持するために使用されます。初期化は空の文字列です。

if文によるチェック

if文は、handleが0より大きいかどうかをチェックします。これは、ChartID関数が有効なチャートIDを返したかどうかを確認するためです。handleが0より大きい場合、有効なチャートIDが取得できたことを意味し、その後のチャート設定の追加処理が行われます。if文の条件が満たされない場合、チャートの設定処理はスキップされます。

サンプルコード解説2

  // オートスクロールを無効にする
  ChartSetInteger(handle, CHART_AUTOSCROLL, false);

  // チャートの右の境界からのシフトを設定する
  ChartSetInteger(handle, CHART_SHIFT, true);

  // ローソク足を描画する
  ChartSetInteger(handle, CHART_MODE, CHART_CANDLES);

  // ティックボリュームの表示モードを設定する
  ChartSetInteger(handle, CHART_SHOW_VOLUMES, CHART_VOLUME_TICK);

オートスクロールの無効化

ChartSetInteger関数を使用して、チャートのオートスクロール機能を無効にしています。オートスクロールが有効だと、チャートが常に最新のバー(足)を表示するため、意図した位置へのシフト(移動)が正しく行われないことがあります。

  • handle: 先ほど取得したチャートの識別子です。
  • CHART_AUTOSCROLL: オートスクロール設定を制御するための識別子です。
  • false: オートスクロールを無効にするための値です。

チャートの右の境界からのシフト設定

次に、チャートの右の境界からのシフト設定を行います。これは、チャートの表示エリアの右側に余白を作り、表示範囲を調整するために使用します。

  • handle: 先ほど取得したチャートの識別子です。
  • CHART_SHIFT: チャートのシフト(移動)設定を制御するための識別子です。
  • true: シフトを有効にするための値です。

ローソク足の描画

チャートにローソク足を描画する設定を行います。ローソク足は、価格変動を視覚的に表示するための一般的な方法です。

  • handle: 先ほど取得したチャートの識別子です。
  • CHART_MODE: チャートの描画モードを制御するための識別子です。
  • CHART_CANDLES: ローソク足を描画するための設定値です。

ティックボリュームの表示モード設定

最後に、ティックボリュームの表示モードを設定します。ティックボリュームは、特定の時間内に発生した取引の数を示します。

  • handle: 先ほど取得したチャートの識別子です。
  • CHART_SHOW_VOLUMES: ボリューム表示モードを制御するための識別子です。
  • CHART_VOLUME_TICK: ティックボリュームを表示するための設定値です。4

サンプルコード解説3

  // Comment() に出力するテキストを準備する
  comm = "Scroll 10 bars to the right of the history start";

  // コメントを表示する
  Comment(comm);

  // 履歴開始の右に10足分スクロールする
  ChartNavigate(handle, CHART_BEGIN, 10);

  // チャート上で最初に見えるバーの番号を得る(番号付けは時系列と同様)
  long first_bar = ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR, 0);

コメントの準備と表示

まず、コメントとして表示するテキストを準備します。ここでは、comm変数に”Scroll 10 bars to the right of the history start”という文字列を設定しています。次に、Comment関数を使用して、このテキストをチャート上に表示します。

  • comm: 表示するコメントを格納する変数です。
  • Comment(comm): チャート上に指定したテキストを表示する関数です。

履歴開始の右に10足分スクロール

ChartNavigate関数を使用して、チャートの開始位置(最古の価格)から10足分右(未来方向)にスクロールします。これにより、チャートの表示範囲が更新されます。

  • ChartNavigate(handle, CHART_BEGIN, 10): チャートの先頭から10足分右に移動する設定です。
  • handle: 先ほど取得したチャートの識別子です。
  • CHART_BEGIN: チャートの先頭を示す識別子です。
  • 10: チャートを右に10足分シフト(移動)することを指定しています。

チャート上で最初に見えるバーの番号を取得

ChartGetInteger関数を使用して、現在チャート上で最初に見えるバーの番号を取得します。この情報は、チャートのどの部分が表示されているかを確認するために役立ちます。

サンプルコード解説4

  // 改行文字を追加する
  comm = comm + "\r\n";

  // コメントに追加する
  comm = comm + "The first bar on the chart is number " + IntegerToString(first_bar) + "\r\n";

  // コメントを表示する
  Comment(comm);

改行文字の追加

最初に、改行文字をcomm変数に追加します。改行文字\r\nを使用することで、コメントに表示されるテキストが次の行に移ります。

  • comm = comm + "\r\n": 既存のコメントテキストに改行文字を追加しています。

バー番号をコメントに追加

次に、取得した最初に見えるバーの番号をコメントに追加します。IntegerToString関数を使用して、整数値を文字列に変換し、その文字列comm変数に追加します。結果として、commにはバーの番号が含まれるテキストが形成されます。

コメントの表示

最後に、更新されたコメントテキストを再度チャート上に表示します。これにより、最新のコメントが表示されます。

  • Comment(comm): 更新されたcomm変数の内容をチャート上に表示する関数です。

この一連の操作により、チャート上に「The first bar on the chart is number [バーの番号]」というコメントが表示され、次の行に移ります。

サンプルコード解説5

  // 5秒待ってチャートの動きを見る
  Sleep(5000);

  // コメントテキストに追加する
  comm = comm + "\r\n" + "Scroll 10 bars to the left of the right chart border";
  Comment(comm);

  // チャートの右の境界の左に10足分スクロールする
  ChartNavigate(handle, CHART_END, -10);

  // チャート上で最初に見えるバーの番号を得る(番号付けは時系列と同様)
  first_bar = ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR, 0);
  comm = comm + "\r\n";
  comm = comm + "The first bar on the chart is number " + IntegerToString(first_bar) + "\r\n";
  Comment(comm);

チャートの動きを確認するための待機

まず、Sleep関数を使用してスクリプトの実行を5秒間停止します。この遅延により、チャートの動きを確認する時間を確保しています。

コメントテキストの更新

次に、既存のコメントテキストに新しい行を追加し、「チャートの右の境界の左に10足分スクロールする」というメッセージを追加します。その後、Comment関数を使用して更新されたコメントテキストをチャートに表示します。

  • comm = comm + "\r\n" + "Scroll 10 bars to the left of the right chart border": 改行文字と新しいメッセージをコメントテキストに追加しています。
  • Comment(comm): 更新されたコメントテキストをチャートに表示します。

チャートの右の境界から左に10足分スクロール

ChartNavigate関数を使用して、チャートの終了位置(最新の価格)から10足分左(過去方向)にスクロールします。これにより、チャートの表示範囲が更新されます。

  • ChartNavigate(handle, CHART_END, -10): チャートの終了位置から左に10足分シフト(移動)します。
  • handle: 先ほど取得したチャートの識別子です。
  • CHART_END: チャートの終了位置を示す識別子です。
  • -10: チャートを左に10足分シフト(移動)することを指定しています。

チャート上で最初に見えるバーの番号を取得

再びChartGetInteger関数を使用して、現在チャート上で最初に見えるバーの番号を取得します。この情報を利用して、チャートのどの部分が表示されているかを確認します。

更新されたコメントテキストの表示

取得したバーの番号をコメントテキストに追加し、再度チャートに表示します。これにより、最新の状態がチャート上に反映されます。

  • comm = comm + "\r\n" + "The first bar on the chart is number " + IntegerToString(first_bar) + "\r\n": 改行文字と取得したバーの番号をコメントテキストに追加しています。
  • Comment(comm): 更新されたコメントテキストをチャートに表示します。

サンプルコード解説6

  // 5秒待ってチャートの動きを見る
  Sleep(5000);

  // チャートのスクロールの新しいブロック
  comm = comm + "\r\n" + "Scroll 300 bars to the right of the history start";
  Comment(comm);

  // 履歴開始の右に300足分スクロールする
  ChartNavigate(handle, CHART_BEGIN, 300);
  first_bar = ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR, 0);
  comm = comm + "\r\n";
  comm = comm + "The first bar on the chart is number " + IntegerToString(first_bar) + "\r\n";
  Comment(comm);

チャートの動きを確認するための待機

再び、Sleep関数を使用してスクリプトの実行を5秒間停止します。この遅延により、チャートの動きを確認する時間を確保しています。

コメントテキストの更新

次に、既存のコメントテキストに新しい行を追加し、「履歴開始の右に300足分スクロールする」というメッセージを追加します。その後、Comment関数を使用して更新されたコメントテキストをチャートに表示します。

  • comm = comm + "\r\n" + "Scroll 300 bars to the right of the history start": 改行文字と新しいメッセージをコメントテキストに追加しています。
  • Comment(comm): 更新されたコメントテキストをチャートに表示します。

履歴開始の右に300足分スクロール

ChartNavigate関数を使用して、チャートの開始位置(最古の価格)から300足分右(未来方向)にスクロールします。これにより、チャートの表示範囲が大きく更新されます。

  • ChartNavigate(handle, CHART_BEGIN, 300): チャートの先頭から300足分右に移動する設定です。
  • handle: 先ほど取得したチャートの識別子です。
  • CHART_BEGIN: チャートの先頭を示す識別子です。
  • 300: チャートを右に300足分シフト(移動)することを指定しています。

チャート上で最初に見えるバーの番号を取得

再びChartGetInteger関数を使用して、現在チャート上で最初に見えるバーの番号を取得します。この情報を利用して、チャートのどの部分が表示されているかを確認します。

更新されたコメントテキストの表示

取得したバーの番号をコメントテキストに追加し、再度チャートに表示します。これにより、最新の状態がチャート上に反映されます。

  • comm = comm + "\r\n" + "The first bar on the chart is number " + IntegerToString(first_bar) + "\r\n": 改行文字と取得したバーの番号をコメントテキストに追加しています。
  • Comment(comm): 更新されたコメントテキストをチャートに表示します。

サンプルコード解説7

  // 5秒待ってチャートの動きを見る
  Sleep(5000);

  // チャートのスクロールの新しいブロック
  comm = comm + "\r\n" + "Scroll 300 bars to the left of the right chart border";
  Comment(comm);

  // チャートの右の境界の左に300足分スクロールする
  ChartNavigate(handle, CHART_END, -300);
  first_bar = ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR, 0);
  comm = comm + "\r\n";
  comm = comm + "The first bar on the chart is number " + IntegerToString(first_bar) + "\r\n";
  Comment(comm);
  }
}

チャートの動きを確認するための待機

再び、Sleep関数を使用してスクリプトの実行を5秒間停止します。この遅延により、チャートの動きを確認する時間を確保しています。

コメントテキストの更新

既存のコメントテキストに新しい行を追加し、「チャートの右の境界の左に300足分スクロールする」というメッセージを追加します。その後、Comment関数を使用して更新されたコメントテキストをチャートに表示します。

  • comm = comm + “\r\n” + “Scroll 300 bars to the left of the right chart border”: 改行文字と新しいメッセージをコメントテキストに追加しています。
  • Comment(comm): 更新されたコメントテキストをチャートに表示します。

チャートの右の境界から左に300足分スクロール

ChartNavigate関数を使用して、チャートの終了位置(最新の価格)から300足分左(過去方向)にスクロールします。これにより、チャートの表示範囲が大きく更新されます。

  • ChartNavigate(handle, CHART_END, -300): チャートの終了位置から左に300足分シフト(移動)します。
  • handle: 先ほど取得したチャートの識別子です。
  • CHART_END: チャートの終了位置を示す識別子です。
  • -300: チャートを左に300足分シフト(移動)することを指定しています。

チャート上で最初に見えるバーの番号を取得

再びChartGetInteger関数を使用して、現在チャート上で最初に見えるバーの番号を取得します。この情報を利用して、チャートのどの部分が表示されているかを確認します。

更新されたコメントテキストの表示

取得したバーの番号をコメントテキストに追加し、再度チャートに表示します。これにより、最新の状態がチャート上に反映されます。

  • comm = comm + “\r\n” + “The first bar on the chart is number ” + IntegerToString(first_bar) + "\r\n": 改行文字と取得したバーの番号をコメントテキストに追加しています。
  • Comment(comm): 更新されたコメントテキストをチャートに表示します。
タイトルとURLをコピーしました