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

 
Valeriy Yastremskiy # :

Kodu doğru şekilde yapıştırın, alt S veya simgeye göre ipucu kodu.

SaveTick dizisine neden ihtiyacınız var?

Yalnızca 2 dizi öğesi kullanıyorsunuz. Bir işlevde bildirirseniz, bunları global veya statik değişkenlerle değiştirin.

2 değişken için bir dizi kullanmak mantıklı değil.

Ve görünüşe göre, SaveTick dizisinin boyutunu ayarlayan FindTicket() işlevini çağırmadan önce dizileri çağırıyorsunuz. Ve dizi sınırların dışında.

Teşekkür ederim. anladım.
Bana hatanın ne olduğunu söyle, bana öyle geliyor ki fonksiyon doğru sayılmıyor


***
 
makssub # :

Teşekkür ederim. anladım.
Bana hatanın ne olduğunu söyle, bana öyle geliyor ki fonksiyon doğru sayılmıyor


Kodu doğru girin, bu, yanıt penceresinin en üstünden 13. kutudur.

Ve fonksiyonun satır satır ne yaptığını kelimelerle yazabilirsiniz.

Görünüşe göre doğru değil.

Ve sipariş biletinin Tick değişkenine nerede ve nasıl atandığı açık değildir. Ve neden böyle bir durum için sihir ve sipariş tipini kontrol edin?
_sihir < 0 || OrderMagicNumber() == _magic
Eğer fonksiyon sıfırdan küçük büyü ile veya seçilen sıranın sayısına eşit büyü ile çağrılırsa, nokta boyutunu talep ediyoruz ve eğer sıfıra eşitse, emrin enstrüman sembolünde boş bir değer arıyoruz... ve benzeri.

Ve unutmayın, seçilen sipariş, sipariş veri yapısını doldurur ve depolar. Ve ancak farklı bir sipariş numarası veya bilet ile bir sonraki seçim emrinden sonra bu yapıdaki veriler değişecektir.

Onlar. OrderSend, sipariş veri yapısını doldurmaz, ancak sipariş biletini veya eksi 1'i döndürür. Ve sipariş yapısı yalnızca OrderSelect ile doldurulur. Daha sonra bu düzenin verilerini bu yapıdan alabilirsiniz.

 
Valeriy Yastremskiy # :

Kodu doğru girin, bu, yanıt penceresinin en üstünden 13. kutudur.

Ve fonksiyonun satır satır ne yaptığını kelimelerle yazabilirsiniz.

Görünüşe göre doğru değil.

Ve sipariş biletinin Tick değişkenine nerede ve nasıl atandığı açık değildir. Ve neden böyle bir durum için sihir ve sipariş tipini kontrol edin?
_sihir < 0 || OrderMagicNumber() == _magic
Eğer fonksiyon sıfırdan küçük büyü ile veya seçilen sıranın sayısına eşit büyü ile çağrılırsa, nokta boyutunu talep ediyoruz ve eğer sıfıra eşitse, emrin enstrüman sembolünde boş bir değer arıyoruz... ve benzeri.

Ve unutmayın, seçilen sipariş, sipariş veri yapısını doldurur ve depolar. Ve ancak farklı bir sipariş numarası veya bilet ile bir sonraki seçim emrinden sonra bu yapıdaki veriler değişecektir.

Onlar. OrderSend, sipariş veri yapısını doldurmaz, ancak sipariş biletini veya eksi 1'i döndürür. Ve sipariş yapısı yalnızca OrderSelect ile doldurulur. Daha sonra bu düzenin verilerini bu yapıdan alabilirsiniz.

 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)

 
makssub # :

İ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.
PS tavsiyenizi aldı, dizileri reddetti)
üstten 12. kare)

İlk fonksiyon, biletler sayılarla artıyorsa, en büyük numaralı bileti içerir))) Döngünün bir sonraki yinelemesinde, numaraya göre bir sonraki siparişin bileti önceki siparişin bileti ile karşılaştırılır. Seçim emri, emir yapılarını doldurur ve OrderTicket, bu yapıdan bilet değerini alır.

Kendiniz için satır satır yazın veya her kod satırının ne yaptığını söyleyin) Daha iyi yazın, böylece kendiniz için daha net olacaktır.

İkinci fonksiyonda, aynı bilet için OrderSelect, sipariş yapısını TikF bileti ile aynı sipariş verileriyle dolduracaktır)

 
Valeriy Yastremskiy # :

İlk fonksiyon, biletler sayılarla artıyorsa, en büyük numaralı bileti içerir))) Döngünün bir sonraki yinelemesinde, numaraya göre bir sonraki siparişin bileti önceki siparişin bileti ile karşılaştırılır. Seçim emri, emir yapılarını doldurur ve OrderTicket, bu yapıdan bilet değerini alır.

Kendiniz için satır satır yazın veya her kod satırının ne yaptığını söyleyin) Daha iyi yazın, böylece kendiniz için daha net olacaktır.

İkinci fonksiyonda, aynı bilet için OrderSelect, sipariş yapısını TikF bileti ile aynı sipariş verileriyle dolduracaktır)

Konuştum, ama bu dille ilgili olarak mantık açısından yetersiz görüyorum. Prompt Son açık siparişin bileti nasıl belirlenir?

Ve ondan sonra gelen tüm kapalı siparişlerin karı nasıl hesaplanır?

 
makssub # :

Konuştum, ama bu dille ilgili olarak mantık açısından yetersiz görüyorum. Prompt Son açık siparişin bileti nasıl belirlenir?

Ve ondan sonra gelen tüm kapalı siparişlerin karı nasıl hesaplanır?

Sipariş açılış saatine göre. En büyük olmalı) Ve sadece sipariş numarasına göre değil ve genellikle biletler de yardımcı olmaz. Veya sıra numaralarını, biletleri, sipariş durumunu ve açılış / kapanış saatlerini veritabanınızda ezberleyin.

 if ( OrderSelect (Ticket, SELECT_BY_TICKET)== true ) // Если выбор рыночного ордера произошел успешно
        {
         if (OrderCloseTime()== 0 )              // Если наш рыночный ордер не закрыт           {
            
            //           Alert ("Наш рыночный ордер жив, Модифицируем его если нужно ");
             if (Tral_Stop!= 0 || Tral_Profit!= 0 )
          {     ModifyTral(); }
             return ;
           }
         if (OrderCloseTime()!= 0 )              // Если наш рыночный ордер закрылся
         {
Alert ("Our market order has closed. The Adviser's work is completed ",
                  " Swap = ", OrderSwap(), " Commission = ", OrderCommission(),"Profit/loss = ",OrderProfit());
         // ..... // получаем профит и считаем общий профит например
         }

Ve mantığı sonuna kadar telaffuz etmek daha iyidir. Öyleyse daha kolay. Gerekli verilerle başlamak daha iyidir ve çözmek için yeterli olmalıdır)

Siparişler için açılış saatimiz var (beklemede değil). İşte onların biletleri. Her piyasa emrinin bir açılış fiyatı, SL ve TP vardır. Ve siparişleri kapatmak için bir zaman var. Ve emir kapatıldıktan sonra Kar alanları doldurulur.

Bu verilerden mantığı düzenlemeniz gerekir.

Son açık olandan sonra gelen kapalı emir ibaresi hiç tanımlanmamıştır. Sayıya, bilete ve zamana göre gidebilirler.

 
Valeriy Yastremskiy # :

Sipariş açılış saatine göre. en büyüğü olmalı

doğru yaz, ancak kodun biraz süslü olduğu ortaya çıktı)))

bence nasıl yazılır ve yapılır:

 int GetTicketLastOpenOrder()
{
   int ticket = - 1 ;
   datetime t = 0 ;
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES) && OrderType() <= OP_SELL && OrderOpenTime() > t)
      {
         ticket = OrderTicket();
         t = OrderOpenTime();
      }
   }
   return (ticket);
}


Not: Bilet numarasına göre OrderSelect(), yalnızca açık siparişler arasında sıralama yapmaktan çok daha uzun sürer

 
Igor Makanu # :

doğru yaz, ancak kodun biraz süslü olduğu ortaya çıktı)))

bence nasıl yazılır ve yapılır:


Not: Bilet numarasına göre OrderSelect(), yalnızca açık siparişler arasında sıralama yapmaktan çok daha uzun sürer

Teşekkürler Igor, sadece özü anlamadıklarında, doğru kod özü iletmiyor nedense, bu yüzden sizden basit algoritmaları kelimelerle formüle etmenizi istiyorum)))

 
Valeriy Yastremskiy # :

Sipariş açılış saatine göre. En büyük olmalı) Ve sadece sipariş numarasına göre değil ve genellikle biletler de yardımcı olmaz. Veya sıra numaralarını, biletleri, sipariş durumunu ve açılış / kapanış saatlerini veritabanınızda ezberleyin.

Ve mantığı sonuna kadar telaffuz etmek daha iyidir. Öyleyse daha kolay. Gerekli verilerle başlamak daha iyidir ve çözmek için yeterli olmalıdır)

Siparişler için açılış saatimiz var (beklemede değil). İşte onların biletleri. Her piyasa emrinin bir açılış fiyatı, SL ve TP vardır. Ve siparişleri kapatmak için bir zaman var. Ve emir kapatıldıktan sonra Kar alanları doldurulur.

Bu verilerden mantığı düzenlemeniz gerekir.

Son açık olandan sonra gelen kapalı emir ibaresi hiç tanımlanmamıştır. Sayıya, bilete ve zamana göre gidebilirler.

Cevaplar için teşekkür ederim. Önerilerinizin bir kısmını uyguladım.
İstenen onay işaretini bulan bir fonksiyon yazdı.
Seçilen fonksiyonun gerekli onay sırasından sonra tüm kapatılan emirlerin karını hesaplayan bir fonksiyon yazdı. Geriye kalan tek şey, önerilerinize göre düzeltmek, bir zaman kontrolü eklemek vb.

 tpl = NormalizeDouble(Bid - ProfitLock*Point, Digits);
            ticket = OrderSend (Symbol(), OP_SELL, lastlot, Bid, Slippage, 0, tpl, "",Magic, 0, Red);


double CalculateProfitHistory()
{
double order= 0 ,op= 0 ;
int cnt= 0 ;
datetime time= 0 ;
for ( int i=OrdersHistoryTotal()- 1 ; i>= 0 ; i--)
      {
       if ( OrderSelect (Tick,SELECT_BY_TICKET,MODE_HISTORY))
      {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
         {
            
            
            op += OrderProfit();
            order +=op;
            cnt++;
            
         }
      }
      }
   return (order);
  }

Şimdi kafamı karıştıran tek bir şey var, ama sanırım bir sorun var. Test sonucunda TP 0.02 çıkarsa o zaman sayar ve Yorum 0.1300'e yazar. Söyle bana onun nesi var?

 
Bana yardım edin lütfen https://www.mql5.com/en/forum/160683/page1609 .
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2021.09.02
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
Neden: