Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4 - sayfa 250

 

Hızlıca kontrol etmek basitse, şöyle bir şey:

   double profit = 0 ;
   int cnt=LockTicket, i , ototal = OrdersHistoryTotal();

   for (i = ototal- 1 ; i >= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol() == Symbol () && OrderCloseTime() > 0 )
           {
             if (OrderType() == OP_BUY || OrderType() == OP_SELL)
              {
               if (OrderMagicNumber() == Magic )
                 {
                  profit += OrderProfit()+OrderCommission()+OrderSwap();
                   if (profit>max)
                    { 
                    cnt=OrdersTicket();
                     break ;
                    }                  
                 }
              }
           }
        }
     }

Kural olarak, siparişler zamanında birbirini takip eder, ancak bu garanti edilmez. Bu nedenle, iyi bir şekilde, kronolojinin kontrol edilmesi gerekiyor. Ama deneyler için yapacak.

 
Aleksei Stepanenko # :

Hızlıca kontrol etmek basitse, şöyle bir şey:

Kural olarak, siparişler zamanında birbirini takip eder, ancak bu garanti edilmez. Bu nedenle, iyi bir şekilde, kronolojinin kontrol edilmesi gerekiyor. Ama deneyler için yapacak.

Katılıyorum, süre garanti değil, bu yüzden tüm kapalı siparişleri bileti artırma yönünde gözden geçirmek istiyorum. Siparişin biletini biliyorum ve ondan saymaya çalışıyorum ama bir şeyler ters gitti) Nasıl doğru olacak?

 
Aleksei Stepanenko # :

Hızlıca kontrol etmek basitse, şöyle bir şey:

Kural olarak, siparişler zamanında birbirini takip eder, ancak bu garanti edilmez. Bu nedenle, iyi bir şekilde, kronolojinin kontrol edilmesi gerekiyor. Ama deneyler için yapacak.

Tarihte, emirleri küçükten büyüğe sıralamak daha doğrudur, yeniden hesaplama anında kapanacak olanları hesaba katmak için, açık ve kapalı hesaba katmak için bu piyasa emirlerini büyükten küçüğe doğru sayarız. aynı tik üzerinde olanlar. Bence de)

Alexey Stepanenko # :

Hızlıca kontrol etmek basitse, şöyle bir şey:

Kural olarak, siparişler zamanında birbirini takip eder, ancak bu garanti edilmez. Bu nedenle, iyi bir şekilde, kronolojinin kontrol edilmesi gerekiyor. Ama deneyler için yapacak.

Ve ne, Alexey'nin kodu da doğru sayılmıyor mu?

 
Valeriy Yastremskiy # :

Tarihte, emirleri küçükten büyüğe sıralamak daha doğrudur, yeniden hesaplama anında kapanacak olanları hesaba katmak için, açık ve kapalı hesaba katmak için bu piyasa emirlerini büyükten küçüğe doğru sayarız. aynı tik üzerinde olanlar. Bence de)

Ve ne, Alexey'in kodu da doğru sayılmıyor mu?

Denemedim. Şimdi deneyeceğim. Onu yazacağım.

 
Aleksei Stepanenko # :

Hızlıca kontrol etmek basitse, şöyle bir şey:

Kural olarak, siparişler zamanında birbirini takip eder, ancak bu garanti edilmez. Bu nedenle, iyi bir şekilde, kronolojinin kontrol edilmesi gerekiyor. Ama deneyler için yapacak.

Kontrol ettim, bir çok şeyi derlerken yemin ederim, aşağıdakiler dışında her şeyi düzelttim:

 if (profit>max)

Bu satır, tam olarak anlamıyorum. Açıklayabilir misin?

 
makssub # :
Fikir, belirli bir kar setinden sonra bileti değiştirmektir.

max - bu, biletin değiştiği kar limitidir. Değerini sen ayarla.

 
Aleksei Stepanenko # :

max - bu, biletin değiştiği kar limitidir. Değerini sen ayarla.

