//--- descripción #property description "El script construye el objeto gráfico \"Evento\"." #property description "La fecha del punto de anclaje se establece en por cientos del" #property description "ancho de la ventana del gráfico de barras." //--- mostramos la ventana de los parámetros de entrada durante el arranque del script #property script_show_inputs //--- los parámetros de entrada del script input string InpName="Event"; // Nombre del evento input int InpDate=25; // Fecha del evento en % input string InpText="Text"; // Texto del evento input color InpColor=clrRed; // Color del evento input int InpWidth=1; // Tamaño del punto durante la selección input bool InpBack=false; // Evento al fondo input bool InpSelection=false; // Seleccionar para mover input bool InpHidden=true; // Ocultar en la lista de objetos input long InpZOrder=0; // Prioridad para el clic del ratón //+------------------------------------------------------------------+ //| Crea el objeto "Evento" en el gráfico | //+------------------------------------------------------------------+ bool EventCreate(const long chart_ID=0, // ID del gráfico const string name="Event", // nombre del evento const int sub_window=0, // número de subventana const string text="Text", // texto del evento datetime time=0, // hora const color clr=clrRed, // color const int width=1, // grosor del punto durante la selección const bool back=false, // al fondo const bool selection=false, // seleccionar para mover const bool hidden=true, // ocultar en la lista de objetos const long z_order=0) // prioridad para el clic del ratón { //--- si la hora no está definida, creamos el objeto en la última barra if(!time) time=TimeCurrent(); //--- anulamos el valor del error ResetLastError(); //--- creamos el objeto "Evento" if(!ObjectCreate(chart_ID,name,OBJ_EVENT,sub_window,time,0)) { Print(__FUNCTION__, ": ¡Fallo al crear el objeto \"Evento\"! Código del error = ",GetLastError()); return(false); } //--- ponemos el texto del evento ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); //--- establecemos el color ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- establecemos el grosor del punto de anclaje si el objeto está seleccionado ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); //--- mostramos en el primer plano (false) o al fondo (true) ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); //--- activar (true) o desactivar (false) el modo de desplazamiento del evento con ratón ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); //--- ocultamos (true) o mostramos (false) el nombre del objeto gráfico en la lista de objetos ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); //--- establecemos la prioridad para obtener el evento de cliquear sobre el gráfico ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); //--- ejecución con éxito return(true); } //+------------------------------------------------------------------+ //| Cambia el texto del objeto "Evento" | //+------------------------------------------------------------------+ bool EventTextChange(const long chart_ID=0, // ID del gráfico const string name="Event", // nombre del evento const string text="Text") // texto { //--- anulamos el valor del error ResetLastError(); //--- cambiamos el texto del objeto if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text)) { Print(__FUNCTION__, ": ¡Fallo al cambiar el texto! Código del error = ",GetLastError()); return(false); } //--- ejecución con éxito return(true); } //+------------------------------------------------------------------+ //| Mueve el objeto "Evento" | //+------------------------------------------------------------------+ bool EventMove(const long chart_ID=0, // ID del gráfico const string name="Event", // nombre del evento datetime time=0) // hora { //--- si la hora no está definida, movemos el evento a la última barra if(!time) time=TimeCurrent(); //--- anulamos el valor del error ResetLastError(); //--- movemos el objeto if(!ObjectMove(chart_ID,name,0,time,0)) { Print(__FUNCTION__, ": ¡Fallo al mover el objeto \"Evento\"! Código del error = ",GetLastError()); return(false); } //--- ejecución con éxito return(true); } //+------------------------------------------------------------------+ //| Elimina el objeto "Evento" | //+------------------------------------------------------------------+ bool EventDelete(const long chart_ID=0, // ID del gráfico const string name="Event") // nombre del evento { //--- anulamos el valor del error ResetLastError(); //--- eliminamos el objeto if(!ObjectDelete(chart_ID,name)) { Print(__FUNCTION__, ": ¡Fallo al eliminar el objeto \"Evento\"! Código del error = ",GetLastError()); return(false); } //--- ejecución con éxito return(true); } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- comprobamos si los parámetros de entrada son correctos if(InpDate<0 || InpDate>100) { Print("¡Error. Los parámetros de entrada no son correctos!"); return; } //--- número de barras visibles en la ventana del gráfico int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS); //--- array para guardar los valores de las fechas que van a utilizarse //--- para establecer y cambiar las coordenadas del punto de anclaje de el objeto datetime date[]; //--- asignación de la memoria ArrayResize(date,bars); //--- llenamos el array de datos ResetLastError(); if(CopyTime(Symbol(),Period(),0,bars,date)==-1) { Print("¡Fallo al copiar el valor de la hora! Código del error = ",GetLastError()); return; } //--- definimos los puntos para crear el objeto int d=InpDate*(bars-1)/100; //--- creamos el objeto "Evento" if(!EventCreate(0,InpName,0,InpText,date[d],InpColor,InpWidth, InpBack,InpSelection,InpHidden,InpZOrder)) { return; } //--- redibujamos el gráfico y esperamos 1 segundo ChartRedraw(); Sleep(1000); //--- ahora vamos a mover el objeto //--- contador del ciclo int h_steps=bars/2; //--- movemos el objeto for(int i=0;i<h_steps;i++) { //--- cogemos el siguiente valor if(d<bars-1) d+=1; //--- movemos el punto if(!EventMove(0,InpName,date[d])) return; //--- comprobamos si el trabajo del script ha sido finalizado forzosamente if(IsStopped()) return; //--- redibujamos el gráfico ChartRedraw(); // retardo de 0,05 segundo Sleep(50); } //--- retardo de 1 segundo Sleep(1000); //--- eliminamos el canal desde el gráfico EventDelete(0,InpName); ChartRedraw(); //--- retardo de 1 segundo Sleep(1000); //--- } |