Erreurs, bugs, questions - page 857

 
G001: Désolé, je ne sais pas quoi répondre, je ne sais pas où est le problème, je sais qu'il ne fait pas ce dont j'ai besoin.
Prenons la méthode la plus simple : après chaque ligne significative dans cette partie du code, écrivez Print() et voyez ce qui est imprimé.
 
//+------------------------------------------------------------------+
//|                                                   CalcMartin.mq5 |
//|                                                        avoitenko |
//|                        https://www.mql5.com/en/users/avoitenko |
//+------------------------------------------------------------------+
#property copyright "avoitenko"
#property link      "https://www.mql5.com/en/users/avoitenko"
#property version   "1.00"
#property script_show_inputs

input bool Martingale=true;
input uint MaxLossTrade=5;
input double StartLot=0.1;
input double LotMultiply=2;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double ResultLot=StartLot;
//----- Martingale
   if(Martingale)
     {

      HistorySelect(0,TimeCurrent());
      int Total=HistoryDealsTotal();
      int Losses=0;  // Number of losses orders without a break

      for(int i=Total-1;i>=0;i--)
        {
         ulong Ticket=HistoryDealGetTicket(i);

         if((HistoryDealGetInteger(Ticket,DEAL_TYPE)==DEAL_TYPE_BUY || HistoryDealGetInteger(Ticket,DEAL_TYPE)==DEAL_TYPE_SELL) && 
            (HistoryDealGetInteger(Ticket,DEAL_ENTRY)==DEAL_ENTRY_INOUT || HistoryDealGetInteger(Ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT))
           {
            double profit=HistoryDealGetDouble(Ticket,DEAL_PROFIT)+HistoryDealGetDouble(Ticket,DEAL_SWAP);

            if(profit>=0) break;
            Losses++;
           }
         if(Losses<=MaxLossTrade)ResultLot=(StartLot*MathPow(LotMultiply,Losses));
         else {ResultLot=StartLot;break;}
        }
     }
//-----
   Print("Result Lot = ",ResultLot);
  }
//+------------------------------------------------------------------+
 
avoitenko:

Merci beaucoup, j'ai compris mes erreurs.

Désolé pour la franchise.

 

comment puis-je obtenir le nombre de jours dans une année et dans un mois ? juste en le pré-écrivant ? comme le numéro du mois est si c'est janvier alors c'est 31, etc ?

Et l'année ?

 
FiftyStars:

comment puis-je obtenir le nombre de jours dans une année et dans un mois ? juste en le pré-écrivant ? comme le numéro du mois est si c'est janvier alors c'est 31, etc ?

Et l'année ?

Si elle est divisée par 4, elle est élevée, les autres sont 365.
 
Urain:
Si tu le divises par 4, c'est élevé, le reste est 365.
Cependant, il y a des exceptions... bien que vous puissiez les ignorer :)
 
Urain:
Si divisible par 4, haut, le reste 365.

2100 est aussi divisible par 4, mais c'est 365.

1900 aussi...

 
mql5:
Cependant, il y a des exceptions... bien que vous puissiez les ignorer :)

Voici le code avec des exceptions, mais seulement pour notre époque. La fonction renvoie vrai si l'année est une année bissextile.

bool IsLeapYear(int year)
  {
   return(MathMod(year,4)==0 && (MathMod(year,100)!=0 || MathMod(year,400)==0));
  } 
 
avoitenko:

Voici le code avec des exceptions, mais seulement pour notre époque. La fonction renvoie vrai si l'année est une année bissextile.

Exactement, mais je l'aurais fait différemment... donc si la condition est vraie, il n'y a pas besoin de faire la vérification suivante.

bool IsLeapYear(int year)
  {
   if(year%4!=0)return(false);
   else
     {
      if(year%100==0)
        {
         if(year%400==0)return(true);
         else return(false);
        }
      else return(true);
     }
  }

La plupart des années seront considérées comme fausses lors de la première vérification,

si l'année est divisible par 4, alors nous vérifions si elle est divisible par 100, la plupart de celles qui restent ne sont pas divisibles et ce sera vrai,

si elle est divisible, nous vérifions alors la troisième condition, à savoir si l'année est divisible par 400.

Ainsi, seule une partie minimale des années sera testée pour les trois conditions (ce qui est statistiquement insignifiant et n'affectera pas les performances).

La vitesse d'une telle fonction tendra vers la vitesse d'un contrôle, alors que vous avez la vitesse de deux contrôles.

Et je pense que le nombre de jours est meilleur en glissant :

int CountDayforMonth(int month,bool leapyear=false)// количество дней в месяце
  {
   switch(month)
     {
      case  1: return(31);
      case  2: if(leapyear)return(29);else return(28);
      case  3: return(31);
      case  4: return(30);
      case  5: return(31);
      case  6: return(30);
      case  7: return(31);
      case  8: return(31);
      case  9: return(30);
      case  10: return(31);
      case  11: return(30);
      case  12: return(31);      
      default:return(0);
     }
  }
 
Urain:

Exactement, mais je le ferais différemment... Donc, si la condition a fonctionné, il n'est pas nécessaire de faire un autre contrôle.

La plupart des années seront considérées comme fausses lors du premier contrôle,

si l'année est divisible par 4, alors nous vérifions si elle est divisible par 100, la plupart des années restantes ne sont pas divisibles et nous sortons comme vrai,

si elle est divisible, nous vérifions alors la troisième condition, à savoir si l'année est divisible par 400.

Ainsi, seule une partie minimale des années sera testée pour les trois conditions (ce qui est statistiquement insignifiant et n'affectera pas les performances).

L'exécution d'une telle fonction tendra vers la vitesse d'un contrôle, tandis que la vôtre tendra vers la vitesse de deux contrôles.

J'ai choisi

int GetDaysInYear(int Year) export
  {
   bool Leap=false;
   if(Year%4==0)
     {
      if(Year%100==0)
        {
         if(Year%400==0)
            Leap=true;
        }
      else Leap=true;
     }
   if(Leap)
      return(366);
   else
      return(365);
  }
Raison: