Double vs FLOAT - error MathFloor poco claro - página 6

 
fxsaber:
Sí.
Gracias
 
Vladislav Andruschenko:
Gracias
Había una solución en la primera página... ya está en la página seis.
 
fxsaber:
Entonces, ¿por qué funciona sin normalización y sin MathFloor?
Si la entrada es de 0,95?
 
Dmitry Fedoseev:
Si la entrada es de 0,95?
No lo entiendo.
 
Vladislav Andruschenko:
Puede que no esté muy seguro de lo que hay que conseguir, pero mira esta opción
void OnStart()
{
double ask2 = 1.55557, ask3 = 1.55558, bid = 1.55555;
  Print("(ask2 + bid)/2 = ", (ask2 + bid)/2);
   Print("(ask3 + bid)/2 = ", (ask3 + bid)/2);
    int avPrice_2 = (int)NormalizeDouble((ask2/_Point + bid/_Point)/2, 0);
   int avPrice_3 = (int)NormalizeDouble((ask3/_Point + bid/_Point)/2, 0);
  Print("avPrice_2 = ", avPrice_2);
Print("avPrice_3 = ", avPrice_3);
}/*******************************************************************/
resultado
2017.02.27 00:03:54.453 00 (EURUSD.m,H1)        (ask2 + bid)/2 = 1.55556
2017.02.27 00:03:54.456 00 (EURUSD.m,H1)        (ask3 + bid)/2 = 1.555565
2017.02.27 00:03:54.456 00 (EURUSD.m,H1)        avPrice_2 = 155556
2017.02.27 00:03:54.456 00 (EURUSD.m,H1)        avPrice_3 = 155557
 

"Toma la demanda y la oferta y calcula el precio medio. Si el diferencial es impar (3,5,7,9, etc.) entonces iguala el precio medio más cercano a la Oferta".

La tarea no está fijada:

- ¿Qué significa una dispersión extraña? ¿1,3,...,9 veces el Punto o 1,3,...,17,57 veces el Punto? Los redondeos funcionan dentro de los segmentos unitarios...

- ¿qué significa "más cerca de la Oferta"? Sobre todo si el diferencial es de 43 veces el punto, por ejemplo. ¿Estamos hablando de equiparar la Oferta a qué?

Primero hay que tener claro el problema, sólo entonces se puede tomar una decisión inequívoca.

Al mismo tiempo, ya que estamos hablando de números pares/impares, lo lógico sería ir a los enteros, donde este concepto tiene sentido.

double Ask,Bid,Middle; // Уже известные курсы Ask и Bid, вычисляемый средний курс
int Mash,Spr; // Множитель перехода к целым числам. Для 4-разрядного EURUSD 10000. И целочисленный спред

Mash=MathRound(1.0/_Point);
Spr=MathRound((Ask-Bid)*Mash); // Целочисленный спред
// Придаем конкретность среднему курсу.  Предполагаем, что "ближе к Бид" значит "ближайший меньший среднего арифметического Ask и Bid, кратный Point"
Spr=Spr >> 1; // Целочисленный спред, деленный на 2 с отбрасыванием остатка
Middle=Bid+Spr*_Point;


// Если предположение неверно, канва последующих разборов такая
if ((Spr &  1)  != 0)) {  // Спред нечетный
  }
else {  // Спред четный
  }

 
Tuve algo similar en una tarea muy simple - el script leyó el precio de apertura del EURUSD de la serie de tiempo en un array duplicado y luego escribió ese array en un archivo. Mientras el precio fuera mayor que uno, todo estaba bien. Pero cuando en el año cero el precio era inferior a 1, a veces no muy a menudo, unas 20 veces al año, empezaban a ocurrir algunas cosas extrañas: en algún lugar del decimal 15 se cortaba el 1 y todos los anteriores, por supuesto, se convertían en 9. No es un gran problema, pero no es agradable. La normalización lo hizo en todas partes y después de la lectura y antes de escribir en el archivo y durante la grabación, y la conversión de una matriz a otra con la normalización - nada funcionó. Si añado 1 cuando leo de series de tiempo, todo estaba bien. Al final me harté, cambié el dowble por el flotante y me tranquilicé.
 
Vladimir:

"Toma la demanda y la oferta y calcula el precio medio. Si el diferencial es impar (3,5,7,9, etc.) entonces iguala el precio medio más cercano a la Oferta".

La tarea no está fijada:

De hecho, la tarea parece sencilla... y la puede hacer un escolar... :-) Yo también lo pensé.

Pero en la fijación de precios desde el servidor, la normalización de los datos y el resto, hay rincones oscuros a los que ni siquiera te refieres.

Llevo 9 años programando en mql - y nunca he tenido problemas con la normalización porque lo he hecho bien. y la precisión a 1 milipunto siempre ha funcionado correctamente.

Pero hay tareas que requieren una gran precisión.

Y hay condiciones.

A saber:

  1. Tomamos el precio ASC y BID - calculamos su precio medio = fácil? ok.
  2. Por lo tanto, si la diferencia es impar (3 puntos, por ejemplo), no podemos dividir sin un resto, ¿verdad?

Por lo tanto, tenemos que normalizar el precio de tal manera que si hay un residuo (¡y lo habrá incluso con un spread parejo! :-)) entonces promediamos el precio más cercano al punto bajo, es decir, a la Oferta.

Por ejemplo:

  • asc = 1,23455 bid = 1,23457 spread = 2 Precio medio: 1,23456
  • Precio de compra = 1,23455 Precio de venta = 1,23458 Spread = 3 Precio medio: 1,23456
  • ask = 1,23455 bid = 1,23459 spread = 4 Precio medio: 1,23457

¿Y todo parece ser sencillo? Todo debería funcionar y yo soy un tonto... y me senté durante 2 días esperando no ser un tonto. Entendimiento sobre colas y dabbles y tribbles y bibbles..................

Pero! con la misma fórmula, con diferenciales pares e impares - en algunas situaciones - la Fórmula no funcionó . (ver arriba) .

Incluso, puede funcionar con monedas y no funcionar con petróleo.

Puede que funcione en JPY y no funcione en USD en algún momento.

¿Quizás esté mirando la influencia de la luna? El tiempo en África .................

Pero, cuando estás seguro de que la fórmula funciona, no te das cuenta de que 1 milipunto. y trabajas en..... y entonces "Bang, bang, bang, bang" y ese milipunto, decide huir, o llamar al segundo milipunto, que se interpone.

EN MI OPINIÓN.

Puedes pensar en mí como un tonto, un sub-programador, un colegial.... y así sucesivamente.

Pero el hecho es que.

Se produce un error con diferentes combinaciones de valores dobles. Al mismo tiempo, todo está claro con el flotador.

Todavía no lo he descubierto. La ayuda es muy buena y siempre la pido, es normal. Y puede que dentro de 10 años pida ayuda a la comunidad. Esto es normal. Y respondo a una llamada de auxilio si conozco las trampas: es normal.

Por supuesto, después de esas pruebas, haré una "investigación extra" para entender por mí mismo por qué es así.

Gracias a todos por vuestra respuesta y ayuda.

 
Vladislav Andruschenko:

De hecho, la tarea parece sencilla... y la puede hacer un escolar... :-) Yo también lo pensé.

Pero hay rincones tan oscuros en los precios obtenidos del servidor, en la normalización de los datos y en el resto... que ni siquiera se quiere decir.

Llevo 9 años programando en mql - y nunca he tenido problemas con la normalización porque lo he hecho bien. y la precisión a 1 milipunto siempre ha funcionado correctamente.

Pero! con la misma fórmula, con diferenciales pares e impares - en algunas situaciones - la Fórmula no funcionó . (ver arriba) .

Con diferentes combinaciones - con valores dobles se produce un error. Al mismo tiempo, con el flotador todo está claro.

¿Qué tiene que ver Metacvotes con la normalización de datos en general? Este término significa diferentes cosas para los programadores y no redondear en absoluto. Lea la norma IEEE 754, por ejemplo, aquí:http://www.softelectro.ru/ieee754.html. Los números reales no normalizados llegan hasta 1,17549421*10^(-38) en el caso de la longitud de 4 bytes y hasta 4....*10^(-324) en el caso de la longitud de 8 bytes, los encontramos muy raramente y, desde luego, no en los cálculos del curso. Si necesita llamar a OrderSend, entonces redondee de acuerdo a los requerimientos de esta función. No es necesario utilizar el redondeo hasta que la tarea lo requiera.