Doğru anladıysam görev farklı. 1, 2 ve 3 siparişler açılır. Açılış fiyatlarının nasıl oluştuğunu bilmiyorum. 3. sipariş kapatılır, toplam kâr 3. siparişin kârına eşittir. 3. siparişten önce açılan siparişin biletini hesaplamanız gerekir. Daha sonra 2. sipariş kapatılır 2. siparişten önce açılan siparişin biletini bulmanız gerekir. Bu 1. sipariştir. Toplam kâr 2 ve 3 siparişin kârına eşittir.

Bunun neden böyle olduğunu anlamıyorum, ama mantık bu gibi görünüyor.)

 
Valery, bu iki cümlenin mantığını tam olarak anlamadım.
 
Aleksei Stepanenko # :
Valery, bu iki cümlenin mantığını tam olarak anlamadım.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4

makssub , 2021.09.01 16:38

 int FindTicket()
   {
   int oldticket;
   int tick= 0 ;
   ticket= 0 ;
   
   
   for ( int cnt = OrdersTotal ()- 1 ; cnt>= 0 ; cnt--)
      {
       if ( OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES))
         {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
            {
            oldticket = OrderTicket();
             if (oldticket > ticket)
               {
               ticket = oldticket;
               tick = OrderTicket();
               }
            }
         }
      }
   return (tick); 
   }              
int TickF = FindTicket();
 int CalculateProfitHistory() 
{
   double _point;
   int     i, _ototal = OrdersHistoryTotal(), _profit= 0 ;
   for    (i = 0 ; i < OrdersHistoryTotal(); i++) 
  {
     if ( OrderSelect (TickF, SELECT_BY_TICKET, MODE_HISTORY)) 
    {
       if (OrderSymbol() == Symbol ())
      {
         if (OrderMagicNumber() == Magic) 
        {
           _point = MarketInfo(OrderSymbol(), MODE_POINT);
           if (_point == 0 ) 
           {
               if ( StringFind (OrderSymbol(), "" ) < 0 ) 
                 _point = 0.0001 ; 
               else _point = 0.01 ;
           }   
           if (OrderType() == OP_BUY) 
           {
              _profit += int ((MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice())/_point);
           }
           if (OrderType()==OP_SELL) 
           {
              _profit += int ((OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_ASK))/_point);
           }
         }
      }
    }
  }
   return (_profit);
}

İlk fonksiyonda gerekli siparişin biletini buluyorum. İkincisi, bu biletten sonra tüm kapalı siparişlerin karını hesaplamalıdır. Ondan öncekilerin kârı beni ilgilendirmiyor. İşte ikincisi, diye düşünüyor çarpık bir şekilde. Bir emir açarken bu 2 fonksiyon çağrılır ve buna göre 0'a eşit olmalıdır, ancak eşit değildir.
PS tavsiyenizi aldı, dizileri reddetti)
üstten 12. kare)


 

Her şeyi düşündüm ve önerinize göre kendi yolumda yaptım)

Görev takipti, zarar eden bir emir göründüğünde, kârlı diğer emirler tarafından bloke edilmelidir.

Nasıl uygulandı. Kaybedilen bir siparişin ardından açılan bir siparişin bileti hatırlandı, burası bizim raporlama noktamızdı. Ondan sonra, kaybeden bir emrin karını, ondan sonra kapanan emirlerin karını hesaplamaya başlarız. İlk emrin açıldığını ve kâra ulaşıldığında kapatıldığını hatırlatalım.

if ( (CalculateProfitHistory() + FirstProfit() >= Kar)

{

closeFirst();

Yazdır ("ilk kârsız olanı kapatıyoruz");

}


 double CalculateProfitHistory() 
{
   double profit = 0 ;
   int cnt=Ticket, i , ototal = OrdersHistoryTotal();

   for (i = ototal- 1 ; i >= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol () && OrderCloseTime() > 0 )
         {
             if (OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               if (OrderMagicNumber() == Magic )
               {
                   if (Ticket != 0 )
                  {
                     if (OrderTicket() >= Ticket)
                     {
                        profit += OrderProfit()+OrderCommission()+OrderSwap();
                     }                  
                  }
               }
            }
         }
      }
   }
   return (profit);
}