오류, 버그, 질문 - 페이지 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월이 31이면 월수가 있는건가요 등등?

그럼 올해는?

 
FiftyStars :

일 년과 한 달의 일 수를 구하는 방법은 무엇입니까? 1월이 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 );
     }
  }

대부분의 년은 첫 번째 수표에서 거짓으로 나올 것입니다.

연도가 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 :

정확히는 다르게 했을텐데... 조건이 수렴되면 다음 검사는 더 이상 필요하지 않습니다.

대부분의 년은 첫 번째 수표에서 거짓으로 나올 것입니다.

연도가 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 );
  }
사유: