エラー、バグ、質問 - ページ 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:

私の間違いを理解していただき、ありがとうございました。

ぶっきらぼうで申し訳ありません。

 

1年と1ヶ月の日数を求めるにはどうしたらいいのでしょうか? 月番は1月なら31日など、あらかじめ書いておくのでしょうか?

年は?

 
FiftyStars:

1年と1ヶ月の日数を求めるにはどうしたらいいのでしょうか? 月番は1月なら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で割り切れるかどうかを調べると、残りのほとんどは割り切れないので、偽になります。

で割り切れるなら、3番目の条件として、年が400で割り切れるかどうかをチェックします。

したがって、3つの条件すべてにおいて、最小限の年数の部分しかテストされない(これは統計的に重要ではなく、性能に影響を与えない)。

このような機能のスピードは、2回分のチェックのスピードを持っているのに対して、1回分のチェックのスピードに傾くことになります。

あと、日数はスワイプの方がいいと思います。

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:

その通りですが、私なら違う方法で...。ですから、その条件がうまくいったのであれば、改めてチェックをする必要はないのです。

ほとんどの年は1回目のチェックで偽と出ます。

年が4で割り切れるなら、100で割り切れるかどうかを調べ、残りの年のほとんどは割り切れないので、trueとして終了します。

で割り切れるなら、3番目の条件として、年が400で割り切れるかどうかをチェックします。

したがって、3つの条件すべてにおいて、最小限の年数の部分しかテストされない(これは統計的に重要ではなく、性能に影響を与えない)。

このような機能の性能は、1回のチェックの速さに傾き、あなたの場合は2回のチェックの速さに傾くでしょう。

に落ち着きました。

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