Erreurs, bugs, questions - page 4

 
Interesting:

MarketInfo(Symbol(),MODE_MARGININIT) = SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL)

Que correspond alors à MODE_MARGINREQUIRED ? Ou sinon, comment savoir combien d'argent gratuit il me faut pour ouvrir 1 lot à acheter ?

Dans l'Expert Advisor Moving Average.mq5 des créateurs mql5, les lots sont calculés comme ceci

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage
input double DecreaseFactor     = 3;       // Descrease factor
input int    MovingPeriod       = 12;      // Moving Average period
input int    MovingShift        = 6;       // Moving Average shift
//---
int   ExtHandle=0;
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
//--- select lot size
   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/1000.0,2);

Pourquoi MaximumRisk est si petit (0.02%) et divisé par 1000 lors du calcul des lots ? Que représente ce millier ? Peut-être que 1000 = fonds disponibles nécessaires pour acheter 1 lot multiplié par 100% (pour convertir 0,02% en fraction de 0,0002) ? C'est-à-dire que les fonds disponibles pour l'achat d'un lot sont de 10 $ (10 $x100 %=1000). C'est dans la bonne direction, je pense ?

Et une dernière question. Y a-t-il une limite au nombre maximum d'ordres ouverts ?

 
gpwr:

Que correspond alors à MODE_MARGINREQUIRED ? Ou sinon, comment puis-je connaître le montant des fonds disponibles nécessaires pour ouvrir un lot à acheter ?

Et une dernière question. Y a-t-il une limite au nombre maximum d'ordres ouverts ?


Je me suis posé cette question.


Voici la réponse des développeurs :

Rashid Umarov:

Voir

SYMBOL_TRADE_CONTRAT_TAILLE

Taille du contrat d'échange

double

и

MARGE_DE_LA_DEVISE_SYMBOLE

Devise dans laquelle la marge est calculée

chaîne de caractères


Si je comprends bien, vous devrez le calculer vous-même.

 

gpwr:

Dans l'Expert Advisor Moving Average.mq5 des créateurs mql5, les lots sont calculés comme ceci

Pourquoi MaximumRisk est si petit (0.02%) et divisé par 1000 lors du calcul des lots ? Que représente ce 1000 ? Peut-être que 1000 = fonds disponibles nécessaires pour acheter 1 lot multiplié par 100% (pour convertir 0,02% en fraction de 0,0002) ? C'est-à-dire que les fonds disponibles pour l'achat d'un lot sont de 10 $ (10 $x100 %=1000). C'est dans la bonne direction, je pense ?

Et une dernière question. Y a-t-il une limite au nombre maximum d'ordres ouverts ?


AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk

Cette ligne calcule le risque comme étant de 2% des fonds disponibles, si j'ai bien compris. Pourquoi divise-t-on ce montant par 1000 ?


Mais si je comprends bien, alors avec un dépôt (fonds libres) de 20 000 $, le conseiller expert recommande de ne pas ouvrir plus de 2 % de ce montant (400 $).

En divisant ce montant par 1 000, on obtient logiquement 0,4 lot...

 

gpwr:

Y a-t-il une limite au nombre maximum d'ordres ouverts ?

Je me demandais la même chose. Il y a une suggestion à laquelle les développeurs réfléchissent encore (pour eux, d'ailleurs - application 15802).
 
Interesting:

Cette ligne calcule le risque comme étant de 2% du montant des fonds disponibles, si je comprends bien. La raison pour laquelle ce montant est divisé par 1 000 est du ressort des développeurs.

Mais si je comprends bien, alors avec un dépôt (fonds libres) de 20 000 $, le conseiller expert recommande de ne pas ouvrir plus de 2% de ce montant (400 $).

En divisant ce montant par 1 000, on obtient logiquement 0,4 lot...

Maintenant je l'ai. Il y a une erreur dans Moving Average.mq5. Au lieu de

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage

Il devrait être

input double MaximumRisk        = 0.02;    // Maximum Risk as a fraction  of a free margin

La division par 1000 dans le calcul des lots est alors claire : 100 000 $ (taille du lot)/100 (effet de levier) = 1000. Cependant, les développeurs de mql5 ne doivent pas montrer un tel exemple de conseiller expert. Il devrait être modifié

double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/1000.0,2);

A

double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
int    Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double lot        =NormalizeDouble(FreeMargin*MaximumRisk/LotRqdMgn,2);

Ou mieux encore

double Step       =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
int    Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double lot        =NormalizeDouble(MathFloor(FreeMargin*MaximumRisk/LotRqdMgn/Step)*Step,2);

Il est cependant dommage que MODE_MARGINREQUIRED ait été perdu. Peut-être les développeurs rétabliront-ils ce paramètre pour réduire le nombre de calculs.

 
Interesting:
stringo:
Les noms courts n'ont toujours été utilisés que pour l'affichage dans la sous-fenêtre des indicateurs.
Il ne s'y affiche donc pas, soit c'est une erreur, soit je ne comprends pas quelque chose...
J'ai trouvé l'erreur et je l'ai corrigée, la 16051 peut être fermée.
 

