MetaTrader 5'in Gücü: Birleşik Bir Ortamda Adım Adım Hata Ayıklamadan EX5 Korumasına
Giriş
Algoritmik alım-satım dünyasında, bir alım-satım fikri yalnızca başlangıç noktasıdır. Bir ürünün gerçek değeri, kodun ilk satırı yazıldığında değil, tekrarlanan iyileştirme, doğrulama ve canlı çalışmaya hazırlama döngüleri sırasında ortaya çıkmaya başlar.
Birçok geliştirici MetaEditor'ı hala gelişmiş bir metin editörü olarak görüyor. Yıllarca manuel hata ayıklama yöntemleri kullandılar: günlükleri binlerce print çağrısıyla doldurdular, metin dosyalarını görsel olarak incelemek için saatler harcadılar ve kayma, yanlış sinyaller veya donmuş döngülerin nedenlerini tahmin etmeye çalıştılar. Bu yaklaşım, geliştirme sürecini, en değerli kaynak olan zamanın sürekli olarak boşa harcandığı kaotik ve sistematik olmayan bir arama sürecine dönüştürmektedir. Bu süreçte kodun güvenilirliği belirsizliğini korumaktadır.
Otomatik bir alım-satım sistemi oluşturmak, uygun bir geliştirme ortamı ve güçlü bir programlama dilinden daha fazlasını gerektirir. Ayrıca hata ayıklama ve kalibrasyon için araçlara da ihtiyaç duyar.
MetaTrader 5 geliştirme ve alım-satım sistemi temelde farklı bir standart sunar. Platformun gücü yalnızca nesne yönelimli C++'dan miras alınan MQL5 dilinin ifade gücünde değil, aynı zamanda bir geliştiricinin tüm iş akışı boyunca ilerleyebileceği hızda yatmaktadır: "Hataları bulma → Sorunları düzeltme → Yürütme hızını optimize etme → Nihai .ex5 uygulamasını koruma".
Bu sürecin merkezinde, MQL5 uygulama geliştirme yaşam döngüsünün her aşamasını kapsayan kapsamlı bir entegre geliştirme ortamı (IDE) olan MetaEditor yer almaktadır. MetaEditor, zincirdeki her adım için özelleşmiş araçlar içerir:
- Gerçek tikler kullanılarak adım adım hata ayıklama
- Kod yürütme süresinin donanım düzeyinde profillenmesi
- Performans açısından kritik hesaplamaları hızlandırmak için C++ DLL'leri ile doğrudan entegrasyon
- İkili kod için bulut tabanlı kriptografik koruma
Bu sadece kullanışlı özelliklerden oluşan bir koleksiyon değil, aynı zamanda geliştirme süresini azaltan ve alım-satım fikirlerini uygularken başarısızlık riskini en aza indiren özenle tasarlanmış bir geliştirme ekosistemidir.
Bu makalede, bir alım-satım robotu oluşturmanın tüm yaşam döngüsünü inceleyeceğiz: proje kurulumu, program mantığında hata ayıklama, performans darboğazlarını belirleme, matematiksel olarak yoğun hesaplamaları bir C++ DLL'e izole etme ve son olarak MQL5 Cloud Protector ile fikri mülkiyeti koruma.
Pratik bir örnek olarak, MetaTrader 5 terminal paketine dahil olan Bollinger Bands göstergesine dayalı kendi göstergemizi geliştireceğiz. Sinyal görselleştirme, etkileşimli ayarlar ve sanal işlem performansı hesaplamaları ekleyeceğiz. Bu göstergeyi daha sonra kendi fikirlerinizi test etmek için bir temel olarak kullanabilirsiniz.

Şekil 1: Fikirden Kara
Test Göstergesi: Proje Gereksinimleri
Hata ayıklama ve profilleme için bir test göstergesi geliştireceğiz. Gösterge aşağıdaki işlevselliğe sahip olacaktır:
- Alış/Satış sinyal oklarını ve Zararı Durdur/Kar Al işaretlerini görüntüleme
- Sinyal oluşturmak için standart Bollinger Bands (BB) göstergesini kullanma
- İki sinyal modunu destekliyor: üst/alt BB sınırlarından geri dönüş ve BB sınırlarının kırılması
Geri Dönüş Modu:
- Çubuk üst BB sınırının üzerinde kapanırsa, bir Satış sinyali oluşturur, Kar Al'ı BB orta çizgisine ayarlar, Zararı Durdur'u Kar Al ile aynı mesafeye ayarlar.
- Çubuk alt BB sınırının altında kapanırsa, bir Alış sinyali oluşturur, Kar Al'ı BB orta çizgisine ayarlar, Zararı Durdur'u Kar Al ile aynı mesafeye ayarlar.
Kırılma Modu:
- Alış ve Satışı yer değiştirir, Kar Al ve Zararı Durdur'u yer değiştirir.
Kar Al veya Zararı Durdur'a ulaşılana kadar yalnızca bir giriş sinyali etkin kalabilir. Ardından, sinyal izleme ve ok görüntüleme döngüsü yeniden başlar.
Çubuk kapanışında zıt bir sinyal ortaya çıkarsa, pozisyon tersine çevrilmelidir.
Ek uygulama koşulları:
- Yeni bir işlem gününün ilk saatlerini atla (saatler yapılandırılabilir)
- Piyasa kapanışından önceki son bir saat boyunca işlem yapma
- İşlem gününün sonunda tüm pozisyonları kapat (kapanış saati yapılandırılabilir)
Sinyallerin grafik üzerinde görüntülenmesi:
- Alış - yeşil yukarı ok
- Satış - kırmızı aşağı ok
- Zararı Durdur - sarı çarpı
- Kar Al - mavi çarpı
Göstergenin çalışmasının sonucu aşağıda gösterilmiştir:

