Mira cómo descargar robots gratis
¡Búscanos en Twitter!
Pon "Me gusta" y sigue las noticias
¿Es interesante este script?
Deje un enlace a él, ¡qué los demás también lo valoren!
¿Le ha gustado el script?
Evalúe su trabajo en el terminal MetaTrader 5
Librerías

CDouble & CDoubleVector - librería para MetaTrader 5

Visualizaciones:
578
Ranking:
(25)
Publicado:
2018.09.18 08:27
\MQL5\Scripts\CDoubleDebug\
DoubleTests.mq5 (5.47 KB) ver
Double.mqh (28.61 KB) ver
¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa

Librería para ejecutar los métodos comunes del redondeo utilizados en el desarrollo de las aplicaciones MQL, clase-envoltorio primitiva para los valores tipo double y vector para los objetos CDouble. ¡Está compatible con MQL5 y MQL4!

Versión 1.02: (2018.02.18)

  • Fue corregido el error cuando el resultado redondeado se desviaba del resultado esperado. Mis agradecimientos a AMRALI.

Versión 1.01:

  • Fue corregido el error cuando los operadores aritméticos no devolvían los valores redondeados.
  • Fue añadido el método para establecer el símbolo después de la llamada al constructor.


CDouble

La clase CDouble envuelve el valor del tipo primitivo double en el objeto. Además, esta clase proporciona varios métodos y métodos estáticos para redondear los números tipo double y los arrays/colecciones tipo double.


Descripción

class CDouble : public CObject


Encabezado

#include <Double.mqh>


Jerarquía de herencia

Métodos virtuales usados/redefinidos desde la clase CObject: Type, Load, Save, Compare.

El objeto tipo CDouble contiene cinco campos de datos:

string
m_symbol
Símbolo asignado a la instancia de la clase que se usa para obtener el paso del lote y el tamaño del tick para el redondeo.
double
m_value
Valor inicial del tipo double asignado a la instancia de la clase.
uchar
m_step
Paso para el redondeo, representado como un valor tipo char para reducir el consumo de la memoria. Por ejemplo, 0,0025 se convierte en 25.
uchar
m_digits
Número de dígitos después de la coma.
ENUM_PRECISION
m_mode
Modo del trabajo para enlazar los métodos del redondeo al «paso» especificado.

Antes de centrarnos en la documentación, vamos a mostrar un rápido ejemplo práctico de la clase del envoltorio (wrapper):

MqlTick tick;
   SymbolInfoTick(_Symbol,tick);
   CDouble  price = tick.ask - 0.0087263487676283476,
            sl    = price - 500*_Point,
            tp    = price + 500*_Point,
            lots  = 5.25 / 3.78789;
   MqlTradeRequest r={0};
   r.symbol= _Symbol;
   r.price = price.AsRoundedTick();
   r.sl    = sl.AsRoundedTick();
   r.tp    = tp.AsRoundedTick();
   r.volume= lots.AsRoundedLots();

...

Es otro ejemplo con el uso de los métodos estáticos de la librería:

MqlTick tick;
   SymbolInfoTick(_Symbol,tick);
   MqlTradeRequest r={0};
   r.symbol= _Symbol;
   r.price = tick.ask - 0.0087263487676283476,
   r.sl    = price - 500*_Point,
   r.tp    = price + 500*_Point,
   r.volume= 5.25 / 3.78789;
   ...
   CDouble::RoundTradeRequest(r);
   // redondea automáticamente los campos del precio hasta el tamaño del tick
   // y el volumen hasta el paso del lote


Descripción breve de métodos estáticos

Nota: para usar esta librería, no es necesario conocer la POO o aplicar la instancia de la clase-envoltorio. Lo único que es necesario hacer, es llamar a las funciones estáticas con la resolución del contexto CDouble. La sintaxis es la siguiente:

type variable_name = CDouble::Method(args);
Modificador y tipo Método Descripción
static bool
IsEqual
(double number1,
 double number2,
 double step);
