Pratik uygulama

EA yalnız MT5 görsel testinde çalışıyor: neden?

Grafik nesnesi ile sayısal sinyali ayırın. İşlemsiz mod kaydı, yerel benzetim ve TRY hassasiyet karşıörneğiyle ilk farkı bulun.

Sarı zeminde ince turuncu dik çizgiyle ayrılan iki siyah blok ızgarası; her biri üç sütun ve dört sıra. Solda ikinci sıranın ortası, sağda ikinci sıranın sağı turuncu; uzun gölgeler ve görünür yazı yok.
Yapay zekâ ile üretilmiş editoryal illüstrasyon; gerçek tester ekranı veya iki deneyin veri çıktısı değildir.

Kaldıraçlı forex ve CFD işlemleri kısa sürede kayba yol açabilir. İçerik eğitim amaçlıdır; kişiye özel yatırım tavsiyesi içermez.

Bu makalede

Bu makaleyi okuduktan sonra…

  • Belgelenmiş grafik kısıtını sayfa modelindeki null durumundan ayırabilirsiniz.
  • İşlem yapmayan tanı koduyla mod ve sürüm alanlarını kaydetmenin sınırlarını açıklayabilirsiniz.
  • İlk ayrışmayı girdi, kullanılabilirlik ve tam sayısal hassasiyetle inceleyebilirsiniz.

Kavramları makaleden ayrılmadan öğrenin

Expert Advisor (EA) — uzman danışman Backtesting — geçmiş veriyle strateji testi

Yalnız MT5 görsel testinde çalışan bir EA için kararın veriye mi, grafikte çizilen nesneye mi bağlı olduğunu inceleyin. Grafik nesnesi açıkça hesaplanmış sinyal değerinin yerine geçmemelidir. Stratejiyi değiştirmeden modları, sürümleri, veriyi ve kayıtlardaki ilk farkı karşılaştırın. Buradaki özgün benzetim MT5 çalıştırmaz: sayıyı kullanılamayan girdiden ayırır, eksikliği sıfır yapmaz ve emir göndermez.

Görsel modda gerçekte ne değişir?

MQL5 tester belgesi, görsel olmayan test ve optimizasyonda grafik nesnelerinin çizilmediğini; oluşturulan nesnenin özellikleri sorgulandığında sıfır değerler alındığını belirtir. Bu kısıt görsel moda uygulanmaz. Belgelenmiş platform davranışını açıklıyoruz; sizin EA’nız üzerinde yapılmış deneyden söz etmiyoruz. Testler arasındaki her farkın aynı nedenden çıktığı sonucu çıkarılamaz.

EA çizgi fiyatını veya düğme durumunu girdi olarak okuyorsa o aşamayı gösterge ve fiyat verisinden ayrı kaydedin. Önce o modda kullanılabilir değer bulunup bulunmadığını belirleyin. Açık “kullanılamaz” durumu hesaplamayı durdurabilir; teknik sıfırı gerçek fiyat gibi kabul etmek teşhisi saptırır. Grafiğin görünmesi kullanılan bütün girdilerin hazır olduğunu kanıtlamaz.

Sayısal sinyal grafik nesnesinden nasıl ayrılır?

İşlemsiz, özgün benzetim. Pozitif sinyal 1,1050; eşik 1,1040 olsun. Kural “sinyal eşikten büyük” biçimindedir. Açık sayıyı, kullanılamaz işaretlenmiş nesne okumasıyla karşılaştırırız. Bunlar MT5 kotasyonları veya gerçekleşme kayıtları değildir; veri akışını göstermek için seçilmiş durumlar ve sayılardır.

Eksik girdi sıfır fiyat değildir

