Hatalar, hatalar, sorular - sayfa 857

 
G001 : Üzgünüm, ne diyeceğimi bilmiyorum, sorunun nerede olduğunu bilmiyorum, ihtiyacım olanı yapmadığını biliyorum.
En basit yoldan gidelim: Kodun bu bölümündeki her önemli satırdan sonra Print () yazın ve neyin yazdırıldığını görün.
 
//+------------------------------------------------------------------+
//|                                                   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 :

Çok teşekkür ederim, hatalarımı anladım.

aptallık için özür dilerim.

 

bir yıl ve bir aydaki gün sayısı nasıl bulunur? Ocak 31 ise ay sayısı gibi mi?

peki ya yıl?

 
FiftyStars :

bir yıl ve bir aydaki gün sayısı nasıl bulunur? Ocak 31 ise ay sayısı gibi mi?

peki ya yıl?

4'e tam bölünüyorsa yüksektir, geri kalanı 365'tir.
 
Urain :
4'e tam bölünüyorsa yüksek, geri kalanı 365'tir.
Ancak, istisnalar vardır, .. dikkate alınamasalar da :)
 
Urain :
4'e tam bölünüyorsa yüksek, geri kalanı 365'tir.

2100 de 4'e bölünür ama 365 olur

1900 de...

 
mql5 :
Ancak, istisnalar vardır, .. dikkate alınamasalar da :)

İşte istisnalar dışında kod, ancak yalnızca çağımız için. Yıl artık yıl ise işlev true değerini döndürür.

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

İşte istisnalar dışında kod, ancak yalnızca çağımız için. Yıl artık yıl ise işlev true değerini döndürür.

Kesinlikle, ama bunu farklı şekilde yapardım ... yani koşul birleşirse, bir sonraki kontrol artık gerekli değildir.

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

Çoğu yıl ilk çekte yanlış çıkacak,

yıl 4'e tam bölünüyorsa 100'e tam bölünüp bölünmediğini kontrol ederiz, kalanların çoğu tam bölünemez ve true olarak çıkar,

bölünebilirse, yılın 400'e bölünüp bölünemeyeceğini, üçüncü koşulu kontrol ederiz.

Bu nedenle, üç koşulun tümü için yılların yalnızca küçük bir kısmı kontrol edilecektir (ki bu istatistiksel olarak önemsizdir ve performansı etkilemeyecektir).

Böyle bir işlevin performansı, iki kontrolün hızına sahipken, bir kontrolün hızına eğilim gösterecektir.

PS ve değiştirmenin daha iyi olduğunu düşündüğüm gün sayısı:

 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 :

Kesinlikle, ama bunu farklı şekilde yapardım ... yani koşul birleşirse, bir sonraki kontrol artık gerekli değildir.

Çoğu yıl ilk çekte yanlış çıkacak,

yıl 4'e tam bölünüyorsa 100'e tam bölünüp bölünmediğini kontrol ederiz, kalanların çoğu tam bölünemez ve true olarak çıkar,

bölünebilirse, yılın 400'e bölünüp bölünemeyeceğini, üçüncü koşulu kontrol ederiz.

Bu nedenle, üç koşulun tümü için yılların yalnızca küçük bir kısmı kontrol edilecektir (ki bu istatistiksel olarak önemsizdir ve performansı etkilemeyecektir).

Böyle bir işlevin performansı, iki kontrolün hızına sahipken, bir kontrolün hızına eğilim gösterecektir.

durdum

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