Erreurs, bugs, questions - page 7

 
FEDOR_MQL:

Et à ce stade du développement : les paramètres, l'appel de la fonction et la fonction elle-même doivent afficher ou non les erreurs de compilation. Si oui, pourquoi ? J'ai des erreurs.

Oui, il affiche effectivement des erreurs pour une raison quelconque, même s'il ne devrait pas y en avoir. Je demande aux développeurs de faire attention à cela. Je l'ai modifié de cette façon, il n'y a pas d'erreurs, mais quand j'utilise le switch, il y a toujours une erreur.

 //+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- input parameters

input double   Lots=0.1;
input bool     MM = true;
input double   Risk = 10.0;

double lots;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(MM) lots = LotSon();      //вызов функции LotSon 
   else lots = Lots;
  }
//+------------------------------------------------------------------+
double LotSon()
{
  double LotMin     = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
  double LotMax     = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
  double LotStep    = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
  double Lot        = AccountInfoDouble(ACCOUNT_FREEMARGIN)/100000.0 * Risk;
  Lot               = MathMin(LotMax,MathMax(LotMin,Lot));
  
  if (Lot < LotMin) Lot = LotMin;
  if (Lot > LotMax) Lot = LotMax;
  // Вариант первый
  /*
  switch(LotStep)
  {
   case 0.01: Lot=NormalizeDouble(Lot,2);break;
   case 0.1 : Lot=NormalizeDouble(Lot,1);break;
   case 1.0 : Lot=NormalizeDouble(Lot,0);break;
  }
  */
  // Вариант второй
  if (LotStep == 0.01)Lot=NormalizeDouble(Lot,2);
  if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);
  // Вариант третий
  // if (LotStep == 0.01)     Lot=NormalizeDouble(Lot,2);
  // else if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  // else if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);
 return(Lot); 
}
 
sergey1294:

Oui, en effet, pour certaines erreurs de raison alors qu'il ne devrait pas y en avoir. Je demande aux développeurs de faire attention à cela, je l'ai refait comme ça, pas d'erreurs, mais quand on utilise le switch, cela donne toujours une erreur.

  switch(LotStep)
  {
   case 0.01: Lot=NormalizeDouble(Lot,2);break;
   case 0.1 : Lot=NormalizeDouble(Lot,1);break;
   case 1.0 : Lot=NormalizeDouble(Lot,0);break;
  }

Vous devez envoyer les lots sous forme d'int, c'est-à-dire 0,01 = 1000 et 0,10 = 10000...

 
Interesting:

Les lots doivent être envoyés ici sous forme d'int, c'est-à-dire 0.01 = 1000 et 0.10 = 10000...

D'après vous, il s'avère que la fonction
SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
renvoie 1000 au lieu de 0,01
 
sergey1294:
Donc vous dites que la fonction
renvoie une valeur de 1 000 au lieu de 0,01.

Non, je voulais dire que l'erreur disparaîtra si le code ressemble à ceci :

  switch(StepSize)
  {
   case 1000:   Lot=NormalizeDouble(Lot,2);break;
   case 10000:  Lot=NormalizeDouble(Lot,1);break;
   case 100000: Lot=NormalizeDouble(Lot,0);break;
  }
 
Je viens de remarquer que dans
switch
ne peut pas utiliser des nombres en double précision, alors cette option ne peut pas être utilisée dans ce cas.
 
sergey1294:
Je viens de remarquer que dans
ne peut pas utiliser des nombres en double précision, alors cette option ne peut pas être utilisée dans ce cas.
Vous pouvez le faire si vous convertissez les lots en int au préalable. Comme je l'ai dit plus haut...
 
la question demeure de savoir pourquoi une telle conception ne peut pas être utilisée
  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));
 
Interesting:
Vous pouvez le faire si vous convertissez les lots en int. Ce que j'ai dit plus haut...

Je peux voir le code, si vous le voulez bien ? J'ai essayé de toutes les manières, mais ça ne marche pas.

Je ne sais pas s'il est plus facile d'ajouter le risque en pourcentages des titres. Merci !

 
FEDOR_MQL:

Je peux voir le code, si vous le voulez bien ? J'ai essayé de toutes les manières, mais ça ne marche pas.

Je ne sais pas s'il existe une autre variante simple, il suffit d'ajouter le risque en pourcentages du dépôt à l'EA. Merci !

Cela dépend de ce dont vous avez besoin comme résultat. Ici, par exemple, j'ai donné un certain nombre de fonctions intéressantes sur le calcul des risques


Et pour que ce code fonctionne, il suffit de multiplier le lot par 100000 et de l'introduire dans switch(StepSize) comme paramètre (variable de type int).


PS

Et en général, pour être honnête, je ne comprends pas bien l'utilité de toutes ces variantes ? Je veux dire que, dans le contexte de cette fonction, l'une des dernières.... est suffisante.

 
Interesting:

Cela dépend de ce que vous voulez obtenir dans le résultat final, ici, par exemple, j'ai donné quelques fonctions intéressantes sur le risque


Et pour que ce code fonctionne, il suffit de multiplier lot par 100000 et de le passer à switch(StepSize) comme paramètre (variable de type int).

Votre article est ce dont je pense avoir besoin. Merci