//--- parámetros del recurso gráfico string ExtResName="Resource"; int ExtResWidth=100; int ExtResHeight=100; uint ExtResData[]; int ExtResSize=ExtResWidth*ExtResHeight; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { ResetLastError(); //--- establecemos el tamaño del array en píxeles if(ArrayResize(ExtResData,ExtResSize)!=ExtResSize) { Print("ArrayResize() failed. Error code: ",GetLastError()); return; } //--- rellenamos la matriz de píxeles con un color transparente y creamos un recurso gráfico basado en él 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()); //--- comprobamos el recurso gráfico creado. //--- obtenemos los datos de hora y precio de la siguiente barra MqlTick tick={}; if(!SymbolInfoTick(Symbol(),tick)) { Print("SymbolInfoTick() failed. Error code: ",GetLastError()); return; } //--- creamos un objeto "Dibujo" en las coordenadas del precio y la hora del último tick string obj_name="Bitmap"; if(!ObjectCreate(0,obj_name,OBJ_BITMAP,0,tick.time,tick.bid)) { Print("ObjectCreate() failed. Error code: ",GetLastError()); return; } //--- establecemos una anchura y una altura del objeto de dibujo creado igual a la anchura y la altura del recurso gráfico. //--- establecemos el punto de anclaje del objeto en su centro. ObjectSetInteger(0,obj_name,OBJPROP_XSIZE,ExtResWidth); ObjectSetInteger(0,obj_name,OBJPROP_YSIZE,ExtResHeight); ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER); //--- establecemos un recurso gráfico creado previamente como archivo de imagen para el objeto de dibujo //--- en este caso, para especificar el nombre del recurso gráfico que se va a utilizar, debemos añadir antes de su nombre "::" ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"::"+ExtResName); //--- establecemos el color GreenYellow con una transparencia 200 uint clr=ColorToARGB(clrGreenYellow,200); //--- rellenamos todo el array de píxeles del recurso gráfico con el color establecido ArrayInitialize(ExtResData,clr); //--- dibujamos una cuadrícula con el color 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)); //--- actualizamos los datos del recurso gráfico Update(ExtResName,ExtResData,ExtResWidth,ExtResHeight,true); //--- esperamos 3 segundos antes de eliminar el recurso y el objeto gráfico Print("Wait 3 seconds before deleting the resource and graphic object"); Sleep(3000); //--- guardamos el recurso en un archivo ResetLastError(); if(!ResourceSave("::"+ExtResName,"ResourceSave\\"+ExtResName+".bmp")) { Print("ResourceSave() failed. Error code: ",GetLastError()); return; } //--- eliminamos el recurso y el objeto de dibujo gráfico if(!ResourceFree("::"+ExtResName)) { Print("ResourceFree() failed. Error code: ",GetLastError()); return; } if(!ObjectDelete(0,obj_name)) { Print("ObjectDelete() failed. Error code: ",GetLastError()); return; } //--- ahora creamos un nuevo objeto "Etiqueta gráfica" en las coordenadas del precio y la hora del último tick, desplazado a la izquierda según la anchura de la imagen //--- obtenemos las coordenadas de pantalla según el precio y la hora obtenidos previamente 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; } //--- establecemos el punto de anclaje del objeto en su centro. ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER); //--- establecemos para el objeto de etiqueta gráfica las coordenadas del precio y la hora del último tick, desplazadas a la izquierda según la anchura de la imagen ObjectSetInteger(0,obj_name,OBJPROP_XDISTANCE,x-ExtResWidth); ObjectSetInteger(0,obj_name,OBJPROP_YDISTANCE,y); //--- especificamos el recurso previamente guardado como una imagen bmp para el objeto de etiqueta gráfica como un archivo de imagen ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"\\Files\\ResourceSave\\"+ExtResName+".bmp"); //--- actualizamos el gráfico ChartRedraw(); //--- esperamos 3 segundos antes de eliminar el objeto de etiqueta gráfica Print("Wait 3 seconds before deleting the new graphic object"); Sleep(3000); if(!ObjectDelete(0,obj_name)) Print("ObjectDelete() failed. Error code: ",GetLastError()); } //+------------------------------------------------------------------+ //| Actualiza los datos de los recursos gráficos | //+------------------------------------------------------------------+ void Update(const string res_name,const uint &pixel_data[],const uint width,const uint height,const bool redraw) { //--- si se ha transmitido un tamaño cero, salimos if(width==0 || height==0) return; //--- actualizamos los datos de los recursos y redibujamos el gráfico if(ResourceCreate(res_name,pixel_data,width,height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE) && redraw) ChartRedraw(); } //+------------------------------------------------------------------+ //| Dibuja una línea vertical | //+------------------------------------------------------------------+ void LineVertical(int x,int y1,int y2,const uint clr) { int tmp; //--- clasificación según Y if(y1>y2) { tmp=y1; y1 =y2; y2 =tmp; } //--- línea furea de la imagen if(y2<0 || y1>=ExtResHeight || x<0 || x>=ExtResWidth) return; //--- permanecemos dentro de los límites de la imagen if(y1<0) y1=0; if(y2>=ExtResHeight) y2=ExtResHeight-1; //--- dibujamos la línea int index=y1*ExtResWidth+x; for(int i=y1; i<=y2; i++,index+=ExtResWidth) ExtResData[index]=clr; } //+------------------------------------------------------------------+ //| Dibuja una línea horizontal | //+------------------------------------------------------------------+ void LineHorizontal(int x1,int x2,int y,const uint clr) { int tmp; //--- clasificación según X if(x1>x2) { tmp=x1; x1 =x2; x2 =tmp; } //--- línea furea de la imagen if(x2<0 || x1>=ExtResWidth || y<0 || y>=ExtResHeight) return; //--- permanecemos dentro de los límites de la imagen if(x1<0) x1=0; if(x2>=ExtResWidth) x2=ExtResWidth-1; //--- dibujamos la línea ArrayFill(ExtResData,y*ExtResWidth+x1,(x2-x1)+1,clr); } |