Uzman Danışmanlar: Yatırımcılar için MQL5 Programlama - Kitaptan kaynak kodları. Bölüm 6

 

Yatırımcılar için MQL5 Programlama - Kitaptan kaynak kodları. Bölüm 6:

“Yatırımcılar için MQL5 Programlama” kitabının 6. bölümünde, MQL5 dilinin önemli bir bileşeni olan ticaret otomasyonu hakkında konuşacağız. Finansal enstrüman özellikleri ve işlem hesabı ayarları gibi temel unsurların açıklamasıyla başlayacağız. Bunlar, düzgün çalışan Uzman Danışmanlar oluşturmak için ön koşullardır.

Yatırımcılar için MQL5 Programlama - Kitaptan kaynak kodları. Bölüm 6

Yazar: MetaQuotes

 
Harika
 

Kod eklerken KOD düğmesini (Alt-S) kullanın.

Bir moderatör yanlış yapıştırılan kodu biçimlendirdi. Genellikle bu tür kodlar kaldırılır.

StanislavKorotky Lütfen bu hatayı incelemeye yardımcı olabilir misiniz, MT5 güncellemelerinden sonra başladığına inanıyorum çünkü kodun önceki aylarda herhangi bir değişiklik yapılmadan çalıştığını biliyordum.

parametre dönüştürme türü 'long[][2]' to 'string[][] &' is not allowed SymbolFilter.mqh 199 20

'double[][2]' ile 'string[][] &' parametre dönüştürme türüne izin verilmiyor TradeFilter.mqh 332 20
parametre dönüştürme türü 'long[][2]' ile 'string[][] &' arasında izin verilmiyor TradeFilter.mqh 163 17


Aşağıdaki kodun sorunu tekrarlamaya yardımcı olacağından şüpheleniyorum:

void printSymbols() {
   SymbolFilter f;                      // filtre nesnesi
   string symbols[];                    // isimler için dizi 
   long permissions[][2];               // veri için dizi (özellik değerleri)
   
   // istenen sembol özelliklerinin listesi
   ENUM_SYMBOL_INFO_INTEGER modes[] = {
      SYMBOL_TRADE_MODE,
      SYMBOL_ORDER_MODE
   };
   
   // filtreyi uygulayın, sonuçları içeren dizileri alın
   f.let(SYMBOL_VISIBLE, true).select(true, modes, symbols, permissions);
   
   const int n = ArraySize(symbols);
   PrintFormat("===== Trade permissions for the symbols (%d) ===== ", n);
   for(int i = 0; i < n; ++i)  {
      Print(symbols[i] + ":");
      for(int j = 0; j < ArraySize(modes); ++j) {
         // bit ve sayı açıklamalarını "olduğu gibi" göster
         PrintFormat("  %s (%d)",
            SymbolMonitor::stringify(permissions[i][j], modes[j]),
            permissions[i][j]);
      }
   }
}

Stanislav Korotky - marketeer - Trader's profile
Stanislav Korotky - marketeer - Trader's profile
  • 2025.07.05
  • www.mql5.com
Trader's profile
 
pauldic #:
StanislavKorotky Lütfen bu hatayı incelemeye yardımcı olabilir misiniz, MT5 güncellemelerinden sonra başladığına inanıyorum çünkü kodun önceki aylarda herhangi bir değişiklik yapılmadan çalıştığını biliyordum.

parametre dönüştürme türü 'long[][2]' to 'string[][] &' is not allowed SymbolFilter.mqh 199 20
'double[][2]' ile 'string[][] &' parametre dönüştürme türüne izin verilmiyor TradeFilter.mqh 332 20
parametre dönüştürme türü 'long[][2]' ile 'string[][] &' arasında izin verilmiyor TradeFilter.mqh 163 17


Aşağıdaki kodun sorunu tekrarlamaya yardımcı olacağından şüpheleniyorum:


Lütfen satırları bulun:

   // bu aşırı yüke ihtiyacımız var çünkü yerleşik ArraySort
   // dizgi dizilerini desteklemez
   void ArraySort(string &s[][]) const
   {
      QuickSortTm<string> qt(s);
   }

başlık dosyalarında SymbolFilter.mqh ve TradeFilter.mqh dosyalarını açın ve yanlarına aşağıdaki yöntem aşırı yükünü ekleyin:

   // bu aşırı yüke ihtiyacımız var çünkü yerleşik ArraySort
   // dizgi dizilerini desteklemez
   void ArraySort(string &s[][]) const
   {
      QuickSortTm<string> qt(s);
   }
   
   template<typename T>
   void ArraySort(T &s[][]) const
   {
      ::ArraySort(s);
   }
NOT. Bu soru makale ile ilgisiz görünüyor.
 
Stanislav Korotky #:

Lütfen satırları bulun:

başlık dosyalarında SymbolFilter.mqh ve TradeFilter.mqh ve yanlarına aşağıdaki yöntem aşırı yükünü ekleyin:

PS. Bu soru makale ile ilgisiz görünüyor.

Hızlı yanıtınız için teşekkür ederim, güncellemeyi yaptıktan sonra daha fazla hata aldım:

parameter convertion type 'double[][2]' to 'string[][] &' is not allowed                TradeFilter.mqh 338     20
cannot convert parameter 'double[][2]' to 'OrderMonitor&[][]'                   TradeFilter.mqh 338     20
parameter convertion type 'double[][2]' to 'string[][] &' is not allowed                TradeFilter.mqh 338     20
cannot convert parameter 'double[][2]' to 'PositionMonitor&[][]'                        TradeFilter.mqh 338     20
parameter convertion type 'long[][2]' to 'string[][] &' is not allowed          TradeFilter.mqh 163     17
cannot convert parameter 'long[][2]' to 'OrderMonitor&[][]'                             TradeFilter.mqh 163     17
parameter convertion type 'long[][2]' to 'string[][] &' is not allowed          TradeFilter.mqh 163     17
cannot convert parameter 'long[][2]' to 'PositionMonitor&[][]'                  TradeFilter.mqh 163     17
etc..

ArraySort yerine genel QuickSortTm'yi doğrudan çağırmanın sorunu geçici olarak düzelttiğini fark ettim, ancak bunun en uygun çözüm olduğuna inanmıyorum

QuickSortTm<V> qt(array);
//ArraySort(dizi);
 
pauldic #:

Hızlı yanıtınız için teşekkür ederim, güncellemeyi yaptıktan sonra daha fazla hata aldım:

Bu garip, yukarıda önerilen düzeltmeden sonra /MQL5/Scripts/MQL5Book/p6/SymbolFilterTradeMode.mq5 komut dosyasını derleme 5346'da başarıyla derledim ve çalıştırdım. Kaynak kodunuzu göstermediniz.
 
Stanislav Korotky #:
Bu garip, yukarıda önerilen düzeltmeden sonra /MQL5/Scripts/MQL5Book/p6/SymbolFilterTradeMode.mq5 komut dosyasını derleme 5346'da başarıyla derledim ve çalıştırdım. Kaynak kodunuzu göstermemişsiniz.
Kaynağımı atladığım için beni bağışlayın, bu yüzden önerdiğiniz düzeltmeye geri döndüm, böylece hataları tekrar alabiliyorum ve günlüğe göre kodumun bu kısımları hataya yol açan kısımlar gibi görünüyor
Sürüm 5 yapı 5327

üzerinde çalışıyorum
void printActiveOrders() {
   
   OrderFilter filter;
   ENUM_ORDER_PROPERTY_DOUBLE properties[] = {ORDER_VOLUME_INITIAL, ORDER_PRICE_OPEN, ORDER_SL, ORDER_TP};
   double d[][4];
   ENUM_ORDER_TYPE types[];
   ulong tickets[], magics[];
   string symbols[], comments[];
   
   filter.select(properties, tickets, d);
   filter.select(ORDER_SYMBOL, tickets, symbols);
   filter.select(ORDER_COMMENT, tickets, comments);
   filter.select(ORDER_TYPE, tickets, types);
   filter.select(ORDER_MAGIC, tickets, magics);
   
   Print("Orders ..................  ", ArraySize(tickets));
   for (int i=0; i < ArraySize(tickets); i++) {
      Print(tickets[i], "\t", magics[i], "\t", symbols[i], "\t", EnumToString(types[i]), " \t", NormalizeDouble(d[i][0],3), "\t", d[i][1], " \t ",  d[i][2], " \t", d[i][3], "\t", comments[i]);
   }
}


