[Arşivle!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 2. - sayfa 294

 
CreAndr :
Trol ile ilgili bir sorum var, kim söyleyebilir? Başabaş için doğru trol gibi görünüyor, ancak çalışmıyor.

Burada trol var: https://www.mql5.com/en/forum/131859

Metne bir kod eklemek için metin giriş alanının üzerinde bulunan SRC düğmesine basın.

 
DhP :

Burada trol var: https://www.mql5.com/en/forum/131859

Metne bir kod eklemek için metin giriş alanının üzerinde bulunan SRC düğmesine basın.


Teşekkür ederim.
 
CreAndr :
Trol ile ilgili bir sorum var, kim söyleyebilir? Başabaş için doğru trol gibi görünüyor, ancak çalışmıyor.


Nedenleri azalan önem sırasına göre listelemek:

1. Bilgisayar dahil değildir

2. Metatrader dahil değildir

3. Komut dosyası grafikte yüklü değil

4. Danışmanlara izin verilmez

5. Trol yapacak bir şey yok.

6. Koddaki bir şey yanlış.

 
Roger :


Nedenleri azalan önem sırasına göre listelemek:

1. Bilgisayar dahil değildir

2. Metatrader dahil değildir

3. Komut dosyası grafikte yüklü değil

4. Danışmanlara izin verilmez

5. Trol yapacak bir şey yok.

6. Koddaki bir şey yanlış.

Harika cevap Roger, ama bilgisayar açık, metatrader da, danışman grafiğe eklendi, danışmanlara izin verildi, anlaşmalar açıldı ve buna göre izlenecek bir şey var! Ama kodda yanlış olan şey, soru buydu.
 
artmedia70 :
OrderOpenTime() kullanın
İçin - o zaman neye ihtiyaç var?


Yani evet, ancak seri numarasına göre oldukça kısa olduğu ortaya çıktı ve OrderOpenTime ile bir şekilde ne yapacağımı anlamıyorum , açılış saatini bir yere koymam, listedeki bir sonraki siparişle karşılaştırmam gerekiyor, süre daha uzunsa, değişkeni yeniden yazın, vb. Henüz algoritmaya girmiyorum.


 bool DeleteOrders()
{
   for ( int i= 0 ; i <= OrdersTotal () ; i++)
      {
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
         {
         if ( Symbol ()==OrderSymbol())
            {
             if (OrderType()!= OP_SELL)
               {
               int ticket=OrderTicket();
               OrderDelete(ticket);
               return (true);
               }
            }
         }
      }
return (false);
} 
 
CreAndr :
Harika cevap Roger, ama bilgisayar açık, metatrader da, danışman grafiğe eklendi, danışmanlara izin verildi, anlaşmalar açıldı ve buna göre izlenecek bir şey var! Ama kodda yanlış olan şey, soru buydu.


İlk başta kod yoktu, sonra eklediniz.

Muhtemelen işe yaramadığı için, sipariş açma işlevine sondakini koyduğunuz için, yani bir sipariş açmanın koşulları geldiğinde, sipariş açılır ve daha fazla ilerlemeyebilir.

 
Pyro :

Yani evet, ancak seri numarasına göre oldukça kısa olduğu ortaya çıktı ve OrderOpenTime ile bir şekilde ne yapacağımı anlamıyorum, açılış saatini bir yere koymam, listedeki bir sonraki siparişle karşılaştırmam gerekiyor, süre daha uzunsa, değişkeni yeniden yazın, vb. Henüz algoritmaya girmiyorum.


Seri numarasına göre güvenilmezdir, bu numaralandırmada hiç kimse hiçbir şeyi garanti etmez, sadece test eden için. Birkaç sayfa önce, açık olanlar için benzer şekilde, son kapatılan siparişi aramak için bir kod yazdım. Her şey basit, sıraladılar, bileti hatırladılar, sonra bilet için bir sipariş veya poz seçtiler , hepsi bu:

   int lastclosetime=- 1 ;
   int lastcloseticket=- 1 ;
   int lastdealtype= 0 ;

   for ( int i= 0 ; i<OrdersHistoryTotal(); i++) 
  {
     if (! OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) continue ; 
     if (OrderSymbol()==symbol || OrderMagicNumber()==magic) 
    {
       if (lastclosetime<OrderCloseTime()) 
      {
        lastclosetime=OrderCloseTime();
        lastcloseticket=OrderTicket();
      }
    }
  }

   if ( OrderSelect (lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY)) 
  {
     if (OrderType()==OP_BUY) lastdealtype= 1 ;
     if (OrderType()==OP_SELL) lastdealtype=- 1 ;   
  }
 
Figar0 :


Seri numarasına göre güvenilmezdir, bu numaralandırmada hiç kimse hiçbir şeyi garanti etmez, sadece test eden için. Birkaç sayfa önce, açık olanlar için benzer şekilde, son kapatılan siparişi aramak için bir kod yazdım. Her şey basit, sıraladılar, bileti hatırladılar, sonra bilet için bir sipariş veya poz seçtiler, hepsi bu:

Teşekkürler, gerçekten basit. Bunu halledeceğim.
 
Roger :


İlk başta kod yoktu, sonra eklediniz.

Muhtemelen işe yaramadığı için, sipariş açma işlevine sondakini koyduğunuz için, yani bir sipariş açmanın koşulları geldiğinde, sipariş açılır ve daha fazla ilerlemeyebilir.

Tamam teşekkürler.
 
Figar0 :


Seri numarasına göre güvenilmezdir, bu numaralandırmada hiç kimse hiçbir şeyi garanti etmez, sadece test eden için. Birkaç sayfa önce, açık olanlar için benzer şekilde, son kapatılan siparişi aramak için bir kod yazdım. Her şey basit, sıraladılar, bileti hatırladılar, sonra bilet için bir sipariş veya poz seçtiler, hepsi bu:

Kod yanlış.

İlk olarak, işte burada:

 if (OrderSymbol()== symbol || OrderMagicNumber()== magic ) 

Sıra sembolü, sembol değişkeninde belirtilen sembole eşitse veya düzenin büyüsü, büyünün büyüsüne eşittir... Yani, sembol sembollü herhangi bir düzen seçilirse ve büyü farklıysa veya yoksa, koşul yerine getirilmiş olacaktır. Çünkü bu ya da bu... Buna göre, veya yerine ve koymanız gerekir, ancak kontrolleri ayrı satırlara ayırmak daha iyidir - döngü daha hızlı olacaktır, bu da optimizasyon için önemlidir.

Sonraki... Bilete göre seçim: havuz parametresi yok sayılır, yani. buraya yazmanın anlamı yok.

 if ( OrderSelect (lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY )) 

Biletle bir siparişi başarıyla seçtikten sonra, hangi siparişler listesinden seçildiğini kontrol etmeniz gerekir - piyasadan veya kapalı olanlardan. Bunu yapmak için siparişin kapanış saatini kontrol etmeniz gerekir ve sıfırdan büyükse sipariş kesinlikle kapatılmıştır. Açık pozisyonlar için bu parametre her zaman sıfıra eşittir. IMHO, son siparişi seçtikten sonra hemen türünü kontrol etmeli ve bir değişkene girmelisiniz.

İşlev şimdi şöyle görünecek:

 int    GetTypeLastClosePos( int symbol, int magic)   // Функция возвращает 0 если последний закрытый Бай, 1 - если Селл и -1 при ошибке
{
int    i, lastclosetime= 0 , 
         lastdealtype=- 1 ;

   for (i= 0 ; i<OrdersHistoryTotal(); i++) {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) { // Если выбрали ордер в истории
         if (OrderSymbol()!=symbol)           continue ;   // Если его символ не равен переданному в функцию - идём к следующему
         if (OrderMagicNumber()!=magic)       continue ;   // Если его магик не равен переданному в функцию - идём к следующему
         if (OrderType()> 1 )                   continue ;   // Если ищем только Бай и Селл, значит если больше единицы - к следующему
         // ... теперь выбранный ордер соответствует критериям поиска по символу, магику и типу
         if (lastclosetime<OrderCloseTime()) {           // Посмотрим время его закрытия и если оно больше предыдущего, то...
            lastclosetime=OrderCloseTime();               // ... запишем его как предыдущее
            lastdealtype=OrderType();                     // Тип текущего закрытого ордера: 0 для Бай, 1 для Селл
            }
         }
       else if (! OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         Print ( "Func: GetTypeLastClosePos, Ошибка выбора ордера - " , GetLastError ());   // Посмотрим номер ошибки
         break ;                                                 // Выходим из цикла перебора ордеров
         }
      }
   return (lastdealtype);
}

