Errores, fallos, preguntas - página 857

 
G001: Lo siento, no sé qué responder, no sé dónde está el problema, sé que no hace lo que necesito.
Tomemos el camino más sencillo: después de cada línea significativa en esta parte del código, escriba Print() y vea lo que se imprime.
 
//+------------------------------------------------------------------+
//|                                                   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:

Muchas gracias, entendí mis errores.

Perdón por la brusquedad.

 

¿Cómo puedo obtener el número de días de un año y de un mes? ¿Sólo escribiéndolo de antemano? como el número del mes es si es enero entonces es 31, etc.?

¿qué pasa con el año?

 
FiftyStars:

¿Cómo puedo obtener el número de días de un año y de un mes? ¿Sólo escribiéndolo de antemano? como el número del mes es si es enero entonces es 31, etc.?

¿qué pasa con el año?

Si se divide por 4 es alta, el resto son 365.
 
Urain:
Si lo divides entre 4, es alto, el resto es 365.
Sin embargo, hay excepciones... aunque puedes ignorarlas :)
 
Urain:
Si es divisible por 4, alto, el resto 365.

2100 también es divisible por 4, pero sería 365

1900 también...

 
mql5:
Sin embargo, hay excepciones... aunque podemos ignorarlas :)

Aquí está el código con excepciones, pero sólo para nuestra época. La función devuelve true si el año es bisiesto.

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

Aquí está el código con excepciones, pero sólo para nuestra época. La función devuelve true si el año es bisiesto.

Exactamente, pero yo lo habría hecho de otra manera... por lo que si la condición es verdadera, no es necesario hacer la siguiente comprobación.

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 mayoría de los años saldrán como falsos en la primera comprobación,

si el año es divisible por 4, entonces comprobamos si es divisible por 100, la mayoría de los restantes no son divisibles y será cierto,

si es divisible, entonces comprobamos la tercera condición, si el año es divisible por 400.

Por lo tanto, sólo se probará una parte mínima de años para las tres condiciones (lo que es estadísticamente insignificante y no afectará al rendimiento).

La velocidad de dicha función tenderá a la velocidad de un control, mientras que la suya tenderá a la velocidad de dos controles.

Y creo que el número de días es mejor al pasar el dedo:

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, pero yo lo haría de otra manera... Por lo tanto, si la condición funcionó, no hay necesidad de hacer otra comprobación.

La mayoría de los años saldrán en la primera comprobación como falsos,

si el año es divisible por 4, entonces comprobamos si es divisible por 100, la mayoría de los años restantes no son divisibles y salimos como verdadero,

si es divisible, entonces comprobamos la tercera condición, si el año es divisible por 400.

Por lo tanto, sólo se probará una parte mínima de años para las tres condiciones (lo que es estadísticamente insignificante y no afectará al rendimiento).

El rendimiento de dicha función tenderá a la velocidad de una comprobación, mientras que la suya tenderá a la velocidad de dos comprobaciones.

Me he decidido por

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