void printPositions() {
   PositionFilter filter;
   
   ENUM_POSITION_PROPERTY_DOUBLE properties[] = {POSITION_PRICE_OPEN, POSITION_VOLUME, POSITION_SL, POSITION_TP, POSITION_PROFIT, POSITION_SWAP};
   
   ENUM_POSITION_TYPE types[];
   double d[][6];
   ulong tickets[], extIds[];
   string symbols[], comments[];
   
   filter.let(POSITION_MAGIC, sets.MagicNumber).select(properties, tickets, d);
   filter.select(POSITION_SYMBOL, tickets, symbols);
   filter.select(POSITION_COMMENT, tickets, comments);
   filter.select(POSITION_TYPE, tickets, types);
   filter.select(POSITION_IDENTIFIER, tickets, extIds);

   Print("Tickets\t  Parent Id\tSymbols \t Trade Type \t\t\t\t\t\tEntry \t Lots \t\t SL  \t\t\t TP \t\t\t\t Profit \tSwat \t\tComments");
   for ( int i =0; i < ArraySize(tickets); i++) {
      Print(tickets[i], "\t", extIds[i] == 0 ? "\t\t\t\t\t\t\t\t\t" : (string)extIds[i], "\t", symbols[i], "\t", EnumToString(types[i]), " \t", (string)NormalizeDouble(d[i][0],3), "\t", d[i][1], " \t ",  d[i][2], " \t", d[i][3], " \t", d[i][4], " \t ", d[i][5], "\t", comments[i]);
      //Print(tickets[i], "\t", extIds[i] == 0 ? "\t\t\t\t\t\t\t\t\t" : extIds[i], "\t", symbols[i], "\t", EnumToString(types[i]), " \t", NormalizeDouble(d[i][0],3), "\t", d[i][1], " \t ",  d[i][2], " \t", d[i][3], " \t", d[i][4], " \t ", d[i][5]);
   }
}


Yan tarafta sık sık şu mesajları görüyorum:

This single line message always shows whenever I attach my EA to a chart:
Unresolved int value as enum: 8 for MonitorInterface<ENUM_POSITION_PROPERTY_INTEGER,ENUM_POSITION_PROPERTY_DOUBLE,ENUM_POSITION_PROPERTY_STRING>::TradeState


While these ones below shows when it is detached

2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)   8 leaked strings left
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)   2 undeleted dynamic objects found:
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)      1 object of class 'WebSocketConnectionHybi'
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)      1 object of class 'MqlWebSocketTransport'
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)   576 bytes of leaked memory found
Dosyalar:
log.txt  34 kb
 
pauldic #:
Kaynağımı atladığım için beni affedin, bu yüzden önerdiğiniz düzeltmeye geri döndüm, böylece hataları tekrar alabiliyorum ve günlüğe göre kodumun bu kısımları hataya yol açan kısımlar gibi görünüyor

Yan tarafta, sık sık şu mesajları görüyorum:

T harfinin zaten sınıf şablonu typename'i olarak kullanıldığını gözden kaçırmışım (derleyicinin bu durumda bir hata üretmemesi garip), bu nedenle T'yi başka bir serbest harfle değiştirmek sorun olmayacaktır, örneğin X:

   template<typename X>
   void ArraySort(X &s[][]) const
   {
      ::ArraySort(s);
   }

İlk uyarıya gelince, işte forumlardan bir açıklama (size daha önce verdiğim):

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi üzerine forum

Uzmanlar: Yatırımcılar için MQL5 Programlama - Kitaptan Kaynak Kodlar. Bölüm 7

Stanislav Korotky, 2025.06.14 16:26

Bu sadece MQL5'in ilgili yerleşik numaralandırmasının normalde ardışık olarak atanan sabitlerde bir boşluğa sahip olmasından kaynaklanan bir uyarıdır. Bu boşluk, MQL5 sürekli değiştiği ve bazı sabitler eskimiş olabileceği ve daha sonra ortadan kaldırılabileceği için meydana gelir. Bu tür uyarıları önlemek için kaynak kodunu düzenleyebilirsiniz.

Ve sızan bellek hakkında - korkarım özel kaynak kodunuzda bir eksiklik var, kitap böyle şeyleri göstermedi. Sorunu yeniden üretmek için eksiksiz bir test kodu sağlamalısınız.

NOT. İlgilendiğiniz tüm özellikler için tek bir seçim çalıştırmak daha verimlidir:

   // ÖRNEK: pozisyonlar için kar, sembol, bilet talep edin
   // belirli sihirli sayıya göre, kâra göre sıralanmış
   
   #include <MQL5Book/Tuples.mqh>
   #include <MQL5Book/PositionFilter.mqh>
   #property script_show_inputs
   
   input ulong Magic;
   
   void OnStart()
   {
      int props[] = {POSITION_PROFIT, POSITION_SYMBOL, POSITION_TICKET};
      Tuple3<double,string,ulong> tuples[];
      PositionFilter filter;
      filter.let(POSITION_MAGIC, Magic).select(props, tuples, true);
      ArrayPrint(tuples);
   }



