Double vs FLOAT - erreur MathFloor peu claire - page 6

 
fxsaber:
Oui.
Merci.
 
Vladislav Andruschenko:
Merci.
Il y avait une solution sur la première page... c'est déjà à la page 6.
 
fxsaber:
Alors pourquoi cela fonctionne-t-il sans normalisation et sans MathFloor ?
Si l'entrée est de 0,95 ?
 
Dmitry Fedoseev:
Si l'entrée est de 0,95 ?
Je ne comprends pas.
 
Vladislav Andruschenko:
Je ne suis peut-être pas tout à fait sûr de ce qu'il faut prendre, mais regardez cette option
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);
}/*******************************************************************/
résultat
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
 

" Prenez l'offre et la demande. et calculez le prix moyen. Si l'écart est impair (3,5,7,9, etc.), il faut alors assimiler le prix moyen plus proche de l'offre."

La tâche n'est pas fixée :

- Que signifie un écart bizarre. 1,3,...,9 fois le point ou 1,3,...,17,57 fois le point ? Les arrondis fonctionnent dans les segments d'unités...

- que signifie "plus près du Bid" ? En particulier si l'écart est de 43 fois Point, par exemple. On parle d'assimiler le Bid à quoi ?

Il faut d'abord clarifier le problème, ce n'est qu'ensuite qu'une décision sans ambiguïté peut être prise.

En même temps, puisque nous parlons de nombres pairs/impairs, il serait logique de passer aux nombres entiers, où ce concept a du sens.

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 {  // Спред четный
  }

 
J'ai eu quelque chose de similaire dans une tâche très simple - le script a lu le prix d'ouverture de l'EURUSD à partir de la série chronologique dans un tableau double et a ensuite écrit ce tableau dans un fichier. Tant que le prix était supérieur à un, tout allait bien. Mais lorsque dans l'année zéro le prix était inférieur à 1, pas très souvent, environ 20 fois par an, des choses étranges ont commencé à se produire - quelque part à la 15ème décimale le 1 a été coupé et tous les précédents, bien sûr, se sont transformés en 9. Ce n'est pas un gros problème, mais ce n'est pas gentil. La normalisation l'a fait partout et après la lecture et avant l'écriture dans le fichier et pendant l'enregistrement, et la conversion d'un tableau à un autre avec la normalisation - rien ne fonctionnait. Si j'ajoutais 1 lors de la lecture des séries temporelles, tout était correct. Finalement, j'en ai eu marre, j'ai changé le dowble en float et je me suis calmé.
 
Vladimir:

" Prenez l'offre et la demande. et calculez le prix moyen. Si l'écart est impair (3,5,7,9, etc.), il faut alors assimiler le prix moyen plus proche de l'offre."

La tâche n'est pas fixée :

En fait, la tâche semble simple ? et elle peut être réalisée par un écolier ? :-) C'est ce que je pensais aussi.

Mais dans la tarification du serveur, la normalisation des données et le reste - il y a des coins sombres que vous ne soupçonnez même pas.

Je programme en mql depuis 9 ans - et je n'ai jamais eu de problème de normalisation parce que je l'ai bien fait. et la précision à 1 millipoint a toujours fonctionné correctement.

Mais il y a des tâches qui nécessitent une grande précision.

Et il y a des conditions.

A savoir :

  1. Nous prenons le prix ASC et BID - nous calculons son prix moyen = facile ? ok.
  2. En conséquence, si l'écart est impair (3 points par exemple), on ne peut pas diviser sans reste, n'est-ce pas ?

Nous devons donc normaliser le prix de manière à ce que, s'il y a un résidu (et il y en aura un même avec un écart égal ! :-)), nous fassions la moyenne du prix le plus proche du point bas, c'est-à-dire de l'offre.

Par exemple :

  • asc = 1.23455 bid = 1.23457 spread = 2 Prix moyen : 1.23456
  • Ask = 1.23455 Bid = 1.23458 Spread = 3 Prix moyen : 1.23456
  • ask = 1.23455 bid = 1.23459 spread = 4 Prix moyen : 1.23457

Et tout semble être simple ? Tout devrait fonctionner et je suis moi-même un idiot ? et je suis resté assis pendant 2 jours en espérant ne pas être un idiot. Comprendre les queues et les dabbles et les tribbles et les bibbles..................

Mais ! avec la même formule, avec des écarts pairs et des écarts impairs - dans certaines situations - la formule ne fonctionnait pas . (voir ci-dessus) .

Notamment, il peut fonctionner sur les devises et ne pas fonctionner sur le pétrole.

Il se peut qu' il fonctionne sur le JPY et ne fonctionne pas sur le USD à un moment donné.

Peut-être regarde-t-elle l'influence de la lune ? Le temps en Afrique .................

Mais, quand vous êtes sûr que la formule fonctionne, vous ne remarquez pas ce 1 millipoint. et vous travaillez sur..... et puis "Bang, bang, bang, bang" et ce millipoint, décide de s'enfuir, ou d'appeler le deuxième millipoint, qui se met en travers.

IMHO.

Vous pouvez me considérer comme un idiot, un sous-programmeur, un écolier..... et ainsi de suite.

Mais le fait demeure.

Une erreur se produit avec différentes combinaisons de valeurs doubles. En même temps, tout est clair avec le flotteur.

Je ne l'ai pas encore compris. L'aide est très bonne et je demande toujours de l'aide, c'est normal. Et je demanderai peut-être de l'aide à la communauté dans 10 ans. C'est normal. Et je réponds à un appel à l'aide si je connais les pièges - c'est normal.

Bien sûr, après de tels tests, je ferai une "enquête supplémentaire" pour comprendre par moi-même pourquoi c'est le cas.

Merci à tous pour votre réactivité et votre aide.

 
Vladislav Andruschenko:

En fait, la tâche semble être simple... Et elle peut être réalisée par un écolier ? :-) C'est ce que je pensais aussi.

Mais il y a des coins tellement sombres dans les prix obtenus du serveur, dans la normalisation des données et le reste - que vous n'y pensez même pas.

Je programme en mql depuis 9 ans - et je n'ai jamais eu de problème de normalisation parce que je l'ai bien fait. et la précision à 1 millipoint a toujours fonctionné correctement.

Mais ! avec la même formule, avec des écarts pairs et des écarts impairs - dans certaines situations - la formule ne fonctionnait pas . (voir ci-dessus) .

Avec des combinaisons différentes - avec des valeurs doubles, une erreur se produit. En même temps, avec le flotteur, tout est clair.

Qu'est-ce que la version de Metakvotes de la normalisation des données a à voir avec cela de toute façon ? Ce terme a des significations différentes pour les programmeurs et n'est pas du tout un arrondi. Lisez la norme IEEE 754, par exemple, ici: http://www.softelectro.ru/ieee754.html. Les nombres réels non normalisés vont jusqu'à 1,17549421*10^(-38) en cas de longueur de 4 octets et jusqu'à 4....*10^(-324) en cas de longueur de 8 octets, nous les rencontrons très rarement et certainement pas dans les calculs de cours. Si vous devez appeler OrderSend, arrondissez-le en fonction des exigences de cette fonction. Il n'est pas nécessaire d'utiliser les arrondis tant que la tâche ne l'exige pas.

Les erreurs ne se produisent pas dans le format double ou flottant, mais dans les opérations utilisées. Le fait que la formule n'ait pas résolu la tâche vous indique qu'elle n'est pas appropriée pour cette tâche. Pas plus que ça. Dites-moi quelles erreurs se produisent dans un calcul normal sans normalisation (c'est le morceau de mon post ci-dessus) :

Spr=MathRound((Ask-Bid)/_Point) ; Spr=Spr >> 1; Middle=Bid+Spr*_Point ;

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:

En fait, la tâche semble simple... Et elle peut être réalisée par un écolier ? :-) C'est ce que je pensais aussi.

Mais il y a des coins tellement sombres dans les prix obtenus du serveur, dans la normalisation des données et le reste - que vous n'y pensez même pas.

Je programme en mql depuis 9 ans - et je n'ai jamais eu de problème de normalisation parce que je l'ai bien fait. et la précision à 1 millipoint a toujours fonctionné correctement.

Mais il y a des tâches qui nécessitent une grande précision.

Et il y a des conditions.

A savoir :

  1. Nous prenons le prix ASC et BID - nous calculons son prix moyen = facile ? ok.
  2. En conséquence, si l'écart est impair (3 points par exemple), on ne peut pas diviser sans reste, n'est-ce pas ?

Nous devons donc normaliser le prix de manière à ce que, s'il y a un résidu (et il y en aura un même avec un écart égal ! :-)), nous fassions la moyenne du prix le plus proche du point bas, c'est-à-dire de l'offre.

Par exemple :

  • asc = 1.23455 bid = 1.23457 spread = 2 Prix moyen : 1.23456
  • Ask = 1.23455 Bid = 1.23458 Spread = 3 Prix moyen : 1.23456
  • ask = 1.23455 bid = 1.23459 spread = 4 Prix moyen : 1.23457

Et tout semble être simple ? Tout devrait fonctionner et je suis moi-même un idiot ? et je suis resté assis pendant 2 jours en espérant que je ne suis pas un idiot. Comprendre les queues et les dabbles et les tribbles et les bibbles..................

Mais ! avec la même formule, avec des écarts pairs et des écarts impairs - dans certaines situations - la formule ne fonctionnait pas . (voir ci-dessus) .

Notamment, il peut fonctionner sur les devises et ne pas fonctionner sur le pétrole.

Il se peut qu' il fonctionne sur le JPY et ne fonctionne pas sur le USD à un moment donné.

Peut-être regarde-t-elle l'influence de la lune ? Le temps en Afrique .................

Mais, quand vous êtes sûr que la formule fonctionne, vous ne remarquez pas ce 1 millipoint. et vous travaillez sur..... et puis "Bang, bang, bang, bang" et ce millipoint, décide de s'enfuir, ou d'appeler le deuxième millipoint, qui se met en travers.

IMHO.

Vous pouvez me considérer comme un idiot, un sous-programmeur, un écolier..... et ainsi de suite.

Mais le fait demeure.

Une erreur se produit avec différentes combinaisons de valeurs doubles. En même temps, tout est clair avec le flotteur.

Je ne l'ai pas encore compris. L'aide est très bonne et je la demande toujours, c'est normal. Et je demanderai peut-être l'aide de la communauté dans 10 ans. C'est normal. Et je réponds à un appel à l'aide si je connais les pièges - c'est normal.

Bien sûr, après de tels tests, je ferai une "enquête supplémentaire" pour comprendre par moi-même pourquoi c'est le cas.

Merci à tous pour votre réactivité et votre aide.

En fonction de vos objectifs, il est parfois utile de passer aux chiffres entiers. Cela permet d'économiser beaucoup de nerfs :-) Une fois, j'ai eu une tâche où je devais marquer avec précision de très nombreux niveaux, au début j'ai eu du mal avec le double, mais ensuite j'ai tout converti en points entiers à partir de 0 et tout est devenu facile, simple et sans erreur.