Je ne sais pas si je place mes rapports de bogue au bon endroit. Si ce n'est pas le cas, veuillez me corriger.

Lors du test de mon EA, j'ai volontairement créé une telle situation pour voir si le testeur détermine correctement la marge. Donc, le dépôt de 100 $. Nous négocions l'EURUSD. La taille minimale du lot est de 0,1. Le code suivant pour le calcul des lots se trouve dans l'Expert Advisor

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

Le testeur génère ces erreurs

2010.06.08 22:28:57 Core 1 pas assez d'argent [achat instantané 0.10 EURUSD à 1.19242]
2010.06.08 22:28:57 Core 1 PrevBalance : 100.00, PrevEquity 100.00, PrevMargin : 0.00, NewMargin : 119.24, NewFreeMargin : -19.24
2010.06.08 22:28:57 Core 1 1000 100
2010.06.08 22:28:57 Core 1 pas assez d'argent [achat instantané 0.10 EURUSD à 1.19180]
2010.06.08 22:28:57 Core 1 PrevBalance : 100.00, PrevEquity 100.00, PrevMargin : 0.00, NewMargin : 119.18, NewFreeMargin : -19.18
2010.06.08 22:28:57 Core 1 1000 100
2010.06.08 22:28:57 Core 1 pas assez d'argent [achat instantané 0.10 EURUSD à 1.19362]
2010.06.08 22:28:57 Core 1 PrevBalance : 100.00, PrevEquity 100.00, PrevMargin : 0.00, NewMargin : 119.36, NewFreeMargin : -19.36
2010.06.08 22:28:57 Core 1 1000 100

À en juger par ces messages, la marge libre nécessaire pour acheter un lot, LotRqdMgn, est égale à 1000, ce qui semble correct. Marge libre=100. Multipliez 0,1 lot par 1000 et vous obtenez 100. Cela signifie que nous avons assez de fonds pour ouvrir le 1er lot. Mais le testeur rapporte que nous n'avons pas assez de fonds. Où est l'erreur ?

 
gpwr:

Sur la base de ces messages, la marge libre requise pour acheter un lot, LotRqdMgn, est de 1000, ce qui semble correct. Marge libre=100. Multipliez 0,1 lot par 1000 et vous obtenez 100. Cela signifie que nous avons assez de fonds pour ouvrir le 1er lot. Mais le testeur rapporte que nous n'avons pas assez de fonds. Où se trouve l'erreur ?

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 vous ne pouvez pas faire de transaction - tout est correct.

 
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 il n'est pas possible d'effectuer une transaction - tout est correct.

Merci Renat. J'ai compris mon erreur. J'ai modifié la formule de calcul du LotRqdMgn et tout fonctionne correctement maintenant.

 

Un nouveau mot en bibliothéconomie, ou l'étonnant à côté...


J'ai donc créé un conseiller expert qui utilise la bibliothèque, je l'ai vérifié et tout fonctionne. J'ai fait une archive avec le conseiller expert, cette bibliothèque et quelques fichiers MQL5 et MQH. J'ai donné l'archive à l'applicateur/développeur pour qu'il la teste.


Ce serait bien, mais j'ai décidé d'effectuer les tests sur un autre terminal. J'ai donc déballé l'archive et décidé d'attacher le conseiller expert au graphique.


Et dans le journal du terminal, ces deux lignes sont écrites :

2010.06.10 09:54:51 PM Experts MechanicalTrading-Infinity-2010 (EURUSD,Quotidien)
2010.06.10 09:54:51 Experts Le chargement de MechanicalTrading-Infinity-2010 (EURUSD,Daily) a échoué


J'ai commencé à chercher ce qui fonctionne et comment cela fonctionne (ou plutôt, ne fonctionne pas) et j'ai trouvé un fait étonnant - le terminal voit la bibliothèque compilée dans le répertoire (comme *.ex5), mais la "coule" de manière persistante, ce qui n'est pas très bon, comme vous le comprenez...

Après avoir essayé plusieurs raisons possibles pour un tel comportement, j'ai décidé de placer le fichier original (en tant que *.mq5) dans le dossier avec la bibliothèque. J'ai essayé d'ajouter un EA au graphique - oh mon dieu, tout fonctionne.


Au cours du jeu, un certain nombre de questions ont été soulevées :

1. Pourquoi le conseiller expert ne fonctionne-t-il pas si la bibliothèque n'est représentée que par un fichier .ex5 ?

2. Pourquoi le terminal s'obstine-t-il à supprimer ce fichier du répertoire ?

3. Pourquoi le journal du terminal ne contient-il pas un commentaire clair sur tout ce qui précède ?

4. Pourquoi la documentation ne dit-elle pas que ce comportement est possible ?


Et enfin, la cinquième et dernière question : comment puis-je faire face à tout cela et qu'est-ce que je fais de mal (il se peut que le terminal manque un fichier EX5 et cherche quelque chose, par exemple un fichier d'en-tête ou la bibliothèque elle-même) ?


PS

A propos, j'ai eu le même bug avec Expert Advisors, suppression obstinée du fichier *.ex5... :(

Raison: