Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1206

 
Maxim Kuznetsov:

Alert("Разбег "+DoubleToString(delta,_Digits));

o Alert(StringFormat("Spread %.5f",delta));

en general, acostúmbrate, sólo son representaciones diferentes de un mismo número. Piensa en tus maravillosos años escolares: de ahí viene.

Gracias. ¿Pero qué pasa si necesito utilizar el valor delta como un número y compararlo? Por ejemplo.

if(delta>0.00005)
  {
   //------------
  }
¿Sería eso correcto?
 
prom18:

Gracias. ¿Y si tengo que utilizar el valor delta como un número y comparar? Por ejemplo.

¿Es esto correcto?

Puedes comparar dos números reales así:

bool EqualDoubles(double d1,double d2,double epsilon)
  {
   if(epsilon<0) 
      epsilon=-epsilon;
//---
   if(d1-d2>epsilon) 
      return false;
   if(d1-d2<-epsilon) 
      return false;
//---
   return true;
  }

https://www.mql5.com/ru/docs/basis/types/double

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL5 есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования. Константы с плавающей точкой...
 
Mihail Matkovskij:

Puedes comparar dos números reales así:

https://www.mql5.com/ru/docs/basis/types/double

Puedes, si estás seguro de que no pueden estar muy cerca en su significado. Al fin y al cabo, lo suave se compara con lo cálido.
 
Alexey Viktorov:
Puedes, si estás seguro de que no pueden estar muy cerca en valor. Al fin y al cabo, lo suave se compara con lo cálido.

No lo entiendo. Por ejemplo. Tomo el número de pips que el precio ha pasado en un tick. Si el precio pasó más de 20 puntos, entonces recibo una Alerta.

Comparo la diferencia de precios (1,12300-1,12321=0,00021) con el valor máximo necesario (0,00020).

0.00021>0.00020.

¿Qué tiene que ver esto con lo suave y lo cálido?

 
prom18:

No lo entiendo. Por ejemplo. Tomo el número de pips que el precio ha pasado en un tick. Si el precio pasó más de 20 puntos, entonces recibo una Alerta.

Comparo la diferencia de precios (1,12300-1,12321=0,00021) con el valor máximo necesario (0,00020).

0.00021>0.00020.

¿Qué tiene que ver esto con lo suave y lo cálido?

necesitas puntos, así que compara los puntos.

y el doble se compara con el épsilon (DBL_EPS si la memoria no me falla), de lo contrario podría obtener 3,0-0,2 > 2,0+0,8 (en sentido figurado, las cifras pueden ser diferentes)

 
Maxim Kuznetsov:

necesitas puntos, así que compara los puntos. son enteros por cierto.

mientras que el doble se compara con el épsilon (DBL_EPS si la memoria no me falla), de lo contrario puede obtener 3,0-0,2 > 2,0+0,8 (en sentido figurado, los números pueden ser diferentes)

mejor usar el ejemplo de @fxsaber para este propósito:

int PriceToInteger( const double Price, const double point )
{
   return((int)(Price / point + 0.1));
}

para comprobarlo:

//+------------------------------------------------------------------+
void OnStart()
{
   int bar1 = PriceToInteger(iClose(NULL, 0, 1), _Point);
   int bar2 = PriceToInteger(iClose(NULL, 0, 2), _Point);
   printf("bar2 - bar1 = %i point", bar2 - bar1);
}
//+------------------------------------------------------------------+
int PriceToInteger( const double Price, const double point )
{
   return((int)(Price / point + 0.1));
}
//+------------------------------------------------------------------+
 
prom18:

No lo entiendo. Por ejemplo. Tomo el número de pips que el precio ha pasado en un tick. Si el precio pasó más de 20 puntos, entonces recibo una Alerta.

Comparo la diferencia de precios (1,12300-1,12321=0,00021) con el valor máximo necesario (0,00020).

0.00021>0.00020.

¿Qué tiene que ver esto con lo suave y lo cálido?

Bueno, a veces no hay que leer todo lo que se escribe.

Tomaste números que normalmente son representados por el sistema. Toma estos...

  double a=1.12328,
         b=1.12309,
         c=0.00019,
         d=a-b;

y se obtiene

1.1232800000000001
1.1230899999999999
0.00019
0.000190000000000135

La idea es a-b==c, pero el ordenador te dará esos errores. Se ha escrito mucho sobre ello en el foro, busca y lee.

Pero puedes tomar la diferencia normalizada y el valor de control normalizado y compararlos.

 
Иван:
Que se diviertan todos. Pregunta: en MT4, cuando se trabaja en el probador con cruces (pares sin quid), ¿cómo calcula el probador los resultados de las posiciones cerradas, si la cuenta, en la que se realiza la prueba, es una cuenta en dólares? Para el recálculo de los totales de las posiciones en dólares, ¿el comprobador toma el tipo de cambio de la moneda base del cruce con el dólar en el momento actual o en el momento del intervalo comprobado? Tengo la firme sospecha de que lo es en la actualidad. Si es así, ¿es imposible hacerlo calcular en el momento del intervalo?
¿Alguien lo sabe?
 
Иван:
¿Alguien lo sabe?

cuenta el propio MODE_TICKVALUE para cada tick.

 
Alexey Viktorov:
Podrías, si estás seguro de que no pueden estar muy cerca en valor. Al fin y al cabo, lo suave se compara con lo cálido.

Siprom18 necesita comparar dos números, dentro de los signos de Dígitos, este es el único método que funciona:

double price1 = 1.23450;
double price2 = 1.23447;

if(EqualDoubles(price1, price2, ((_Digits == 4) ? 0.0100 : 0.00100)) {
  ...
}

Pero como puede ver, tiene aún más variaciones: https://www.mql5.com/ru/forum/160683/page1205#comment_17247843. Por lo tanto, en el ejemplo he reducido intencionadamente la precisión de la comparación en dos dígitos. Por supuesto, esa diferencia en los valores de los precios es bastante inexacta... Pero, ¿cómo comparar dos números en casos como éste? Si la desviación fuera de más de Dígitos, entonces no podríamos usar EqualDoubles, sino usar NormalizeDouble para cortar todo lo innecesario.

Aunque también podrías hacerlo así:

int digits = Digits() - 2;

double price1 = NormalizeDouble(1.23450, digits);
double price2 = NormalizeDouble(1.23447, digits);

if(price1 == price2) {
  ...
}