Not: Moderatörlerin kitapla ilgili tüm soru ve cevapları (#41'den başlayarak) uygun başlığa taşıması gerektiğini düşünüyorum, örneğin burada - https://www.mql5.com/en/forum/459067.

Experts: MQL5 Programming for Traders – Source Codes from the Book. Part 6
Experts: MQL5 Programming for Traders – Source Codes from the Book. Part 6
  • 2023.12.15
  • www.mql5.com
MQL5 Programming for Traders – Source Codes from the Book. Part 6 : Author: MetaQuotes...
 
Stanislav Korotky #:

T harfinin zaten sınıf şablonu typename'i olarak kullanıldığını gözden kaçırdım (derleyicinin bu durumda bir hata üretmemesi garip), bu nedenle T'yi başka bir serbest harfle değiştirmek sorun olmayacaktır, örneğin X:

İlk uyarıya gelince, işte forumlardan bir açıklama (size daha önce vermiştim):

Ve sızan bellek hakkında - korkarım özel kaynak kodunuzda bir eksiklik var, kitap böyle şeyleri göstermedi. Sorunu yeniden oluşturmak için eksiksiz bir test kodu sağlamalısınız.

NOT. İlgilendiğiniz tüm mülkler için tek bir seçim yapmak daha etkilidir:



Not: Bence moderatörler kitapla ilgili tüm soru ve cevapları (#41'den başlayarak) uygun başlığa, örneğin buraya - https://www.mql5.com/en/forum/459067taşımalıdır.

Çok teşekkür ederim, T -> X değişikliği sihri yaptı. Ve önceki soruma işaret ettiğin için tekrar teşekkür ederim (daha önce sorduğumu unutmuşum) ve hatırlatman daha önce kaçırdığım toyjson3.mqh'deki güncellemeyi görmeme yardımcı oldu ve 'select' için düzeltmeleri yapacağım.

Sızıntı konusunda haklı olduğuna inanıyorum, sanırım nereden geldiğine dair bir fikrim var.

Çok teşekkür ederim kardeşim.
 
void printActiveOrders() {
   int properties[] = {ORDER_VOLUME_INITIAL, ORDER_PRICE_OPEN, ORDER_SL, ORDER_TP, ORDER_TICKET, ORDER_MAGIC, ORDER_TYPE, ORDER_SYMBOL, ORDER_COMMENT};
   Tuple9<double,double,double,double,long,long,long,string,string> values[]; 
   OrderFilter filter;
   filter.select(properties, values);
   Print("\nFound:  ", ArraySize(values), " Orders\n{ORDER_VOLUME_INITIAL, ORDER_PRICE_OPEN, ORDER_SL, ORDER_TP, ORDER_TICKET, ORDER_MAGIC, ORDER_TYPE, ORDER_SYMBOL, ORDER_COMMENT}");
   ArrayPrint(values);
}

void printDeals() {
   DealFilter filter;    
   int properties[] = {DEAL_TIME, DEAL_SYMBOL, DEAL_TICKET, DEAL_TYPE, DEAL_VOLUME, DEAL_PRICE, DEAL_COMMISSION, DEAL_PROFIT};
   
   Tuple8<long,string,long,long,double,double,double,double> data[];   
   filter.select(properties, data, true); // Zamana göre filtrele
   Print("\nFound:  ", ArraySize(data), " Deals\nTIME, SYMBOL, TICKET, TYPE, VOLUME, PRICE, COMMISSION, PROFIT");
   ArrayPrint(data);
}

@StanislavKorotky
Fırsatlara ve Siparişlere ve bu kodla erişebiliyorum, ancak belirli bir zaman dilimi için aynı şeye nasıl erişeceğimi bulamadım. Lütfen belirli bir zaman dilimi için aynı şeyi nasıl yapacağıma dair herhangi bir belge veya örnek konusunda bana rehberlik edebilir misiniz?

 
pauldic #:

Fırsatlara ve Siparişlere ve bu kodla erişebiliyorum, ancak belirli bir zaman dilimi için aynı şeye nasıl erişeceğimi bulamadım. Lütfen belirli bir zaman dilimi için aynı şeyi nasıl yapacağıma dair herhangi bir belge veya örnek konusunda bana rehberlik edebilir misiniz?

Emirler, anlaşmalar, pozisyonlar zaten zaman dilimleriyle ilgili değildir. Ya bir şeyi yanlış anladınız ya da ifadeniz yanlış.