【MQL5】ResourceReadImage関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク
  1. ResourceReadImage関数の働き・役割
  2. ResourceReadImage関数の引数について
  3. ResourceReadImage関数の戻り値について
  4. ResourceReadImage関数を使う際の注意点
  5. ResourceReadImage関数を使ったサンプルコード
  6. サンプルコード解説1:OnStart関数部分その1
    1. 1. グラフィックリソース名の指定
    2. 2. 画像の幅と高さを設定
    3. 3. ピクセルデータを格納する配列を宣言
    4. 4. 配列サイズ(ピクセル数)の計算
    5. 5. エラー情報のリセット
  7. サンプルコード解説2:OnStart関数部分その2
    1. ピクセルデータ配列のリサイズ
    2. エラーチェック
  8. サンプルコード解説3:OnStart関数部分その3
    1. ピクセルデータ配列の初期化
    2. グラフィックリソースの作成
    3. 作成されたリソース配列のサイズを出力
  9. サンプルコード解説4:OnStart関数部分その4
    1. 現在のティックデータを取得
    2. Bitmapオブジェクトの作成
  10. サンプルコード解説5:OnStart関数部分その5
    1. ビットマップオブジェクトの幅を設定
    2. ビットマップオブジェクトの高さを設定
    3. ビットマップオブジェクトのアンカーポイントを中央に設定
    4. グラフィックリソースをオブジェクトに紐づける
  11. サンプルコード解説6:OnStart関数部分その6
    1. DodgerBlue色を透明度200で設定
    2. グラフィックリソースのデータを更新し、チャートを再描画
    3. リソース読み込みの前に3秒間待機
  12. サンプルコード解説7:OnStart関数部分その7
    1. グラフィックリソースから新しいピクセル配列にデータを読み込む
    2. OrangeRed色を透明度200で設定
  13. サンプルコード解説8:OnStart関数部分その8
    1. 新しいグラフィックリソースを作成
    2. 新しいリソースの配列サイズをエキスパートログに出力
    3. グラフィックラベルオブジェクトを作成
  14. サンプルコード解説9:OnStart関数部分その9
    1. チャート上の座標を取得
    2. グラフィックラベルオブジェクトの幅と高さを設定
    3. オブジェクトのアンカーポイントを左上に設定
    4. オブジェクトのX座標とY座標の位置を設定
    5. コピーされたグラフィックリソースをグラフィックラベルに適用
  15. サンプルコード解説10:OnStart関数部分その10
    1. GreenYellow色に変更
    2. グラフィックリソースのデータを再更新し、チャートを再描画
    3. リソースとオブジェクトを削除する前に3秒待機
    4. 作成したリソースとオブジェクトを削除
  16. サンプルコード解説11:Update関数(オリジナル関数)
    1. 各引数の説明
    2. リソースの幅や高さがゼロの場合は処理を終了
    3. リソースデータを更新し、必要に応じてチャートを再描画

ResourceReadImage関数の働き・役割

ResourceReadImage関数は、ResourceCreate関数で作成された、またはEX5ファイルに保存されたグラフィックリソースからデータを読み込むために使用されます。
この関数を使うことで、作成されたリソースのピクセルデータを取得し、そのデータを基にさまざまな操作を行うことが可能です。グラフィックリソースとは、画像データやカラーデータなどを含むリソースであり、チャート上に表示するためのビットマップオブジェクトなどに利用されます。

ResourceReadImage関数の引数について

bool  ResourceReadImage(
  const string      resource_name,       // 読まれるグラフィックリソース名
  uint&             data[],             // リソースからデータを受け取るための配列
  uint&             width,             // リソースの画像幅を受け取る
  uint&             height,             // リソースの画像の高さを受け取る
  );

ResourceReadImage関数には、以下の引数が必要です。

第1引数:resource_name

  • 種類:string
  • 説明:読み取るグラフィックリソースの名前を指定します。自身のリソースにアクセスする場合には、「::ResourceName」という形式で指定します。EX5ファイルに保存されているリソースにアクセスする場合には、「パス\ファイル名.ex5::リソース名」という形式で、ファイルのパスとリソース名を指定する必要があります。

第2引数:data[]

  • 種類:uint&[]
  • 説明:グラフィックリソースからデータを受け取るための配列を指定します。この配列は、リソースのピクセルデータを格納します。1次元または2次元配列が利用できます。

第3引数:width

  • 種類:uint&
  • 説明:リソースの画像の幅を受け取るための変数です。この変数にリソースの幅(ピクセル単位)が格納されます。

第4引数:height

  • 種類:uint&
  • 説明:リソースの画像の高さを受け取るための変数です。この変数にリソースの高さ(ピクセル単位)が格納されます。

ResourceReadImage関数の戻り値について

ResourceReadImage関数は、処理が成功した場合は「true」、失敗した場合は「false」を返します。エラーが発生した場合は、GetLastError関数でエラーコードを確認できます。

ResourceReadImage関数を使う際の注意点

配列が2次元の場合、配列の2番目の次元が画像の幅より小さいと、ResourceReadImage関数はデータの読み込みに失敗し、結果としてfalseが返されます。この場合でも、画像の幅と高さは取得されます。

データ配列COLOR_FORMAT_ARGB_NORMALIZEまたはCOLOR_FORMAT_XRGB_NOALPHA形式で初期化して使用する必要があります。これらのフォーマットを使わない場合、データが正しく読み込まれない可能性があります。

リソース名を指定する際には、「::」を使ってリソース名を正確に指定する必要があります。この形式を誤ると、リソースが見つからず読み込みに失敗する可能性があります。

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

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                      |
//+------------------------------------------------------------------+
void OnStart()
 {
  //--- グラフィックリソース名を指定する変数を定義
  //  rc_name は、後でリソースを作成し参照するために使用する名前
  string rc_name="Resource";  
  
  //--- リソース画像の幅を指定
  //  この例では、幅を100ピクセルに設定
  uint   rc_width=100;  
  
  //--- リソース画像の高さを指定
  //  この例では、高さを100ピクセルに設定
  uint   rc_height=100;
  
  //--- ピクセルデータを格納する配列を宣言
  //  グラフィックリソースの各ピクセルの色情報を保存するための配列
  uint   rc_data[];  
  
  //--- 画像全体のピクセル数を計算
  //  幅×高さの値を格納する。これが配列サイズの基準となる
  uint   rc_size=rc_width*rc_height; 
 
  //--- エラー情報をリセット
  //  以前のエラーコードをクリアすることで、新しいエラーが正確に検出できるようにする
  ResetLastError();
  
  //--- ピクセルデータ配列のサイズをリサイズ
  //  配列を画像サイズ(100x100ピクセル)にリサイズし、失敗した場合はエラーメッセージを出力
  if(ArrayResize(rc_data,rc_size)!=rc_size)
    {
    Print("ArrayResize() failed. Error code: ",GetLastError());
    return;
    }
    
  //--- 配列全体を透明色(0x00FFFFFF)で初期化
  //  透明色で塗りつぶすことで、描画されるビットマップが最初は透明な状態になる
  ArrayInitialize(rc_data,0x00FFFFFF);
  
  //--- グラフィックリソースを作成
  //  指定した幅・高さ・色フォーマットでリソースを作成し、失敗した場合はエラーメッセージを出力
  if(!ResourceCreate(rc_name,rc_data,rc_width,rc_height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE))
    {
    Print("ResourceCreate() failed. Error code: ",GetLastError());
    return;
    }
    
  //--- 作成されたリソース配列のサイズをエキスパートログに出力
  //  rc_data.Size()で配列のサイズを確認
  Print("Size of created recource array: ",rc_data.Size());
 
  //--- 現在のティックデータを取得
  //  シンボルの最新の価格データ(ティック)を取得し、取得に失敗した場合はエラーメッセージを出力
  MqlTick tick={};
  if(!SymbolInfoTick(Symbol(),tick))
    {
    Print("SymbolInfoTick() failed. Error code: ",GetLastError());
    return;
    }
    
  //--- Bitmapオブジェクトを作成
  //  最後のティック価格と時刻を使用して、Bitmapオブジェクトを作成し、失敗時にはエラーメッセージを出力
  string obj_name="Bitmap";
  if(!ObjectCreate(0,obj_name,OBJ_BITMAP,0,tick.time,tick.bid))
    {
    Print("ObjectCreate() failed. Error code: ",GetLastError());
    return;
    }
    
  //--- 作成されたビットマップオブジェクトの幅をリソースの幅に設定
  ObjectSetInteger(0,obj_name,OBJPROP_XSIZE,rc_width);
  
  //--- 作成されたビットマップオブジェクトの高さをリソースの高さに設定
  ObjectSetInteger(0,obj_name,OBJPROP_YSIZE,rc_height);
  
  //--- ビットマップオブジェクトのアンカーポイントを中央に設定
  //  オブジェクトの描画基準点を中央に配置する
  ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER);
  
  //--- グラフィックリソースをオブジェクトに紐づける
  //  ここでリソース名を指定してオブジェクトに画像を適用する
  ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"::"+rc_name);
 
  //--- DodgerBlue色を透明度200で設定
  //  ARGB形式で色を設定し、透明度を指定してピクセル配列全体に反映
  uint clr=ColorToARGB(clrDodgerBlue,200);
  ArrayInitialize(rc_data,clr);
  
  //--- グラフィックリソースのデータを更新し、チャートを再描画する
  //  Update関数で指定した色に基づき、リソースデータを再更新し、画面に描画
  Update(rc_name,rc_data,rc_width,rc_height,true);
 
  //--- 3秒間待機してからリソースを読み込む
  Print("Wait 3 seconds before ResourceReadImage()");
  Sleep(3000);
  
  //--- グラフィックリソースから新しいピクセル配列にデータを読み込む
  //  幅と高さを取得し、失敗した場合はエラーメッセージを出力
  uint rc_data_copy[];
  uint w=0, h=0;
  ResetLastError();
  if(!ResourceReadImage("::"+rc_name,rc_data_copy,w,h))
    {
    Print("ResourceReadImage() failed. Error code: ",GetLastError());
    return;
    }
 
  //--- OrangeRed色を透明度200で設定
  //  先ほど読み込んだピクセル配列全体をOrangeRed色で塗りつぶし、リソースを作成
  clr=ColorToARGB(clrOrangeRed,200);
  ArrayInitialize(rc_data_copy,clr);
  
  //--- 新しいグラフィックリソースを作成
  //  新しい名前でリソースを作成し、失敗した場合はエラーメッセージを出力
  if(!ResourceCreate(rc_name+"Copy",rc_data_copy,rc_width,rc_height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE))
    {
    Print("New ResourceCreate() failed. Error code: ",GetLastError());
    return;
    }
    
  //--- 作成された新しいリソースの配列サイズをエキスパートログに出力
  Print("Size of created new recource array: ",rc_data_copy.Size());
 
  //--- グラフィックラベルオブジェクトを作成
  //  BitmapLabelオブジェクトを新しく作成し、失敗した場合はエラーメッセージを出力
  string obj_name2="BitmapLabel";
  if(!ObjectCreate(0,obj_name2,OBJ_BITMAP_LABEL,0,0,0))
    {
    Print("ObjectCreate() failed. Error code: ",GetLastError());
    return;
    }
    
  //--- チャート上でティックの時刻と価格に基づいて画面座標を取得
  int x=0, y=0;
  if(!ChartTimePriceToXY(0,0,tick.time,tick.bid,x,y))
    {
    Print("ChartTimePriceToXY() failed. Error code: ",GetLastError());
    return;
    }
    
  //--- グラフィックラベルオブジェクトの幅と高さを設定
  ObjectSetInteger(0,obj_name2,OBJPROP_XSIZE,rc_width);
  ObjectSetInteger(0,obj_name2,OBJPROP_YSIZE,rc_height);
  
  //--- オブジェクトのアンカーポイントを左上に設定
  ObjectSetInteger(0,obj_name2,OBJPROP_ANCHOR,ANCHOR_LEFT_UPPER);
  
  //--- オブジェクトのX座標とY座標の位置を設定
  ObjectSetInteger(0,obj_name2,OBJPROP_XDISTANCE,x);
  ObjectSetInteger(0,obj_name2,OBJPROP_YDISTANCE,y);
  
  //--- コピーされたグラフィックリソースをグラフィックラベルに適用
  ObjectSetString(0,obj_name2,OBJPROP_BMPFILE,"::"+rc_name+"Copy");
 
  //--- 3秒待機してからGreenYellow色に変更
  Print("Wait 3 seconds before changing color to GreenYellow");
  Sleep(3000);
  clr=ColorToARGB(clrGreenYellow,200);
  ArrayInitialize(rc_data_copy,clr);
  
  //--- グラフィックリソースのデータを再更新し、チャートを再描画
  Update(rc_name+"Copy",rc_data_copy,rc_width,rc_height,true);
 
  //--- リソースとオブジェクトを削除する前に3秒待機
  Print("Wait 3 seconds before deleting both objects");
  Sleep(3000);
  
  //--- 作成したリソースとオブジェクトを削除
  Print("Deleting Resource and all Bitmap objects");
  ResourceFree("::"+rc_name);
  ResourceFree("::"+rc_name+"Copy");
  ObjectDelete(0,obj_name);
  ObjectDelete(0,obj_name2);
 }
 