Compara dos números tipo double y devuelve un valor lógico restando el segundo número desde el primero, redondeando la suma hasta "step", y comparando con 0.
static bool
IsEqual
(double number1,
 double number2,
 int digits);
Compara dos números tipo double y devuelve un valor lógico restando el segundo número desde el primero, redondeando la suma hasta "digits", y comparando con 0.
static int
Compare
(double number1,
 double number2,
 double step)
Compara dos números tipo double y devuelve un número entero:
  • 0, si los números son iguales.
  • 1, si el número 1 es mayor que el 2.
  • -1, si el número 1 es menor que el 2.
static double
RoundToStep
(const double number, 
 double step)
Devuelve el valor redondeado con la precisión hasta step (por ejemplo, 0,0025).
static double
RoundToDigit
(const double number, 
 int digits)
Devuelve el valor redondeado con la precisión hasta digit (igual como NormalizeDouble).
static double
RoundToStepUp
(const double number, 
 double step)
Devuelve el valor redondeado arriba con la precisión hasta step.
static double
RoundToStepDown
(const double number, 
 double step)
Devuelve el valor redondeado abajo con la precisión hasta step.
static double
RoundToTick
(const double number, 
 string symbol=NULL)
Devuelve el valor redondeado con la precisión hasta el tamaño del tick del símbolo actual (symbol=NULL) o símbolo especificado en el parámetro symbol.
static double
RoundToLots
(const double number,
 string symbol=NULL,
 bool always_return_valid=true)

Devuelve el valor redondeado con la precisión hasta el tamaño del lote del símbolo actual (symbol=NULL) o símbolo especificado en el parámetro symbol.

always_return_valid == true: siempre devuelve el volumen permitido del lote (min_lots <= return_value <= max_lots)

static void (MQL5)
RoundTradeRequest
(MqlTradeRequest &request)

Modifica los campos price, sl, tp, y volumen de acuerdo con el símbolo especificado en la solicitud.

Redondea el precio, sl y tp con la precisión hasta el tamaño del tick.

Redondeo el volumen abajo con la precisión hasta el paso del lote.

static void
RoundArrayToStep

(double &arr[], double step = NULL)

Redondea el array entero con la precisión hasta el paso especificado o hasta el tamaño del tick del símbolo actual si step==NULL.
static void
RoundArrayToStep

(CArrayDouble &arr, double step = NULL)

Redondea la colección entera CArrayDouble con la precisión hasta el paso especificado o hasta el tamaño del tick del símbolo actual si step==NULL.
static int
GetDigits
(double floating_point)
Devuelve el número de dígitos hasta los ceros finales en el número tipo double (por ejemplo, para 0,0002500... será devuelto el valor 5).
static double 
GetPoint
(int digits)
Devuelve el valor tipo double con el número de dígitos especificado después de la coma (por ejemplo, para 3 será devuelto el valor 0,001).
static string
ToString

(double number, int digits)

Devuelve el valor string del número con coma flotante, redondeado con la precisión hasta digits, y recorta los ceros finales (por ejemplo, CDouble::ToString(1,23400001, 6) devolverá el valor «1,234»).

Ejemplos:

MqlTick tick;
   SymbolInfoTick(_Symbol,tick);
   double rnd_by_step   = CDouble::RoundToStep(tick.bid*1.052565465,_Point);
   double rnd_by_digits = CDouble::RoundToDigit(tick.bid*1.052565465,_Digits);
   double by_lot_step   = CDouble::RoundToLots(0.123423,_Symbol);
   double by_tick_size  = CDouble::RoundToTick(tick.ask-100*_Point,_Symbol);
   double roundup       = CDouble::RoundToStepUp(3.999999999,_Point);
   double rounddn       = CDouble::RoundToStepDown(3.999999999,_Point);
   int    digits        = CDouble::GetDigits(0.0000025);
   double point         = CDouble::GetPoint(10);
   bool   equal         = CDouble::IsEqual(tick.bid,tick.bid+0.00000009,_Point);
   string tostr         = CDouble::ToString(3.1399999999999999);
   int    compare       = CDouble::Compare(tick.ask,tick.bid);
   
