English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
preview
MQL5 Strateji Sınayıcıyı anlayın ve etkin bir şekilde kullanın

MQL5 Strateji Sınayıcıyı anlayın ve etkin bir şekilde kullanın

MetaTrader 5Sınayıcı | 13 Mayıs 2025, 12:09
69 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Giriş

MQL5 programcıları olarak, etkili sonuçlar elde etmek için Strateji Sınayıcıyı iyi anlamamız ve kullanmamız gerekiyor. Bu değerli aracı kullanarak, MQL5 programlarımızın performansı hakkında önemli bilgiler edinebiliriz, bu da alım-satım sonuçlarının iyileştirilmesini etkileyecektir. Programımızı test etmeye başlamadan önce, bir dizi önemli konuyu iyi anlamamız gerekir; bunlardan biri, meydana gelebilecek her türlü hatayla başa çıkmaktır. İyi anlamamız gereken bir diğer konu da, oluşturduğumuz programları etkileşimli olarak yürütmemizi sağlayan hata ayıklamadır. Son olarak, en önemli ve değerli araç, oluşturduğumuz programları MetaTrader 4'ten daha ilginç özelliklerle test etmemizi ve değerlendirmemizi sağlayan Strateji Sınayıcıdır. Bu makale, MQL5 Strateji Sınayıcıyı kullanmanın en önemli yönlerine adanmıştır. Aşağıdaki konuları ele alacağız:

MQL5 programlama dilini ve nasıl program geliştireceğinizi zaten bildiğiniz varsayılmaktadır. Bunlar makaleyi anlamak için ön koşullardır. Dilde uzmanlaşmak için ihtiyacınız olan her şeyi MQL5 Dokümantasyonunda bulabilirsiniz. MQL5 programlamanın temellerini öğrenmek ve en popüler teknik göstergelere dayalı alım-satım sistemleri oluşturmakla ilgili diğer makalelerimi de okuyabilirsiniz. Umarım onları faydalı bulursunuz.

Hatalar

İlk olarak, MQL5 programları oluştururken, yürütürken ve çalıştırırken karşılaşılabilecek hatalardan bahsedelim. MQL5 bizi hatalar hakkında bilgilendirir, ancak ne anlama geldiklerini veya nerede meydana geldiklerini bilmiyorsak, onları düzeltmek için çok daha fazla zamana ihtiyacımız olacaktır.

Kod yazarken derleme hataları ve uyarılar oluşabilir. MQL5 programını çalıştırırken de çalışma zamanı hatalarıyla karşılaşabiliriz. MQL5 programımız alım-satım işlemleri yapmaya çalıştığında da işlem sunucusu hataları gibi başka tür hatalarla karşılaşabiliriz. Dolayısıyla, aşağıdaki hata türlerine göz alacağız:

  • Derleme hataları ve uyarıları
  • Çalışma zamanı hataları
  • İşlem sunucusu hataları

Bu hataları ele almadan önce, nerede göründüklerini bilmek önemlidir. MQL5 IDE'de, alt kısımda bir araç çubuğu penceresi vardır. Varsayılan olarak orada değilse, aşağıdaki yollardan biriyle görüntüleyebilirsiniz:

1- Görünüme tıklayın ==> Araç Kutusunu seçin

Araç Kutusu

2- Klavyeden Ctrl+T tuşlarına basın

3- Araç Çubuğundan Araç Kutusu düğmesine tıklayın

Araç Kutusu 2

Araç Kutusu şu şekilde görünür:

Araç Kutusu 3

Derleme hataları ve uyarıları:

Kod yazarken, kaçınılmaz olarak sözdizimi hataları veya yanlış basımlar yaparız ve bu da derleme hatalarına yol açar. Bu bölümde bu türden en popüler ve sık karşılaşılan hatalardan bahsedeceğiz. Hatalar düzeltilene kadar bir program derlenemez. Bu türden en sık karşılaşılan hatalar şunlardır:

Noktalı virgül beklendi (semicolon expected):

Satır sonundaki noktalı virgül eksiktir. Bazen de sol parantez eksiktir. Bu hatadan kaçınmak için, bu karakterleri doğru bir şekilde yerinde kullanmalıyız. Aşağıdaki kod bu hataya bir örnektir.

Yanlış kod:

int a=(2+1)

Hata şu şekilde görünecektir:

