OBJ_ARROW_UP

Signo "Flecha arriba".

ObjArrowUp

Nota

Desde la enumeración ENUM_ARROW_ANCHOR se puede elegir la posición del punto de anclaje respecto al signo.

Los signos de gran tamaño (más de 5) se puede crear sólo poniendo el correspondiente valor de la propiedad OBJPROP_WIDTH durante la escritura del código en MetaEditor.

Ejemplo

El siguiente script crea y desplaza el signo "Flecha arriba" en el gráfico. Para la creación y modificación de las propiedades del objeto gráfico han sido escritas unas funciones especiales que Usted puede utilizar "como son" en sus propias aplicaciones.

 

//--- descripción
#property description "El scribt dibuja el signo \"Flecha arriba\"."
#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="ArrowUp";    // Nombre del signo
input int               InpDate=25;           // Fecha del punto de anclaje en %
input int               InpPrice=25;          // 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 "Flecha arriba"                                     |
//+------------------------------------------------------------------+
bool ArrowUpCreate(const long              chart_ID=0,           // ID del gráfico
                   const string            name="ArrowUp",       // nombre del objeto
                   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_UP,sub_window,time,price))
     {
      Print(__FUNCTION__,
            ": ¡Fallo al crear el signo \"Flecha arriba\"! 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 sobre el gráfico
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- ejecución con éxito
   return(true);
  }
//+------------------------------------------------------------------+
//| Mueve el punto de anclaje                                        |
//+------------------------------------------------------------------+
bool ArrowUpMove(const long   chart_ID=0,     // ID del gráfico
                 const string name="ArrowUp"// 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 "Flecha arriba"                            |
//+------------------------------------------------------------------+
bool ArrowUpAnchorChange(const long              chart_ID=0,        // ID del gráfico
                         const string            name="ArrowUp",    // nombre del objeto
                         const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP// modo de anclaje
  {
//--- anulamos el valor del error
   ResetLastError();
//--- cambiamos la posición del punto 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 "Flecha arriba"                                     |
//+------------------------------------------------------------------+
bool ArrowUpDelete(const long   chart_ID=0,     // ID del gráfico
                   const string name="ArrowUp"// nombre del objeto
  {
//--- anulamos el valor del error
   ResetLastError();
//--- eliminamos el signo
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": ¡Fallo al eliminar el signo \"Flecha arriba\"! 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 "Flecha arriba" en el gráfico
   if(!ArrowUpCreate(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 v_steps=accuracy/2;
//--- movemos el punto de anclaje
   for(int i=0;i<v_steps;i++)
     {
      //--- cogemos el siguiente valor
      if(p<accuracy-1)
         p+=1;
      //--- movemos el punto
      if(!ArrowUpMove(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 1 segundo
   Sleep(1000);
//--- cambiamos la posición del punto de anclaje respecto al signo
   ArrowUpAnchorChange(0,InpName,ANCHOR_BOTTOM);
//--- redibujamos el gráfico
   ChartRedraw();
//--- retardo de 1 segundo
   Sleep(1000);
//--- eliminamos el signo desde el gráfico
   ArrowUpDelete(0,InpName);
   ChartRedraw();
//--- retardo de 1 segundo
   Sleep(1000);
//---
  }