Constantes de precios

Los indicadores técnicos requieren para sus cálculos la especificación de los valores de los precios y/o volúmenes a base de los cuales serán calculados. Hay 7 identificadores predefinidos de la enumeración ENUM_APPLIED_PRICE que se usan para especificar la base de precios necesaria para los cálculos.

ENUM_APPLIED_PRICE

Identificador

Descripción

PRICE_CLOSE

Precio de cierre

PRICE_OPEN

Precio de apertura

PRICE_HIGH

Precio máximo en el período

PRICE_LOW

Precio mínimo en el período

PRICE_MEDIAN

Precio mediano, (high+low)/2

PRICE_TYPICAL

Precio típico, (high+low+close)/3

PRICE_WEIGHTED

Precio promedio, (high+low+close+close)/4

Si en los cálculos se usa el volumen, hay que indicar uno de dos valores de la enumeración ENUM_APPLIED_VOLUME.

ENUM_APPLIED_VOLUME

Identificador

Descripción

VOLUME_TICK

Volumen de tick

VOLUME_REAL

Volumen comercial

El indicador técnico iStochastic() se calcula de dos maneras, utilizando:

  • o sólo los precios Close;
  • o los precios High y Low.

Para eligir la opción necesaria de cálculo hay que indicar uno de los valores de la enumeración ENUM_STO_PRICE.

ENUM_STO_PRICE

Identificador

Descripción

STO_LOWHIGH

Calcular basándose en los precios Low/High

STO_CLOSECLOSE

Calcular basándose en los precios Close/Close

Si un indicador técnico para sus cálculos utiliza los datos cuyo tipo es definido por la enumeración ENUM_APPLIED_PRICE, entonces el manejador de cualquier indicador (built-in en el terminal o escrito por el usuario) puede ser usado como serie de precios de entrada. En este caso para los cálculos serán utilizados los valores del buffer cero del indicador. Eso permite desarrollar fácilmente los valores de un indicador a base de los valores del otro. El manejador de un indicador personalizado se crea llamando a la función iCustom().

Ejemplo:

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- input parameters
input int      RSIperiod=14;         // período para calcular RSI
input int      Smooth=8;             // período de alisamiento RSI
input ENUM_MA_METHOD meth=MODE_SMMA// método de alisamiento
//---- plot RSI
#property indicator_label1  "RSI"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//---- plot RSI_Smoothed
#property indicator_label2  "RSI_Smoothed"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrNavy
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         RSIBuffer[];          // aquí vamos a almacenar los valores RSI
double         RSI_SmoothedBuffer[]; // aquí estarán los valores suavizados RSI 
int            RSIhandle;            // descriptor de indicador RSI
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,RSIBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,RSI_SmoothedBuffer,INDICATOR_DATA);
   IndicatorSetString(INDICATOR_SHORTNAME,"iRSI");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- 
   RSIhandle=iRSI(NULL,0,RSIperiod,PRICE_CLOSE);
//---
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[]
                 )
 
  {
//--- ponemos a cero el valor del último error
   ResetLastError();
//--- obtenemos los datos del indicador RSI en un array RSIBuffer[]
   int copied=CopyBuffer(RSIhandle,0,0,rates_total,RSIBuffer);
   if(copied<=0)
     {
      Print("Fallo al copiar los valores del indicador RSI. Error = ",
            GetLastError(),",  copied = ",copied);
      return(0);
     }
//--- creamos el indicador de la media usando los valores del indicador RSI 
   int RSI_MA_handle=iMA(NULL,0,Smooth,0,meth,RSIhandle);
   copied=CopyBuffer(RSI_MA_handle,0,0,rates_total,RSI_SmoothedBuffer);
   if(copied<=0)
     {
      Print("Fallo al copiar el indicador suavizado RSI. Error = ",
            GetLastError(),",  copied = ",copied);
      return(0);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }