Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 287

 
Après-midi. Aide avec la fonction s'il vous plaît, les sommes de perte des ordres fermés, lorsqu'il est utilisé avec la fonction de fermeture des ordres metatrader se bloque, je pense qu'il ya une erreur dans cette fonction.
double ClosProfit()
{
double summa=0;
int orders=OrdersHistoryTotal() ;
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Erreur dans l'historique !") ;
break ;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
continue ;
//---
if(OrderProfit()>0) break ;
Si(OrderProfit()<0)i++ ;
}
Si(i<0)
summa=OrderProfit()+summa ;
}
Si(OrderProfit()>summa)
summa=OrderProfit()+summa ;
return(summa) ;
}
 
Lowech:
Bonjour. S'il vous plaît, aidez-moi avec cette fonction, elle résume les pertes des ordres fermés, metatrader se bloque lorsqu'elle est utilisée avec la fonction des ordres fermés, je pense qu'il y a une sorte d'erreur dans cette fonction.

Il est préférable de regarder les modèles prêts à l'emploi et de les ajuster si nécessaire. GetProfitFromDateInCurrency() (en anglais)

 
Lowech:
Après-midi. Aide avec la fonction s'il vous plaît, résume la perte des ordres fermés, lorsqu'il est utilisé avec la fonction de fermeture des ordres metatrader se bloque, je pense qu'il ya une sorte d'erreur dans cette fonction.

Comment ça, Metatrader se plante ? Le programme se compile avec des erreurs !!!

A trois endroits, au lieu de "si" avec une petite minuscule, il est écrit "si" avec une majuscule.

une paire de parenthèses est clairement inutile : la première après int orders=OrdersHistoryTotal() ; et sa paire après summa=OrderProfit()+summa ; - mais cela n'a pas d'importance

il y a aussi...

 
Lowech:
Après-midi. Aide avec cette fonction s'il vous plaît, il résume la perte des ordres fermés, lorsqu'il est utilisé avec la fonction de fermeture des ordres Metatrader se bloque, je pense qu'il ya une sorte d'erreur dans cette fonction.

Essayez ceci :

double ClosProfit()
{ double summa=0;
  int orders=OrdersHistoryTotal(); 
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0.0) summa=OrderProfit()+summa;
  }
  return(summa);
}
 
J'avais 2 minutes de retard pour écrire ... Considérons cette partie attentivement :
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
    {
      Print("Error in history!");
      break;
    }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()>0) break;
    if(OrderProfit()<0)i++;
  }
  if(i<0)

Compilé avec la directive #property strict - c'est la dernière ligne : i" - identifiant non déclaré. Le fait est que la variable est déclarée dans une boucle et n'est valable que dans cette boucle. Sans la directive #property strict, il compile sans erreur, mais c'est mauvais. La directive doit être utilisée.

Il est plus facile d'écrire if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) au lieu de if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)). L'étape suivante est une pause - c'est la sortie de la boucle. Mais nous devons traiter les autres commandes. Cependant, dans l'histoire, ce n'est pas nécessaire. L'erreur se produit sur les ordres au marché et les ordres en attente, si au moment du traitement, l'ordre a été fermé et qu'il est manquant. La règle générale est la suivante : if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue ; - continuer à traiter les commandes suivantes

Pour la même raison, remplacez if(OrderProfit()>0) break ; par if(OrderProfit()>0) continue ;

Et voici la raison de l'erreur : if(OrderProfit()<0)i++; - if(OrderProfit()>0 ; - l'indice est incrémenté. Et l'en-tête de boucle for(int i=ordres-1;i>=0;i--) le diminue. Le traitement du même ordre est répété et le programme se retrouve dans une boucle. C'est probablement ce qu'il faut faire :

#property   strict
double ClosProfit()
{
  double summa=0;
  for(int i=OrdersHistoryTotal()-1; i>=0; i--)
  {
    if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0) summa+=OrderProfit();
  }
  return(summa);
}
 
STARIJ:
2 minutes de retard en écrivant ... Considérons cette partie attentivement :

Compilé avec la directive #property strict - c'est la dernière ligne : i" - identifiant non déclaré. Le fait est que la variable est déclarée dans une boucle et n'est valable que dans cette boucle. Sans la directive #property strict, il compile sans erreur, mais c'est mauvais. La directive doit être utilisée.

Il est plus facile d'écrire if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) au lieu de if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)). L'étape suivante est une pause - c'est la sortie de la boucle. Mais nous devons traiter les autres commandes. Cependant, dans l'histoire, ce n'est pas nécessaire. L'erreur se produit sur les ordres au marché et les ordres en attente, si au moment du traitement, l'ordre a été fermé et qu'il est manquant. La règle générale est la suivante : if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue ; - continuer à traiter les commandes suivantes

Pour la même raison if(OrderProfit()>0) break ; remplacer par if(OrderProfit()>0) continue ;

Et voici la raison de l'erreur : if(OrderProfit()<0)i++; - if(OrderProfit()>0 ; l'indice est incrémenté. Et l'en-tête de boucle for(int i=ordres-1;i>=0;i--) le diminue. Le traitement du même ordre est répété et le programme se retrouve dans une boucle. C'est probablement ce qu'il faut faire :


Merci, plus de plantage de metatrader) Regarding

if(OrderProfit()>0) break ; remplacer par if(OrderProfit()>0) continue ;

Je veux que cette fonction ignore ce profit lorsqu'un ordre se ferme sur le profit. Je veux seulement qu'elle inclue le montant de la perte avant que le premier ordre se ferme sur le profit. I.e.

si(OrderProfit()>0) break ;


Je dois arrêter le compteur si l'ordre s'est fermé sur le profit, je le vois correctement ?
 
Lowech:

Merci, plus de plantage metatrader) Ce dont j'ai besoin c'est que si un ordre se ferme sur le bénéfice, la fonction ne prenne pas en compte ce bénéfice, seulement le montant de la perte et jusqu'au premier ordre fermé sur le bénéfice. I.e.
Je dois arrêter le compteur si l'ordre s'est fermé sur le profit, je le vois correctement ?
Votre raisonnement est presque correct. Il n'y a aucune garantie de placement d'une commande dans l'historique. Pour toi, tu peux, mais pour vendre - mauvais.
 
STARIJ:
Votre raisonnement est presque correct. Il n'y a aucune garantie d'un arrangement de l'ordre dans l'histoire. Pour vous-même - oui, mais pour vendre - mauvais.
La boucle basée sur les ordres ne calcule-t-elle pas les ordres dans l'ordre ?
 
STARIJ:

S'il y a une source - DROW_NONE - pas de dessin

Cela n'a pas aidé, les chiffres s'affichent toujours dans le coin.

 
Lowech La boucle de commande ne compte-t-elle pas les commandes dans l'ordre ?

Par ordre d'apparition dans la liste. Mais il n'y a aucune garantie d'ordre dans cette liste.