Double vs FLOAT - error MathFloor poco claro

 

Hola a todos, me estoy cansando de la exactitud de las citas. La normalización, etc.

      float AUTOPRICE;
      float askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      float bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);
      float Averab=((askP+bidP))/2.0;
      AUTOPRICE=MathFloor(Averab)*Point;
      Print("FLOAT  "+"  askP="+askP+" bidP="+bidP+" Averab="+DoubleToString(Averab,10)+" AUTOPRICE="+DoubleToString(AUTOPRICE,10));

      double AUTOPRICE2;
      double askP2=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      double bidP2=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);
      double Averab2=((askP2+bidP2))/2.0;
      AUTOPRICE2=MathFloor(Averab2)*Point;
      Print("DOUBLE  "+"  askP2="+askP2+" bidP2="+bidP2+" Averab2="+DoubleToString(Averab2,10)+" AUTOPRICE="+DoubleToString(AUTOPRICE2,10));

difusión:2

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - DOBLE PRUEBA MATHFLOOR EURUSD,M30:DOBLE askP2=105143 bidP2=105141 Averab2=105142.000000 AUTOPRICE=1.0514200000

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - DOBLE PRUEBA MATHFLOOR EURUSD,M30:FLOAT askP=105143 bidP=105141 Averab=105142.0000000000 AUTOPRICE=1.0514199734




difusión:3

2017.02.26 09:57:47.832 2017.01.02 00:03:00 Exp - DOBLE PRUEBA MATHFLOOR EURUSD,M30:DOBLE askP2=105144 bidP2=105141 Averab2=105142.5000000000 AUTOPRICE=1.0514200000

2017.02.26 09:57:47.832 2017.01.02 00:03:00 Exp - DOBLE PRUEBA MATHFLOOR EURUSD,M30:FLOAT askP=105144 bidP=105141 Averab=105142.5000000000 AUTOPRICE=1.0514199734


difusión:4

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - DOBLE PRUEBA MATHFLOOR EURUSD,M30:DOBLE askP2=105145 bidP2=105141 Averab2=105143.000000 AUTOPRICE=1.0514200000

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - DOBLE PRUEBA MATHFLOOR EURUSD,M30:FLOAT askP=105145 bidP=105141 Averab=105143.0000000000 AUTOPRICE=1.0514299870

difusión:5

2017.02.26 09:58:39.495 2017.01.02 00:03:00 Exp - DOBLE PRUEBA MATHFLOOR EURUSD,M30:DOBLE askP2=105146 bidP2=105141 Averab2=105143.5000000000 AUTOPRICE=1.0514300000

2017.02.26 09:58:39.495 2017.01.02 00:03:00 Exp - DOBLE PRUEBA MATHFLOOR EURUSD,M30:FLOATaskP=105146 bidP=105141 Averab=105143.5000000000 AUTOPRICE=1.0514299870

Esas señales adicionales están en algún lugar al final del túnel..........

 
      double askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      double bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);

      double Averab=((askP+bidP)*1)/2.0;
      Print("askP="+askP+" bidP="+bidP+" Averab="+Averab+" MathFloor((int)Averab)="+MathFloor((int)Averab));

en spread=2

askP=105143 bidP=105141 Averab=105142 MathFloor((int)Averab)=105142

en la dispersión=3

askP=105144 bidP=105141 Averab=105142.5 MathFloor((int)Averab)=105142

en 4!!!! spread

askP=105545 bidP=105141 Averab=105143 MathFloor((int)Averab)=105142

¿Por qué?

 
Vladislav Andruschenko:

Hola a todos, ya me he cansado de la exactitud de las cotizaciones. Normalizaciones, etc.

De alguna manera deberías ser capaz de entender lo que son double e int. Cómo funciona la conversión de tipos.

Nunca he utilizado MathMod y MathFloor. Tu código grita mucho que no entiendes en absoluto lo que hay detrás de lo que has escrito.

La impresión del número doble no es nada. Si quieres imprimir el valor real de double, tienes que mirar sus bytes.

 

cebado sólo para evitar tener que escribirlo manualmente,

La variable en sí no da el resultado que espero de ella.

Elreparto de tipos, la normalización de int y el doblaje es lo que he estado haciendo sin ayuda.

De momento estoy desesperado ya que he probado todas las opciones. y he puesto un trozo de código de 1 en 1000 que no funciona como debería.

Pero gracias por la ayuda.

Intenta hacer lo que quiero: no me enseñes el código después, sólo dime si funciona o no.

Tome la oferta y la demanda.

y calcular el precio medio.

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

Por ejemplo:

Oferta=1,55555 Demanda=1,55557 Precio medio=1,55556 Spread=2

Oferta=1,5555 Pregunta=1,55558 Precio medio=1,55556 Spread=3

y lo harás bien.

Pero cuando el diferencial es de 4,5,6,7 - tendrás esa precisión yendo hacia lo desconocido. Y los números nadarán en sentido contrario.

 
Vladislav Andruschenko:
      double askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      double bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);

      double Averab=((askP+bidP)*1)/2.0;
      Print("askP="+askP+" bidP="+bidP+" Averab="+Averab+" MathFloor((int)Averab)="+MathFloor((int)Averab));

en spread=2

askP=105143 bidP=105141 Averab=105142 MathFloor((int)Averab)=105142

en la dispersión=3

askP=105144 bidP=105141 Averab=105142.5 MathFloor((int)Averab)=105142

en 4!!!! spread

askP=105545 bidP=105141 Averab=105143 MathFloor((int)Averab)=105142

¿Por qué?

Una vez tuve una situación similar: mi mente hervía de indignación. El reemplazo de double por float ayudó , aún no sé por qué.

 
sibirqk:
Una vez tuve una situación similar, mi mente hervía de indignación en ese momento. El reemplazo de double por float ayudó , aún no sé por qué.

Gracias, lo probaré........ a mí también me está dando vueltas la cabeza.

¡¡¡SÍ!!! ¡Así es exactamente como funciona! Está bien.

float askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
float bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);
float Averab=((askP+bidP))/2.0;

¡¡¡Gracias!!! No sé lo que haría más........

 
#define ALPHA 0.1

int askP = (int)(Ask / Point + ALPHA);
int bidP = (int)(Bid / Point + ALPHA);

Así funciona MathFloor

int MyMathFloor( const double Num )
{
  return((int)((Num > 0) ? Num : Num - 1));
}
 
double Averab = NormalizeDouble ((Ask + Bid)/(2.0 * Point), Digits);
 
fxsaber:
#define ALPHA 0.1

int askP = (int)(Ask / Point + ALPHA);
int bidP = (int)(Bid / Point + ALPHA);

Así funciona MathFloor

int MyMathFloor( const double Num )
{
  return((int)((Num > 0) ? Num : Num - 1));
}

para los diferentes diferenciales? incluyendo 2,3,4,5,6,7 ?

Porque ya probé tu manera (sin+ ALPHA). 2,3 spread está bien, pero 4,5 ya es un fallo

Andrey Dik:
double Averab = NormalizeDouble ((Ask + Bid)/2.0, Digits);

Normalización, esto es lo primero que hice en la función, pero desafortunadamente en ciertos diferenciales, empieza a fallar

 
Vladislav Andruschenko:

la normalización es la primera cosa que hice en la función, pero desafortunadamente en ciertos márgenes, empieza a fallar

Lo he arreglado, pruébalo ahora.
 
Vladislav Andruschenko:

tomar el Ask y el Bid.

y calcular el precio medio.

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

#define ALPHA 0.1

int DoubleToInt( const double Num )
{
  return((int)(Num + ALPHA));
}

void OnStart()
{
  double NewPrice = DoubleToInt((Ask + Bid) / (2 * Point)) * Point;

  Print(NewPrice);
}