Eksik girdi sıfır fiyat değildirVarsayımsal sayısal sinyal 1,1050, eşik 1,1040’tan büyüktür. Kullanılamayan nesne bizim modelimizde null olur; bu yoldaki koşul değerlendirilmez. Bu, MT5 fonksiyonunun null döndürdüğü iddiası veya gerçekleşmiş işlem değildir.Açık sayısal değer1,1050Eşik: 1,1040Nesne kullanılamaznullGirdi değeri yokModel sonucudoğru / bilinmiyorİşlem talebi yokDeğeri ve kullanılabilirliği ayrı kontrol edin.Özgün model — varsayımsal değerler.
1,1050 > 1,1040 doğrudur. Kullanılamayan nesne modelde null olarak korunur ve o koşul değerlendirilmez.
Yanlış koşul ile değerlendirilemeyen koşul ayrı
YolGirdiDeğerlendirme
Açık sayısal sinyal1,10501,1050 > 1,1040: doğru
Kullanılamayan nesnenull: değer yokKoşul değerlendirilmez
Hatalı ikameYokluk yerine 00 > 1,1040: sıradan yanlış gibi görünür

Son satır hatalı varyanttır. Korunan yolda eksik okuma null kalır; diğer varyant sıfır ikamesinin sonucunu gösterir. Sıfır sayıdır, null ise modelin yokluk durumudur. Ters kuralda, “sinyal eşikten küçük” karşılaştırmasında sahte sıfır koşulu sağlamış bile görünür. Rastgele yedek sayı koyarak programı onardığınızı varsaymayın. Eşit sayılarla kesin büyüktür koşulu yanlıştır; bu, girdinin yokluğu değildir.

Veriyi grafik nesnesinden ayırın

Öğretici örneğimiz tarayıcınızda yerel çalışır: hesaba veya API’ye bağlanmaz, girdilerinizi göndermez ya da kalıcı kaydetmez. Parola veya kişisel bilgi girmeyin.

Bu, kuralımızın benzetimidir; MT5 içinde EA testi değildir. 10⁻⁸–10⁸ aralığında, en çok 15 basamaklı pozitif sayı kullanın. Ondalık virgül veya nokta kabul edilir; bilimsel gösterim ve binlik ayırıcı kullanmayın. Modelimizde eksik nesne verisi null değeridir; ayrı bir hatalı sürüm bunun yerine sıfır koyar. Sonuç, EA arızanızın nedenini kanıtlamaz.

Sinyal ve eşikte 1,1050 veya 1.1050 yazabilirsiniz. Binlik ayırıcı kullanmayın; 1.000 gibi belirsiz girişler reddedilir.

Araç iki pozitif, sonlu değeri değiştirmenize izin verir. Araca ondalık virgül veya noktayla pozitif sayı girebilirsiniz; binlik ayırıcı kullanmayın. 10⁻⁸–10⁸ aralığı ve en çok 15 basamak geçerlidir. Görsel olmayan modelde nesne kullanılamaz; görsel modelde sinyal değerini taşır. Bu, tüm MT5 davranışının kopyası değil, bu sayfanın açık benzetim kuralıdır.

Açık sayı değerlendirilirken eksik nesne yolunda sonuç bilinmiyor kalır. Sayfa grafik okumaz, tester veya hesap/API çalıştırmaz; girdileri göndermez ve kalıcı saklamaz. Alıştırma yanlış sonuçla değerlendirme yapılamamasını ayırır, yatırım sinyali üretmez. Gerçek EA arızasının nedenini yalnız bu araçla belirleyemezsiniz; başarıyı daha yüksek kâr hanesine bakarak da ölçmeyin.

İşlem yapmadan program modu nasıl kaydedilir?

MQL_TESTER, MQL_VISUAL_MODE ve MQL_OPTIMIZATION bayrakları programın ortamını bildirir. TERMINAL_BUILD terminalin derleme numarasıdır. Pencere görünümünden modu tahmin etmek yerine gerçek okumaları kaydedin. Aynı bayraklar veri ve parametrelerin de aynı olduğu anlamına gelmez; onlar ayrı kayıtlardır.

