//--- グラフィックリソースパラメータ
string ExtResName="Resource";
int ExtResWidth=100;
int ExtResHeight=100;
uint ExtResData[];
int ExtResSize=ExtResWidth*ExtResHeight;
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
ResetLastError();
//--- ピクセル配列のサイズを設定する
if(ArrayResize(ExtResData,ExtResSize)!=ExtResSize)
{
Print("ArrayResize() failed. Error code: ",GetLastError());
return;
}
//--- ピクセル配列を透明色で塗りつぶし、それに基づいてグラフィック リソースを作成する
ArrayInitialize(ExtResData,0x00FFFFFF);
if(!ResourceCreate(ExtResName,ExtResData,ExtResWidth,ExtResHeight,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE))
{
Print("ResourceCreate() failed. Error code: ",GetLastError());
return;
}
Print("Size of created recource array: ",ExtResData.Size());
//--- 作成されたグラフィックリソースを確認する
//--- 現在の足の時間と価格のデータを取得する
MqlTick tick={};
if(!SymbolInfoTick(Symbol(),tick))
{
Print("SymbolInfoTick() failed. Error code: ",GetLastError());
return;
}
//--- 最後のティック価格と時刻の座標を使用して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,ExtResWidth);
ObjectSetInteger(0,obj_name,OBJPROP_YSIZE,ExtResHeight);
ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER);
//--- ビットマップオブジェクト用に以前に作成したグラフィックリソースを画像ファイルとして指定する
//--- この場合、使用されるグラフィックリソースの名前を示すために、その名前の前に「::」を追加する必要がある
ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"::"+ExtResName);
//--- 透明度200でGreenYellow色を設定する
uint clr=ColorToARGB(clrGreenYellow,200);
//--- グラフィックリソースのピクセル配列全体を設定された色で塗りつぶす
ArrayInitialize(ExtResData,clr);
//--- DodgerBlue色を使用してグリッドを描画する
for(int x=0;x<ExtResWidth;x+=9)
LineVertical(x,0,ExtResHeight,ColorToARGB(clrDodgerBlue,200));
for(int y=0;y<ExtResHeight;y+=9)
LineHorizontal(0,ExtResWidth,y,ColorToARGB(clrDodgerBlue,200));
//--- グラフィックリソースデータを更新する
Update(ExtResName,ExtResData,ExtResWidth,ExtResHeight,true);
//--- リソースとグラフィックオブジェクトを削除する前に3秒待つ
Print("Wait 3 seconds before deleting the resource and graphic object");
Sleep(3000);
//--- リソースをファイルに保存する
ResetLastError();
if(!ResourceSave("::"+ExtResName,"ResourceSave\\"+ExtResName+".bmp"))
{
Print("ResourceSave() failed. Error code: ",GetLastError());
return;
}
//--- リソースとグラフィックオブジェクト画像を削除する
if(!ResourceFree("::"+ExtResName))
{
Print("ResourceFree() failed. Error code: ",GetLastError());
return;
}
if(!ObjectDelete(0,obj_name))
{
Print("ObjectDelete() 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;
}
obj_name="BitmapLabel";
if(!ObjectCreate(0,obj_name,OBJ_BITMAP_LABEL,0,0,0))
{
Print("ObjectCreate() failed. Error code: ",GetLastError());
return;
}
//--- オブジェクトのアンカーポイントをその中心に設定する
ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER);
//--- 最後のティックの価格と時刻の座標を画像の幅だけ左にシフトして、グラフィカルラベルオブジェクトに設定する
ObjectSetInteger(0,obj_name,OBJPROP_XDISTANCE,x-ExtResWidth);
ObjectSetInteger(0,obj_name,OBJPROP_YDISTANCE,y);
//--- 以前にbmp画像として保存した、グラフィックラベルオブジェクトのリソースを画像ファイルとして指定する
ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"\\Files\\ResourceSave\\"+ExtResName+".bmp");
//--- チャートを更新する
ChartRedraw();
//--- グラフィックラベルオブジェクトを削除する前に3秒待つ
Print("Wait 3 seconds before deleting the new graphic object");
Sleep(3000);
if(!ObjectDelete(0,obj_name))
Print("ObjectDelete() failed. Error code: ",GetLastError());
}
//+------------------------------------------------------------------+
//| グラフィックリソースデータを更新する |
//+------------------------------------------------------------------+
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();
}
//+------------------------------------------------------------------+
//| 垂直線を描画する |
//+------------------------------------------------------------------+
void LineVertical(int x,int y1,int y2,const uint clr)
{
int tmp;
//--- Yによって並び替える
if(y1>y2)
{
tmp=y1;
y1 =y2;
y2 =tmp;
}
//--- 画像境界の外側の線
if(y2<0 || y1>=ExtResHeight || x<0 || x>=ExtResWidth)
return;
//--- 画像の境界内にとどまる
if(y1<0)
y1=0;
if(y2>=ExtResHeight)
y2=ExtResHeight-1;
//--- 線を引く
int index=y1*ExtResWidth+x;
for(int i=y1; i<=y2; i++,index+=ExtResWidth)
ExtResData[index]=clr;
}
//+------------------------------------------------------------------+
//| 水平線を描画する |
//+------------------------------------------------------------------+
void LineHorizontal(int x1,int x2,int y,const uint clr)
{
int tmp;
//--- Xによって並び替える
if(x1>x2)
{
tmp=x1;
x1 =x2;
x2 =tmp;
}
//--- 画像境界の外側の線
if(x2<0 || x1>=ExtResWidth || y<0 || y>=ExtResHeight)
return;
//--- 画像の境界内にとどまる
if(x1<0)
x1=0;
if(x2>=ExtResWidth)
x2=ExtResWidth-1;
//--- 線を引く
ArrayFill(ExtResData,y*ExtResWidth+x1,(x2-x1)+1,clr);
}
|