//--- descripción #property description "El scribt dibuja el signo \"Marca\"." #property description "La coordenada del punto de anclaje se establece en" #property description "por cientos de las dimensiones de la ventana del gráfico." //--- 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="ArrowCheck"; // Nombre del signo input int InpDate=10; // Fecha del punto de anclaje en % input int InpPrice=50; // Precio del punto de anclaje en % input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // Modo de anclaje input color InpColor=clrRed; // Color del signo input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Estilo de la línea del contorno input int InpWidth=5; // Tamaño del signo input bool InpBack=false; // Signo 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 signo "Marca" | //+------------------------------------------------------------------+ bool ArrowCheckCreate(const long chart_ID=0, // ID del gráfico const string name="ArrowCheck", // nombre del signo const int sub_window=0, // número de subventana datetime time=0, // hora del punto de anclaje double price=0, // precio del punto de anclaje const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // modo de anclaje const color clr=clrRed, // color del signo const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de la línea del contorno const int width=3, // tamaño del signo const bool back=false, // al fondo const bool selection=true, // 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 { //--- establecemos las coordenadas del punto de anclaje si todavía no han sido establecidas ChangeArrowEmptyPoint(time,price); //--- anulamos el valor del error ResetLastError(); //--- creamos el signo if(!ObjectCreate(chart_ID,name,OBJ_ARROW_CHECK,sub_window,time,price)) { Print(__FUNCTION__, ": ¡Fallo al crear el signo \"Marca\"! Código del error = ",GetLastError()); return(false); } //--- establecemos el modo de anclaje ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor); //--- establecemos el color del signo ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- establecemos el estilo de la línea del contorno ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); //--- establecemos el tamaño del signo 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 signo con ratón //--- cuando el objeto gráfico se crea usando la función ObjectCreate, por defecto el objeto //--- no se puede seleccionar y mover. Mientras que dentro de este método el parámetro selection //--- por defecto es igual a true, lo que permite seleccionar y mover este objeto 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 con el ratón sobre el gráfico ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); //--- ejecución con éxito return(true); } //+------------------------------------------------------------------+ //| Mueve el punto de anclaje | //+------------------------------------------------------------------+ bool ArrowCheckMove(const long chart_ID=0, // ID del gráfico const string name="ArrowCheck", // nombre del objeto datetime time=0, // coordenada del tiempo del punto de anclaje double price=0) // coordenada del precio del punto de anclaje { //--- si las coordenadas del punto de anclaje no han sido establecidas, lo movemos a la barra actual con el precio Bid if(!time) time=TimeCurrent(); if(!price) price=SymbolInfoDouble(Symbol(),SYMBOL_BID); //--- anulamos el valor del error ResetLastError(); //--- movemos el punto de anclaje if(!ObjectMove(chart_ID,name,0,time,price)) { Print(__FUNCTION__, ": ¡Fallo al mover el punto de anclaje! Código del error = ",GetLastError()); return(false); } //--- ejecución con éxito return(true); } //+------------------------------------------------------------------+ //| Cambia el modo de anclaje del signo "Marca" | //+------------------------------------------------------------------+ bool ArrowCheckAnchorChange(const long chart_ID=0, // ID del gráfico const string name="ArrowCheck", // nombre del objeto const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // modo de anclaje { //--- anulamos el valor del error ResetLastError(); //--- cambiamos el modo de anclaje if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor)) { Print(__FUNCTION__, ": ¡Fallo al cambiar el modo de anclaje! Código del error = ",GetLastError()); return(false); } //--- ejecución con éxito return(true); } //+------------------------------------------------------------------+ //| Elimina el signo "Marca" | //+------------------------------------------------------------------+ bool ArrowCheckDelete(const long chart_ID=0, // ID del gráfico const string name="ArrowCheck") // nombre del signo { //--- anulamos el valor del error ResetLastError(); //--- eliminamos el signo if(!ObjectDelete(chart_ID,name)) { Print(__FUNCTION__, ": ¡Fallo al eliminar el signo \"Marca\"! Código del error = ",GetLastError()); return(false); } //--- ejecución con éxito return(true); } //+------------------------------------------------------------------+ //| Comprueba los valores de los puntos de anclaje y para | //| los valores vacíos establece los valores por defecto | //+------------------------------------------------------------------+ void ChangeArrowEmptyPoint(datetime &time,double &price) { //--- si la hora del punto no ha sido establecida, se colocará en la barra actual if(!time) time=TimeCurrent(); //--- si el precio del punto no ha sido establecido, tendrá el valor Bid if(!price) price=SymbolInfoDouble(Symbol(),SYMBOL_BID); } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- comprobamos si los parámetros de entrada son correctos if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>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); //--- tamaño del array price int accuracy=1000; //--- arrays para guardar los valores de las fechas y precios que van a utilizarse //--- para establecer y modificar las coordenadas del punto de anclaje del signo datetime date[]; double price[]; //--- asignación de la memoria ArrayResize(date,bars); ArrayResize(price,accuracy); //--- 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; } //--- llenamos el array de precios //--- encontramos el valor máximo y mínimo del gráfico double max_price=ChartGetDouble(0,CHART_PRICE_MAX); double min_price=ChartGetDouble(0,CHART_PRICE_MIN); //--- determinamos el paso del cambio del precio y llenamos el array double step=(max_price-min_price)/accuracy; for(int i=0;i<accuracy;i++) price[i]=min_price+i*step; //--- definimos los puntos para trazar el signo int d=InpDate*(bars-1)/100; int p=InpPrice*(accuracy-1)/100; //--- creamos el signo "Marca" en el gráfico if(!ArrowCheckCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor, InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder)) { return; } //--- redibujamos el gráfico y esperamos 1 segundo ChartRedraw(); Sleep(1000); //--- ahora vamos a mover el punto de anclaje y cambiar su posición respecto al signo //--- contador del ciclo int h_steps=bars*2/5; //--- movemos el punto de anclaje for(int i=0;i<h_steps;i++) { //--- cogemos el siguiente valor if(d<bars-1) d+=1; //--- movemos el punto if(!ArrowCheckMove(0,InpName,date[d],price[p])) return; //--- comprobamos si el trabajo del script ha sido finalizado forzosamente if(IsStopped()) return; //--- redibujamos el gráfico ChartRedraw(); // retardo de 0,025 segundo Sleep(25); } //--- cambiamos la posición del punto de anclaje respecto al signo ArrowCheckAnchorChange(0,InpName,ANCHOR_BOTTOM); //--- redibujamos el gráfico ChartRedraw(); //--- contador del ciclo h_steps=bars*2/5; //--- movemos el punto de anclaje for(int i=0;i<h_steps;i++) { //--- cogemos el siguiente valor if(d<bars-1) d+=1; //--- movemos el punto if(!ArrowCheckMove(0,InpName,date[d],price[p])) return; //--- comprobamos si el trabajo del script ha sido finalizado forzosamente if(IsStopped()) return; //--- redibujamos el gráfico ChartRedraw(); // retardo de 0,025 segundo Sleep(25); } //--- retardo de 1 segundo Sleep(1000); //--- eliminamos el signo desde el gráfico ArrowCheckDelete(0,InpName); ChartRedraw(); //--- retardo de 1 segundo Sleep(1000); //--- } |