Double vs FLOAT - errore MathFloor poco chiaro

 

Ciao a tutti, mi sto stancando della precisione delle citazioni. Normalizzazioni e così via.

      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));

diffusione:2

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

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




diffusione:3

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

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


diffusione:4

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

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

diffusione:5

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

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

Quei segni extra sono da qualche parte alla fine del tunnel..........

 
      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));

a spread=2

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

a spread=3

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

a 4!!!! spread

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

Perché?

 
Vladislav Andruschenko:

Ciao a tutti, mi sto stancando della precisione delle citazioni. Normalizzazioni e così via.

In qualche modo dovreste essere in grado di capire cosa sono double e int. Come funziona la conversione dei tipi.

Non ho mai usato MathMod e MathFloor. Il vostro codice urla molto che non capite affatto cosa c'è dietro quello che avete scritto.

La stampa del numero doppio non significa nulla. Se volete stampare il vero valore del doppio, dovete guardare i suoi byte.

 

priming solo per evitare di doverlo scrivere manualmente,

La variabile stessa non dà il risultato che mi aspetto da essa.

Lafusione dei tipi, la normalizzazione dell'int e il doppiaggio sono ciò che ho fatto senza aiuto.

Al momento sono disperato perché ho provato tutte le opzioni e ho messo un pezzo di codice 1 su 1000 che non funziona come dovrebbe.

Ma grazie per l'aiuto.

Provate a fare quello che voglio: non mostratemi il codice dopo, ditemi solo se funziona o no.

Prendi Ask e Bid.

e calcolare il prezzo medio.

Se lo spread è dispari (3,5,7,9, ecc.) allora equipara il prezzo medio più vicino al Bid.

Per esempio:

Bid=1.55555 Ask=1.55557 Prezzo medio=1.55556 Spread=2

Bid=1.5555 Ask=1.55558 Prezzo medio=1.55556 Spread=3

e lo otterrete nel modo giusto.

Ma quando lo spread è 4,5,6,7 - avrai quella precisione che va verso l'ignoto. E i numeri nuoteranno nella direzione sbagliata.

 
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));

a spread=2

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

a spread=3

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

a 4!!!! spread

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

Perché?

Una volta ho avuto una situazione simile - la mia mente ribolliva di indignazione. Sostituire double con float ha aiutato , ancora non so perché.

 
sibirqk:
Una volta ho avuto una situazione simile - la mia mente ribolliva di indignazione in quel momento. Sostituire double con float ha aiutato , ancora non so perché.

Grazie, ci proverò........ anche io mi sto facendo prendere la mano.

SÌ!!! È esattamente così che funziona! Va bene.

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

Grazie!!! Non so più cosa farei........

 
#define ALPHA 0.1

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

Ecco come funziona 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);

Ecco come funziona MathFloor

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

per diversi spread? tra cui 2,3,4,5,6,7 ?

Perché ho provato il tuo modo prima (senza+ ALPHA). 2,3 spread è ok, ma 4,5 è già un glitch

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

Normalizzazione, questa è la prima cosa che ho fatto nella funzione, ma sfortunatamente a certi spread, comincia ad andare in tilt

 
Vladislav Andruschenko:

La normalizzazione è la prima cosa che ho fatto nella funzione, ma sfortunatamente a certi spreads, comincia a fare cilecca

L'ho aggiustato, prova ora.
 
Vladislav Andruschenko:

prendere l'Ask e il Bid.

e calcolare il prezzo medio.

Se lo spread è dispari (3,5,7,9 ecc.) allora equipara il prezzo medio più vicino al Bid.

#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);
}
Motivazione: