Erros, bugs, perguntas - página 857

 
G001: Desculpe, não sei o que responder, não sei onde está o problema, sei que não faz o que eu preciso.
Vamos tomar o caminho mais simples: após cada linha significativa nesta parte do código, escreva Print() e veja o que é impresso.
 
//+------------------------------------------------------------------+
//|                                                   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:

Muito obrigado, compreendi os meus erros.

Desculpem a aspereza.

 

como obter o número de dias num ano e num mês? só por pré-escrita? como o número do mês é se for Janeiro, então é 31, etc.?

e sobre o ano?

 
FiftyStars:

como obter o número de dias num ano e num mês? só por pré-escrita? como o número do mês é se for Janeiro, então é 31, etc.?

e sobre o ano?

Se dividido por 4 é elevado, os restantes são 365.
 
Urain:
Se o dividir por 4, é elevado, o resto é 365.
No entanto, há excepções... embora as possa ignorar :)
 
Urain:
Se divisível por 4, alto, o resto 365.

2100 também é divisível por 4, mas é 365

1900 também...

 
mql5:
Contudo, há excepções... embora as possamos ignorar :)

Aqui está o código com excepções, mas apenas para a nossa era. A função retorna verdadeiro se o ano for um ano bissexto.

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

Aqui está o código com excepções, mas apenas para a nossa era. A função retorna verdadeiro se o ano for um ano bissexto.

Exactamente, mas eu tê-lo-ia feito de forma diferente. portanto, se a condição for verdadeira, não há necessidade de fazer a próxima verificação.

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

A maior parte dos anos serão revelados como falsos na primeira verificação,

se o ano for divisível por 4, então verificamos se é divisível por 100, a maioria dos restantes não são divisíveis e serão falsos,

se for divisível, então verificamos a terceira condição, se o ano é divisível por 400.

Assim, apenas uma parte mínima de anos será testada para as três condições (o que é estatisticamente insignificante e não irá afectar o desempenho).

A velocidade de tal função tenderá para a velocidade de uma verificação, enquanto que a velocidade de duas verificações é a mesma.

E eu penso que o número de dias é melhor por deslizar:

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:

Exactamente, mas fá-lo-ia de forma diferente... Portanto, se a condição funcionou, não há necessidade de fazer outra verificação.

A maior parte dos anos sairá no primeiro cheque como falso,

se o ano é divisível por 4, então verificamos se é divisível por 100, a maioria dos anos restantes não são divisíveis e saímos como verdadeiros,

se for divisível, então verificamos a terceira condição, se o ano é divisível por 400.

Assim, apenas uma parte mínima de anos será testada para as três condições (o que é estatisticamente insignificante e não irá afectar o desempenho).

O desempenho de tal função tenderá à velocidade de uma verificação, enquanto que a sua tenderá à velocidade de duas verificações.

Estabeleci-me em

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