Pon "Me gusta" y sigue las noticias
Deje un enlace a él, ¡qué los demás también lo valoren!
Evalúe su trabajo en el terminal MetaTrader 5
- Visualizaciones:
- 700
- Ranking:
- Publicado:
- 2018.09.18 08:27
-
¿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
- CObject
- CDouble
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:
|
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 |
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 |
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 |
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:
|
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:
|
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

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.

El indicador Chandelier Exit en forma de velas

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

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.