Aşağıdaki küçük bağımsız tanılama EA’sı OnInit içinde yapılandırmayı kaydeder, OnTick gövdesini boş bırakır. Emir göndermez veya değiştirmez. OnInit belgesi başlangıç imzasını, PrintFormat belgesi biçimli çıktıyı açıklar. Ayrı MQ5 dosyası olarak kaydedip kendi MetaEditor’ünüzde derleyin; gerçek derleme sonucu ve günlükleri saklayın. Burada native derleme yaptığımızı iddia etmiyoruz.

#property strict
int OnInit()
{
   PrintFormat("tester=%d visual=%d optimization=%d build=%d symbol=%s period=%d",
      (int)MQLInfoInteger(MQL_TESTER),
      (int)MQLInfoInteger(MQL_VISUAL_MODE),
      (int)MQLInfoInteger(MQL_OPTIMIZATION),
      (int)TerminalInfoInteger(TERMINAL_BUILD),
      _Symbol, (int)_Period);
   return INIT_SUCCEEDED;
}
void OnTick() {}

Mevcut EA’ya ikinci OnInit eklemeyin veya başlangıç işlevini bu örnekle değiştirmeyin. Kayıt eklerken mevcut akış korunmalıdır. Tester belgesinde optimizasyon sırasında PrintFormat için OnInit istisnası vardır; diğer aşamaların her birinden mesaj görünmemesi o aşamaların hiç çalışmadığını kanıtlamaz. Kodun tester/visual/optimization/build/symbol/period etiketleri ve tür belirteçleri makine kaydının parçası olarak korunmuştur.

Kârı değil ilk farkı nasıl bulursunuz?

Eşleştirilmiş iki çalışma kaydı hazırlayın: görsel/görsel olmayan mod, terminal ve kod sürümleri, girdiler, sembol ve zaman dilimi, tick üretimi, istenen ve gerçek başlangıç, veri kopyası, maliyetler ve ilk durum. Ayar dosyalarını ve sürüm kimliklerini de koruyun. Beyanlar farklıysa bütün sonucu grafik penceresine atfetmeyin. İki çalışma kaydı karşılaştırıcısı bu düzeni destekler.

İlk farklı aşamayı arayın: alma başarısı, veri zamanı, gösterge hazırlığı, sinyal, koşul veya karar. “Kâr 80 yerine 120” notu o aşamayı göstermez. Asıl günlükleri değiştirmeyin; yanlarına küçük karşılaştırma tablosu koyun. Programın geçmişte kaydetmediği değeri sonradan olmuş gibi doldurmayın.

Tanı kaydı iki çalışmadaki olayları eşleştirecek kadar açık ve küçük olmalıdır. Sabit kimlik olmadan her şeyi yazmak ilk ayrışmayı saklayabilir. İstenen girdi, gözlem kimliği, zaman veya sıra konumu ve kabul durumu kaydedilsin. Benzer fiyatları aynı olay sanmak yerine aynı kimliğin aşamalarını izleyin. Bu bir kayıt tasarımıdır; her gizli bağımlılığı otomatik keşfetme garantisi değildir.

TRY örneği: iki kayıt aynı görünüp koşulda ayrışabilir

Kurgu EUR/TRY tabanlı iki sinyal değeri A’da 40,104, B’de 40,103 olsun; ikisi de kullanılabilir ve aynı gözlem kimliğine aittir. Kesin eşik 40,1035’tir. A > eşik doğru, B > eşik yanlıştır. İki ondalık haneye yuvarlanmış günlük her iki sinyali 40,10 gösterebilir. Eşiği de iki haneye yuvarlamak onu 40,10 gösterir. Böyle bir ekran, ilk fark bulunmadığını kanıtlamaz.

Burada işlem veya piyasa kotasyonu yoktur. Ayrı ölçek karşılaştırması için 1.000 EUR ile (sinyal−eşik) çarpımı A’da +0,50 TRY, B’de −0,50 TRY’dir; iki sinyal arası farkın karşılığı 1 TRY’dir. Bunlar gerçekleşmiş kâr/zarar değildir. Gösterimde kaybolan basamak, parasal ölçek sıfır demek değildir. Kararda kullanılan tam değeri ve sürümünü saklayın; yalnız iki haneli metni yeniden okuyup eski hesabın doğru kopyası sanmayın.

Aynı görünen metin, farklı karar girdisiKurgu EUR/TRY sinyalleri; ikisi de kullanılabilir. Kesin eşik 40,1035; iki ondalık gösterimde iki sinyal de 40,10.VARSAYIMSAL HESAPLAMAA kaydındaki tam hassasiyetlideğer40,104 > 40,1035: doğruB kaydındaki tam hassasiyetlideğer40,103 > 40,1035: yanlışYalnız iki haneli günlükA = B = 40,10 görünür
Aynı görünen metin, farklı karar girdisi. Kurgu EUR/TRY sinyalleri; ikisi de kullanılabilir. Kesin eşik 40,1035; iki ondalık gösterimde iki sinyal de 40,10.

Kullanılabilirliği ve kararın gerçek hassasiyetini birlikte kaydedin. Biçimlenmiş ekran metni ham sayısal girdinin yerine geçmez.

Küçük ekranda şemayı yatay kaydırabilir veya büyütebilirsiniz. Değerler ve sonuç aşağıdaki metinde de yer alır.

A kaydındaki tam hassasiyetli değer
40,104 > 40,1035: doğru – 1.000 EUR ölçekli fark +0,50 TRY; gerçek PnL değil.
B kaydındaki tam hassasiyetli değer
40,103 > 40,1035: yanlış – Aynı ölçekli fark −0,50 TRY; iki sinyal arası 1 TRY.
Yalnız iki haneli günlük
A = B = 40,10 görünür – Görünür eşitlik, kararın tam girdilerinin eşitliği değildir.

Sinyal tasarımında ne değişmeli?

Hesaplama açık değerle beraber kullanılabilirlik durumu döndürsün; çizim katmanı bu değeri göstersin. Böylece çizimi kapatmak girdinin kaynağını kasıtlı olarak değiştirmez. Aynı modülü eksik veri ve eşik eşitliği dahil birkaç kontrollü girdiyle kontrol edin. Bu, bütün tester sonuçlarının eşitliğini garanti etmez; sürüm, veri, maliyet ve diğer kod bağımlılıkları hâlâ önemlidir.

MetaQuotes’un grafik nesneleri bölümündeki görsel mod istisnası, belgeye dayalı davranış açıklamasıdır; kendi EA’nızda nedenin kanıtı için günlük gerekir. Kaynak kod yoksa EA yazarına iki çalışma kaydını ve ilk belgelenmiş ayrışmayı verin. Teşhis yerine peş peşe canlı deneme emirleri kullanmayın. MT4 ve MT5 test hazırlığı daha geniş kontrol sırasını açıklar.

Sonraki somut adımlar

  1. İki modun kaydını tamamlayın. Kod, terminal, girdi, veri ve aralığı koruyun; bilinmeyen alanı işaretleyin. Aynı EA dosyası diğer bütün koşulların eşit olduğunu kanıtlamaz.
  2. Yokluğu sıfırdan ayırın. Sinyal 1,1050 ve eşik 1,1040 ile başlayın, sonra eşit değerleri deneyin. Nesne kullanılamadığında açık sayısal yolun sonucundan bağımsız olarak null kaldığını kontrol edin. İşlem hesabı gerekmez.
  3. İlk ayrışan aşamayı kaydedin. Ayrı demo yapılandırmasında veya tester içinde işlemsiz günlükleri toplayıp sırayı karşılaştırın. Girdi, kullanılabilirlik ve koşulu ayırın. Tanı kaydı güvenlik, kârlılık veya yatırım önerisi kanıtı değildir.

Anladığınızı kontrol edin

Alıştırma: yaklaşık 3 dakika.

Eşik 1,1040. Nesne okuması kullanılamaz. Modelimiz “eşikten büyük” koşuluna ne yapar?

Yanıtı ve açıklamayı göster

Doğru. Bu sayfa modelinin semantiğidir; MT5 fonksiyonunun null döndürdüğü iddiası değildir.

Diğer sorular

Modelin null değeri MT5 fonksiyonunun null döndürmesi mi?
Hayır. Belge, görsel olmayan testte nesne özellikleri sorgulandığında sıfır değerlerden söz eder. Null, bizim kullanılamayan girdiyi açıkça temsil etme yöntemimizdir. Gerçek EA’da fonksiyon, başarı durumu, mod ve beklenen veri kontrol edilir; model bütün MQL5 davranışlarını canlandırmaz.
Benzetimde doğru sonucu EA’nın emir açacağı anlamına gelir mi?
Hayır. Sayfa iki pozitif sayıyı karşılaştırır, terminal veya hesaba bağlanmaz. Diğer koşul, izin, veri hazırlığı ve emir gerçekleşmesi ayrı aşamalardır. Araç yanlışla değerlendirilemeyeni ayırır; yatırım sinyali veya EA etkinlik kanıtı üretmez.
Grafik nesnelerini kaldırınca bütün testler aynı olur mu?
Garanti değildir. Tek çizim bağımlılığı giderilse de kod, parametre, veri kopyası, tick modeli, maliyet ve ilk durum farklı kalabilir. İlk farkı bulun, birkaç bileşeni aynı anda değiştirmeyin, çözümü yalnız son kârın artışına göre değerlendirmeyin. Bilinmeyen alanı yazara açıkça bildirin.
Küçük kayıt kodu işlemlere hazır bir strateji mi?
Hayır. Bağımsız OnInit yapılandırma kaydı ve boş OnTick içerir; emir, sinyal veya pozisyon yönetimi yoktur. Kendi dosyanızı MetaEditor’de derleyip gerçek sonucu saklayın. İkinci OnInit eklemeyin veya başka başlangıcı körlemesine değiştirmeyin. Bayrak kontrolü başka EA’nın güvenliğini kanıtlamaz.
İki kayıtta 40,10 yazması neden yeterli değil?
Örnekte 40,104 ve 40,103 aynı iki haneli metne yuvarlanırken 40,1035 kesin eşiğinin ayrı taraflarındadır. İkisi de geçerli girdi olmasına rağmen koşul farklıdır. Asıl değer ve kimlik saklanmadıysa biçimlenmiş metinden fark geri getirilemez; 1 TRY ölçek farkı gerçekleşmiş getiri değildir.

Kaynaklar ve doğrulama

  1. MetaQuotes — Testing Trading Strategies

    Görsel olmayan nesne özelliği sıfırları, görsel istisna ve optimizasyonda OnInit mesaj istisnası.

  2. MetaQuotes — Running MQL5 Program Properties

    MQL_TESTER, MQL_VISUAL_MODE ve MQL_OPTIMIZATION ortam bayrakları.

  3. MetaQuotes — Client Terminal Properties

    TERMINAL_BUILD gerçek istemci derleme numarasıdır.

  4. MetaQuotes — OnInit

    int OnInit imzası ve INIT_SUCCEEDED; verilen kodun native derleme kanıtı değil.

  5. MetaQuotes — PrintFormat

    Biçim belirteciyle değer türü, sayısı ve sırası eşleşmelidir; genel optimizasyon kısıtının OnInit istisnası tester bölümünde açıklanır.

Hesaplamalar açıkça belirtilen varsayımlara dayanır. Güncel piyasa verilerinin veya sağlayıcının koşullarının yerini almaz.

Yazar hakkında

Jarosław Wasiński, Polonya’da çalışan bir editör ve piyasa analistidir. MyBank.pl’yi 2004 yılında kurdu; 2007 yılından beri döviz piyasasını takip ediyor.