Şekil 2: Test göstergesi sinyalleri
Gösterge kaynak kodunun tamamı bu makaleye ekli BB_Signal_Indicator.mq5 dosyasında mevcuttur.
Proje Kurulumu: Geliştirme ve Hata Ayıklamanın Temeli
Temelden başlayalım - uygun proje organizasyonu. Geliştirme ortamını önceden hazırlamak, ilk testinizi çalıştırmadan önce bile önemli ölçüde zaman kazandırır.
Her ciddi proje kod yazmakla değil, bu kod için doğru ortamı oluşturmakla başlar. Tam özellikli bir IDE olan MetaEditor, rutin görevleri otomatikleştirmek için araçlar sağlayarak geliştiricilerin grafik ayarları ve yapılandırmaları yerine mantığa odaklanmalarına olanak tanır. Şimdi verimli geliştirmenin temelini oluşturan kilit bileşenlere bakalım.
Bir proje oluşturma: Tek bir dosyadan bir sisteme
Tek .mq5 dosyalarıyla çalışmak prototip oluşturma sırasında kabul edilebilir, ancak ciddi geliştirme bir proje gerektirir.
Bir proje, program ayarlarını, derleme parametrelerini ve ilgili tüm dosyalar hakkındaki bilgileri depolayan .mqproj uzantılı ayrı bir dosyadır. Kolay proje yönetimi için Kılavuzda özel bir sekme bulunmaktadır. Include, kaynak, header ve diğer dosyalar gibi tüm dosyalar bu sekmede kategoriler halinde düzenlenir.
Bir kaynak dosyasından proje nasıl oluşturulur:
- Kılavuz penceresinde, mevcut MQ5 dosyasını seçin (bizim durumumuzda BB_Signal_Indicator.mq5)
- Sağ tıklayın ve içerik menüsünden 'Kaynaktan Yeni Proje'yi seçin
Aynı dizinde otomatik olarak bir .mqproj dosyası oluşturulacaktır:

Şekil 3: Kaynak dosyasından proje oluşturma
Bir proje ne sağlar:
- Tüm program dosyalarının merkezi yönetimi
- Otomatik bağımlılık takibi (#include, #resource)
- Kaynak kodundan bağımsız ayrı derleme ayarları
- Sürüm kontrolü ve değişiklik takibi
Sihirbaz ayrıca boş projeler oluşturmanıza da olanak tanır. Bu, varsayılan şablonların uygun olmadığı belirli dosya yapılarına sahip standart dışı geliştirme projeleri için kullanışlı bir özelliktir. Bu durumda, yalnızca boş bir .mqproj yapılandırma dosyası oluşturulur. Kaynak dosyaları daha sonra manuel olarak eklenmelidir.
Notlar
- Proje mevcut bir kaynak dosyasından oluşturulmuşsa, proje adı bu dosyadan devralınır. Yeni bir proje oluşturursanız, proje adını manuel olarak belirtmeniz istenecektir.
- Ayrıca, tüm proje dosyalarını ve klasörlerini saklamak için özel bir dizin oluşturmanız önerilir.
Proje özellikleri: Merkezi yapılandırma
Proje ayarlarına projenin içerik menüsünden Özellikler aracılığıyla erişilir. Bu iletişim kutusu, kaynak kodundaki #property yönergelerinin elle düzenlenmesinin yerini alır.

Şekil 4: Proje özellikleri
Ana özellikler:
- Program türü - derleme sırasında oluşturulan yürütülebilir modül türünü tanımlar.
- Proje CPU'su - derleme sırasında kullanılan standart komut setinin (X64 Regular) veya genişletilmiş CPU komut setlerinin seçilmesini sağlar.
- Telif hakkı - telif hakkı ile ilgili bilgiler (kaynak kodundaki #property copyright ile eşdeğerdir).
- Link - geliştiricinin web sitesine bir bağlantı (kaynak kodundaki #property link ile eşdeğerdir).
- Sürüm - program sürümü (kaynak kodundaki #property version ile eşdeğerdir).
- Simge - program simgesi (kaynak kodundaki #property icon ile eşdeğerdir).
- Açıklama - program açıklaması (kaynak kodundaki #property description ile eşdeğerdir).
Optimizasyon ve performans ayarları:
- Maksimum optimizasyon - optimizasyon olmadan derlenen uygulamalar daha hızlı oluşturulur ancak daha yavaş yürütülür. Gerekirse hata ayıklama sırasında optimizasyonu devre dışı bırakın, ancak sürüm derlemeleri için etkinleştirin.
- Ondalıklı bölenleri kontrol et - bölen kontrollerinin devre dışı bırakılması performansı biraz artırır çünkü sıfıra bölme hataları artık çalışma zamanı yürütmesi sırasında doğrulanmaz.
- Optimizasyon önbelleğini kullan (Uzman Danışmanlar için) - optimizasyon sırasında, Strateji Sınayıcı sonuçları bir önbellekte saklar. Sonuçlar her bir girdi seti için kaydedilir. Optimizasyonun aynı parametrelerle yeniden çalıştırılması, MetaTrader 5'in önbelleğe alınan sonuçları yeniden hesaplamak yerine yeniden kullanmasına olanak tanır. Bunun istisnası, mevcut önbellek girişlerinden bağımsız olarak yeni hesaplamanın gerekli olabileceği matematiksel hesaplamalardır. Bu gibi durumlarda, proje ayarlarında 'Optimizasyon önbelleğini kullan' seçeneğini devre dışı bırakın. Önbelleğe alma devre dışı bırakıldığında bile test sonuçları saklanmaya devam eder, böylece tamamlanan tüm geçişler Strateji Sınayıcı raporlarında kullanılabilir durumda kalır.
Gösterge özellikleri:
- Sınayıcıda göstergeyi her tikte hesapla - göstergelerin gelen her tikte hesaplanmasını zorlar. Bu seçenek yalnızca Strateji Sınayıcıdaki yürütmeyi etkiler. Canlı platform ortamında, göstergeler her zaman her tikte yeniden hesaplanır.
Ancak, göstergeleri kullanan bir Uzman Danışmanı test ederken, Strateji Sınayıcı gösterge değerlerini yalnızca Uzman Danışman açıkça gösterge arabellek verilerini talep ettiğinde hesaplar. Bu, Uzman Danışman her tikte gösterge değerlerine ihtiyaç duymadığında test ve optimizasyonu önemli ölçüde hızlandırır. Göstergeniz her tikte hesaplama gerektiriyorsa, bu seçeneği etkinleştirin.
Göstergeler ayrıca aşağıdaki durumlarda her tikte zorla yeniden hesaplanır:
- Görsel test modu etkinleştirildiğinde
- Gösterge EventChartCustom(), OnChartEvent() veya OnTimer() fonksiyonlarını kullanıyorsa
- Gösterge 1916'dan önceki bir yapı ile derlenmişse
Not
Proje özellikleri her zaman kaynak kodunda belirtilen özelliklerden önceliklidir. Ayarlar hem projede hem de kaynak kodunda tanımlanmışsa (farklı değerlerle bile olsa), proje ayarları kullanılacaktır.
Kılavuzda proje dosyalarını yönetme

Otomatik dosya ekleme:
- #include ile dahil edilen dosyalar otomatik olarak Kılavuzda Dependencies altında görünür
- Header dosyaları Headers altında görünür
- #resource ile dahil edilen kaynaklar (görüntüler, sesler vb.) Resources altında görünür
- MQ5 kaynak dosyaları Sources altında görünür
Manuel dosya ekleme:
-
Dosyalar ayrıca proje içerik menüsü kullanılarak 'Mevcut Dosya Ekle' veya 'Mevcut Klasör Ekle' seçenekleriyle manuel olarak da eklenebilir. 'Mevcut Klasör Ekle' komutu, seçilen bir dizindeki tüm desteklenen dosyaları projeye toplu olarak eklemenizi sağlar.

Şekil 5: Dosyaları manuel olarak ekleme
Not
Bir dosya manuel olarak eklendiğinde, program koduna otomatik olarak dahil edilmez ve proje dizinine kopyalanmaz. Dosya basitçe projeye bağlanır, böylece proje kılavuzunda görünür.
Dosyalar, proje içerik menüsünden istenen dosya üzerinde Sil seçilerek kaldırılabilir. Projeden bir dosya silerken, sistem iki seçenek sunar:
- Kaldır - dosyayı diskte tutarken projeden çıkarır.
- Sil - dosyayı hem projeden hem de sabit sürücüden tamamen kaldırır.
Dosyaları silerken dikkatli olun. Bir kaynak dosyasının yanlışlıkla kaldırılması, kodun kalıcı olarak kaybolmasına neden olabilir.
Ek bölümler:
- Settings and files - bu bölüm test konfigürasyonları veya grafik şablonları gibi yardımcı dosyalar eklemek için kullanılabilir.
debug.tpl şablonunu kullanma
Birçok geliştirici \profiles\templates terminal dizininde bulunan debug.tpl adlı dosyayı gözden kaçırır. Bu, geliştirme ve test verimliliğini azaltan önemli bir kaçırılmış fırsattır. Şu şekilde çalışır: hata ayıklama başlatıldığında (F5 tuşu), MetaEditor MetaTrader 5 terminalinde geçici bir grafik oluşturur. Şablonlar klasöründe bir debug.tpl dosyası varsa, terminal bu dosyanın ayarlarını söz konusu grafiğe otomatik olarak uygular.
Pratik avantajı, bu şablonu gerekli tüm göstergeler, seviyeler, ızgara ayarları ve grafik özellikleriyle önceden yapılandırabilmenizdir. Örneğin, robotunuz Bollinger Bands göstergesini kullanarak işlem yapıyorsa, göstergeyi şablona eklemeniz yeterlidir. Hata ayıklama her başlatıldığında, grafik zaten tamamen yapılandırılmış olacak ve göstergeyi içerecektir; böylece manuel kurulum gerekliliği ortadan kalkacaktır.
Hata ayıklama sırasında F5 tuşuna basmak geliştirme boyunca sürekli gerçekleştiğinden, bu iş akışını önemli ölçüde kolaylaştırır.
Hata ayıklama ortamının önceden yapılandırılması
Hata ayıklama ortamı ayarları, MetaEditor’da şurada bulunur: "Araçlar → Seçenekler → Hata Ayıklama/Profilleme". Burada, hata ayıklayıcı her başlatıldığında kullanılacak varsayılan parametreleri yapılandırırsınız.

Şekil 6: Hata ayıklama ortamı ayarları
Ana hata ayıklama ve profilleme ayarları:
- Sembol - uygulamanızın tasarlandığı işlem enstrümanını (örneğin, EURUSD) ve strateji tarafından kullanılan zaman dilimini (örneğin, orta vadeli sistemler için H1) belirtin.
- Tarih - geçmiş verilerde hata ayıklarken, istediğiniz zaman aralığını hemen belirleyebilirsiniz. Strateji Sınayıcıdaki görsel testler bu aralıkta çalışacaktır.
- Profilleme sırasında optimizasyonu etkinleştir - darboğazları ararken, hangi kod satırlarının en fazla yürütme süresini tükettiğini açıkça görmek için optimizasyonu devre dışı bırakın. Ortaya çıkan performans ölçütlerinin sürüm derlemelerinden farklı olacağını unutmayın; nihai performans testleri için optimizasyonu yeniden etkinleştirin.
- Profilleme sırasında satır içi yerleştirmeyi etkinleştir - satır içi yerleştirme (inlining) etkinleştirildiğinde, fonksiyon kodu doğrudan çağrı bölgesine eklenir ve bu da yürütme hızını önemli ölçüde artırır. Ancak bu, fonksiyon profillemesini zorlaştırır. Daha temiz profilleme raporları elde etmek için, satır içi yerleştirmeyi devre dışı bırakın.
- Geçmiş verilerde hata ayıklama için görsel modu kullan - varsayılan olarak, geçmiş veriler üzerinde hata ayıklama Strateji Sınayıcı içinde görsel olmayan modda çalışır, ancak bu seçenek görsel modun manuel olarak etkinleştirilmesine olanak tanır. Geçmiş veriler üzerinde profilleme her zaman görsel olmayan modda gerçekleştirilir.
Geçmiş veriler üzerinde görsel modda profilleme genellikle anlamsızdır çünkü sistem kaynaklarının çoğu MQL mantığını yürütmek yerine grafikleri oluşturmak için harcanır. Grafik işlevselliğini (paneller, nesneler, arayüzler vb.) test etmek için, program doğrudan normal bir grafik üzerinde çalıştığından gerçek zamanlı mod genellikle yeterlidir.
- Belirtilen ayarları kullan - hata ayıklama ve profilleme için belirtilen ayarları etkinleştirir veya devre dışı bırakır. Etkinleştirildiğinde, program seçilen sembol ve zaman dilimini kullanarak başlatılır. Geçmiş veriler üzerinde hata ayıklama da görsel test için bu parametreleri kullanır. Devre dışı bırakıldığında, aşağıdaki alanlar düzenlemeye kapalı hale gelir.
Hata Ayıklama/Profilleme sekmesinde herhangi bir sembol veya zaman dilimi belirtilmezse MetaEditor, varsayılan olarak Piyasa Gözlemi penceresindeki ilk sembolü ve H1 zaman dilimini kullanır.
Derleme: Hatalar ve uyarılar
F7 tuşuna basıldığında kaynak kodu yürütülebilir bir .ex5 dosyasına derlenir. Derleme sırasında MetaEditor'daki Araç Kutusu/Hatalar sekmesi iki tür mesaj görüntüleyebilir:
- Hatalar - .ex5 dosyasının oluşturulmasını engelleyen kritik sorunlar.
- Uyarılar - potansiyel olarak çalışma zamanı sorunlarına neden olabilecek kod bölümleri (örneğin, başlatılmamış bir değişkenin kullanılması). .ex5 dosyası yine de oluşturulur, ancak uyarılar gösterilir.
Uyarılar göz ardı edilmemelidir. MetaEditor'da çalışırken en iyi yaklaşım, yalnızca Uyarı sayısı sıfıra eşit olduğunda (ve doğal olarak Hata sayısı da sıfıra eşit olduğunda) kodu test için hazır kabul etmektir. Proje ayarlarındaki derleme bayrakları, uyarıları hata olarak değerlendirerek bu disiplini uygulayabilir ve geliştiricileri yürütmeden önce kod belirsizliklerini ortadan kaldırmaya zorlayabilir.
Tüm proje dosyaları düzgün bir şekilde düzenlendikten, hata ayıklama ve profilleme ayarları yapılandırıldıktan, şablonlar hazırlandıktan ve derleyici hatasız veya uyarısız temiz bir derleme yaptıktan sonra, en önemli aşamaya geçme zamanı gelmiştir: yerleşik hata ayıklayıcıyı kullanarak mantıksal hataları belirleme ve düzeltme.
Adım Adım Hata Ayıklama: Kodunuzu Mikroskop Altında İnceleyin
Bir önceki aşamada proje yapısını oluşturduk ve gerekli tüm dosyaları ekledik, ancak algoritmanın mantığı hala sadece teoride var. MetaEditor'da adım adım hata ayıklama, çalışan bir programın içine bakmanıza, yürütmeyi herhangi bir anda duraklatmanıza ve değişkenlerin mevcut durumunu ve değerlerini incelemenize olanak tanır. Bir MQL5 programının mantığını test etmek için yerleşik hata ayıklayıcının nasıl kullanılacağına bakalım.
MetaEditor iki hata ayıklama modunu destekler: gerçek zamanlı hata ayıklama ve geçmiş üzerinde hata ayıklama. Esnekliği, hem işlem terminali hem de Strateji Sınayıcı ile derin entegrasyondan gelir. Her mod farklı görevleri çözer:
1. Gerçek Zamanlı Veriler Üzerinde Hata Ayıklama
Bu mod, F5 tuşuna basılarak MetaTrader 5 terminalinde özel bir grafikte başlatılır; bu grafik, aracı kurumun sunucusundan canlı tikler alır. Grafik, debug.tpl şablonundaki ayarları kullanarak otomatik olarak açılır. Bu mod, robot veya göstergenin canlı piyasa olaylarına tepkilerini test etmek, arayüz olay işlemesini (OnChartEvent) doğrulamak veya zamanlayıcı olaylarını (OnTimer) test etmek için idealdir.
Esasen bu, canlı olarak çalışan programdır. Kodun gelen tiklere gerçek zamanlı olarak nasıl yanıt verdiğini gözlemlersiniz. Ancak bir dezavantajı vardır: hata ayıklama hızı, gelen piyasa tiklerinin gerçek hızı ile sınırlıdır.
Bir Uzman Danışman bu modda başlatıldığında, grafiğin sağ üst köşesinde adının yanında Debugging kelimesi görünür ve grafiğin hata ayıklama modunda çalıştığını belirtir.
2. Geçmiş Veriler Üzerinde Hata Ayıklama
Bu mod, Ctrl+F5 kullanılarak Strateji Sınayıcının içinde başlatılır. Kaydedilen geçmiş tikler, seçilen aralıkta piyasa geçmişi yeniden canlandırılarak Uzman Danışmana veya göstergeye sırayla beslenir. Bu, alım-satım mantığını doğrulamak için birincil moddur. Algoritmaları yıllar süren geçmiş veriler üzerinden dakikalar içinde çalıştırmanıza ve nadir durumları (fiyat boşluğu davranışı veya yüksek volatilite olayları gibi) tespit etmenize olanak tanır.
MetaEditor ayarları, Hata Ayıklama/Profilleme sekmesinde bulunan 'Geçmiş verilerde hata ayıklama için görsel modu kullan' seçeneği aracılığıyla hata ayıklama sırasında grafiği görüntülemek için görsel modun etkinleştirilmesine de olanak tanır.
Durdurma noktaları - Dur ve düşün
Hata ayıklamanın temel unsuru Durdurma Noktasıdır. Durdurma noktası, bir kaynak kodu satırına yerleştirilen ve MetaEditor/MetaTrader 5'e bu satıra ulaşıldığında yürütmeyi duraklatması talimatını veren bir işaretleyicidir. Durdurma noktaları, satır numarasının yanındaki gri kenar boşluğuna çift tıklanarak veya imleç istenen satırdayken F9 tuşuna basılarak eklenebilir veya kaldırılabilir.

Neden durdurma noktaları kullanılmalı? Bir hatanın nerede ve neden oluştuğunu daha sonra tahmin etmeye çalışmak yerine, kodun kritik bölümlerini (lot büyüklüğü hesaplamaları veya işlem sinyali oluşturma gibi) etkin bir şekilde inceleyebilirsiniz. Yürütme, işaretli satır çalışmadan önce duraklayarak girdi değişkenlerini ve ara değerleri incelemenize, dizge içeriklerini okumanıza vb. olanak tanır. Başka bir deyişle, değişkenlerin gerçekten beklediğiniz değerleri içerip içermediğini doğrulayabilirsiniz.
Kod gezintisi - Adım adım yürütme
Yürütme duraklatıldığında, geliştirici program üzerinde neredeyse tam kontrol sahibi olur. Yapılamayacak tek şey kodu o anda düzenlemektir. MetaEditor, adım adım yürütme için üç ana komut sağlar:
- Step Into - F11 tuşuna basılarak. Bir satır kod çalıştırır. Satır bir fonksiyon çağrısı içeriyorsa, hata ayıklayıcı bu fonksiyona girer ve ilk satırında duraklar. Daha sonra F10 veya F11 tuşuna basarak fonksiyon gövdesinde satır satır ilerlemeye devam edebilirsiniz.
- Step Over - F10 tuşuna basılarak. Bir satır kod çalıştırır. Satır bir fonksiyon çağrısı içeriyorsa, hata ayıklayıcı fonksiyona girmeden tüm fonksiyonu yürütür ve bir sonraki satırda durur.
- Step Out - Shift+F11 tuşlarına basılarak. Geçerli fonksiyonun kalan kısmını yürütür ve çağıran koda döndükten hemen sonra duraklar.
Kod analiz araçları - Çağrı yığını ve gözcü penceresi
Sadece yürütmeyi durdurmak yeterli değildir. Ayrıca programın mevcut durumunu da anlamanız gerekir. Bu işlem Araç Kutusu\Hata Ayıklama sekmesi aracılığıyla gerçekleştirilir.

Şekil 7: Kod analiz araçları
Çağrı Yığını (Şekil 7'deki Call Stack penceresi) programın yürütme geçmişini görüntüler. Geçerli durdurma noktasına giden dosya ve fonksiyon zincirini gösterir. Çağrı Yığınının en üst girişi o anda yürütülen fonksiyonu temsil eder. Şekil 7'de, bu OnCalculate() fonksiyonudur. Alttaki giriş, giriş noktasını temsil eder. Şekil 7'de, yine OnCalculate() fonksiyonudur - bu durumda eşleşiyorlar. Çağrı Yığını listesindeki ilk sütun dosya adını, son sütun ise satır numarasını gösterir.
Çağrı yığınında herhangi bir fonksiyona çift tıklandığında editör imleci anında o fonksiyonun çağrıldığı satıra gider. Bu, derin iç içe fonksiyon çağrıları içeren karmaşık programları analiz ederken vazgeçilmezdir.
Gözcü Penceresi (Şekil 7'teki Watch penceresi) değişken değerlerinin gerçek zamanlı olarak izlenmesini sağlar. Gözcü Listesine bir değişken eklemek için kodda değişkeni seçin ve Shift+F9 tuşlarına basın (veya içerik menüsünden Gözcü Ekle'yi seçin); değişken listeye eklenecektir. Her yürütme adımından sonra (F10 veya F11), izlenen değişkenler yenilenir. Değişen değerler kolaylık sağlamak için vurgulanır.
Değerlere ve adlara ek olarak, Gözcü penceresi değişken türlerini de görüntüler. Diziler için liste, belirtilmişse boyutu ve zaman serisi özniteliğini (Series) gösterir.
a+b gibi basit ifadeleri doğrudan gözcü listesine girebilir ve kaynak kodunu değiştirmeden sonucu hemen görebilirsiniz. Genişletilebilir listeler, yapıların ve dizilerin içeriğinin görüntülenmesini sağlar.
Yerleşik MetaEditor hata ayıklayıcı, hata ayıklamayı yapılandırılmış bir analitik sürece dönüştürür. Zamanı kontrol eder (geçmiş üzerinde veya gerçek zamanlı yürütme), alanı yönetir (çağrı yığını aracılığıyla) ve durumu görüntülersiniz (değişken incelemesi aracılığıyla). Bu, programlardaki mantıksal hataları bulmayı ve düzeltmeyi çok daha hızlı hale getirir.
Ancak program doğru bir şekilde çalıştığında, başka bir soru ortaya çıkar: Yeterince hızlı mı? Kod çalışıyor ancak kötü performans gösteriyorsa, MetaEditor'ın sunduğu bir sonraki araç gerekli hale gelir: Profilleyici.
Profilleyici ile Darboğazları Bulma veya Program Performansını İyileştirme
Çoğu durumda, performans sorunları verimsiz koddan kaynaklanır. İşte bu noktada Profilleyici çok değerli hale gelir - her fonksiyonun ve hatta tek tek kod satırlarının yürütme süresini ölçen bir araç.
Yürütme hızını profillemeden önce, derleyici optimizasyonlarının devre dışı bırakıldığından emin olun. MetaEditor'da Araçlar/Seçenekler'i açın ve Hata Ayıklama/Profilleme sekmesine gidin. Bu neden önemli? Varsayılan olarak, derleyici kodu optimize eder: gereksiz değişkenleri kaldırır, eylem gruplarını birleştirir ve fonksiyon satır içi yerleştirme (inlining) uygular.
Optimize edilmiş kod için profilleme etkinleştirilirse, gerçek yürütme yapısı ve sırası artık düzenleyicide gördüklerinizle eşleşmediğinden sonuçların yorumlanması zorlaşır. Profilleyici "dürüst" kodla çalışmalıdır.
Gerçek zamanlı veriler üzerinde profilleme
Gerçek zamanlı çalışan programlar için yürütme hızı kritik öneme sahiptir. MetaEditor, farklı kod bölümlerinin yürütme maliyetini değerlendirmek için uygun bir yol sağlar. Bunu yapmak için kod profillemeyi başlatın ve programın bir süre çalışmasına izin verin. Gösterge profilleme için genellikle birkaç dakika yeterlidir.
Profilleme, MetaEditor menüsü kullanılarak özel bir grafik üzerinde başlatılır: Hata Ayıklama/Gerçek Veriler Üzerinde Profilleme Başlat. Bu, arayüz yanıt verebilirliğini veya gelen tik işlemeyi değerlendirmek için kullanılabilir.
Notlar
- Başlattıktan sonra, robotun tüm kritik fonksiyonların yürütülmesi için yeterince uzun süre çalışmasına izin verin: başlatma, gösterge hesaplamaları, alım-satım işlemleri. Bir fonksiyon hiç çağrılmazsa, raporda görünmeyecektir.
-
Maksimum doğruluk için, Durdur (Shift+F5) tuşuna basarak hata ayıklamayı durdurmamanız önerilir. Bunun yerine, Uzman Danışmanı veya göstergeyi doğrudan grafikten kaldırın. Bu, tüm süreçlerin düzgün şekilde kapatılmasını ve profilleme istatistiklerinin doğru şekilde kaydedilmesini sağlar.

Geçmiş veriler üzerinde profilleme
Geçmiş verilerde profilleme MetaEditor menü komutu aracılığıyla başlatılır: Hata Ayıklama/Geçmiş Veriler Üzerinde Profilleme Başlat. Bu modda, profilleme Strateji Sınayıcının içinde çalışır. Bu, darboğazları bulmak için birincil moddur çünkü programın geniş geçmiş aralıklarında çok hızlı bir şekilde test edilmesini sağlar.
Sonuçların analiz edilmesi
Profilleme tamamlandıktan sonra sonuçlar Araç Kutusu/Profilleyici sekmesinde görünür. Her bir fonksiyon için iki temel ölçüt görüntülenir:
- Toplam CPU aktivitesi - bir fonksiyonun çağrı yığınının içinde geçirdiği zamanın yüzdesini gösterir. Bu, fonksiyonun kendisinin yürütülmesini ve çağırdığı tüm fonksiyonların içinde harcanan zamanı içerir.
- Öz CPU aktivitesi - iç içe çağrılar hariç olmak üzere, yalnızca fonksiyonun kendi içindeki komutları yürütmek için harcanan zamanın yüzdesini gösterir.

Şekil 8: Gerçek zamanlı profilleme sonuçları - Çağrılara Göre Fonksiyonlar
Profilleme sonuçlarını anlama
Şekil 8'i inceleyelim. Yeşil oklarla işaretlenmiş üç fonksiyon en yüksek aktivite seviyelerini göstermektedir. Bunlar, gösterge tarafından kullanılan olay işleyicileridir (f→ simgesiyle tanımlanır). Bunlar OnInit(), OnDeinit(), OnCalculate()'dir. İlk iki fonksiyon hem Toplam Aktivite hem de Öz Aktivite için sıfıra yakın değerlere sahiptir. Bu beklenen bir durumdur, çünkü yalnızca başlatma ve kapatma sırasında çalışırlar. Nispeten basit görevleri yerine getirirler:
- OnInit(), gösterge arabelleklerini yapılandırır ve standart Bollinger Bands göstergesi için bir tanıtıcı oluşturur;
- OnDeinit() - Bollinger Bands tanıtıcısını serbest bırakır ve yorum dizgesini temizler.
Üçüncü OnCalculate() fonksiyonu, Toplam Aktivite = %99.9 göstermektedir. Bu da beklenen bir durumdur. OnInit() başarıyla tamamlandıktan sonra, gösterge ömrünün neredeyse tamamını gelen tiklerin işlenmesiyle geçirir, bu nedenle işleme süresi bu fonksiyonda harcanır.
Ancak, son derece yüksek Toplam Aktiviteye rağmen, OnCalculate() çok düşük Öz Aktivite = %0.23 değerine sahiptir. Bu bize fonksiyonun kendisinin hızlı olduğunu, ancak dahili olarak çok daha yavaş olan başka bir fonksiyonu çağırdığını söyler. Dolayısıyla, optimizasyon gerekiyorsa, OnCalculate()'in kendisini değil, çağırdığı her şeyi optimize etmeliyiz.
Daha fazla araştırma yapmak için profilleyici görünümünü 'Satırlara Göre Fonksiyonlar' olarak değiştirin:

Şekil 9: Gerçek zamanlı profilleme sonuçları - Satırlara Göre Fonksiyonlar
Şekil 9'da en yüksek Toplam Aktiviteye sahip satırın standart gösterge arabellek kopyalama fonksiyonuna yapılan üç çağrıyı içerdiğini görebiliriz: CopyBuffer(...). Bu sistem düzeyinde bir fonksiyondur. Kendi başına hızlıdır, ancak dahili olarak terminal kernel fonksiyonlarını çağırır. Terminalin dahili uygulamasını optimize edemeyiz, ancak aktarılan veri miktarını (çubuklar) azaltabiliriz. Ancak bizim durumumuzda, sadece en son işlenmemiş çubuklar kopyalandığı için bu zaten optimize edilmiştir.
Sonuç olarak, basit göstergemizin halihazırda oldukça verimli bir şekilde uygulandığı sonucuna varabiliriz.
Verileri dışa aktarma
Daha fazla analiz için profilleme sonuçları Open XML (Excel), HTML veya CSV formatlarına dışa aktarılabilir. Bu, farklı algoritma sürümlerinin performansını karşılaştırmak veya proje optimizasyonlarının geçmişini tutmak için kullanışlıdır.
Peki ya programda, artık yalnızca MQL5 kullanılarak optimize edilemeyecek bir darboğaz tespit ederseniz ne olur? Örneğin, karmaşık istatistiksel hesaplamalar veya kriptografik süreçler kapsamlı optimizasyondan sonra bile hala çok fazla zaman tüketiyorsa ne olur? Bu durumda, MetaEditor sandbox'ının dışına çıkmak gerekir. C++'ın gücünün bir MQL5 projesine doğrudan nasıl entegre edilebileceğini görelim.
C++ Entegrasyonu: MQL5 Yerini Ne Zaman Yerel Koda Bırakır?
MQL5, performans açısından kritik bileşenlerin C++ dilinde yazılmış dinamik kütüphanelere (DLL'ler) taşınmasına olanak tanır. Gerektiğinde, ek yürütme hızı kazanmak için performans açısından kritik parçaları yerel C++ koduna taşıyabilirsiniz. İşte bu noktada MetaEditor bir geliştirme ortamı olarak benzersizliğini ortaya koyuyor ve diller arasındaki sınırı etkili bir şekilde kaldırıyor.
C++'a geçiş kendi içinde bir amaç haline gelmemelidir. Bu, bakım karmaşıklığı ile yürütme hızı arasında bir denge meselesidir. Aşağıdaki durumlarda bu yaklaşımı kullanın:
- Profilleyici, bir fonksiyonun orantısız miktarda CPU kaynağı tükettiğini ve algoritmik olarak basitleştirilemediğini gösterdiğinde.
- MQL5'te eşdeğeri olmayan hazır çözümler (örneğin, makine öğrenimi kütüphaneleri veya özelleşmiş matematik paketleri) kullanmanız gerektiğinde.
Sanal alım-satım istatistiklerinin hesaplanmasını ve görüntülenmesini ekleyerek deneysel göstergemizi geliştirelim. Hesaplamalar için başlangıç tarihi göstergenin girdi parametreleri aracılığıyla belirtilecektir. Göstergenin güncellenmiş versiyonu aşağıda gösterilmiştir:

Şekil 10: İstatistiksel hesaplamalar ile test göstergesi
Kaynak kodunun tamamı bu makaleye ekli BB_Signal_Stat_Indicator_V2.mq5 dosyasında mevcuttur.
Şimdi göstergeyi profilleyicide çalıştıralım:

Şekil 11: Geçmiş istatistiksel hesaplamalarla göstergenin profillenmesi
Yeni bir istatistik fonksiyonu görünüyor: CalculateVirtualStats(). Uygulamanın ticari sürümlerinde gelecekteki genişleme ve daha gelişmiş hesaplamalar için bunu bir DLL'e taşımaya karar verdiğimizi varsayalım. Bu durumda, istatistik motorunu güncellemek için projenin tamamını yeniden derlemeye gerek kalmadan yalnızca DLL kütüphanesini değiştirmek yeterlidir.
C++ düzenleyicisi olarak MetaEditor
Birçok geliştirici MetaEditor'ın MQL ile sınırlı olmadığının farkında değildir. C++ kaynak dosyaları (.cpp ve .h) ile de .mq5 dosyaları ile olduğu kadar kolay çalışabilir. MetaEditor içinde bir kütüphane nasıl oluşturulur:
- Proje klasörünüzün içinde bir .cpp dosyası oluşturun (örneğin, Libraries bölümünde).
- Fonksiyon kodunu yazın. MQL5'in kütüphane ile doğru şekilde etkileşime girebilmesi için __stdcall veya __cdecl çağrı kuralını kullanmak önemlidir.
- F7'ye (Derle) basın. MetaEditor otomatik olarak harici bir derleyici çağırır ve DLL dosyasını oluşturur. C++ derlemesi için MetaEditor, bilgisayarınızda yüklü olan Microsoft Visual Studio'yu kullanır (Express ve Community sürümleri dahil olmak üzere Visual Studio 2008 veya üstü).
Visual Studio mimarisi MetaEditor kurulumunuzun mimarisiyle eşleşmelidir, yani Microsoft Visual Studio'nun 64 bit sürümüne ihtiyacınız vardır. MetaTrader 5 ve MetaEditor yalnızca 64 bit Windows işletim sistemlerini destekler.
Bir DLL'deki fonksiyonları MQL5 koduna aktarmak için aşağıdaki bildirimi kullanın:
//+------------------------------------------------------------------+ //| Import function from DLL | //+------------------------------------------------------------------+ #import "StatsCalculator.dll" void CalculateStatsDLL(const TradeRecord &p_history[],int p_trade_count,double initial_balance,VStatResult &res); #import
Burada tek bir fonksiyon içe aktarılır: CalculateStatsDLL(). Bu fonksiyon, sağlanan sanal alım-satım işlemlerini kullanarak alım-satım istatistiklerini hesaplar. Sonuçlar, DLL içinde dahili olarak doldurulan VStatResult &res yapısı aracılığıyla geri döndürülür.
Gösterge kodunun içinde, orijinal istatistik fonksiyonu şu şekilde değiştirilmelidir:
//+------------------------------------------------------------------+ //| Wrapper for DLL function call | //+------------------------------------------------------------------+ void CalculateVirtualStats(const TradeRecord &p_history[],int p_trade_count,double initial_balance,VStatResult &res) { //--- validate trade count (comparing arrays with NULL is prohibited in MQL5) if(p_trade_count<=0) return; CalculateStatsDLL(p_history,p_trade_count,initial_balance,res); }
Ek bir kontrol, işlem dizisinin boş olmamasını sağlayarak çalışma zamanı hatalarına karşı ekstra koruma sağlar. DLL uygulamasını kullanan tam gösterge kaynağı, bu makaleye ekli BB_Signal_Stat_Indicator_DLL.mq5 dosyasında mevcuttur.
Algoritma hata ayıklaması yapıldıktan, performansı optimize edildikten ve kritik bileşenler C++'a taşındıktan sonra son aşama başlar - bitmiş ürünü korumak. Ticari algoritmik alım-satımda, strateji kaynak kodu birincil varlıktır.
Nihai EX5 Dosyasının Korunması: Fikri Mülkiyet için Bulut Kalkanı
EX5 yürütülebilir formatı halihazırda kaynak koda dönüştürmeye (decompilation) karşı oldukça dirençli olmasına rağmen, ticari dağıtım ek garantiler gerektirir. İşte bu noktada MQL5 Cloud Protector hizmeti devreye giriyor. Daha da yüksek bir koruma seviyesi sağlar.
Koruma nasıl çalışır: Ödün vermeyen kriptografi
Birçok geliştirici, kaynak kodunun sızmasından korktukları için bulut tabanlı koruma hizmetlerine temkinli yaklaşıyor. MQL5 Cloud Protector bu riskleri tamamen ortadan kaldırmak için özel olarak tasarlanmıştır.
- Yerel derleme: Program ilk olarak kullanıcının yerel makinesinde bir EX4/EX5 dosyasına derlenir. Ek koruma yalnızca derlenmiş yürütülebilir dosyaya uygulanır - kaynak kodu hiçbir zaman hiçbir yere iletilmez.
- Yalnızca ikili verilerin iletimi: Dosyanın yalnızca yürütülebilir kısmı, modern asimetrik algoritmalar kullanılarak şifrelendiği ve benzersiz bir özel anahtarla imzalandığı çevrimiçi hizmete güvenli bir bağlantı yoluyla gönderilir.
- Yerel derleme ve şifreleme: Sunucu tarafında modern asimetrik şifreleme uygulanır. Kod, MetaTrader Mağazasında kullanılan aynı koruma türü olan yerel makine koduna dönüştürülür. Tek fark, ortaya çıkan dosyanın belirli bir bilgisayara bağlı olmamasıdır. Standart bir EX4/EX5 uygulaması gibi herhangi bir makinede çalışabilir.
Bu koruma seviyesi, EX5 programının tersine mühendislik ve modifikasyonunu neredeyse imkansız hale getirir.
Korumanın yürütülebilir dosyaya entegre edilmesi: Ticari standart
Ek korumalı bir yürütülebilir dosya oluşturmak için projeyi veya ana MQL kaynak dosyasını açın ve Araçlar → MQL5 Cloud Protector'ı çalıştırın. Bu, otomatik bir derleme ve bulut işleme sürecini başlatır. Nihai yürütülebilir dosya, proje veya ana MQ5 kaynak dosyası ile aynı dizinde oluşturulur.

Şekil 12: Korumayı yürütülebilir dosyaya entegre etme
MQL5 Cloud Protector, ticari dağıtımla ilgili üç ana görevi çözer:
- Kaynak koda dönüştürmenin önlenmesi
- Esnek dağıtım
- Performansı koruma ve hatta iyileştirme - kod gizleme (obfuscation) tekniklerinin aksine, bulut tabanlı yerel derleme, makine komutu düzeyinde optimizasyon yoluyla yürütme hızını korur veya iyileştirir.
Nihai yürütülebilir dosyanın korunması, bu makalenin başında açıklanan geliştirme döngüsünün mantıksal sonucudur. MQL5 Cloud Protector ile ürününüz bir prototipten ölçeklendirmeye hazır güvenli bir ticari çözüme dönüşür.
Sonuç
Rekabetin milisaniyelerle ölçüldüğü ve bir hatanın maliyetinin tüm bir bakiyeye eşit olabildiği modern algoritmik alım-satımda geliştirme kalitesi, programcı ve algo yatırımcının hakim olduğu araçların karmaşıklığına bağlıdır. Bir MQL5 uygulamasının tüm yaşam döngüsü boyunca ilerledik: ilk fikirden bitmiş ürünün nihai kriptografik korumasına kadar.
Temel sonuç açıktır: MetaEditor, MetaTrader 5'i seçmek için MQL5 dilinin kendisi kadar güçlü bir argümandır. Bir programlama dili neyin inşa edilebileceğini tanımlar. Bir geliştirme ortamı ise bunun ne kadar hızlı, güvenilir ve verimli bir şekilde oluşturulabileceğini belirler. MetaEditor, kodlama sürecine yapı ve disiplin getirir:
- Yerleşik hata ayıklayıcı, çağrı yığınlarının ve değişken durumlarının/değerlerinin hassas bir şekilde incelenmesiyle sonu gelmeyen tahminlerin ve günlük analizinin yerini alır.
- Profilleyici, öznel izlenimleri sayılarla değiştirerek nesnel performans ölçütleri sağlar.
- DLL'ler aracılığıyla C++ ile entegrasyon, hesaplama açısından yoğun görevler için yüksek seviyeli bir dilin sınırlamalarını ortadan kaldırır.
- MQL5 Cloud Protector, fikri mülkiyet koruması sorununu çözerek algoritmaların ticari dağıtımını hem güvenli hem de meşru hale getirir.
Tüm bu araçlara hakim olan bir geliştirici, fikirden uygulamaya giden yolu kısaltır ve önemli bir rekabet avantajı elde eder. Ve tüm iş akışı tek bir MetaEditor arayüzü üzerinden yönetilir.
MetaEditor ve MetaTrader 5'i öğrenmek için önerilen materyaller:
- MetaEditor Yardımı konuları: Hata Ayıklama, Profilleme, C++ DLL, and Cloud Protector.
- Makale: MetaTrader 5'te bir alım-satım stratejisi nasıl hızlı bir şekilde geliştirilir ve hata ayıklaması yapılır?
Eklerin listesi:
| Dosya adı | Açıklama |
|---|---|
| BB_Signal_Ind.mq5 | Sinyalleri grafik üzerinde oklar şeklinde görüntüleyen bir test göstergesinin kodu |
| BB_Signal_Stat_Indicator_V1.mq5 | Oklar şeklinde sinyaller ve sanal alım-satım istatistiklerini görüntüleyen bir test göstergesinin kodu |
| BB_Signal_Stat_Indicator_V2.mq5 | Oklar şeklinde sinyaller, sanal alım-satım istatistikleri ve bakiye eğrisini görüntüleyen bir test göstergesinin kodu |
| BB_Signal_Stat_Indicator_DLL.mq5 | Oklar şeklinde sinyaller, sanal alım-satım istatistikleri ve bakiye eğrisini görüntüleyen ve ayrıca bir DLL kütüphanesi kullanan bir test göstergesinin kodu |
| StatsCalculator.zip | Visual Studio 2019'da sanal alım-satım istatistiklerini hesaplamak için bir DLL oluşturma kodu |
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/22395
Uyarı: Bu materyallerin tüm hakları MetaQuotes Ltd'ye aittir. Bu materyallerin tamamen veya kısmen kopyalanması veya yeniden yazdırılması yasaktır.
Yeni Raylara Adım Atın: MQL5'te Özel Göstergeler
Harici Kütüphaneler Kullanmadan 3D Görselleştirme: MetaTrader 5, MQL5 + DX11 ile Optimizasyon Sonuçlarını Nasıl Gösteriyor?
İşte Karışınızda Yeni MetaTrader 5 ve MQL5
MetaTrader 5: Stratejinize Uygun Bir Piyasa Oluşturun - Özel Sembollerde Renko/Aralık/Hacim, Sentetikler ve Stres Testleri
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Web sitesi politikasını ve kullanım şartlarını kabul edersiniz