#ifdef __MQL5__
   MqlTradeRequest r={0};
   r.symbol= _Symbol;
   r.price = tick.ask+0.000089849847658759198199999;
   r.sl    = r.price - 503 * _Point;
   r.tp    = r.price + 503 * _Point;
   r.volume= 1.127984984;
   
   CDouble::RoundTradeRequest(r);
#endif 


Descripción breve del constructor

Constructor Descripción
static double
(const ENUM_PRECISION mode = PRECISION_DEFAULT,
 const string symbol = NULL)

Nota: no hace falta llamar al constructor explícitamente, puesto que los argumentos se inicializan en la función llamada. Tampoco hay necesidad de especificar el método de la definición de la precisión, porque los métodos devuelven el valor redondeado a base de la llamada al método.

ENUM_PRECISION:

  • PRECISION_DEFAULT - establece la precisión predefinida en el paso de 1 y 8 dígitos tras la coma, que pueden ser redifinidos al llamar a Step() o Digits().
  • PRECISION_TICK_SIZE - establece la precisión hasta el tamaño del tick del símbolo especificado para todos los métodos del redondeo.
  • PRECISION_LOT_STEP - establece la precisión hasta el paso del lote del símbolo especificado para todos los métodos del redondeo.
CDouble
(const CDouble &other)
Constructor de las copias: copia todos los campos ocultos desde otro objeto a este objeto.

Ejemplos:

CDouble num;
CDouble bid(PRECISION_TICK_SIZE, _Symbol);
CDouble ask(bid)
CDouble ask2 = bid;
CDouble lots(PRECISION_LOT_STEP, _Symbol);


Descripción breve de la asignación - Operadores sobrecargados de la asignación

Modificador y tipo Método Descripción
void
Set(const double value)
asigna el valor inicial tipo double a la variable m_value.
void
Set(const CDouble &other)
asigna el valor inicial del objeto tipo CDouble a la variable m_value.
void
Operadores sobrecargados =, +=, -=, *=, /= (double OR CDouble&) asigna o modifica el valor inicial tipo double a la variable m_value.

Nota: el operador de la asignación = puede ser invocado en la misma línea que la declaración.

Ejemplos:

CDouble bid;
bid.Set(tick.bid);
CDouble ask = tick.ask;

CDouble pi = 3.14;
CDouble factor = 2;
pi*=factor;
Print(pi.ToString());
//6.28


Descripción breve de los operadores aritméticos sobrecargados

Modificador y tipo Método Descripción
double
Operadores sobrecargados +, -, *, / (double OR CDouble&) Puede recibir el valor tipo double o el objeto tipo CDouble como argumento. Devuelve el valor tipo double después de la aplicación de la operación aritmética asociada con el operador sobrecargado.

Nota: Sólo un operador aritmético puede usarse en cada instrucción.

Sintaxis de los operadores aritméticos sobrecargados:

type_double_result <-- CDouble_object <-- operator <-- double
// objeto tipo CDouble siempre se encuentra a la izquierda del operador

type_double_result <-- CDouble_object1 <-- operator <-- CDouble_object2
// cuando se usan dos objetos CDouble, la orden no importa.

Ejemplos:

CDouble foo    = 3.14;
CDouble bar    = 10;
CDouble foobar = bar + foo;          //13.14
CDouble err    = bar + foo + foobar; // error - uso inválido del operador

double var = bar / foo;


Descripción breve de los operadores de comparación sobrecargados

Modificador y tipo Método Descripción
bool
Overloaded operators ==, !=, >, <, >=, <= (double OR CDouble&)

Puede recibir el valor tipo double o el objeto tipo CDouble como argumento. Devuelve el resultado de comparación de los números como un valor lógico.

Nota: para la comparación se usa el método <static int>Compare.

Ejemplos:

CDouble foo = 3.14, bar = 3.139999999999999999999;
   
   Print(foo == bar); //true
   Print(foo <= bar); //true
   Print(foo >  bar); //false


Descripción breve del método de la instancia

Precisión del redondeo (por defecto): digits = 8; step = 1e-08

  • Hay tres modos de controlar la precisión: Step, Digits o PrecisionMode(ENUM_PRECISION). La llamada a cualquiera de estos métodos redefine los ajustes anteriores.
  • Step puede ser igual a _Point, LOT_STEP o TickSize; se representa como un número con coma flotante (por ejemplo, 0,00001, 0,025 etc.)
  • No es necesario establecer el paso puesto que RoundToTick y RoundToLot usan automáticamente los pasos correspondientes para devolver el valor redondeado.
Modificador y tipo Método Descripción
void
PrecisionMode
(const ENUM_PRECISION mode)

Establece el modo predefinido para calcular el redondeo y la función ToString. Redefine los ajustes existentes de Step y Digit. Nota: también se puede en el constructor.

ENUM_PRECISION:

  • PRECISION_DEFAULT - establece la precisión predefinida en el paso de 1 y 8 dígitos tras la coma, que pueden ser redifinidos al llamar a Step() o Digits().
  • PRECISION_TICK_SIZE - establece la precisión hasta el tamaño del tick del símbolo especificado para todos los métodos del redondeo.
  • PRECISION_LOT_STEP - establece la precisión hasta el paso del lote del símbolo especificado para todos los métodos del redondeo.
ENUM_PRECISION
PrecisionMode()
Devuelve el modo actual de la definición de la precisión.
void
Step
(const double step_or_point)
Establece la precisión especificada para el paso. Redefine el modo de la definición de la precisión.
double
Step()
Devuelve el valor actual de Step.
void
Digits
(const int digits)
Establece la precisión hasta el número especificado de los dígitos tras la coma. Redefine el modo de la definición de la precisión establece el paso igual a 1e-(digits).
int
Digits()
Devuelve la precisión actual como número de los dígitos tras la coma.
double
AsRawDouble()
Devuelve el valor inicial del número guardado tipo double.
double
AsRounded()

Devuelve el valor redondeado con precisión hasta el paso especificado. default = 1e-08.

Para PRECISION_TICK_SIZE se fija el paso en el tamaño del tick.

Fijamos el paso en el tamaño del paso del lote para PRECISION_LOT_STEP.

double
AsRoundedUp()
Devuelve el valor redondeado arriba con la precisión hasta el paso especificado.
double
AsRoundedDown()
Devuelve el valor redondeado abajo con la precisión hasta el paso especificado.
double
AsRoundedTick()
Devuelve el valor redondeado con la precisión hasta el tick (se establece con el tamaño del tick del símbolo).
double
AsRoundedLots
(bool always_return_valid = true)
Devuelve el valor redondeado con la precisión hasta el lote (se establece con el paso del lote del símbolo).
int
ToInt()
Devuelve el valor int.
long
ToLong()
Devuelve el valor long.
string
ToStringPrecision()
Devuelve la cadena con ceros finales.
string
ToString()
Devuelve la cadena con ceros finales recortados.
string
Symbol()
Devuelve el símbolo actual.
string
Symbol(const string symbol)
Al llamar al constructor, establece el símbolo especificado, que se diferencia del símbolo del gráfico, como símbolo de trabajo. Se usa durante el trabajo con varios símbolos.

Ejemplos:

CDouble pi2 = 3.14159265359;
   
   // obtención del valor como... 
   double raw_double             = pi2.AsRawDouble();
   double round_double_to_step   = pi2.AsRounded();
   double tick_size_double       = pi2.AsRoundedTick();
   double lot_step_double        = pi2.AsRoundedLots();
   double rounded_up             = pi2.AsRoundedUp();
   double rounded_down           = pi2.AsRoundedDown();
   int    double_to_int          = pi2.ToInt();
   long   double_to_long         = pi2.ToLong();
   string precision_str          = pi2.ToStringPrecision();
   pi2 = 3.140000000009;
   pi2.Digits(8);
   string truncated_str          = pi2.ToString();


Descripción breve de métodos virtuales

Son los métodos redefinidos desde CObject:

Modificador y tipo Método Descripción
virtual int
Compare
(const CObject *node,
 const int mode=0)
