Erreurs, bugs, questions - page 1782

 
A100:

La règle consistant à perdre les chiffres significatifs et à les remplir avec des chiffres aléatoires fonctionne.

Le résultat est long, mais dans les calculs intermédiaires de double et c'est là que les chiffres significatifs sont perdus

(Chiffres+1)*3-1=17

Merci pour ces informations.

Cependant, l'information est difficile à saisir - c'est-à-dire que le nombre peut être tel, mais vous ne pouvez pas faire de calculs avec ?

Voici un exemple de code où il est converti de la chaîne de caractères en nombre

long CalcY=StringToDouble("111111111111111111");
Print ("CalcY=",CalcY);

Imprime le nombre 111111111111111104.

C'est-à-dire qu'il n'y a pas de calculs ici ou je me trompe ?

Est-il possible de gérer ces chiffres ou s'agit-il de limitations linguistiques ?

 
-Aleks-:

Il n'y a donc aucun calcul ici, ou je me trompe ?

Un calcul est une opération quelconque (dans cecas, une conversion). Pour le nombre spécifié StringToDouble retourne le double avec perte de précision

StringToInteger renvoie un long, mais d'autres fonctions fonctionnant avec un double ne peuvent pas être utilisées dans les calculs sans perte de précision, telles que NormalizeDouble, MathPow

 
A100:

Calcul - toute opération (dans ce cas, une conversion). StringToDouble retourne un double - il y a une perte de précision

StringToInteger renvoie un long, mais d'autres fonctions fonctionnant avec un double ne peuvent être utilisées dans les calculs sans perte de précision, comme NormalizeDouble, MathPow,

StringToInteger a fonctionné pour exprimer le nombre, mais ensuite c'est pire, je suppose que le nombre doit être décomposé en ses composants pour les opérations mathématiques...

long CalcZ=StringToInteger("111111111111111111");
Print ("CalcZ=",CalcZ);

double Test=CalcZ;
Print ("Test=",Test);

Test=1.111111111111111e+17

 

Encore une fois, c'est écrit dans le helpdesk

INT_MAX

Valeur maximale pouvant être représentée par le type int

2147483647

Alors comment StringToInteger a effectué la conversion et l'a stocké dans le long si le nombre est plus grand que celui autorisé ?

 
-Aleks-:

Alors comment StringToInteger convertit-il et stocke-t-il en long si le nombre est plus grand que celui autorisé ?

StringToInteger retourne à l'origine un long dans la plageLONG_MINLONG_MAX(on pourrait aussi l'appeler StringToColobok).

 
A100:
StringToInteger retourne à l'origine un long (il aurait pu tout aussi bien s'appeler StringToBoob)

Bien sûr, c'est probablement vrai, mais dans l'aide, c'est tellement confus...

"

Convertit une chaîne contenant la représentation en caractères d'un nombre en un nombre int(entier).

"

C'est ce qui m'a induit en erreur.

Merci pour ces informations.

J'en déduis que la représentation numérique ci-dessus ne tiendra pas dans le tampon graphique ?

 
-Aleks-:

J'en déduis que le nombre ci-dessus ne tiendra pas dans le tampon graphique ?

Ils s'écrivent comme suit : B'1111111111111111111111111111111111'.

 
A100:

J'affirme (et propose de vérifier) que lorsque l'on passe de M5 à M15, aucune commande M5 Deinit n'est envoyée au premier indicateur (et seulement à lui - dans ce cas M5) et il ne se déchargera pas du graphique jusqu'à ce que l'utilisateur supprime l'EA.

Glory a raison et le déchargement fonctionne correctement.

Notez que dans MT5, le noyau de calcul de l'indicateur est une ressource partagée avec un compteur d'utilisation dans son propre gestionnaire. Si différents programmes ou fenêtres utilisent l'indicateur avec les mêmes paramètres, une seule copie de calcul avec le compteur d'utilisation fonctionne réellement. Cela permet d'économiser beaucoup d'argent lorsqu'un trader utilise les mêmes indicateurs dans les graphiques et dans un conseiller expert.

Le gestionnaire d'indicateurs est conçu de telle sorte qu'il supprime physiquement les indicateurs de manière asynchrone et avec un délai. Et pendant ce temps, une nouvelle copie de travail est créée avec de nouveaux paramètres, qui est souvent initialisée avant que l'ancienne copie ne soit physiquement supprimée.
 
Renat Fatkhullin:
Le gestionnaire d'indicateurs est conçu de telle sorte qu'il supprime physiquement les indicateurs de manière asynchrone et avec un délai. Et pendant ce temps, une nouvelle copie de travail est créée avec de nouveaux paramètres, qui est souvent initialisée avant que l'ancienne copie ne soit physiquement supprimée.

Simplifions l'indicateur

//Test_i.mq5 //Индикатор
void Prn( string f, int i = -1 ) { Print( f, "->", StringSubstr( EnumToString( Period()), 7 ), (i == -1 ? "" : ":" + i )); }
void OnInit()                    { Prn( __FUNCTION__ );         }
void OnDeinit( const int reason ) { Prn( __FUNCTION__, reason ); }
int OnCalculate( const int, const int, const int, const double& [] ) { return 0; }

Attachons le fichier Test.mq5 au graphique M5 et changeons la période du graphique de M5->M15.

Résultat :

2017.02.06 00:54:20.897 OnInit->M5
2017.02.06 00:54:25.553 OnInit->M15

Question : Quand est-ce que OnDeinit->M5 sera appelé ?

Ma réponse : jamais !

Votre réponse ci-dessus : de manière asynchrone et avec un délai.

Dossiers :
Test.mq5  1 kb
 
A100:

Question : Quand est-ce que OnDeinit->M5 sera appelé ?

Ma réponse : jamais !

Votre réponse ci-dessus : de manière asynchrone et avec un délai.

Plus de 30 minutes se sont écoulées et OnDeinit->M5 n'est toujours pas appelé.

Et maintenant, modifions le code de l'Expert Advisor (en changeant légèrement l'ordre) ...

Résultat :

2017.02.06 01:31:45.002 OnInit->M5
2017.02.06 01:31:48.340 OnDeinit->M5:1 Appelé immédiatement et sans délai !
2017.02.06 01:31:48.409 OnInit->M15

Dossiers :
Test.mq5  2 kb
Raison: