Errori, bug, domande - pagina 857

 
G001: Scusa, non so cosa rispondere, non so dove sia il problema, so che non fa quello di cui ho bisogno.
Prendiamo il modo più semplice: dopo ogni linea significativa in questa parte del codice, scrivete Print() e vedete cosa viene stampato.
 
//+------------------------------------------------------------------+
//|                                                   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:

Grazie mille, ho capito i miei errori.

Scusate la franchezza.

 

Come posso ottenere il numero di giorni in un anno e in un mese? Semplicemente pre-scrivendo? Come il numero del mese è se è gennaio allora è 31, ecc.

e l'anno?

 
FiftyStars:

Come posso ottenere il numero di giorni in un anno e in un mese? Semplicemente pre-scrivendo? Come il numero del mese è se è gennaio allora è 31, ecc.

e l'anno?

Se diviso per 4 è alto, il resto è 365.
 
Urain:
Se lo dividi per 4, è alto, il resto è 365.
Tuttavia, ci sono delle eccezioni... anche se puoi ignorarle :)
 
Urain:
Se divisibile per 4, alto, il resto 365.

2100 è anche divisibile per 4, ma è 365

Anche il 1900...

 
mql5:
Tuttavia, ci sono delle eccezioni... anche se puoi ignorarle :)

Ecco il codice con le eccezioni, ma solo per la nostra epoca. La funzione restituisce vero se l'anno è un anno bisestile.

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

Ecco il codice con le eccezioni, ma solo per la nostra epoca. La funzione restituisce vero se l'anno è un anno bisestile.

Esattamente, ma io l'avrei fatto diversamente... quindi se la condizione è vera, non c'è bisogno di fare il controllo successivo.

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 maggior parte degli anni risulterà falsa al primo controllo,

se l'anno è divisibile per 4, allora controlliamo se è divisibile per 100, la maggior parte dei rimanenti non sono divisibili e sarà vero,

se è divisibile, allora controlliamo la terza condizione, se l'anno è divisibile per 400.

Così solo una parte minima di anni sarà testata per tutte e tre le condizioni (che è statisticamente insignificante e non influenzerà le prestazioni).

La velocità di una tale funzione tenderà alla velocità di un controllo, mentre voi avete la velocità di due controlli.

E penso che il numero di giorni sia migliore con lo swiping:

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:

Esattamente, ma io lo farei in modo diverso... Quindi, se la condizione ha funzionato, non c'è bisogno di fare un altro controllo.

La maggior parte degli anni uscirà al primo controllo come falsa,

se l'anno è divisibile per 4, allora controlliamo se è divisibile per 100, la maggior parte degli anni rimanenti non sono divisibili e usciamo come vero,

se è divisibile, allora controlliamo la terza condizione, se l'anno è divisibile per 400.

Così solo una parte minima di anni sarà testata per tutte e tre le condizioni (che è statisticamente insignificante e non influenzerà le prestazioni).

Il rendimento di una tale funzione tenderà alla velocità di un controllo, mentre il vostro tenderà alla velocità di due controlli.

Mi sono stabilito su

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);
  }