Los errores no se producen en el formato de los dobles o los flotantes, sino en las operaciones utilizadas. El hecho de que la fórmula no haya resuelto la tarea le indica que no es apropiada para la misma. No más que eso. Dígame qué errores se producen en un cálculo normal sin normalización (este es el trozo de mi post anterior):

Spr=MathRound((Oferta-Pregunta)/_Punto); Spr=Spr >> 1; Middle=Pregunta+Spr*_Punto;

IEEE 754 - стандарт двоичной арифметики с плавающей точкой
  • Yashkardin Vladimir
  • www.softelectro.ru
double-precision длина числа, бит 32 64 смещенная экспонента (E), бит 8 11 остаток от мантиссы (M), бит 23 52 смещение 127 1023 двоичное денормализованое число (-1)S∙0,M∙exp2-127 ,где M-бинарное (-1)S∙0,M∙exp2-1023 ,где M-бинарное двоичное нормализованое число (-1)S∙1,M∙exp2(E-127) ,где M-бинарное (-1)S∙1,M∙exp2(E-1023) ,где M-бинарное...
 
Vladislav Andruschenko:

De hecho, la tarea parece sencilla... ¿Y la puede hacer un escolar? :-) Yo también lo pensé.

Pero hay rincones tan oscuros en los precios obtenidos del servidor, en la normalización de los datos y en el resto... que ni siquiera se quiere decir.

Llevo 9 años programando en mql - y nunca he tenido problemas con la normalización porque lo he hecho bien. y la precisión a 1 milipunto siempre ha funcionado correctamente.

Pero hay tareas que requieren una gran precisión.

Y hay condiciones.

A saber:

  1. Tomamos el precio ASC y BID - calculamos su precio medio = fácil? ok.
  2. Por lo tanto, si la diferencia es impar (3 puntos, por ejemplo), no podemos dividir sin un resto, ¿verdad?

Por lo tanto, tenemos que normalizar el precio de tal manera que si hay un residuo (¡y lo habrá incluso con un spread parejo! :-)) entonces promediamos el precio más cercano al punto bajo, es decir, a la Oferta.

Por ejemplo:

  • asc = 1,23455 bid = 1,23457 spread = 2 Precio medio: 1,23456
  • Precio de compra = 1,23455 Precio de venta = 1,23458 Spread = 3 Precio medio: 1,23456
  • ask = 1,23455 bid = 1,23459 spread = 4 Precio medio: 1,23457

¿Y todo parece ser sencillo? Todo debería funcionar y yo soy un tonto... y me senté durante 2 días esperando no ser un tonto. Entendimiento sobre colas y dabbles y tribbles y bibbles..................

Pero! con la misma fórmula, con diferenciales pares e impares - en algunas situaciones - la Fórmula no funcionó . (ver arriba) .

Incluso, puede funcionar con monedas y no funcionar con petróleo.

Puede que funcione en JPY y no funcione en USD en algún momento.

¿Quizás esté mirando la influencia de la luna? El tiempo en África .................

Pero, cuando estás seguro de que la fórmula funciona, no te das cuenta de que 1 milipunto. y trabajas en..... y entonces "Bang, bang, bang, bang" y ese milipunto, decide huir, o llamar al segundo milipunto, que se interpone.

EN MI OPINIÓN.

Puedes pensar en mí como un tonto, un sub-programador, un colegial.... y así sucesivamente.

Pero el hecho es que.

Se produce un error con diferentes combinaciones de valores dobles. Al mismo tiempo, todo está claro con el flotador.

Todavía no lo he descubierto. La ayuda es muy buena y siempre la pido, es normal. Y puede que dentro de 10 años pida ayuda a la comunidad. Esto es normal. Y respondo a una llamada de auxilio si conozco las trampas: es normal.

Por supuesto, después de esas pruebas, haré una "investigación extra" para entender por mí mismo por qué es así.

Gracias a todos por vuestra respuesta y ayuda.

Dependiendo de tus objetivos, a veces merece la pena pasar a los números enteros por completo. Ahorra muchos nervios :-) Una vez tuve una tarea en la que tenía que marcar con precisión muchísimos niveles, al principio me costó el doble, pero luego convertí todo a puntos enteros desde 0 y todo se volvió fácil, sencillo y sin errores.
Razón de la queja: