Double vs FLOAT - непонятная ошибка MathFloor

 

Всем привет, замучался я уже с точностью котировок. Нормализации и так далее.

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

спред:2

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

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




спред:3

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

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

 


спред:4

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

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

 

спред:5

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

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

 

 

 

 

Эти лишние знаки где-то в конце тоннеля..........  

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

при спреде =2

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

при спреде=3

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

 

 при спреде 4!!!!

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

 почему ? 

 
Vladislav Andruschenko:

Всем привет, замучался я уже с точностью котировок. Нормализации и так далее.

Вам надо каким-то образом суметь понять, что же из себя представляют double и int. Как работает приведение типов.

Никогда не использовал MathMod и MathFloor. У Вас по коду очень много кричащего о том, что Вы совсем не понимаете, что стоит за написанным.

 

Распринтовка double-числа - ни о чем. Если хочется распечатать истинное значение double, нужно посмотреть его байты.

 

распринтовка только для того чтобы не писать вручную,

Сама по себе переменная не дает того результата, которого я от него жду.

Приведение типов, нормализация инт и дабл - это то что я делал без помощи.

В данный же момент я в отчаянии ибо перепробовал все варианты. и выставил кусок 1 из 1000 кода, который не работает так как нужно.  

Но спасибо за помощь.

 

Попробуйте у себя добиться того, чего хочу я: код мне можете потом не показывать. просто скажите - работает или нет.  

берем Аск и Бид.

и вычисляем среднюю цену.

Если спред нечетный (3,5,7,9 и тд) тогда приравниваем среднюю цену ближе к Бид.

например:

Бид=1.55555     Аск =1.55557  Средняя цена= 1,55556  спред = 2

Бид=1.55555     Аск =1.55558  Средняя цена= 1,55556  спред = 3

 

и у Вас получится все верно.

Но когда спред будет 4,5,6,7 - у Вас эта точность уйдет в неизвестное.   и цифру поплывут не туда. 

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

при спреде =2

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

при спреде=3

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

 

 при спреде 4!!!!

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

 почему ? 

Была как-то похожая ситуация - у меня тогда аж разум закипал от возмущенья. Помогла замена  double на float,  почему до сих пор не знаю.
 
 
sibirqk:
Была как-то похожая ситуация - у меня тогда аж разум закипал от возмущенья. Помогла замена  double на float,  почему до сих пор не знаю.
 

Спасибо, попробую........ у меня тоже мозг уже вскипел.  

ДА!!! Именно так работает! все ок.

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

 

Спасибо.! я уже не знаю, что делал бы........ 

 
#define ALPHA 0.1

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

 

Вот так пашет 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);

 

Вот так пашет MathFloor

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

 

при разных спредах? в том числе, 2,3,4,5,6,7 ?

потому, что Ваш способ я пробовал ранее(правда без  + ALPHA). и на 2,3 спреде все ок, а на 4,5 - уже глюк

 

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

нормализация, это первое что я делал в функции, но к сожалению при определенных спредах, она начинает глючить  

 
Vladislav Andruschenko:

нормализация, это первое что я делал в функции, но к сожалению при определенных спредах, она начинает глючить  

я поправил, попробуйте теперь.
 
Vladislav Andruschenko:

берем Аск и Бид.

и вычисляем среднюю цену.

Если спред нечетный (3,5,7,9 и тд) тогда приравниваем среднюю цену ближе к Бид.

#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);
}
Причина обращения: