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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladislav Andruschenko
162938
Vladislav Andruschenko  

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

      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 

 

 

 

 

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

Vladislav Andruschenko
162938
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

 почему ? 

fxsaber
16758
fxsaber  
Vladislav Andruschenko:

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

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

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

 

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

Vladislav Andruschenko
162938
Vladislav Andruschenko  

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

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

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

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

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

 

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

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

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

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

например:

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

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

 

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

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

sibirqk
516
sibirqk  
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,  почему до сих пор не знаю.
 
Vladislav Andruschenko
162938
Vladislav Andruschenko  
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;

 

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

fxsaber
16758
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));
}
Andrey Dik
13682
Andrey Dik  
double Averab = NormalizeDouble ((Ask + Bid)/(2.0 * Point), Digits);
Vladislav Andruschenko
162938
Vladislav Andruschenko  
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);

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

Andrey Dik
13682
Andrey Dik  
Vladislav Andruschenko:

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

я поправил, попробуйте теперь.
fxsaber
16758
fxsaber  
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);
}
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий