Fehler, Irrtümer, Fragen - Seite 857

 
G001: Tut mir leid, ich weiß nicht, was ich antworten soll, ich weiß nicht, wo das Problem liegt, ich weiß, dass es nicht das tut, was ich brauche.
Nehmen wir den einfachsten Weg: schreiben Sie nach jeder sinnvollen Zeile in diesem Teil des Codes Print() und sehen Sie, was gedruckt wird.
 
//+------------------------------------------------------------------+
//|                                                   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:

Vielen Dank, ich habe meine Fehler verstanden.

Entschuldigen Sie die Unverblümtheit.

 

Wie ermittle ich die Anzahl der Tage in einem Jahr und in einem Monat? indem ich sie einfach vorschreibe? z. B. die Monatszahl ist, wenn es Januar ist, dann ist es 31, usw.?

Was ist mit dem Jahr?

 
FiftyStars:

Wie ermittle ich die Anzahl der Tage in einem Jahr und in einem Monat? indem ich sie einfach vorschreibe? z. B. die Monatszahl ist, wenn es Januar ist, dann ist es 31, usw.?

Was ist mit dem Jahr?

Wenn sie durch 4 geteilt wird, ist sie hoch, die übrigen sind 365.
 
Urain:
Wenn man es durch 4 teilt, ist es hoch, der Rest ist 365.
Es gibt jedoch Ausnahmen... die man allerdings ignorieren kann :)
 
Urain:
Wenn durch 4 teilbar, hoch, der Rest 365.

2100 ist auch durch 4 teilbar, aber es ist 365

1900 zu...

 
mql5:
Es gibt jedoch Ausnahmen... aber die können wir ignorieren :)

Hier ist der Code mit Ausnahmen, aber nur für unsere Zeit. Die Funktion gibt true zurück, wenn das Jahr ein Schaltjahr ist.

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

Hier ist der Code mit Ausnahmen, aber nur für unsere Zeit. Die Funktion gibt true zurück, wenn das Jahr ein Schaltjahr ist.

Genau, aber ich hätte es anders gemacht... Wenn die Bedingung also erfüllt ist, muss die nächste Prüfung nicht durchgeführt werden.

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

Die meisten Jahre werden sich bei der ersten Überprüfung als falsch herausstellen,

Wenn die Jahreszahl durch 4 teilbar ist, prüfen wir, ob sie durch 100 teilbar ist. Die meisten der verbleibenden Jahreszahlen sind nicht teilbar und es wird wahr sein,

Wenn es teilbar ist, wird als dritte Bedingung geprüft, ob das Jahr durch 400 teilbar ist.

Daher wird nur ein minimaler Teil der Jahre für alle drei Bedingungen getestet (was statistisch unbedeutend ist und die Leistung nicht beeinflusst).

Die Geschwindigkeit einer solchen Funktion entspricht eher der Geschwindigkeit einer Prüfung, während Sie die Geschwindigkeit von zwei Prüfungen haben.

Und ich denke, dass die Anzahl der Tage durch Streichen besser ist:

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:

Genau, aber ich würde es anders machen... Wenn also die Bedingung erfüllt ist, ist eine weitere Prüfung nicht erforderlich.

Die meisten Jahre werden sich bei der ersten Überprüfung als falsch herausstellen,

Wenn das Jahr durch 4 teilbar ist, wird geprüft, ob es durch 100 teilbar ist. Die meisten der verbleibenden Jahre sind nicht teilbar und werden als wahr beendet,

Wenn es teilbar ist, wird als dritte Bedingung geprüft, ob das Jahr durch 400 teilbar ist.

Daher wird nur ein minimaler Teil der Jahre für alle drei Bedingungen getestet (was statistisch unbedeutend ist und die Leistung nicht beeinflusst).

Die Leistung einer solchen Funktion tendiert zur Geschwindigkeit einer Prüfung, während Ihre zur Geschwindigkeit von zwei Prüfungen tendiert.

Ich habe mich entschieden für

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