Se usa para el ordenamiento y la búsqueda. El método Compare compara el valor AsRounded del objeto actual con el valor AsRounded del nodo de entrada.
virtual int
Type()
Devuelve el identificador TYPE_DOUBLE como int.
virtual bool
Save(const int file_handle)
Serializa y guarda las variables-miembros en el archivo del manejador (handle) de entrada.
virtual bool
Load(const int file_handle)
Establece las variables-miembros en los valores guardados en el archivo del manejador de entrada.

Vea los ejemplos en la sección CDoubleVector.


CDoubleVector

Clase CDoubleVector representa una colección de punteros a los objetos que sirve para las instancias dinámicas de CDouble.


Descripción

class CDoubleVector : public CArrayObj


Encabezado

#include <Double.mqh>


Jerarquía de herencia

Métodos virtuales usados/redefinidos desde la clase CArrayObj: CreateElement.


Descripción breve del método de la instancia

**Vea la descripción de los métodos públicos heredados en la página de CArrayObj.

Modificador y tipo Método Descripción
CDouble*
operator[]
(const int index)
Operador sobrecargado del índice. Devuelve el puntero al objeto por el índice n en el vector.
bool
Add(const double value)
Recibe el valor del tipo primitivo CDouble como argumento, transformándolo en el objeto CDouble , y lo añade al final del vector.
bool
AssignDoubleArray
(const double &array[])
Recibe el array de valores tipo CDouble , transformándolo en los objetos CDouble, y los asigna al vector.
bool
CopyOut(double &arr[])
Copia los valores CDouble desde el vector al array de valores del tipo primitivo double.
bool
CopyOut(CArrayDouble &arr)
Copia los valores CDouble desde el array a la colección CDoubleArray.
virtual bool
Save(const int file_handle)
Guarda el vector en el archivo especificado por el handle de entrada del archivo.
virtual bool
Load(const int file_handle)
Carga el estado guardado del vector desde el archivo especificado por el handle de estrada del archivo.

Ejemplos:

CDoubleVector *vect = new CDoubleVector;
   
   double dubs[]={3.14,1.21,55.555};
   vect.AssignDoubleArray(dubs);
   vect.Add(tick.bid);
   
   // llamada al objeto CDouble por el índice
   Print(vect[vect.Total()-1].ToString());
   
   // добавление нового объекта CDouble
   CDouble *lot = new CDouble(PRECISION_LOT_STEP);
   lot = 1.22;
   vect.Add(lot);
   
   // ordenamiento del vector en orden ascendiente
   vect.Sort();
   
   int total = vect.Total();
   
   // guardado del vector en el archivo incluyendo los estados y los valores de objetos CDouble
   string f = "testdub.bin";
   int    h = FileOpen(f,FILE_WRITE|FILE_BIN);
   if(vect.Save(h))
      Print("save successful");
   FileClose(h);
   delete vect;
   
   // cargando el vector desde el archivo
   CDoubleVector vect_reborn;
   h=FileOpen(f,FILE_READ|FILE_BIN);
   if(vect_reborn.Load(h))
      Print("load successful");
   FileClose(h);
   total = vect_reborn.Total();
   Print("Total vector size = ",sizeof(vect_reborn)," bytes");
   for(int i=0;i<vect_reborn.Total();i++)
      Print(vect_reborn[i].ToString());
      
   // copiando al array double
   double arr2[];
   vect_reborn.CopyOut(arr2);
   Print(ArraySize(arr2));

Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/code/19727

Renko 2.0 Renko 2.0

Indicador para construir los gráficos Renko funcionales con sombras. Se puede establecer el tamaño de las velas en ticks, pips o en puntos.

ChandelierExit_Candle ChandelierExit_Candle

El indicador Chandelier Exit en forma de velas

Export Positions History Export Positions History

Exporta el historial de posiciones cerradas en la cuenta de cobertura (hedging) al archivo CSV.

Accumulative Swing Index Smoothed Accumulative Swing Index Smoothed

En esta versión del indicador Accumulative Swing Index han sido añadidas funciones adicionales, lo que permite obtener los resultados mucho más suavizados.