Erreurs, bugs, questions - page 9

 
DC2008:

Il n'est pas correct d'utiliser la condition == pour les variables de type double. Il est recommandé de comparer comme ceci :


Je peux ajouter à cela que, bien qu'avec un certain retard, nous avons quand même écrit un article sur ce sujet - Features of working with numbers of type double in MQL4. Tout ce qui y est mentionné sera toujours pertinent pour tout langage de programmation lorsqu'il s'agit d'opérations avec des nombres réels (double et flottant dans MQL5).
Особенности работы с числами типа double в MQL4 - Статьи по MQL4
  • www.mql5.com
Особенности работы с числами типа double в MQL4 - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации
 
DC2008:

Il n'est pas correct d'utiliser la condition == pour les variables de type double. Il est recommandé de comparer comme ceci :


C'est tout à fait raisonnable, et surtout une approche sensée. Mais il me semble qu'au moins la première ligne aurait dû ressembler à ceci :

if (MathAbs(LotStep-0.01)<0.01)return(NormalizeDouble(Lot,2));
 

Je reçois de temps en temps les messages suivants dans le journal

2010.06.15 14:48:09 MemoryException 4915200 octets non disponibles

Je ne sais pas quoi faire.

 
Prival:

Les messages suivants apparaissent périodiquement dans le journal

2010.06.15 14:48:09 MemoryException 4915200 octets non disponibles

Je ne sais pas quoi faire.

Pas assez de RAM. Vérifiez la taille des tableaux dynamiques, probablement une tentative d'allouer plus de mémoire que celle disponible.
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
DC2008:

Il n'est pas correct d'utiliser la condition == pour les variables de type double. Il est recommandé de comparer comme ceci :


Ce n'est pas le but de la question, si j'ai bien compris, il faut toujours mettre l'opérateur return à la fin d'une fonction utilisateur.
 
joo:
Pas assez de mémoire opérationnelle. Vérifiez la taille des tableaux dynamiques, il s'agit probablement d'une tentative d'allocation de plus de mémoire que celle disponible.
Non, ce n'est pas ça. C'est probablement quelque chose avec les serveurs. Il y a probablement des travaux en cours. Un trou est apparu dans les données. La connexion au serveur est souvent perdue. L'historique n'est pas téléchargé.
 
sergey1294:
Si j'ai bien compris, le retour opérateur doit toujours être placé à la fin de la fonction utilisateur.

Je pense que la réponse à propos de == était essentielle. Il devrait vraiment y avoir un return(...) quelque part dans une fonction de type double. Pas nécessairement à la fin. L'utilisation de l'opérateur == dans if() return() ; peut provoquer une fausse sortie si vous avez le type LotStep 0.1000000000000000001. Dans ce cas, aucun des retours ne fonctionne et la fonction ne renvoie rien. Bien que dans votre cas, le retour n'aime probablement pas NormalizeDouble. Dans votre version qui fonctionne, fixez la fin à return(NormilizeDouble(lot,2)) et voyez si cela fonctionne. Je suis moi-même curieux de le savoir.

 
gpwr:

Je pense que la réponse à propos de == était essentielle. Il devrait vraiment y avoir un return(...) quelque part dans une fonction de type double. Pas nécessairement à la fin. L'utilisation de l'opérateur == dans if() return() ; peut provoquer une fausse sortie si vous avez le type LotStep 0.1000000000000000001. Dans ce cas, aucun des retours ne fonctionne et la fonction ne renvoie rien. Bien que dans votre cas, le retour n'aime probablement pas NormalizeDouble. Dans votre version qui fonctionne, fixez la fin à return(NormilizeDouble(lot,2)) et voyez si cela fonctionne. Je suis moi-même curieux de le savoir.

Il doit y avoir return(...) à la fin, mais il se peut qu'il n'y arrive jamais (si l'une des conditions If fonctionne)...
 
Interesting:
Il doit y avoir return(...) à la fin, mais il se peut qu'on n'y arrive pas (si l'une des conditions If fonctionne)...
C'est ce qui m'intéressait, en 4 il n'était pas nécessaire de le mettre à la fin.
 

double volMin     =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
long   Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double vol=NormalizeDouble(MathFloor(FreeMargin*MaxRisk/LotRqdMgn/Step)*Step,2);
if(vol<volMin) vol=volMin;
if(vol*LotRqdMgn>FreeMargin) vol=0.0;
Print(LotRqdMgn," ",FreeMargin);
return(vol);
Renat
:

L'erreur est que vous avez oublié la devise de la marge dans vos calculs. Solde = 100 USD et exigence de marge = 100 EUR (119 USD).

C'est pourquoi l'opération ne peut être effectuée - tout est correct.

Je veux revenir à ma question sur le calcul correct de la marge. Comme Renat l'a remarqué dans mes calculs, LotRqdMgn (marge requise pour acheter 1 lot) ne tient pas compte du prix de la devise. Je me souviens avoir vu cette table

Identifiant

Description

Formule

SYMBOLE_CALC_MODE_FOREX

Mode Forex - calcul du bénéfice et de la marge pour le Forex

Marge : Lots*Taille_contrat/Levage

Profit: (prix de clôture - prix d'ouverture)*Taille du contrat*Lots

SYMBOLE_CALC_MODE_FUTURES

ModeFutures- calcul de la marge et du profit pour les futures

Marge : Lots *InitialMargin*Percentage/100

Profit : (prix de clôture - prix d'ouverture) * prix du pic / taille du pic * lots.

SYMBOLE_CALC_MODE_CFD

Mode CFD - calcul de la marge et du bénéfice pour CFD

Marge : Lots *Taille du contrat*Prix du marché*Pourcentage/100

Profit : (prix de clôture - prix d'ouverture)*Taille du contrat*Lots

SYMBOLE_CALC_MODE_CFDINDEX

Mode index CFD - calcul de la marge et du bénéfice pour les CFD par indices

Marge : (Lots*Taille du contrat*Prix du marché)*Prix du pic/Taille du pic

Profit : (prix de clôture - prix d'ouverture)*Taille du contrat*Lots

SYMBOLE_CALC_MODE_CFDLEVERAGE

Mode Levier CFD - calcul de la marge et du profit pour les CFD à effet de levier.

Marge : (Lots*Taille du contrat*Prix du marché*Pourcentage)/Levage

Profit : (prix de clôture - prix d'ouverture)*Taille du contrat*Lots

Il s'avère donc qu'il y a une erreur dans le tableau : au lieu de Lots*Taille_Contrat/Levage, ce doit être Prix*Lots*Taille_Contrat/Levage.