Scripts: Panneau de calcul du bénéfice historique

 

Panneau de calcul du bénéfice historique:

Ce script CalculateHistoryProfit version 1.0 est conçu pour calculer les bénéfices d'une période donnée à l'aide d'un panneau graphique.

Panneau de calcul du bénéfice historique

Author: Sergey Porphiryev

 
    //+------------------------------------------------------------------+
    //| Calculer le bénéfice total et le nombre d'opérations pour la période sélectionnée.
    //+------------------------------------------------------------------+
    void CalculateProfit()
    {
       total_profit = 0;
       total_deals = 0;
      
       HistorySelect(0, TimeCurrent());
       int total_orders = HistoryDealsTotal();
  
       for (int i = total_orders - 1; i >= 0; i--)
       {
           ulong deal_ticket = HistoryDealGetTicket(i);
           datetime deal_time = (datetime)HistoryDealGetInteger(deal_ticket, DEAL_TIME); // Pourquoi cette ligne n'est-elle pas plus basse que la suivante ?
           if (HistoryDealGetInteger(deal_ticket, DEAL_ENTRY) != 1) continue; // Qu'en est-il des transactions CloseBy et IN-commission ?
  
           if (deal_time >= start_date && deal_time <= end_date) // Pourquoi pas HistorySelect ?
           {
               string deal_symbol = HistoryDealGetString(deal_ticket, DEAL_SYMBOL);
               int deal_magic = (int)HistoryDealGetInteger(deal_ticket, DEAL_MAGIC);
               int deal_type = (int)HistoryDealGetInteger(deal_ticket, DEAL_TYPE);
              
               // Filtrage par type de transaction (achat ou vente)
               bool type_filter = (deal_type == 0 || deal_type == 1);
  
               // Filtrage des caractères
               bool symbol_filter = (StringFind(current_symbols, "ALL") != -1) || (StringFind(current_symbols, deal_symbol) != -1); // Il est coûteux de vérifier la première condition à chaque fois dans la boucle.
  
               // Filtrage par Magiks
               bool magic_filter_all = (StringFind(current_magics, "ALL") != -1); // Il est coûteux de vérifier à chaque fois dans une boucle.
              
               // Diviser la chaîne avec les mages en un tableau
               string magic_values[];
               int count = StringSplit(current_magics, ',', magic_values); // Ce point aurait également dû être retiré de la boucle.
  
               // Vérifier la présence de "Empty" et de magick 0
               bool magic_filter_empty = false;
               for (int j = 0; j < count; j++) // Cher cycle.
               {
                   if (magic_values[j] == "Empty" && deal_magic == 0) // Il est moins coûteux de vérifier d'abord la deuxième condition.
                   {
                       magic_filter_empty = true;
                       break;
                   }
               }
  
               // Vérifier la présence d'un magik spécifique
               bool magic_filter_exact = false;
               for (int j = 0; j < count; j++)
               {
                   if (IntegerToString(deal_magic) == magic_values[j]) // Pourquoi comparer des variables de type chaîne de caractères entre elles ?
                   {
                       magic_filter_exact = true;
                       break;
                   }
               }

Quelques commentaires sur le code.

 
fxsaber #:

Quelques commentaires sur le code.

OOO !!! Merci beaucoup pour vos précieuses notes !!!! Ce sera quelque chose à faire ce week-end ;))))))

 
Beau travail. Merci pour votre partage.