//+------------------------------------------------------------------+
//| グラフィックリソースデータを更新する関数                          |
//+------------------------------------------------------------------+
void Update(const string res_name,const uint &pixel_data[],const uint width,const uint height,const bool redraw)
 {
  //--- リソースの幅や高さがゼロの場合は処理を終了
  if(width==0 || height==0)
    return;
  
  //--- リソースデータを更新し、必要に応じてチャートを再描画する
  //  描画を更新し、ビジュアルに反映させる
  if(ResourceCreate(res_name,pixel_data,width,height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE) && redraw)
    ChartRedraw();
 }

サンプルコード解説1:OnStart関数部分その1

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                      |
//+------------------------------------------------------------------+
void OnStart()
 {
  //--- グラフィックリソース名を指定する変数を定義
  //  rc_name は、後でリソースを作成し参照するために使用する名前
  string rc_name="Resource";  
  
  //--- リソース画像の幅を指定
  //  この例では、幅を100ピクセルに設定
  uint   rc_width=100;  
  
  //--- リソース画像の高さを指定
  //  この例では、高さを100ピクセルに設定
  uint   rc_height=100;
  
  //--- ピクセルデータを格納する配列を宣言
  //  グラフィックリソースの各ピクセルの色情報を保存するための配列
  uint   rc_data[];  
  
  //--- 画像全体のピクセル数を計算
  //  幅×高さの値を格納する。これが配列サイズの基準となる
  uint   rc_size=rc_width*rc_height; 
 
  //--- エラー情報をリセット
  //  以前のエラーコードをクリアすることで、新しいエラーが正確に検出できるようにする
  ResetLastError();

この部分では、OnStart関数内でグラフィックリソースの初期設定を行っています。

1. グラフィックリソース名の指定

ここでは、rc_nameという変数にリソース名「Resource」を指定しています。このリソース名は後に作成するグラフィックリソースに使用され、リソースの管理や参照に使われる識別子です。リソース名は任意の文字列を設定できますが、他のリソース名と重複しないように注意する必要があります。

2. 画像の幅と高さを設定

ここでは、リソースとして使用する画像の幅と高さをそれぞれ100ピクセルに設定しています。幅(横のピクセル数)と高さ(縦のピクセル数)は、それぞれrc_widthとrc_heightに格納されます。この値に基づいて、後で作成するグラフィックリソースのサイズが決定されます。

3. ピクセルデータを格納する配列を宣言

ここでは、グラフィックリソースの各ピクセルの色情報を保存するための配列rc_dataを宣言しています。この配列は後で、リソースの各ピクセルの色データを保持するために使用されます。初期段階では配列のサイズは指定していませんが、後でリサイズすることによって適切なサイズに設定します。

4. 配列サイズ(ピクセル数)の計算

画像全体のピクセル数を計算し、その結果をrc_sizeに格納します。画像はrc_widthとrc_heightの掛け算によって、縦横のピクセル数を掛け合わせたサイズとなります。このrc_sizeが後でピクセルデータの配列のサイズとして使用されます。

5. エラー情報のリセット

ResetLastError関数は、以前発生したエラーコードをリセットします。この操作を行うことで、この後の処理で新しいエラーが発生した際に、正確にエラー情報を取得できるように準備しています。エラーコードが正しく取得できない場合、デバッグや問題解決が難しくなるため、適切にエラーをリセットしておくことが重要です。

サンプルコード解説2:OnStart関数部分その2

 //--- ピクセルデータ配列のサイズをリサイズ
  //  配列を画像サイズ(100x100ピクセル)にリサイズし、失敗した場合はエラーメッセージを出力
  if(ArrayResize(rc_data,rc_size)!=rc_size)
    {
    Print("ArrayResize() failed. Error code: ",GetLastError());
    return;
    }

この部分では、ピクセルデータ配列のサイズをリサイズし、エラー処理を行っています。

ピクセルデータ配列のリサイズ

ここでは、ピクセルデータを格納する配列のサイズをリサイズしています。画像サイズが100ピクセル×100ピクセルであるため、rc_size(100×100=10,000)として計算されたサイズに合わせて配列をリサイズします。このリサイズによって、配列が正しいサイズで準備され、後で使用するピクセルデータを保持できるようにします。

エラーチェック

リサイズが正しく行われたかどうかを確認しています。ArrayResize関数は、リサイズに成功すると新しい配列のサイズを返します。ここで、返されたサイズがrc_sizeと一致しなかった場合、リサイズに失敗したことになります。そのため、リサイズが失敗した際にはPrint関数を使ってエラーメッセージを出力し、GetLastError関数でエラーコードを取得します。

この処理によって、配列のリサイズに問題が発生した際に適切なデバッグ情報を得られるようにし、続行できない場合はreturn文でスクリプトを終了させます。

サンプルコード解説3:OnStart関数部分その3

  //--- 配列全体を透明色(0x00FFFFFF)で初期化
  //  透明色で塗りつぶすことで、描画されるビットマップが最初は透明な状態になる
  ArrayInitialize(rc_data,0x00FFFFFF);
  
  //--- グラフィックリソースを作成
  //  指定した幅・高さ・色フォーマットでリソースを作成し、失敗した場合はエラーメッセージを出力
  if(!ResourceCreate(rc_name,rc_data,rc_width,rc_height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE))
    {
    Print("ResourceCreate() failed. Error code: ",GetLastError());
    return;
    }
    
  //--- 作成されたリソース配列のサイズをエキスパートログに出力
  //  rc_data.Size()で配列のサイズを確認
  Print("Size of created recource array: ",rc_data.Size());

この部分では、ピクセルデータ配列を初期化し、グラフィックリソースを作成しています。

ピクセルデータ配列の初期化

ここでは、ピクセルデータを格納するrc_data配列全体を透明色で初期化しています。0x00FFFFFFはARGB形式で表されており、最初の00が透明度(アルファ値)を示し、FFFFFFは白色を意味します。これにより、ピクセル配列全体が透明な状態に設定され、描画されるビットマップも最初は透明になります。この初期化は、後にリソースが適切に作成され、表示されるビットマップがデフォルトで透明になることを保証します。

グラフィックリソースの作成

ResourceCreate関数を使用して、指定した幅、高さ、カラーフォーマット(COLOR_FORMAT_ARGB_NORMALIZE)でグラフィックリソースを作成します。ここでは、リソース名、ピクセルデータ、幅、高さ、カラーフォーマットが指定されています。作成が失敗した場合は、エラーメッセージをエキスパートログに出力し、GetLastError関数を使ってエラーコードを取得します。失敗時にはreturn文でスクリプトの実行を停止します。

作成されたリソース配列のサイズを出力

リソースが作成された後、配列rc_dataのサイズをエキスパートログに出力します。rc_data.Size()で配列の要素数を確認し、それが想定通りのサイズであるかどうかをログに出力することで、リソースが正しく作成されたかを確認します。

サンプルコード解説4:OnStart関数部分その4

//--- 現在のティックデータを取得
  //  シンボルの最新の価格データ(ティック)を取得し、取得に失敗した場合はエラーメッセージを出力
  MqlTick tick={};
  if(!SymbolInfoTick(Symbol(),tick))
    {
    Print("SymbolInfoTick() failed. Error code: ",GetLastError());
    return;
    }
    
  //--- Bitmapオブジェクトを作成
  //  最後のティック価格と時刻を使用して、Bitmapオブジェクトを作成し、失敗時にはエラーメッセージを出力
  string obj_name="Bitmap";
  if(!ObjectCreate(0,obj_name,OBJ_BITMAP,0,tick.time,tick.bid))
    {
    Print("ObjectCreate() failed. Error code: ",GetLastError());
    return;
    }

この部分では、ティックデータを取得し、Bitmapオブジェクトを作成しています。

現在のティックデータを取得

まず、MqlTick構造体を使用して現在のシンボルの最新ティックデータを取得します。ティックデータには、現在の価格やティック発生時刻などが含まれます。SymbolInfoTick関数を使用して、指定されたシンボル(通常は現在の通貨ペアなど)に対する最新ティック情報を取得します。

この取得に失敗した場合、エラーメッセージをエキスパートログに出力し、GetLastError関数でエラーコードを確認します。もし失敗した場合は、return文によってスクリプトの実行を停止します。

Bitmapオブジェクトの作成

ティックデータを基にBitmapオブジェクトを作成します。ここで、オブジェクト名として”Bitmap”という文字列を指定しています。ObjectCreate関数を使用し、ティックデータの時間(tick.time)と価格(tick.bid)を基にオブジェクトを作成します。これにより、チャート上にティックデータに基づいた位置にビットマップオブジェクトが描画されます。

オブジェクトの作成に失敗した場合、エラーメッセージをエキスパートログに出力し、GetLastError関数でエラーコードを確認します。失敗時には、return文でスクリプトの実行を停止します。

サンプルコード解説5:OnStart関数部分その5

 //--- 作成されたビットマップオブジェクトの幅をリソースの幅に設定
  ObjectSetInteger(0,obj_name,OBJPROP_XSIZE,rc_width);
  
  //--- 作成されたビットマップオブジェクトの高さをリソースの高さに設定
  ObjectSetInteger(0,obj_name,OBJPROP_YSIZE,rc_height);
  
  //--- ビットマップオブジェクトのアンカーポイントを中央に設定
  //  オブジェクトの描画基準点を中央に配置する
  ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER);
  
  //--- グラフィックリソースをオブジェクトに紐づける
  //  ここでリソース名を指定してオブジェクトに画像を適用する
  ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"::"+rc_name);

この部分では、作成されたビットマップオブジェクトのサイズや表示位置を設定し、リソースをオブジェクトに紐づけています。

ビットマップオブジェクトの幅を設定

まず、ObjectSetInteger関数を使って、作成されたビットマップオブジェクトの幅をリソースの幅(rc_width)に設定します。これにより、リソース画像と同じ幅でビットマップオブジェクトが描画されるようになります。

ビットマップオブジェクトの高さを設定

次に、同じくObjectSetInteger関数で、ビットマップオブジェクトの高さをリソースの高さ(rc_height)に設定します。これにより、オブジェクトのサイズがリソースと一致し、適切に表示されます。

ビットマップオブジェクトのアンカーポイントを中央に設定

ObjectSetInteger関数を使用して、ビットマップオブジェクトのアンカーポイントを中央(ANCHOR_CENTER)に設定します。アンカーポイントとは、オブジェクトの描画位置を基準にする点のことで、ここではオブジェクトの中央を基準に描画します。

グラフィックリソースをオブジェクトに紐づける

ObjectSetString関数を使用して、ビットマップオブジェクトにグラフィックリソースを紐づけます。リソース名として、”::”を付加したリソース名(rc_name)を指定します。この処理によって、オブジェクトに先ほど作成したグラフィックリソース(画像)が適用され、チャート上に表示されます。

サンプルコード解説6:OnStart関数部分その6

  //--- DodgerBlue色を透明度200で設定
  //  ARGB形式で色を設定し、透明度を指定してピクセル配列全体に反映
  uint clr=ColorToARGB(clrDodgerBlue,200);
  ArrayInitialize(rc_data,clr);
  
  //--- グラフィックリソースのデータを更新し、チャートを再描画する
  //  Update関数で指定した色に基づき、リソースデータを再更新し、画面に描画
  Update(rc_name,rc_data,rc_width,rc_height,true);
 
  //--- 3秒間待機してからリソースを読み込む
  Print("Wait 3 seconds before ResourceReadImage()");
  Sleep(3000);

この部分では、DodgerBlue色でピクセル配列を初期化し、リソースデータの更新と再描画を行い、その後にリソースを読み込むまでの動作が記述されています。

DodgerBlue色を透明度200で設定

まず、ColorToARGB関数を使って、DodgerBlueという色を透明度200で設定しています。この関数は、色と透明度を指定してARGB形式(Alpha, Red, Green, Blue)で色を定義します。ここでの透明度200は、0(完全透明)から255(完全不透明)までの値の範囲で、中間的な透明度を意味します。次に、ArrayInitialize関数を使用して、rc_data配列の全ピクセルをこの色で塗りつぶしています。これにより、リソース全体がDodgerBlue色で初期化されます。

