Ошибки, баги, вопросы - страница 857

 
G001: Извините, не знаю что ответить, не знаю где проблема, знаю что не делает то что мне надо. 
 Давайте пойдём самым простым путём: после каждой значимой строчки в этой части кода пропишем Print() и посмотрим, что выводится на печать.
 
//+------------------------------------------------------------------+
//|                                                   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:

Огромное спасибо, понял мои ошибки.

Извините за тупость. 

 

как получить количество дней в году и в месяце? только предописанием этого?типа номер месяца есть если январь то 31 и т.д.?

а как тогда быть с годом? 

 
FiftyStars:

как получить количество дней в году и в месяце? только предописанием этого?типа номер месяца есть если январь то 31 и т.д.?

а как тогда быть с годом? 

Если делится на 4 то высокосный, остальные 365.
 
Urain:
Если делится на 4 то высокосный, остальные 365.
Однако есть исключения,.. хотя их можно и не брать в расчёт :)
 
Urain:
Если делится на 4 то высокосный, остальные 365.

2100 тоже делится на 4, но будеть 365

1900 тоже... 

 
mql5:
Однако есть исключения,.. хотя их можно и не брать в расчёт :)

Вот код с учетом исключений, но только для нашей эры. Функция возворащает true если год високосный.

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

Вот код с учетом исключений, но только для нашей эры. Функция возворащает true если год високосный.

Именно, но я бы сделал по другому... так если условие сошлось то следующую проверку уже делать не нужно.

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

Большая часть годов выйдет по первой проверке как false,

если же год делится на 4, то проверяем делится ли он на 100, большая часть из оставшихся не делится и выходим по true,

если же делится то проверяем третье условие, делится ли год на 400.

Таким образом лишь минимальная часть годов будет проверятся по всем трём условиям (что статистически незначительно и не повлияет на быстродействие).

Быстродействие такой функции будет стремится к скорости одной проверки, тогда как у вас к скорости двух проверок.

ЗЫ а количество дней думаю лучше свичём:

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:

Именно, но я бы сделал по другому... так если условие сошлось то следующую проверку уже делать не нужно.

Большая часть годов выйдет по первой проверке как false,

если же год делится на 4, то проверяем делится ли он на 100, большая часть из оставшихся не делится и выходим по true,

если же делится то проверяем третье условие, делится ли год на 400.

Таким образом лишь минимальная часть годов будет проверятся по всем трём условиям (что статистически незначительно и не повлияет на быстродействие).

Быстродействие такой функции будет стремится к скорости одной проверки, тогда как у вас к скорости двух проверок.

я  остановился на 

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);
  }
Причина обращения: