错误、漏洞、问题 - 页 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:
然而,也有例外......尽管你可以忽略它们 :)

下面是有例外情况的代码,但只适用于我们这个时代。如果该年是闰年,该函数返回真。

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

这里是有例外情况的代码,但只适用于我们的时代。如果该年是闰年,该函数返回真。

正是如此,但我会以不同的方式来做......。所以如果条件为真,就不需要做下一步的检查。

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

大多数年份在第一次检查中都会出现假的情况。

如果年份能被4整除,那么我们就检查它是否能被100整除,剩下的大部分都不能被整除,这将是真的。

如果它是可分的,那么我们检查第三个条件,即年份是否可被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:

正是如此,但我会以不同的方式来做......。因此,如果条件奏效,就没有必要再做检查。

大多数年份在第一次检查时都会显示为虚假。

如果年份能被4整除,那么我们就检查它是否能被100整除,剩下的大部分年份都不能被整除,我们就退出为真。

如果它是可分的,那么我们检查第三个条件,即年份是否可被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);
  }