Erreurs, bugs, questions - page 8

 
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. Je voudrais utiliser le code comme exemple et montrer la rentabilité de mon robot de trading.

Je vous ai donné le code qui fonctionne sans erreur
 
sergey1294:

Chaque variante de cas peut être marquée par une constante entière, une constante de caractère ou une expression constante. Une expression constante ne peut pas inclure de variables ou d'appels de fonction . Une instruction de commutation doit être de type entier.
 
Valmars:
Chaque variante de cas peut être marquée par une constante entière, une constante de caractère ou une expression constante. Une expression constante ne peut pas inclure de variables ou d'appels de fonction. Une instruction decommutation doit être de type entier.
Cette question a déjà été traitée.
 
sergey1294:
Je vous ai donné un code qui fonctionne sans erreur
Vous avez raison, le reste du code aurait dû être jeté au lieu d'être sauvegardé...
 

Je me demande pourquoi une construction comme celle-ci ne fonctionne pas, elle donne une erreur - '}'. - tous les chemins de contrôle ne renvoient pas une valeur

 //+------------------------------------------------------------------+
#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;

  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));
}
 
sergey1294:
Je vous ai donné le code qui fonctionne sans erreur.
Désolé Sergei, je ne l'ai pas vu. Je l'ai trouvé maintenant. Merci beaucoup à tous, je ne pensais pas que cela prendrait autant de temps.
 
sergey1294:

Je me demande pourquoi une construction comme celle-ci ne fonctionne pas, elle donne une erreur - '}'. - tous les chemins de contrôle ne renvoient pas une valeur


A votre avis, que doit retourner cette fonction ? La façon dont je vois les choses
return(Lot);
 
Interesting:
A votre avis, que doit retourner cette fonction ? La façon dont je le vois -

Ça ne marche pas comme ça.


  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));

Voici comment cela fonctionne.

  if (LotStep == 0.01)Lot=NormalizeDouble(Lot,2);
  if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);

  return(Lot); 

	          
 
sergey1294:

Ça ne marche pas comme ça

C'est vrai et ça ne marche pas. C'est à chacun de voir, mais personnellement j'ai toujours pensé que return() devait être déclaré à la fin de toute fonction, et le compilateur me soutient sur ce point.


PS

Personnellement, dès MQL4, j'ai commencé à utiliser la variable Result pour calculer la valeur de retour. Je dois noter que l'appel de return() à la fin du code d'une fonction est obligatoire et que sa présence au début/milieu du code sera parfois perçue comme une sorte d'analogue de break (la seule différence est que break lui-même n'est pas perçu par le compilateur comme une commande pour retourner la valeur du résultat de la fonction).

 

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

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;

  if (MathAbs(LotStep-0.01)<0.001)return(NormalizeDouble(Lot,2));
  if (MathAbs(LotStep-0.1)<0.001) return(NormalizeDouble(Lot,1));
  if (MathAbs(LotStep-1.0)<0.001) return(NormalizeDouble(Lot,0));
  return(-1);
}
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5