グラフィックリソースのデータを更新し、チャートを再描画

Update関数を呼び出して、リソースのデータを更新します。Update関数内で、リソース名、ピクセルデータ、幅、高さを指定し、リソースを再作成しています。また、引数redrawがtrueに設定されているため、リソースデータの更新後にチャートを再描画し、変更が画面に反映されます。

リソース読み込みの前に3秒間待機

Print関数を使って「Wait 3 seconds before ResourceReadImage()」というメッセージをエキスパートログに出力し、次にSleep関数を使って3秒間待機します。これは、次のステップでリソースを読み込む前に時間を空けて、描画が適切に完了するのを待つためです。

サンプルコード解説7:OnStart関数部分その7

 //--- グラフィックリソースから新しいピクセル配列にデータを読み込む
  //  幅と高さを取得し、失敗した場合はエラーメッセージを出力
  uint rc_data_copy[];
  uint w=0, h=0;
  ResetLastError();
  if(!ResourceReadImage("::"+rc_name,rc_data_copy,w,h))
    {
    Print("ResourceReadImage() failed. Error code: ",GetLastError());
    return;
    }
 
  //--- OrangeRed色を透明度200で設定
  //  先ほど読み込んだピクセル配列全体をOrangeRed色で塗りつぶし、リソースを作成
  clr=ColorToARGB(clrOrangeRed,200);
  ArrayInitialize(rc_data_copy,clr);

この部分では、グラフィックリソースからデータを読み込み、新しいピクセル配列を操作しています。

グラフィックリソースから新しいピクセル配列にデータを読み込む

まず、ResourceReadImage関数を使って、先に作成したグラフィックリソースからデータを新しい配列に読み込みます。この関数は、指定されたリソースからピクセルデータを読み出し、幅と高さも取得します。

もしリソースの読み込みが失敗した場合、Print関数を使ってエラーメッセージを出力し、GetLastError関数を使用して詳細なエラー情報を取得します。エラーが発生した場合は、return文でスクリプトの実行を停止します。

OrangeRed色を透明度200で設定

次に、ColorToARGB関数を使って、OrangeRed色を透明度200で設定しています。先ほど読み込んだ新しいピクセル配列全体を、このOrangeRed色で塗りつぶしています。この操作により、新しく作成されるリソースのすべてのピクセルがOrangeRed色で表示されるようになります。ArrayInitialize関数を使って、配列全体を指定した色で初期化しています。

サンプルコード解説8:OnStart関数部分その8

  //--- 新しいグラフィックリソースを作成
  //  新しい名前でリソースを作成し、失敗した場合はエラーメッセージを出力
  if(!ResourceCreate(rc_name+"Copy",rc_data_copy,rc_width,rc_height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE))
    {
    Print("New ResourceCreate() failed. Error code: ",GetLastError());
    return;
    }
    
  //--- 作成された新しいリソースの配列サイズをエキスパートログに出力
  Print("Size of created new recource array: ",rc_data_copy.Size());
 
  //--- グラフィックラベルオブジェクトを作成
  //  BitmapLabelオブジェクトを新しく作成し、失敗した場合はエラーメッセージを出力
  string obj_name2="BitmapLabel";
  if(!ObjectCreate(0,obj_name2,OBJ_BITMAP_LABEL,0,0,0))
    {
    Print("ObjectCreate() failed. Error code: ",GetLastError());
    return;
    }

この部分では、新しいグラフィックリソースを作成し、グラフィックラベルオブジェクトを生成しています。

新しいグラフィックリソースを作成

ResourceCreate関数を使って、新しい名前でグラフィックリソースを作成しています。rc_nameに”Copy”を付け加えた名前を使用して、新しいリソースとしてrc_data_copy配列に格納されたピクセルデータを用いてリソースを作成します。幅、高さ、カラーフォーマットなどは先に定義したものと同じです。リソースの作成に失敗した場合には、Print関数でエラーメッセージを出力し、GetLastError関数でエラーコードを取得します。

新しいリソースの配列サイズをエキスパートログに出力

作成された新しいリソースに対して、rc_data_copy配列のサイズをエキスパートログに出力します。これにより、新しいリソースが正しく作成されているかどうかを確認できます。

グラフィックラベルオブジェクトを作成

ObjectCreate関数を使用して、新しくBitmapLabelオブジェクトを作成しています。オブジェクト名として”BitmapLabel”を指定し、オブジェクトの初期位置やその他のパラメータはデフォルトで設定されています。もしオブジェクトの作成に失敗した場合は、Print関数でエラーメッセージを出力し、エラーが発生した場合はスクリプトを終了させます。

サンプルコード解説9:OnStart関数部分その9

  //--- チャート上でティックの時刻と価格に基づいて画面座標を取得
  int x=0, y=0;
  if(!ChartTimePriceToXY(0,0,tick.time,tick.bid,x,y))
    {
    Print("ChartTimePriceToXY() failed. Error code: ",GetLastError());
    return;
    }
    
  //--- グラフィックラベルオブジェクトの幅と高さを設定
  ObjectSetInteger(0,obj_name2,OBJPROP_XSIZE,rc_width);
  ObjectSetInteger(0,obj_name2,OBJPROP_YSIZE,rc_height);
  
  //--- オブジェクトのアンカーポイントを左上に設定
  ObjectSetInteger(0,obj_name2,OBJPROP_ANCHOR,ANCHOR_LEFT_UPPER);
  
  //--- オブジェクトのX座標とY座標の位置を設定
  ObjectSetInteger(0,obj_name2,OBJPROP_XDISTANCE,x);
  ObjectSetInteger(0,obj_name2,OBJPROP_YDISTANCE,y);
  
  //--- コピーされたグラフィックリソースをグラフィックラベルに適用
  ObjectSetString(0,obj_name2,OBJPROP_BMPFILE,"::"+rc_name+"Copy");

この部分では、チャート上の座標を取得し、グラフィックラベルオブジェクトのプロパティを設定しています。

チャート上の座標を取得

ChartTimePriceToXY関数を使用して、指定した時間と価格に基づいてチャート上のX座標とY座標を取得しています。この場合、ティックデータ(tick.timeとtick.bid)を基にした座標が取得されます。xとyは取得した座標値が格納される変数です。この操作が失敗した場合は、Print関数でエラーメッセージを出力し、スクリプトの実行を終了します。

グラフィックラベルオブジェクトの幅と高さを設定

ObjectSetInteger関数を使用して、グラフィックラベルオブジェクトの幅と高さを設定します。rc_widthとrc_heightに設定されたリソースのサイズに基づき、オブジェクトが正しいサイズで表示されるようにします。

オブジェクトのアンカーポイントを左上に設定

ObjectSetInteger関数を使って、オブジェクトのアンカーポイントを左上に設定しています。これにより、オブジェクトが指定したX座標とY座標の位置に対して、左上を基準に表示されます。

オブジェクトのX座標とY座標の位置を設定

取得したチャート上のX座標とY座標をObjectSetInteger関数を使用して、それぞれオブジェクトのX座標とY座標に設定しています。これにより、オブジェクトがチャート上の正しい位置に表示されるようになります。

コピーされたグラフィックリソースをグラフィックラベルに適用

ObjectSetString関数を使用して、コピーされたグラフィックリソースをグラフィックラベルオブジェクトに適用しています。リソース名には”::”を付加してリソース名を指定し、これによりグラフィックラベルオブジェクトに画像が適用されます。

サンプルコード解説10:OnStart関数部分その10

 //--- 3秒待機してからGreenYellow色に変更
  Print("Wait 3 seconds before changing color to GreenYellow");
  Sleep(3000);
  clr=ColorToARGB(clrGreenYellow,200);
  ArrayInitialize(rc_data_copy,clr);
  
  //--- グラフィックリソースのデータを再更新し、チャートを再描画
  Update(rc_name+"Copy",rc_data_copy,rc_width,rc_height,true);
 
  //--- リソースとオブジェクトを削除する前に3秒待機
  Print("Wait 3 seconds before deleting both objects");
  Sleep(3000);
  
  //--- 作成したリソースとオブジェクトを削除
  Print("Deleting Resource and all Bitmap objects");
  ResourceFree("::"+rc_name);
  ResourceFree("::"+rc_name+"Copy");
  ObjectDelete(0,obj_name);
  ObjectDelete(0,obj_name2);
 }

この部分では、色の変更、グラフィックリソースの再更新、リソースとオブジェクトの削除を行っています。

GreenYellow色に変更

まず、Sleep関数を使い3秒間待機した後、ColorToARGB関数を使用してGreenYellow色を透明度200で設定します。次に、ArrayInitialize関数を使って、rc_data_copy配列全体をGreenYellow色で塗りつぶしています。この処理によって、ピクセル配列がGreenYellow色に更新されます。

グラフィックリソースのデータを再更新し、チャートを再描画

Update関数を使用して、リソースデータを更新します。新しく塗りつぶしたピクセルデータを基に、グラフィックリソースを再作成し、再描画します。これにより、チャート上のオブジェクトに色の変更が反映されます。

リソースとオブジェクトを削除する前に3秒待機

次に、リソースとオブジェクトを削除する前に、Sleep関数を使用して再び3秒間待機します。この待機により、リソースが画面に表示される時間を確保しています。

作成したリソースとオブジェクトを削除

ResourceFree関数を使用して、作成したグラフィックリソースを解放します。リソース名に”::”を付けてリソースを指定し、リソースを削除します。また、ObjectDelete関数を使って、BitmapオブジェクトとBitmapLabelオブジェクトを削除します。これにより、リソースとオブジェクトがチャート上から完全に取り除かれます。

サンプルコード解説11:Update関数(オリジナル関数)

//+------------------------------------------------------------------+
//| グラフィックリソースデータを更新する関数                          |
//+------------------------------------------------------------------+
void Update(const string res_name,const uint &pixel_data[],const uint width,const uint height,const bool redraw)
 {
  //--- リソースの幅や高さがゼロの場合は処理を終了
  if(width==0 || height==0)
    return;
  
  //--- リソースデータを更新し、必要に応じてチャートを再描画する
  //  描画を更新し、ビジュアルに反映させる
  if(ResourceCreate(res_name,pixel_data,width,height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE) && redraw)
    ChartRedraw();
 }

このUpdate関数は、グラフィックリソースのデータを更新し、必要に応じてチャートを再描画するために使用されます。

各引数の説明

  • res_name
    リソース名を指定します。。先に作成したリソースと同じ名前を使用することで、そのリソースを更新します。
  • pixel_data
    グラフィックリソースに使用するピクセルデータの配列です。リソースの各ピクセルに対応する色情報が含まれています。この配列を基にリソースが再作成されます。
  • width
    グラフィックリソースの幅(ピクセル単位)を指定します。配列の横方向のサイズで、リソース作成時に必要です。
  • height
    グラフィックリソースの高さ(ピクセル単位)を指定します。配列の縦方向のサイズで、リソース作成時に必要です。
  • redraw
    再描画のフラグです。この値がtrueの場合、リソースの更新後にチャートが再描画されます。falseの場合、チャートの再描画は行われません。

リソースの幅や高さがゼロの場合は処理を終了

関数の最初で、リソースの幅や高さがゼロの場合には、その後の処理を行わず、関数を終了します。これは、無効なリソースサイズでリソースを作成しないための安全措置です。幅や高さがゼロのリソースは存在しないため、無駄な処理を防ぎます。

リソースデータを更新し、必要に応じてチャートを再描画

リソースデータの更新は、ResourceCreate関数を使用して行います。指定されたリソース名とピクセルデータ、リソースの幅と高さを使用して、グラフィックリソースを再作成します。カラー形式はCOLOR_FORMAT_ARGB_NORMALIZEで指定されています。これにより、ピクセルデータがリソースとして正しく更新されます。

また、redrawがtrueに設定されている場合は、ChartRedraw関数が呼び出され、チャートが再描画されます。これにより、グラフィックリソースの更新がチャート上に即座に反映されます。

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