Calcul du profit d'un ordre fermé "HELP - page 9

 
Natashe4ka:

Je pensais aussi qu'il comptait correctement.
Je n'aurais pas dû mettre cette information dans le code et ma vie aurait été plus facile)).

Et maintenant je me demande comment la fonction n'a pas fonctionné correctement pendant tout ce temps ! !!

Je vois, je dois enlever la vérification du profit = positif, à cause de cela le compte s'arrête plus tard, j'ai juste dû prendre en compte ma perte précédente aussi.

double lastloss()
{
double lastlos=0.0,lastlot=0.0,op=0.0;
int cnt=0;
datetime time=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2)
         {
            if(cnt==0 && OrderCloseTime()!=0) time=OrderCloseTime();
            if(OrderCloseTime()+PeriodSeconds()<time/* && op>0.0*/) break;
            op=OrderProfit()+OrderSwap()+OrderCommission();
            lastlos+=op;
            cnt++;
         }
      }
}
return(lastlos);
}
 
Natashe4ka:

Il m'a semblé aussi que tout compte comme il faut.
Je n'aurais pas dû mettre cette info dans le code et la vie aurait été plus simple))

Et maintenant, on se demande comment la fonction n'a pas fonctionné correctement pendant tout ce temps ! !!

Vous utilisez la fonction des premières pages de votre livre pour débutants pour fermer. Dans le testeur, il clôturera presque normalement, mais dans une transaction réelle, le robot clôturera souvent dans le rouge, surtout s'il prend un petit profit.

Avez-vous déjà essayé de négocier sur le marché réel ou seulement dans le testeur ?

Avez-vous déjà vu une telle situation, lorsqu'une série de positions sont fermées ? Notez la différence en pips entre le signal de fermeture et la fermeture de la dernière position.

Pour ne pas faire de spam, je ne joindrai que 3 captures d'écran, bien qu'en réalité il y en ait plus d'une centaine disponibles :


Toutes les fonctions fonctionnent correctement pour tout le monde, mais vous êtes le seul à ne pas fonctionner correctement. Vous vous êtes déjà demandé pourquoi ?

Et enfin, la question que vous devez vous poser, à laquelle nous n'avons pas besoin de réponse : allez-vous redémarrer le terminal à tout moment, ou le fermer pour le week-end, ... ? Si c'est le cas, comment obtiendrez-vous le bénéfice au prochain lancement du terminal pour continuer le travail du Conseiller Expert qui a été fait à la dernière fermeture de la série, si vous ne voulez pas le sauvegarder quelque part ?

 

Il y a plus :

Pourquoi ai-je demandé ce que fait la suppression d'un ordre entre les positions de clôture ?


Nous nous trouvons maintenant dans une situation où un EA commence à fermer des positions lorsqu'il atteint un profit, puis il reçoit un ordre qui n'est d'aucune utilité, c'est-à-dire qu'il ne fait ni profit ni perte, mais un ordre pour supprimer cet ordre est envoyé et pendant qu'il est supprimé, le prix part et l'EA continue à fermer d'autres positions. Le résultat est le suivant : nous avons commencé à clôturer le bénéfice mais comme nous avons tout clôturé de travers, nous avons fini par clôturer la série avec une perte. Est-ce normal ? N'écrivez pas de codes uniquement pour le testeur, écrivez un code au moins pour travailler sur un compte de démonstration.

 
Vitalie Postolache:

J'ai compris, je dois enlever la vérification de profit = positif, cela fait que le compte s'arrête plus tard, j'avais juste besoin de prendre en compte ma perte précédente aussi.

double lastloss()
{
double lastlos=0.0,lastlot=0.0,op=0.0;
int cnt=0;
datetime time=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2)
         {
            if(cnt==0 && OrderCloseTime()!=0) time=OrderCloseTime();
            if(OrderCloseTime()+PeriodSeconds()<time/* && op>0.0*/) break;
            op=OrderProfit()+OrderSwap()+OrderCommission();
            lastlos+=op;
            cnt++;
         }
      }
}
return(lastlos);
}

Il fonctionne, compte comme il se doit, génial, génial ! !!
Merci - merci - merci ! !!!!!!!!!!!)))))))))))))

Vous avez bien fait))

 
Vitaly Muzichenko:

Il y a plus :

Pourquoi ai-je demandé ce que fait la suppression d'un ordre entre les positions de clôture ?


Nous nous trouvons maintenant dans une situation où un EA commence à fermer des positions lorsqu'il atteint un profit, puis il reçoit un ordre qui n'est d'aucune utilité, c'est-à-dire qu'il ne fait ni profit ni perte, mais un ordre pour supprimer cet ordre est envoyé et pendant qu'il est supprimé, le prix part et l'EA continue à fermer d'autres positions. Le résultat est le suivant : nous avons commencé à clôturer le bénéfice mais comme nous avons tout clôturé de travers, nous avons fini par clôturer la série avec une perte. Est-ce normal ? N'écrivez pas de codes uniquement pour le testeur, écrivez un code au moins pour travailler sur un compte de démonstration.

Oui, ils ne ferment pas dans l'ordre, cela arrive si le cycle de fermeture commence à zéro.
 
Vitalie Postolache:
Ils ne se ferment pas dans n'importe quel ordre, cela arrive si le cycle de fermeture commence à zéro.

De quel zéro ?

Pourquoi perdre du temps à supprimer des commandes au moment de la fermeture de la grille ? Vous savez vous-même que la suppression d'un ordre prend du temps, alors pourquoi perdre du temps ? Et si votre société de courtage n'est pas rapide, nous sommes fichus. J'ai montré une capture d'écran avec 15 positions fermées en 1 minute et 34 secondes et nous devons réaliser que le prix peut passer par plus d'une douzaine de points pendant ce temps et nous aurons de la chance s'il va dans notre direction et non contre nous.

 
Vitaly Muzichenko:

De quel zéro ?

Pourquoi perdre du temps à supprimer des commandes au moment de la fermeture de la grille ? Vous savez vous-même que la suppression d'un ordre prend du temps, alors pourquoi perdre du temps ? Et si votre société de courtage n'est pas rapide, nous sommes fichus. J'ai déjà posté une capture d'écran où 15 positions ont été fermées en 1min.34s, et nous devons comprendre que le prix peut passer par plus d'une douzaine de points pendant ce temps et nous aurons de la chance s'il va dans notre direction et non contre nous.

A partir de ce point zéro for(int i=0;i<OrdersHistoryTotal();i++) - De cette façon, les ordres seront fermés un par un, dans le meilleur des cas s'ils sont sélectionnés par numéro ordinal.

Oui, je sais, un ordre en attente ne doit pas être supprimé au milieu du processus de clôture d'une série, et il serait préférable de les clôturer dans l'ordre, mais cela vient avec l'expérience.