Noktalı virgül beklendi

Doğru kod:

Kod satırının sonuna noktalı virgül ekleyerek kodu düzelttik:

int a=(2+1);

Kodun aşağıdaki gibi herhangi bir hata olmadan derlendiğini görüyoruz:

Hata çözüldü

Beklenmeyen karakter hatası (unexpected token):

Hatanın nedeni, son kod satırında eksik bir sağ parantez veya mevcut kod satırında fazladan bir sol parantez olmasıdır. Bu hataya bir örnek aşağıda gösterilmiştir:

Yanlış kod:

int a=(2+1;

Hata mesajı:

Beklenmeyen karakter

Doğru kod:

int a=(2+1);

Koda sağ parantez ekleyerek düzeltip derledikten sonra, Hatalar sekmesinde herhangi bir hata görmüyoruz:

Hata çözüldü

Bildirilmemiş tanımlayıcı hatası (undeclared identifier):

Bu hata, bir değişkeni öncesinde bildirmeden kullandığımızda ortaya çıkar, çünkü herhangi bir yeni değişkeni kullanmadan veya ona herhangi bir değer atamadan önce bildirmemiz gerekir. Bu değişkene geri döndürmemiz gereken tamsayı (int) veya dizge (string) gibi doğru ve uygun veri türünü seçmemiz gerekir. Aşağıda, yeni bir değişkeni bildirmeden kullandığımızda ortaya çıkan bu hataya bir örnek yer almaktadır.

Yanlış kod:

a=5;

Önceki kodda, (a) değişkenini bildirmeden ona 5 atayarak kullandık. Dolayısıyla, bu kodu derlediğimizde aşağıdaki gibi undeclared identifier hatası ile karşılaşacağız:

Bildirilmemiş tanımlayıcı

Gördüğümüz gibi, mesaj sadece hatanın kendisini değil, aynı zamanda hataya neden olan 'a' değişkenini de belirtiyor.

Doğru kod:

int a=5;

Bu doğru kodu derledikten sonra, Araç Kutusunun Hatalar sekmesinde herhangi bir hata bulmayacağız.

Dengesiz sol parantez hatası (unbalanced left parenthesis):

Bu hata, sağ parantezi koymayı unuttuğumuzda veya fazladan bir sağ parantez kullandığımızda ortaya çıkar. Bu hatayı aşağıdaki örnek üzerinden görebiliriz.

Yanlış kod:

   bool a=7;
   if (a=5
   a=5;

Sağ parantezin olmaması aynı anda iki hataya yol açtı - dengesiz sol parantez (unbalanced left parenthesis) ve operatör beklendi (some operator expected).

Dengesiz sol parantez

Doğru kod:

   bool a=7;
   if (a=5)
   a=5;
Hata düzeltildikten sonra kod normal şekilde derlenir.


Beklenmeyen program sonu hatası (unexpected end of program):

Bazen kodumuzda bir kapanış parantezini atlarız ve bu ‘beklenmeyen program sonu’ hatasına neden olur, bu hatayı çözmek üzere ne eklememiz gerektiğini görmek için kodumuzu kontrol etmemiz veya her açılış parantezinin bir kapanış parantezine sahip olduğundan emin olmamız gerekir. Aşağıda bu hataya bir örnek verilmiştir.

Yanlış kod:

void OnStart()
  {
   bool a=7;
   if (a=5)
   a=5;

Eksik kapanış parantezi iki hataya neden oldu - beklenmeyen program sonu (unexpected end of program) ve dengesiz parantezler (unbalanced parentheses).

Beklenmeyen program sonu

Doğru kod:

void OnStart()
  {
   bool a=7;
   if (a=5)
   a=5;
   }

Kapanış parantezini ekleyerek kodu düzelttikten sonra kodun hatasız bir şekilde derlendiğini göreceğiz.

İfadelere global kapsamda izin verilmez hatası (expressions are not allowed on a global scope):

Bileşik bir operatörde sol parantezi atladığımızda veya belirli bir fonksiyonun kapsamı dışında bir ifade belirttiğimizde bu hata oluşur, çünkü ifadeleri yalnızca fonksiyonun kapsamı içinde kullanmamız gerekir. Aşağıda bir örnek gösterilmiştir.

Yanlış kod:

   int a=(7+5);
   if (a<7)
   
   a=7;
   }

Açılış parantezini ({) unuttuk, bu da kapsamı değiştirdi ve ‘ifadelere global kapsamda izin verilmez’ hatasıyla sonuçlandı. Hatalar sekmesinde hata mesajı şu şekilde görünür.

İfadelere global kapsamda izin verilmez


Doğru kod:

   int a=(7+5);
   if (a<7)
   {
   a=7;
   }

Hata düzeltildikten sonra kod normal şekilde derlenir.

Yanlış parametre sayısı hatası (wrong parameters count):

Hata, belirli parametrelerle önceden tanımlanmış bir fonksiyon kullandığımızda ve bu parametreleri doğru bir şekilde belirtmediğimizde, fazla veya eksik belirttiğimizde ortaya çıkar. Aşağıda bu hataya bir örnek verilmiştir.

Yanlış kod:

Eğer “myVal” fonksiyonunu iki tamsayı değerinin toplanması sonucu elde edilen tamsayı değerini geri döndürmesi için oluşturduysak, bu fonksiyonda iki parametremiz olduğu anlamına gelir. Bu iki parametre dışında başka parametreler kullanarak bu fonksiyonu çağırdığımızda, aşağıdaki kodda olduğu gibi bir hata yapmış oluruz.

void OnStart()
  {
   int example=myVal(10);
  }
//+------------------------------------------------------------------+
int myVal(int a, int b)
  {
   return a+b;
  }

Kodu derlediğimizde aşağıdaki hatayı alırız:

Yanlış parametre sayısı

Doğru kod:

Oluşturulan fonksiyonun belirtilen parametrelerini aşağıda gösterildiği gibi kullanmamız gerekir.

void OnStart()
  {
   int example=myVal(10,20);
  }
//+------------------------------------------------------------------+
int myVal(int a, int b)
  {
   return a+b;
  }

Bu doğru kodu derlersek herhangi bir hata görmeyeceğiz.

Operatör beklendi hatası (some operator expected):

Bu hata, bir operatörü belirli bir konumda eksik bıraktığımızda veya yanlış yerleştirdiğimizde ortaya çıkar. Aşağıda bu hata türüne bir örnek verilmiştir.

Yanlış kod:

int a= 7 10;

Yukarıdaki kodda, iki sayı arasında bir operatörü atladık ve bu, aşağıdaki resimde olduğu gibi ‘operatör beklendi’ hatası almamıza neden oldu:

Operatör beklendi

Doğru kod:

int a= 7+10;

Koda (+) ekleyerek düzelttikten sonra kodun hatasız derleneceğini göreceğiz.

Bunlar en yaygın derleme hatalarıdır. Ancak, hataların yanı sıra uyarılar da vardır. Bunlar bilgilendirme amacıyla görüntülenir. Aşağıda Hatalar sekmesinde bir uyarıya neden olacak örnek bir kod verilmiştir.

int a;

Kodu derlediğimizde, 'a' değişkeninin kullanımda olmadığına dair bir uyarı alacağız çünkü yeni bir 'a' değişkeni bildirdik, ancak onu kullanmadık veya ona bir değer atamadık.

Uyarı

Derleme hataları ve uyarıları hakkında daha fazla bilgi için aşağıdaki bağlantılardan dokümantasyona göz atabilirsiniz:

Bu hataların ortaya çıkması durumunda, bu hataları ortadan kaldırmak için çok yararlı olabilecek birkaç ipucu:

  • Hataları düzeltmeye en baştan başlayın, çünkü önceki bir hatayı düzeltmek devamındaki tüm hataları ortadan kaldırabilir.
  • Araç Çubuğunun Hatalar sekmesindeki bir hata satırına çift tıklamak sizi doğrudan hatanın oluştuğu kod satırına götürecektir.

Bir MQL5 programının kodunu yazarken ilk aşamada oluşabilecek hataları ele aldık. İkinci aşamaya geçeceğiz, bu da programı yürüttüğümüzde ortaya çıkan hatalar olan çalışma zamanı hatalarıdır.

Çalışma zamanı hataları:

Daha önce de belirttiğimiz gibi, çalışma zamanı hataları bir MQL5 programının yürütülmesi sırasında ortaya çıkan hatalardır. Bu hatalar kodun hatasız derlenmesini engellemez, ancak kod istediğimiz gibi çalışmaz. Bu hataları günlükte, hatanın nedenini ve kaynak kodda hatayı içeren satırı belirten mesajlar şeklinde bulabiliriz.

Bu hatalara örnekler:

Hata kodu Hata nedeni
4007
  Bir dizinin yeniden yerleştirilmesi için yeterli bellek olmaması veya statik bir dizinin büyüklüğünün değiştirilmeye çalışılması
4101   Yanlış grafik kimliği
4301   Bilinmeyen sembol
4754   Emir bulunamadı
5120   Dahili veritabanı hatası

Fark ettiyseniz, MQL5 kolay bir şekilde ayırt edilebilmeleri için tüm çalışma zamanı hatalarını kodlarla tanımlamıştır. GetLastError() fonksiyonunu kullanarak programınıza hata işleme yöntemi ekleyerek bu kodları görüntüleyebilirsiniz. Bu hataları ayrıca test sırasında Günlük sekmesinden veya programın grafik üzerinde yürütülmesi sırasında Uzmanlar sekmesinden de görebilirsiniz. Kodlarla birlikte tüm çalışma zamanı hataları MQL5 dokümantasyonunda burada sunulmaktadır:

https://www.mql5.com/tr/docs/constants/errorswarnings/errorcodes

Burada belirtmem gerekir ki, örneğin dizi aralığının dışına çıkılması (array out of range) gibi yürütmeyi sonlandıracak birkaç kritik hata dışında, programın yürütülmesi çalışma zamanı hatasından sonra durdurulmaz.

İşlem sunucusu hataları:

Bu hatalar, OrderSend() fonksiyonu kullanılırken MqlTradeRequest işlem talebi yapısında işlem gerçekleştirme aşamasında meydana gelir. Bu hatalar, test sırasında Günlük sekmesinden veya programı bir grafik üzerinde yürütürken Uzmanlar sekmesinden görülebilir. Hata örnekleri:

Hata kodu
Hata nedeni
10006
  Talep reddedildi
10032
  İşleme yalnızca gerçek hesaplarda izin verilir
10033
  Bekleyen emir sayısı sınırına ulaşıldı
10034
  Sembol üzerindeki emirler ve pozisyonlar için hacim sınırına ulaşıldı
10041
  Bekleyen emir etkinleştirme talebi reddedildi, emir iptal edildi

Bu tür hataların tüm kodlarını aşağıdaki bağlantı aracılığıyla MQL5 dokümantasyonunda bulabilirsiniz:

https://www.mql5.com/tr/docs/constants/errorswarnings/enum_trade_return_codes

Hata ayıklama

MQL5 Hata Ayıklayıcı, oluşturduğumuz programı geçmiş veya güncel veriler üzerinde çalıştırmak için kullanılabilir. MetaEditor Araç Çubuğundaki Hata Ayıklayıcı düğmeleri aşağıda gösterilmiştir.

Hata Ayıklayıcı düğmeleri

1- Geçmiş veriler üzerinde hata ayıklamayı başlat/devam ettir

2- Gerçek veriler üzerinde hata ayıklamayı başlat/devam ettir

3- Hata ayıklamayı duraklat

4- Hata ayıklamayı durdur

Geçmiş veriler üzerinde hata ayıklama başlatıldığında, programın geçmiş veriler üzerinde test edilmesi başlayacaktır. Gerçek veriler üzerinde hata ayıklama yapıldığında, program mevcut grafik üzerinde başlatılır. Hata Ayıklayıcı da aynı anda çalışmaya başlar.

Strateji Sınayıcı

Strateji Sınayıcı, MetaTrader 5'in en önemli ve değerli aracıdır. MetaTrader 4'tekinden daha iyidir ve çok dövizli test dahil olmak üzere birçok yeni özelliğe sahiptir. Strateji Sınayıcıyı aşağıdaki yollardan biriyle açabilirsiniz:

1- MetaTrader 5 işlem terminali açıkken klavyeden Ctrl+R tuşlarına basın.

2- Görünüm menüsünden ==> Strateji Sınayıcıyı seçin.

Strateji Sınayıcı

Sonrasında, neye ihtiyacınız olduğunu veya test türünü seçmek için Strateji Sınayıcı Genel Bakış sekmesiyle açılacaktır.

Strateji Sınayıcı 1

Basitçe, Genel Bakış sekmesi aracılığıyla neyi test etmemiz gerektiğini seçeceğiz ve bunu yaptıktan sonra sekme, test etmeyi seçtiğiniz şeye göre önceden tanımlanmış ayarlarla Ayarlar sekmesine geçiş yapacaktır.

  • Tek: Uzman danışmanları görselleştirme modu olmadan test etmek için.
  • Gösterge: Göstergeleri test etmek için.
  • Görselleştir: Programın talimatlarına göre verilere nasıl tepki vereceğini görmek için grafik üzerinde görselleştirme modu ile test etmek için.
  • Stres ve gecikmeler: Adından da anlaşılacağı gibi stres ve gecikmeleri test etmek için.
  • Optimizasyon seçenekleri (tam, genetik, ileri).
  • Piyasa tarayıcısı: Piyasa taramasını test etmek için.
  • Matematik hesaplamaları: Matematik hesaplamalarını test etmek için.

Son seçenek olan ‘Önceki sonuçları görüntüle’ aracılığıyla önceki test sonuçlarını görebilirsiniz. Ayrıca, test seçeneklerinin altındaki arama çubuğu aracılığıyla önceki belirli bir testi arayabilirsiniz.

Ayarlar sekmesinde aşağıdakileri göreceğiz:

Strateji Sınayıcı 2

  •   1- Uzman: Test edilecek programın dosyası seçmek için.
  •   2- IDE: Seçilen programın kaynak kodunu açar.
  •   3- Belirli ayarları kaydetmek veya yüklemek için.
  •   4- Sembol: Testin yapılacağı sembolü seçmek için.
  •   5- Sembolün zaman dilimini seçmek için.
  •   6- Seçilen sembolün özelliklerini açar.
  •   7- Tarih: Testin yapılacağı dönemi seçmek için.
  •   8- Testin başlangıç tarihini seçmek için.
  •   9- Testin bitiş tarihini seçmek için.
  •  10- İleri: İleri test için ayrılacak optimizasyon süresinin gerekli kısmını seçmek için.
  •  11- İleri test için başlangıç tarihini seçmek için.
  •  12- Verileri gerçeğe yakın hale getirmek üzere gecikme ayarlamak için.
  •  13- Gerçek verilere ve gerçek işlem gerçekleştirme koşullarına yaklaşmak için.
  •  13/2- Modelleme: Test modelini seçmek için (her tik vb.)
  •  14- Kârları pip cinsinden görüntülemek için.
  •  15- Test başlangıcındaki bakiye miktarını seçmek için.
  •  16- Bakiyenin para birimini seçmek için.
  •  17- Kaldıracı seçmek için.
  •  18- Bir optimizasyon isteyip istemediğimizi seçmek için, bunun hakkında daha sonra konuşacağız.
  •  19- Test sırasında işlemleri görselleştirmek için.


Ayrıca, test edilen programın kullanıcı tarafından düzenlenebilecek girdilere sahip olup olmadığını kontrol etmek için Girdiler sekmesine sahibiz.

İstediğiniz ayarları belirledikten sonra, Başlat düğmesine tıkladığınızda program test edilmeye başlar. Görselleştirme etkinleştirilmişse, sekmelere sahip bir grafik görürüz. “Alım-Satım” sekmesi, varsa gerçekleştirilen işlemleri görüntüler. “Geçmiş” sekmesi kapatılan veya iptal edilen emirleri gösterir. “İşlemler” sekmesi tüm işlemleri gösterir. “Günlük” sekmesi programın yazdırılan mesajlarını ve diğer bilgileri görüntüler. Programın performansını Strateji Sınayıcı penceresindeki Grafik sekmesinden de izleyebiliriz.

Test tamamlandıktan sonra, tüm istatistikler Geçmiş Testi sekmesinde görüntülenir.

Strateji Sınayıcı 3

Strateji Sınayıcı 4

Test edilen programa bağlı olarak, Geçmiş Testi sekmesindeki veriler yukarıdaki örnekte gördüğünüzle aynı veya farklı görünecektir.

Test sürecinde çok önemli olduğu için burada bahsetmem gereken bir şey daha var: optimizasyon. Optimizasyon işlevi, girdi parametreleri için çeşitli değer aralıklarının seçilmesine olanak sağlar ve hangi girdi değerlerinin en iyi sonuçları verdiğini belirlemek için bu girdi değerlerinin tüm olası kombinasyonlarını kontrol eder. Optimizasyon modeli Ayarlar sekmesinden seçilebilir.

Strateji Sınayıcı 5

Strateji Sınayıcı 6

Testten sonra kontrol etmemiz ve değerlendirmemiz gereken en önemli unsurlar:

  • Net Kâr: Brüt kârdan brüt zararın çıkarılmasıyla hesaplanır.
  • Düşüş: İşlemler sırasında hesabın yaşadığı maksimum kayıptır.
  • Kâr Faktörü: Brüt kârın brüt zarara oranıdır.
  • Beklenen Getiri: Bir işlemin ortalama kâr veya zararıdır.
  • Düzelme Faktörü: Test edilen stratejinin kayıp yaşadıktan sonra ne kadar iyi kurtulduğunu ölçer.  


Sonuç

Herhangi bir MQL5 programı geliştirirken hepimizin ustalaşması gereken en önemli ve değerli araçlardan biri olan Strateji Sınayıcıyı inceledik. Bu aracı anlamaya ve etkili bir şekilde kullanmaya yardımcı olacak bazı ilgili konular üzerinde konuştuk. MQL5 programlarını geliştirirken karşılaşabileceğimiz hata türleri hakkında bilgi edindik:

  • Derleme hataları ve uyarıları.
  • Çalışma zamanı hataları.
  • İşlem sunucusu hataları.

Daha sonra MQL5 IDE'nin Hata Ayıklayıcısını nasıl kullanacağımızı görerek hata ayıklama hakkında bilgi edindik. Ardından, test raporu da dahil olmak üzere Strateji Sınayıcının ana özelliklerini ayrıntılı olarak inceledik.

Umarım bu makale yüksek kaliteli MQL5 programları oluşturmanıza ve etkili bir şekilde test etmenize yardımcı olur. Makaleyi faydalı bulursanız ve benzer daha fazla makale okumak isterseniz, en popüler teknik göstergelere dayalı alım-satım sistemleri oluşturma hakkındaki diğer makalelerime göz atabilirsiniz.

MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/12635

Popülasyon optimizasyon algoritmaları: Fidan dikimi ve büyütme (Saplings Sowing and Growing up, SSG) Popülasyon optimizasyon algoritmaları: Fidan dikimi ve büyütme (Saplings Sowing and Growing up, SSG)
Fidan dikimi ve büyütme (SSG) algoritması, çok çeşitli koşullarda hayatta kalmak için olağanüstü yetenek gösteren gezegendeki en dirençli organizmalardan birinden esinlenmiştir.
MQL5’i kullanarak özel bir True Strength Index göstergesi nasıl oluşturulur? MQL5’i kullanarak özel bir True Strength Index göstergesi nasıl oluşturulur?
Özel bir göstergenin nasıl oluşturulacağına dair yeni bir makaleyle karşınızdayım. Bu sefer True Strength Index (TSI) göstergesiyle çalışacağız ve ona dayalı bir Uzman Danışman geliştireceğiz.
Popülasyon optimizasyon algoritmaları: Elektromanyetizma benzeri algoritma (ElectroMagnetism-like algorithm, ЕМ) Popülasyon optimizasyon algoritmaları: Elektromanyetizma benzeri algoritma (ElectroMagnetism-like algorithm, ЕМ)
Makale, elektromanyetizma benzeri algoritmanın (EM) ilkelerini, yöntemlerini ve çeşitli optimizasyon problemlerinde kullanım olanaklarını açıklamaktadır. EM algoritması, büyük miktarda veri ve çok boyutlu fonksiyonlarla çalışabilen verimli bir optimizasyon aracıdır.
Model aramada brute force yaklaşımı (Bölüm V): Farklı bir bakış açısı Model aramada brute force yaklaşımı (Bölüm V): Farklı bir bakış açısı
Bu makalede, algoritmik alım-satıma oldukça uzun bir süre sonra ulaştığım tamamen farklı bir yaklaşım göstereceğim. Elbette tüm bunlar, aynı anda birkaç problemi çözmesine olanak tanıyan bir dizi değişikliğe uğrayan brute force programımla ilgili. Bununla birlikte, makaleyi daha genel ve olabildiğince basit bir şekilde yazdım, böylece brute force hakkında hiçbir şey bilmeyenler için de uygun hale geldi.