OBJ_ARROW

Objeto "Flecha".

ObjArrow

Nota

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

Las flechas 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.

Se puede elegir el tipo necesario de la flecha poniendo uno de los códigos del símbolo de la fuente Wingdings.

Ejemplo

El siguiente script crea el objeto "Flecha" en el gráfico y cambia su tipo. 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 script crea la flecha aleatoria en la ventana del gráfico."
#property description "La coordenada del punto de anclaje se establece en por cientos"
#property description "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="Arrow";        // Nombre de la flecha
input int               InpDate=50;             // 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=clrDodgerBlue// Color de la flecha
input ENUM_LINE_STYLE   InpStyle=STYLE_SOLID;   // Estilo de la línea del contorno
input int               InpWidth=10;            // Tamaño de la flecha
input bool              InpBack=false;          // Flecha 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 la flecha                                                  |
//+------------------------------------------------------------------+
bool ArrowCreate(const long              chart_ID=0,           // ID del gráfico
                 const string            name="Arrow",         // nombre de la flecha
                 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 uchar             arrow_code=252,       // código de la flecha
                 const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM// posición del punto de anclaje
                 const color             clr=clrRed,           // color de la flecha
                 const ENUM_LINE_STYLE   style=STYLE_SOLID,    // estilo de la línea del contorno
                 const int               width=3,              // tamaño de la flecha
                 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 la flecha
   if(!ObjectCreate(chart_ID,name,OBJ_ARROW,sub_window,time,price))
     {
      Print(__FUNCTION__,
            ": ¡Fallo al crear la flecha! Código del error = ",GetLastError());
      return(false);
     }
//--- establecemos el código de la flecha
   ObjectSetInteger(chart_ID,name,OBJPROP_ARROWCODE,arrow_code);
//--- establecemos el modo de anclaje
   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- establecemos el color de la flecha
   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 de la flecha
   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 de la flecha 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 ArrowMove(const long   chart_ID=0,   // ID del gráfico
               const string name="Arrow"// 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 código de la flecha                                               |
//+------------------------------------------------------------------+
bool ArrowCodeChange(const long   chart_ID=0,   // ID del gráfico
                     const string name="Arrow"// nombre del objeto
                     const uchar  code=252)     // código de la flecha
  {
//--- anulamos el valor del error
   ResetLastError();
//--- cambiamos el código de la flecha
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_ARROWCODE,code))
     {
      Print(__FUNCTION__,
            ": ¡Fallo al cambiar el código de la flecha! Código del error = ",GetLastError());
      return(false);
     }
//--- ejecución con éxito
   return(true);
  }
//+------------------------------------------------------------------+
//| Cambia el modo de anclaje                            |
//+------------------------------------------------------------------+
bool ArrowAnchorChange(const long              chart_ID=0,        // ID del gráfico
                       const string            name="Arrow",      // nombre del objeto
                       const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP// modo del 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 la flecha                                                  |
//+------------------------------------------------------------------+
bool ArrowDelete(const long   chart_ID=0,   // ID del gráfico
                 const string name="Arrow"// nombre de la flecha
  {
//--- anulamos el valor del error
   ResetLastError();
//--- eliminamos la flecha
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": ¡Fallo al eliminar la flecha! 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 la flecha
   int d=InpDate*(bars-1)/100;
   int p=InpPrice*(accuracy-1)/100;
//--- creamos la flecha en el gráfico
   if(!ArrowCreate(0,InpName,0,date[d],price[p],32,InpAnchor,InpColor,
      InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
     {
      return;
     }
//--- redibujamos el gráfico
   ChartRedraw();
//--- vamos a ver en el ciclo todas las variantes de creación de las flechas
   for(int i=33;i<256;i++)
     {
      if(!ArrowCodeChange(0,InpName,(uchar)i))
         return;
      //--- comprobamos si el trabajo del script ha sido finalizado forzosamente
      if(IsStopped())
         return;
      //--- redibujamos el gráfico
      ChartRedraw();
      // retardo de medio segundo
      Sleep(500);
     }
//--- retardo de 1 segundo
   Sleep(1000);
//--- eliminamos la flecha desde el gráfico
   ArrowDelete(0,InpName);
   ChartRedraw();
//--- retardo de 1 segundo
   Sleep(1000);
//---
  }