Şimdi, mevcut grafiğin sadece Al veya Sat'ı ve hangisinin en son kapandığını kontrol etmek için bu fonksiyonu aşağıdaki şekilde çağırıyoruz:

 int LastPoseType=GetTypeLastClosePos( Symbol (), Magic);
if (LastPoseType==OP_BUY) {
   // ... код, если последний закрытый Buy ...
   }
if (LastPoseType==OP_SELL) {
   // ... код, если последний закрытый Sell ...
   }
else { // ... код обработки ошибки ... }

Hatayı işlemek için, prensipte, örneğin global bir değişken oluşturabilirsiniz. int hata; ve işlevin gövdesinde, hata numarasını bu değişkende saklayın:

 else if (! OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         err= GetLastError ();                                                     // Посмотрим номер ошибки
         Print ( "Func: GetTypeLastClosePos, Ошибка выбора ордера - " ,err);       // Сообщим об ошибке и в какой ф-ции она произошла
         break ;                                                                  // Выходим из цикла перебора ордеров
         }

Ardından, işlevi çağırdıktan sonra hatayı işlemek için ...

GetTypeLastClosePos( Symbol (), Magic);

... ve bir hata oluşursa, numarası err değişkeninde olacak ve bu numara işleme bloğunda işlenecektir.

 else {
   if (err==???) {
       // обработка этой ошибки
      }
   if (err==???) {
       // обработка этой ошибки
      }
// ... и т.д. ...
   }

anahtarı kullanmak daha iyidir