English Русский
preview
"En İyi Geçişten" Sağlam Çözümlere: MetaTrader 5'te Optimizasyon Yüzeyini Keşfetme

"En İyi Geçişten" Sağlam Çözümlere: MetaTrader 5'te Optimizasyon Yüzeyini Keşfetme

MetaTrader 5Sınayıcı |
16 0
MetaQuotes
MetaQuotes

Giriş

Alım-satım stratejilerinin optimizasyonu uzun zamandır algoritmik alım-satım sistemleri geliştirmenin standart bir parçası olmuştur. MetaTrader 5 bunun için güçlü araçlar sağlar: çok iş parçacıklı bir sınayıcı, dağıtılmış hesaplama ve kullanıcı tanımlı kriterler. Optimizasyon sonuçları, performans ölçütlerinin Uzman Danışman parametrelerine bir, iki ve üç boyutlu bağımlılıkları olarak görselleştirilebilir. İlk bakışta, bu fazlasıyla yeterlidir: optimizasyon başlatılır, sonuçlar Kar Faktörüne veya başka bir özet kritere göre sıralanır ve ardından en iyi geçiş seçilir. Ancak, algoritmik alım-satımın en yaygın yanılsamalarından biri de burada başlar.

Sorun, optimizasyonun neredeyse her zaman tek bir geçişten maksimum sonucu bulmaya odaklanmasıdır. Sınayıcı, parametre yüzeyinin zirvesini gösterir - en yüksek Kar Faktörü, en iyi Sharpe Oranı veya maksimum kar. Ancak piyasa, tek uç noktalar üzerine kurulu sistemleri nadiren ödüllendirir. Aksine, bu tür zirvelerin genellikle parametrelerin geçmiş verilerin yerel yapısıyla rastgele bir şekilde örtüşmesinin sonucu olduğu ortaya çıkmaktadır. Gösterge periyodunda, Zararı Durdur değerinde veya piyasa modunda yalnızca küçük bir değişiklik yeterlidir ve etkileyici bir sonuç hızla parçalanmaya başlar.

Bu nedenle yüksek Kar Faktörü tek başına hiçbir şeyi garanti etmez. İki strateji aynı getiriyi sağlayabilir, ancak sağlamlık açısından temelde farklılık gösterebilir. İlki, komşu parametrelerin tüm aralığı boyunca kabul edilebilir sonuçları korur. İkincisi ise sadece optimizasyon yüzeyinde kaotik ve karsız konfigürasyonlarla çevrili dar bir iğne şeklinde mevcuttur. Biçimsel olarak her iki sistem de karlıdır. Pratikte bunlardan sadece birinin gerçek piyasada hayatta kalma şansı vardır.

MetaTrader 5 yerleşik görselleştirme araçları, nihai ölçütlerin her bir optimizasyon parametresine olan bağımlılığını açıkça göstermektedir. Sınayıcı ölçüt değerlerini ve sonuçların dağılımını gösterir. Bununla birlikte, komşu konfigürasyonların değerlendirilmesinde çok az yardım sunar: bozulma hızı, istikrarlı platoların varlığı, parametrelere duyarlılık ve aşırı optimizasyon limitleri. Başka bir deyişle, fonksiyonun maksimum değeri artık tüm optimizasyon yüzeyinin geometrisi kadar önemli değildir.

İşte bu noktada optimizasyon çerçeveleri özel bir değer kazanır. Bu mekanizma, her optimizasyon geçişinden sonra istenen kullanıcı verilerinin depolanmasına ve analiz edilmesine olanak tanır. Geliştirici, birkaç yerleşik göstergeyle çalışmak yerine, kendi araştırma ölçüm sistemini oluşturma yeteneğine sahiptir: ek ölçütler iletmek, komşu konfigürasyonların istikrarını değerlendirmek, yerel parametre alanlarını analiz etmek ve aşırı karlılığa değil, sistem davranışının istikrarına odaklanan kriterler oluşturmak. Bu noktada optimizasyon, güzel bir sayı arayışı olmaktan çıkar ve tam teşekküllü bir araştırmaya dönüşür.

Bu makalede, MetaTrader 5'te optimizasyon çerçevelerinin pratik uygulamasına bakacağız, kendi ölçütlerimizi nasıl kaydedeceğimizi ve sonuçları nasıl analiz edeceğimizi öğreneceğiz ve ayrıca tüm optimizasyon yüzeyine dayalı özel istikrar kriterleri oluşturacağız. Ana odak noktası, değişen piyasa koşullarından sonra bile öngörülebilir davranışı sürdürebilen istikrarlı parametre alanlarının belirlenmesi olacaktır.

Kendimizi kandırmadan optimizasyon



Bir araştırma ölçüm sistemi olarak optimizasyon çerçeveleri

Yerleşik sınayıcının tüm yeteneklerine rağmen, MetaTrader 5'teki standart optimizasyon, doğası gereği kuru bir prosedür olmaya devam etmektedir. Temsilci hesaplamaları gerçekleştirir. Sınayıcı sonucu kaydeder. Sonunda, kullanıcı hazır bir sayılar seti görür: Kar Faktörü, Sharpe Oranı, düşüş, kar ve diğer özet ölçütler. Bu, ilk seçim için yeterlidir. Ancak ciddi bir analiz için yeterli değildir. Zirve görünüyor, ancak arazinin kendisi büyük ölçüde görünmez kalıyor.

Optimizasyon Çerçeveleri bu noktada devreye girer. Bu sadece bir geçişin sonucunu kaydetmenin başka bir yolu değildir. Bu, test temsilcileri ile analiz kodu arasında araştırma verilerinin aktarılmasına yönelik tam teşekküllü bir kanaldır. Çerçeveler aracılığıyla, strateji davranışını daha derinlemesine anlamamıza yardımcı olan her şeyi aktarabiliriz: ek istatistikler, ara parametreler, model durumu, varlık eğrisi özellikleri, istikrar değerlendirmesi ve diğer özel ölçütler.

Bu mekanizmanın işleyişi oldukça doğal görünmektedir. Her geçişin tamamlanmasının ardından, Uzman Danışman verileri OnTester()'dan FrameAdd() aracılığıyla iletir. Bu, terminalde TesterPass olayını tetikler ve bu da OnTesterPass() fonksiyonunu çağırır. Bu işleyicinin içinde, gelen çerçeveyi hemen ayrıştırabilirsiniz: FrameFirst() ve FrameNext() aracılığıyla verileri sırayla okuyun ve gerekirse gerekli girişleri filtreleyin. Pratikte bu, canlı bir sonuç akışı hissi verir: geçiş tamamlanır, çerçeve gelir, veriler artık analiz edilebilir.

Ancak bu akışın önemli bir özelliği vardır. Çerçeveler teker teker değil, gruplar halinde ve bazen fark edilir bir gecikmeyle gelebilir. Bu durum özellikle dağıtılmış optimizasyonda, hesaplamaların bir kısmı uzak temsilciler tarafından gerçekleştirildiğinde fark edilir. Bu nedenle her TesterPass, bir sonraki geçişin tamamlandığı anda tam olarak işlenemez. Bu sebeple OnTesterDeinit(), sonuçlarla çalışmanın son güvenilir aşaması olmaya devam etmektedir. Bazı çerçeveler daha sonra geldiyse, optimizasyon tamamlandıktan sonra FrameFirst() ile tüm veri dizisi baştan tekrar gözden geçirilerek ve gerekirse FrameFilter() ile sıralanarak veya filtrelenerek okunabilir.

Sonuç olarak, optimizasyon artık sadece bir izole geçişler serisinden ibaret değildir. Parametrelerin tüm yüzeyi boyunca araştırma ölçümlerini biriktirmek için bir sisteme dönüştürülür. Bu, çalışma mantığını temelden değiştirir. Artık geliştirici yalnızca kriterin nihai değerini değil, aynı zamanda elde edildiği bağlamı da görüyor. Kar Faktörü ile birlikte ek ölçütleri de saklayabiliriz: kar yoğunluğu, işlem tekdüzeliği, zaman segmentleri arasında istikrar ve varlık özellikleri. Ayrıca, komşu parametrelerdeki bozulma göstergelerini ve piyasa rejimine duyarlılığı kaydetmek de mümkündür.

Böylece, her geçiş tam teşekküllü bir tanı grubu gibi görünmeye başlar. Optimizasyon ne kadar uzun veya karmaşık olursa, bu yaklaşımın değeri de o kadar yüksek olur. Aslında, optimizasyon çerçevelerinin gerçek değeri, tüm optimizasyon yüzeyinin sonradan analiz edilmesinde yatmaktadır. Tek tek noktaları analiz etmek yerine, parametre uzayını bir bütün olarak incelemek mümkün hale gelir: istikrarlı alanlar aramak, sonuçların bozulma hızını ölçmek, bir stratejinin hassasiyetini değerlendirmek ve komşu konfigürasyonlara dayalı olarak kendi istikrar kriterlerini oluşturmak.

Bu nedenle bu yaklaşımda optimizasyon, yalnızca ölçütlerin mutlak değerlerinin değil, aynı zamanda dağılımlarının şeklinin, istikrarlı bölgelerin yoğunluğunun ve komşu parametrelerin davranışının da önemli olduğu çok boyutlu bir yüzey çalışması haline gelir. Burada kazanan artık en yüksek izole zirveye sahip olan değil, daha sağlam ve güvenilir bir yüzeye sahip olandır.



Bir araştırma nesnesi olarak basit strateji

Optimizasyon çerçeveleri ile tanıştıktan sonra, tamamen doğal bir soru ortaya çıkıyor: Bu analizin konusu olarak tam olarak neyi kullanmalıyız? Sezgisel olarak, karmaşık bir alım-satım sistemini ele almak istiyoruz - çok katmanlı bir model, bir dizi filtre, bir dizi gösterge, uyarlanabilir pozisyon yönetimi. Ancak karmaşık strateji ilgi odağı olmaya başlar. Makale, optimizasyonu incelemek yerine yavaş yavaş alım-satım sisteminin kendisinin tartışılmasına dönüşür. Ve bu tamamen farklı bir hikaye.

Bizim çalışmamızda ise tam tersi bir yaklaşıma ihtiyacımız var. Strateji mümkün olduğunca basit, neredeyse önemsiz olmalıdır. Okuyucunun her bir sinyalin kaynağını ve sonuçlardaki her bir değişikliği kolayca anlayabileceği kadar şeffaf olmalıdır. Burada araştırma deneyinin saflığı, karlılığın büyüsünden daha önemlidir.

Bu nedenle, bir araştırma nesnesi olarak, iyi bilinen iki fikir etrafında inşa edilmiş son derece basit bir model kullanıyoruz: hareketli ortalamaların çaprazlaması ve RSI modu. Sistemin ilk kısmı giriş anından sorumludur. İkincisi ise piyasa durumunu filtrelemek içindir. Bu durumda, sinyallerin kendileri Uzman Danışmandan göstergelerin doğrudan sorgulanmasıyla değil, bir olay modeli aracılığıyla üretilir. Göstergeler bağımsız olarak sinyaller üretir ve bunları kullanıcı olayları aracılığıyla aktarır.

Bu yaklaşım birkaç sorunu aynı anda çözmektedir. Strateji son derece kompakt ve okunabilir olmaya devam eder. Sinyal mantığı iyi bir şekilde ayrışır: göstergeler yalnızca olayların üretilmesinden sorumludur, Uzman Danışman ise yalnızca durumların işlenmesinden ve pozisyonların yönetilmesinden sorumludur. Ve sistem davranışı hakkında tanısal ölçümlerin kolayca biriktirilmesine olanak tanıdığı için makalenin araştırma doğasına özellikle uyan olay odaklı mimaridir.

Mantığın temelinde basit bir fikir yatar. EMA çaprazlaması potansiyel bir giriş tetikleyicisi olarak kullanılır.

//--- chek signal
   if(fast_buff[1] > slow_buff[1] &&
      fast_buff[0] <= slow_buff[0])
      SendSignalEvent(EVENT_EMA_CROSS, DIR_BUY, 0.0, "EMA CROSS");
   if(fast_buff[1] < slow_buff[1] &&
      fast_buff[0] >= slow_buff[0])
      SendSignalEvent(EVENT_EMA_CROSS, DIR_SELL, 0.0, "EMA CROSS");

Ancak, çaprazlama sinyalinin kendisi bir pozisyon açmaz. İlk olarak, sistem mevcut RSI modunu kontrol eder.

Aynı zamanda, RSI yalnızca mod değişikliği anında - belirtilen seviyeler geçildiğinde - bir olay oluşturur.

//--- chek signal
   ENUM_SIGNAL_DIRECTION new_regime = current_regime;
   if(rsi_buff[0] <= UpperLevel &&
      rsi_buff[1] > UpperLevel)
      new_regime = DIR_BUY;
   if(rsi_buff[0] >= LowerLevel &&
      rsi_buff[1] < LowerLevel)
      new_regime = DIR_SELL;
   if(rsi_buff[1] >= LowerLevel &&
      rsi_buff[1] <= UpperLevel)
      new_regime = DIR_NONE;
//--- send signal
   if(new_regime != current_regime)
     {
      current_regime = new_regime;
      SendSignalEvent(EVENT_RSI_REGIME, current_regime,
                      rsi_buff[1], "RSI REGIME");
     }

Bu sayede gürültüyü önemli ölçüde azaltmak mümkündür. Uzman Danışman, mevcut RSI durumunu dahili bir bayrak şeklinde saklar ve bunu bir piyasa bağlamı olarak kullanır. Sinyaller eşleşirse, olay senkronize kabul edilir ve Uzman Danışman bir işlem açar.

void OnChartEvent(const int32_t id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   if(id-CHARTEVENT_CUSTOM == EVENT_RSI_REGIME)
     {
      rsi_regime = (ENUM_SIGNAL_DIRECTION)lparam;
      rsi_regime_changes++;
      CloseConflictingPosition();
     }
   if(id-CHARTEVENT_CUSTOM == EVENT_EMA_CROSS)
     {
      ema_events++;
      ProcessEntry((int)lparam);
     }
  }

Bu, daha sonraki tüm optimizasyonlar için önemli bir noktadır. Kasıtlı olarak bağımsız bilgi kaynaklarının tutarlılığı etrafında bir sistem inşa ediyoruz.

Risk yönetimi de bilinçli olarak basit tutulmuştur. Zararı Durdur ve Kar Al, bir pozisyon açarken ATR çarpanları aracılığıyla hesaplanır. ATR değeri yalnızca mevcut volatilitenin bir hesaplaması olarak kullanılır ve olay modelinde yer almaz. Bu, mimariyi mümkün olduğunca temiz tutmamızı sağlar: ATR risk ölçeğini tanımlarken, olaylar yönden sorumludur.

void ProcessEntry(const int signal)
  {
   if(PositionSelect(_Symbol))
      return;
   if(signal == DIR_BUY &&
      rsi_regime == DIR_BUY)
     {
      if(!atr_buff.CopyIndicatorBuffer(atr_handle, 0, 1, 2))
         return;
      double atr = atr_buff[0];
      double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
      synchronized_entries++;
      double sl = NormalizeDouble(bid - atr * iSLmult,
                                  _Digits);
      double tp = NormalizeDouble(bid + atr * iTPmult,
                                  _Digits);
      trade.Buy(iLots, _Symbol, 0, sl, tp);
     }
   if(signal == DIR_SELL &&
      rsi_regime == DIR_SELL)
     {
      if(!atr_buff.CopyIndicatorBuffer(atr_handle, 0, 1, 2))
         return;
      double atr = atr_buff[0];
      double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      synchronized_entries++;
      double sl = NormalizeDouble(ask + atr * iSLmult,
                                  _Digits);
      double tp = NormalizeDouble(ask - atr * iTPmult,
                                  _Digits);
      trade.Sell(iLots, _Symbol, 0, sl, tp);
     }
  }

Pratik açıdan bakıldığında, böyle bir strateji tam da öngörülebilirliği nedeniyle ilginçtir. Karmaşık mantık, gizli bağımlılıklar veya ağır filtreleme yoktur. Optimizasyon sonuçlarındaki herhangi bir değişiklik, model parametrelerindeki bir değişiklikle neredeyse doğrudan ilişkilidir. Bu, optimizasyon yüzeyinin çok daha okunabilir ve keşifsel analiz için uygun hale geldiği anlamına gelir.



Özel ölçütler ve üst düzey analizler

MetaTrader 5 sınayıcısı birçok yerleşik göstergeyi hesaplayabilir: kar, Kar Faktörü, Düzelme Faktörü, Sharpe Oranı, düşüş, beklenen getiri ve diğer geçiş özellikleri. Bu, tek bir konfigürasyonu değerlendirmek için oldukça yeterlidir. Ancak, bu tür göstergeler parametre uzayında yalnızca bir noktayı tanımlamaktadır. Belirli bir geçişin ne kadar başarılı olduğu sorusuna cevap verirler. Ancak stratejinin bu noktaya yakın bir yerde nasıl davrandığı hakkında neredeyse hiçbir şey söylenmez.

İşte eğlence burada başlıyor. MetaTrader 5 çeşitli optimizasyon seçenekleri sunar ve sonuçları seçilen kriterin en iyi değerine göre sıralar. Sonuçlar tablosunda diğer performans göstergeleri de gösterildiğinden resim oldukça eksiksiz görünmektedir. Ancak, görselleştirme yalnızca seçilen kriter için ve yalnızca optimize edilen parametrelere bağlı olarak oluşturulur. Yani, geliştirici bir ölçütün yüzeyini görür, ancak bulunan alanın çevresinde ne kadar istikrarlı olduğunu görmez. Ancak bu temelde farklı bir konudur.

Terminalde optimizasyon sonuçlarının görselleştirilmesi

İki konfigürasyon nihai raporda çok benzer görünebilir, ancak tamamen farklı davranabilir. Biri yüksek Kar Faktörü sağlar, ancak yalnızca parametrelerdeki en ufak bir değişiklikte parçalanan dar bir zirveye tutunur. Diğeri daha düşük bir sonuç gösterir, ancak daha geniş bir aralıkta benzer değerleri korur. Standart bir sınayıcı neredeyse her zaman ilk konfigürasyonu en iyi olarak seçecektir. Ancak araştırma açısından bakıldığında, ikincisinin genellikle daha değerli olduğu ortaya çıkar çünkü davranışı istikrarlı görünür.

Bu nedenle, yalnızca yerleşik istatistikleri değil, aynı zamanda kendi tanılama ölçütlerimizi de tek bir geçiş düzeyinde toplamaya başlıyoruz. FrameAdd, dahili davranışı anlamamıza yardımcı olacak her türlü ek bilgiyi iletmemize olanak tanır. Bizim durumumuzda, EMA çaprazlaması olaylarının sayısı, RSI modu değişikliklerinin sayısı ve senkronize girişlerin yanı sıra sinyal dönüştürme oranı, sinyal başına kar ve kullanıcı tanımlı istikrar kriteri temel verilerle birlikte kaydedilir. Bu, sistemin dahili anlamda tam olarak nasıl çalıştığını görmeye yönelik bir girişimdir.

double OnTester()
  {
//---
   double profit_per_signal = 0.0;
   double trigger_conversion_ratio = 0.0;
//---
   double profit = TesterStatistics(STAT_PROFIT);
   double pf = TesterStatistics(STAT_PROFIT_FACTOR);
   if(ema_events > 0)
     {
      trigger_conversion_ratio =
         (double)synchronized_entries / (double)ema_events;
     }
   if(synchronized_entries > 0)
     {
      profit_per_signal =
         profit / synchronized_entries;
     }
   double ret =
      CalculateCustomCriterion(pf,
                               trigger_conversion_ratio,
                               profit_per_signal
                              );
//---
   double telemetry[12];
   telemetry[0]  = profit;
   telemetry[1]  = pf;
   telemetry[2]  = ema_events;
   telemetry[3]  = rsi_regime_changes;
   telemetry[4]  = synchronized_entries;
   telemetry[5]  = trigger_conversion_ratio;
   telemetry[6]  = profit_per_signal;
   telemetry[7]  = ret;
   telemetry[8]  = iFastEMA;
   telemetry[9]  = iSlowEMA;
   telemetry[10] = iSLmult;
   telemetry[11] = iTPmult;
//---
   FrameAdd("Telemetry", 0, ret, telemetry);
//---
   return(ret);
  }

Sinyallerin trigger_conversion_ratio dönüşüm oranı özellikle kullanışlıdır. EMA tetikleyicilerinin ne kadarının gerçekte bir işleme yol açtığını gösterir. Değer yüksekse, temel sinyal ve mod filtresinin koordineli bir şekilde davrandığı anlamına gelir. Düşükse, sistem ya çok seçicidir ya da çok gürültülüdür veya parametre mantığının kendisi düzgün çalışmıyordur. Her halükarda, bu ölçüt karın kendisinden ziyade, model bileşenleri arasındaki etkileşimin kalitesini yansıtmaktadır.

Diğer bir ölçüt ise sinyal başına kardır (profit_per_signal). İşlem başına ortalama kara benzer, ancak bunlar farklı değerlerdir. Modelimizde, bir işlem yalnızca EMA ve RSI sinyalleri birbiriyle uyumlu olduğunda açılır, ancak açık pozisyon EMA'nın ters çaprazlamasından sonra otomatik olarak kapatılmaz. Ayrıca, pozisyon aktif kaldığı sürece, sonraki sinyaller basitçe göz ardı edilebilir. Bu nedenle, senkronize sinyallerin sayısı ile fiilen gerçekleştirilen işlem döngülerinin sayısı her zaman tam olarak örtüşmez. Bu anlamda, sinyal başına kar, kaçırılan sinyalleri hesaba katarak sistemin mevcut giriş noktalarından ne kadar etkili bir şekilde para kazandığını yansıtır.

İşte burada bir sonraki seviyeye geçiş görünür. Optimizasyon çerçeveleri parametrelerin tüm yüzeyi boyunca ölçüm biriktirmeye başladığında, sadece tek tek geçişleri değil, karşılıklı davranışlarını da analiz etmek mümkün hale gelir. Ve bu sadece en iyi sonuçların bir listesinden çok daha önemlidir. Sadece maksimumun nerede olduğu ile değil, aynı zamanda komşu konfigürasyonların nasıl davrandığı, parametrelerdeki küçük bir değişiklikle sonucun ne kadar hızlı bozulduğu ve bulunan nokta etrafında istikrarlı bir plato olup olmadığı ile de ilgileniyoruz.

Bu nedenle çerçeveler aracılığıyla dışa aktarılan veriler bir CSV dosyasına kaydedilir.

void OnTesterDeinit()
  {
   ArrayResize(frames, 0, 100);
   FrameFirst();
   int pos = 0;
   ulong pass = 0;
   string name = "";
   long id = 0;
   double value = 0;
   double data[];
   SFrameData item;
//---
   while(FrameNext(pass, name, id, value, data))
     {
      if(ArraySize(data) < 12)
         continue;
      item.pass                 = id;
      item.profit               = data[0];
      item.pf                   = data[1];
      item.ema_events           = data[2];
      item.regime_changes       = data[3];
      item.synchronized_entries = data[4];
      item.conversion_ratio     = data[5];
      item.profit_per_signal    = data[6];
      item.custom_criterion     = data[7];
      item.fast_ema             = data[8];
      item.slow_ema             = data[9];
      item.sl_mult              = data[10];
      item.tp_mult              = data[11];
      pos = ArraySize(frames);
      if(ArrayResize(frames, pos + 1, (pos + 49) / 50) < pos + 1)
         return;
      frames[pos] = item;
     }
   ExportCSV();
//---
  }

Bu format kullanışlıdır çünkü elektronik tablolardan özelleşmiş analiz paketlerine kadar okuyucuya sunulan çok çeşitli araçlar kullanılarak daha ileri analiz yapılabilir. Çalışmamızda bu amaç için Python kullandık. MetaTrader 5, bununla gerekli bir entegrasyon sağlar. Bu, bir parametre yüzeyi incelemesi oluşturmamızı sağlar: değerleri yumuşatma, yerel istikrarı değerlendirme, sonuçların dağılımına bakma ve komşu alanları karşılaştırma.

Test ve sonraki analizler için, 1.01.2020'den 1.01.2026'ya kadar olan dönem için H1 zaman diliminde EURUSD üzerinde geçmiş verileri aldık. Bu aralık, çeşitli piyasa formasyonlarının ortaya çıkmasına imkan verecek kadar uzundur: sakin dönemler, güçlü hareketler, uzun süreli trendler ve gürültünün arttığı dönemler. Bu sadece makul bir sonuç elde etmek için değil, aynı zamanda optimizasyon yüzeyinin yapay olarak düzgün görünmemesini sağlamak için de önemlidir.

Optimizasyon dönemi

İlk aşamada, Uzman Danışman dört parametreye göre optimize edilir: hızlı EMA, yavaş EMA, Zararı Durdur çarpanı ve Kar Al çarpanı. Bu dört parametre stratejinin temel şeklini tanımlar ve piyasaya vereceği tepkiyi belirler. Olay oluşturmanın aktif aralığını genişletmek ve aşırı dar filtrelemeyi önlemek için RSI sınırları 40 ve 60'a kaydırılmıştır. Bu konfigürasyonda, mod filtresi daha hassas hale gelir ve olay modeli daha az kısıtlı olur. Bu, Uzman Danışmanın araştırılan piyasa durumlarına daha sık girmesini ve dolayısıyla daha açıklayıcı bir optimizasyon yüzeyi oluşturmasını sağlar.

Optimizasyon tamamlandığında, sonuçlar bir CSV dosyasına kaydedilir ve Python işleme aşamasına gider. Burada, her bir parametre çifti için pivot_table aracılığıyla iki boyutlu bir yüzey oluşturulur ve ardından buna Gauss yumuşatma uygulanır. Bunun sonucunda daha sakin, daha düzgün bir kriter yüzeyi - araştırma versiyonu - elde edilir ve burada rastgele zirveler fark edilir şekilde daha az belirgin hale gelir.

Kriterin ham ve yumuşatılmış yüzeyi

Aynı fonksiyonda yerel istikrar, komşu alandaki ortalama değerin standart sapmaya oranı olarak hesaplanır.

Yerel istikrarın görselleştirilmesi

Daha sonra yüzeyin nerede aniden değiştiğini ve nerede nispeten düz kaldığını göstermek için bir gradyan haritası oluşturulur.

Gradyan haritası

Bu tür grafikler, parametre uzayında geniş bir plato mu yoksa sadece dar, kırılgan bir zirve mi olduğunu görmemizi sağlar.

Ayrı bir analiz katmanı, tüm parametreler için aynı anda bir koordinat grafiği sağlar. Oluşturulmadan önce parametreler normalleştirilir ve Paralel Koordinatlar üzerinde seçilen kritere göre yalnızca en iyi geçişler vurgulanır. Bu, yalnızca tek bir başarılı noktayı değil, aynı zamanda diğer konfigürasyonlar arasındaki konumunu da görmeniz gerektiğinde kullanışlıdır. Komut dosyası, kritere göre en iyi sonuçların %5'ini yazdırır, böylece görsel resme hemen sayısal destek eşlik eder.

Optimize edilen parametrelerin paralel koordinatları

Sonuç olarak, Python bir sonraki analiz seviyesi olarak çalışır. MetaTrader 5 optimizasyon yüzeyini sunarken, Python ondan gürültüyü giderir, yerel istikrarı gösterir, komşu alanları karşılaştırır ve parametrelerin gerçekten istikrarlı bir bölümünü rastgele güzel bir zirveden ayırt etmeye yardımcı olur. Optimizasyon, tek tek geçişlerin tek bir sayıya göre sıralanması meselesi olmaktan çıkar. Sadece kriterin değerinin değil, aynı zamanda çevredeki tüm alanın nasıl davrandığının da önemli olduğu çok boyutlu bir yüzey çalışmasına dönüşür. Bu da bize stratejiye, istikrarı optimizasyon yüzeyinin şekli tarafından belirlenen bir sistem olarak daha derinlemesine bakma fırsatı verir.



Maksimum arayışından istikrarlı bir plato arayışına

Keşifsel optimizasyonun temel amacı sonucu maksimize etmek değil, stratejinin konfigürasyondaki küçük değişikliklerle bile istikrarlı kaldığı parametre aralıklarını bulmaktır.

Bu fark çok önemlidir. Optimizasyon yüzeyindeki tek bir yüksek zirve neredeyse her zaman cazip görünür. Ancak pratikte, bu tür uç noktaların genellikle piyasa gürültüsünün, belirli bir geçmiş dönemin özelliklerinin veya basitçe modelin aşırı uyumunun bir sonucu olduğu ortaya çıkmaktadır. Sınayıcıda ikna edici görünürler, ancak canlı piyasada durum böyle olmayabilir.

Bu nedenle sonuçları Python'a yükledikten sonra, tek tek geçişlere değil, bir bütün olarak parametrelerin tüm yüzeyine bakarız.

İlk olarak optimizasyon kriterinin ham ve yumuşatılmış yüzeylerini karşılaştırmak faydalı olacaktır. İlk yüzey karışık görünür: birçok yerel sıçrama, keskin maksimumlar ve tek zirveler vardır. Bu, rastgele tesadüflerin kolayca başarılı çözümler gibi göründüğü tipik bir gürültü optimizasyonu resmidir. Yumuşatmadan sonra, bu aykırı değerlerin çoğu kaybolur ve rastgele yapılardan ziyade daha istikrarlı yapılar ön plana çıkar.

İşte bu noktada her güzel zirvenin güvenilir olmadığı anlaşılır. Yumuşatmadan sonra yüzey parçalanır ve şeklini kaybederse, bulunan uç noktalar bir formasyondan ziyade bir rastlantıdır. Bizim durumumuzda resim farklıdır: SlowEMA etrafında 120-150 ve 220-240 aralıklarında iki belirgin tepe noktası kaldı. Bu, tek seferlik bir artışla değil, istatistiksel olarak istikrarlı bir formasyonla karşı karşıya olduğumuza dair ciddi bir işarettir. Üstelik buradaki optimum nokta keskin bir iğneye değil, geniş bir tarağa benziyor. Ve bu aslında iyi bir işaret. Sağlam stratejiler nadiren tek bir yerde ortaya çıkar. Çoğu zaman, komşu değerlerin benzer sonuçlar verdiği bir platoda kalırlar.

Bundan sonra, gradyan ısı haritasına bakmak mantıklıdır. Bu grafik, EMA parametreleri kaydırıldığında amaç fonksiyonunun ne kadar hızlı değiştiğini gösterir. Burada, özellikle 70-90 ve 200-220 aralığındaki SlowEMA ile artan hassasiyet alanları fark edilir hale gelir. Bu aralıklarda, ayarlardaki küçük bir değişiklik bile sonucu önemli ölçüde değiştirebilir. Bu da zaten aşırı optimizasyon riskinin arttığına dair doğrudan bir ipucudur.

Gradyanın kendisi belirgin bir dikey yapıya sahiptir. Bu, SlowEMA'nın sonucu FastEMA'dan önemli ölçüde daha fazla etkilediği anlamına gelir. Buradaki mantık oldukça doğaldır: yavaş ortalama piyasa rejimini belirlerken, hızlı olan giriş noktasından ve sistem davranışının yerel olarak ayarlanmasından daha fazla sorumludur. Aksine, 160-190 ve 30-50 aralıklarındaki SlowEMA çevresindeki alanlar düşük bir gradyan göstermektedir. Ancak şu gerçeği abartmamak önemlidir: Ham Yüzey ve Yumuşatılmış Yüzey, bunların gerçekten verimli alanlardan ziyade düşük veya sıfıra yakın karlılığa sahip alanlar olduğunu açıkça göstermektedir. Yüzeyin düzgünlüğü stratejiyi değerli kılmaz.

Paralel Koordinatlar grafiği, kullanıcı kriterlerine göre en iyi %5 konfigürasyonlar için oluşturulan resmi tamamlar. Ve burada asıl mesele açıktır: sürdürülebilir çözümler sihirli bir noktada birleşmez. Bunlar çeşitli çalışma kombinasyonları arasında dağılmıştır. Bu çok önemli bir sinyaldir. Dar bir tek maksimum değer genellikle etkileyici görünür, ancak çoğunlukla aşırı optimizasyonla ilişkilidir. Aksine, dağınık kümeler sistemin çeşitli modlarda çalışabileceğini gösterir.

En iyi konfigürasyonların daha yüksek FastEMA değerlerine sahip olma eğiliminde olduğu özellikle dikkat çekicidir. Bu mantıklıdır: daha yumuşak değerler gürültüyü azaltır ve sinyalleri daha temiz hale getirir. Aynı zamanda, SlowEMA, stratejinin işleyişine ilişkin farklı piyasa modlarına işaret edebilecek çeşitli kümeler oluşturmaktadır. SLMult ve TPMult parametreleri daha eşit bir şekilde dağılmıştır. Bu durum, pozisyon yönetiminin nihai sonuç üzerinde EMA sinyallerinin yapısından daha zayıf bir etkiye sahip olduğunu göstermektedir. Başka bir deyişle, sistemin çekirdeği giriş mantığındadır ve işlem yönetimi ikincil bir rol oynar.

Bir sonraki adım mantıksal olarak başlangıçtaki parametrelerin tamamında değil, istikrarlı çalışma belirtileri gösteren alanda gerçekleştirilir. İlk aşamadan sonra FastEMA, SlowEMA, SLMult ve TPMult'u yüzeyin geniş bir plato gibi göründüğü alanlara daraltıyoruz. Ardından modele iki parametre daha ekleniyor - bu aşamada genel giriş yapısının bir parçası olarak optimize ettiğimiz alt ve üst RSI sınırları. Bu, bir kerede tüm parametrik diziye odaklanmaktan kaçınmamıza, ancak bulunan istikrarlı konfigürasyondan daha ince ayarına geçmemize olanak tanır.

İleri test bu noktada işe yarar. MetaTrader 5'te, ileri optimizasyon sırasında, araştırma için belirtilen dönem otomatik olarak iki bölüme ayrılır: ilki optimizasyon için, ikincisi ise ileri test için kullanılır. Dahası, tüm çalışmalar ileri dönemde başlatılmaz, yalnızca en iyileri başlatılır: parametrelerin tam numaralandırılması yapıldığında en iyilerin %10'u, genetik algoritma kullanıldığında ise %25’i seçilir. Optimizasyon ve ileriye dönük sonuçlar daha sonra ayrı sınayıcı sekmelerinde karşılaştırılabilir. Bu, uyumu kontrol etmek için kullanışlıdır. Bu, seçilen parametre kümesinin eğitim geçmişi bölümü dışında istikrarlı kalıp kalmadığını kontrol etmek için de kullanılabilir.

İlk aşama, stratejinin tek bir keskin zirvede yaşamak zorunda olmadığını zaten gösterdi. Şimdi yapılması gereken, tespit edilen parametre bölgesinin daha sıkı bir test moduna geçişe dayanıp dayanamayacağını kontrol etmektir. İleri test, istikrarlı bir parametre bölgesini sadece geçmiş veri döneminde iyi görünen bir bölgeden ayırmaya yardımcı olur.

İleri optimizasyon

İkinci aşamada görev değişir. Şimdi, bulunan parametre bölgesinin yeni verilere aktarıldıktan sonra istikrarlı kalma kabiliyetiyle ilgileniyoruz. Bu nedenle ileri test, istikrarlı bir platonun analizinin mantıksal bir devamı haline gelir. Bulunan konfigürasyonun bağımsız bir veri bölümü üzerinde uygulanabilirliğini kontrol etmekten bahsediyoruz. Bu özellikle RSI mod filtreli EMA modelimiz için önemlidir. Bu tür sistemler genellikle optimizasyon dönemi içinde çok etkileyici sonuçlar ortaya koyarlar, ancak eğitim setinin ötesine geçtikten sonra kalitelerini belirgin şekilde kaybederler. Gerçekten istikrarlı kararları, belirli bir piyasa rejiminin özellikleriyle tesadüfen örtüşen parametrelerden ayırmamızı sağlayan ileri testtir.

İleri optimizasyon tablosu, ileri aşamadaki kullanıcı kriterinin en iyi değerlerinin optimizasyon aşamasındaki en iyi değerlerle örtüşmek zorunda olmadığını hemen göstermektedir.

İleri test sonuçları

Bizim durumumuzda, tablonun üst kısmında çok yüksek bir optimizasyon kriterine sahip geçişler görüyoruz, ancak daha yakından bakıldığında bu kararlardan bazılarının son derece az sayıda işleme dayandığı ortaya çıkıyor.

Tablonun üst kısmındaki RSI seviyelerinin dengesizliği özellikle dikkat çekicidir. Alt sınır 40-45 civarında sabitlenirken, üst sınır 75-90 aralığına çıkıyor. Bu, modelin aslında genel olarak yükselen piyasa rejimini dikkate almaya başladığı ve belirgin bir şekilde trend tek taraflılığına doğru kaydığı anlamına gelmektedir. Bu tasarım, piyasanın yönlü hareketi gerçekten desteklediği bir bölümde çok güçlü sonuçlar gösterebilir, ancak faz değiştiğinde etkinliğinin önemli bir kısmını kolayca kaybeder. Başka bir deyişle, aşırı uyum riski çoktan görülmektedir: strateji, geçmiş dönemin kendine özgü özelliklerine fazlasıyla uyum sağlamıştır.

Bu bağlamda, 244 geçiş satırı çok daha ilginç görünüyor. Kriterin uç bir değerini vermiyor, ancak belirgin bir şekilde daha dengeli ve dolayısıyla muhtemelen daha sağlam görünüyor. Bu konfigürasyon için aşağıdaki parametreler kullanılmıştır:

  • iFastEMA = 25,
  • iSlowEMA = 135,
  • iUpperLevel = 60,
  • iLowerLevel = 40,
  • iTPmult = 5,
  • iSLmult = 4.

Bu kombinasyon artık tek bir elverişli piyasa segmentinden maksimum faydayı sağlamayı amaçlamamakta, bunun yerine daha dengeli ve ölçülü bir giriş yapısı oluşturmaktadır. Sonuç olarak, strateji 134.16 USD kar, 4.08 Kar Faktörü, %7.05 Düşüş ve 5 işlem göstermektedir. Bu dönem için, bu tamamen uygulanabilir ve aynı zamanda temkinli bir profil gibi görünüyor.

Bu parametre seti için bakiye grafiği ve varlık aynı resmi doğrulamaktadır.

Bakiye grafiği
İki dönem için tek geçiş grafiği - optimizasyon ve ileri test.
 

Strateji, 72 ayı kapsayan optimizasyon aşamasında 259 işlem gerçekleştirdi ve %63.57 maksimum bakiye düşüşü ve 1.25 Kar Faktörü ile %141.16 kar gösterdi.

3 aylık ileriye dönük test sırasında 5 işlem gerçekleşti: kar %13.42, düşüş %3.91, Kar Faktörü ise 4.08 oldu.

Strateji, 1000 USD bakiyeyle başlayarak başlangıçta yaklaşık 1700 USD seviyesine kadar büyüme gösterdi, ardından önemli bir düzeltmeden geçerek Eylül 2022'de yaklaşık 620 USD'lik yerel bir minimuma düştü. Bunu uzun bir toparlanma ve optimizasyon döneminin sonunda yaklaşık 2400 USD seviyesinde sona eren sürekli bir yukarı yönlü bölüm takip etti. İleri segmentte, seçilen konfigürasyonun pratik uygulanabilirliği hakkındaki sonucu daha da destekleyen bir bakiye artışı eğilimi de göze çarpmaktadır.

Böylece, ileri optimizasyon, daha yakından incelendiğinde test dönemine uyum sağladığı ortaya çıkan 8'in üzerinde PF'ye sahip konfigürasyonlar da dahil olmak üzere aşırı agresif ve istatistiksel olarak kırılgan çözümleri filtrelememize olanak tanıdı. Bu bağlamda, 244 geçişi en dengeli seçenek gibi görünmektedir: kabul edilebilir karlılık, ılımlı düşüş ve bağımsız bir veri bölümünde yeterli istikrarı bir araya getirmektedir. Keşifsel optimizasyonda en çok ilgi çeken çözümler tam da bu çözümlerdir - en çarpıcı zirveyi ürettikleri için değil, zamanın ve değişen piyasa koşullarının testine daha iyi dayandıkları için.



Sonuç

Bu makalede, odağımızı bilinçli olarak maksimum kar arayışından bir alım-satım stratejisinin sürdürülebilirliğinin incelenmesine kaydırdık. Bu yaklaşım optimizasyonun mantığını değiştirmektedir. Odak noktası tek bir başarılı çalışma değil, parametrelerin tüm yüzeyidir: stratejinin nerede sağlam durduğu, nerede şekil kaybetmeye başladığı ve nerede ince ve kırılgan bir zirveye dönüştüğü. Optimizasyon çerçevelerinin özellikle yararlı olmasının nedeni budur. Sonuçların yapısına, komşu konfigürasyonlardaki davranışlarına ve parametrelerdeki küçük bir değişimle modelin kalitesinin nasıl değiştiğine bakmamızı sağlarlar. Bu anlamda, çerçeveler mühendislik tanılaması için bir araç haline gelir.

Dolayısıyla çalışmanın ana sonucu şudur:

Güçlü optimizasyon, karı maksimize etmekle değil, tam olarak neyin optimize edildiğinin anlaşılmasını maksimize etmekle ilgilidir.

İşte bu nedenle, bu makale için en karlı strateji değil, son derece basit ve şeffaf bir strateji seçildi. Burada bu, metodolojik bir avantaj anlamına gelmektedir. Temel optimizasyon ve istikrarlı bir plato seçiminden ileri testlere ve eğitim alanı dışındaki sonuçların analizine kadar sürecin kendisini gösterebilecek temiz bir test ortamına ihtiyacımız vardı. Bu seçim, ana fikri gereksiz zorluklara girmeden göstermemizi sağlıyor - MetaTrader 5'in optimizasyon özellikleri, geliştirici piyasa rejimindeki bir değişikliğe dayanabilecek istikrarlı bir alan aramaya başladığında özellikle net bir şekilde ortaya çıkar.


Makalede kullanılan programlar

# Ad Tür Açıklama
1 Expert.mq5 Uzman Danışman Makalede optimize edilen strateji için Uzman Danışman
2 CrossEMA.mq5 Gösterge EMA çaprazlamasına dayalı olay üreten gösterge
3 RSI.mq5 Gösterge Seviyelerin geçilmesine dayalı olay üreten RSI
4 postanalysis.py Komut dosyası Python'da sonradan analiz komut dosyası
5 defines.mqh Kod tabanı Makro ikameleri ve ortak metotlar kütüphanesi

MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/22578

Ekli dosyalar |
MQL5.zip (10.25 KB)
Yeni Raylara Adım Atın: MQL5'te Özel Göstergeler Yeni Raylara Adım Atın: MQL5'te Özel Göstergeler
Yeni terminalin ve dilin tüm yeni olanaklarını ve özelliklerini listelemeyeceğim. Bunlar sayısızdır ve bazı yenilikler ayrı bir makalede tartışılmaya değerdir. Ayrıca burada nesne yönelimli programlama ile yazılmış bir kod yoktur, geliştiriciler için ek avantajlar olarak bir bağlamda basitçe bahsedilemeyecek kadar ciddi bir konudur. Bu makalede, MQL4'e kıyasla göstergeleri, yapılarını, çizimlerini, türlerini ve programlama ayrıntılarını ele alacağız. Umarım bu makale hem yeni başlayanlar hem de deneyimli geliştiriciler için faydalı olacaktır, belki bazıları yeni bir şeyler bulacaktır.
En Güçlü Makine Öğrenimi Destekli İşlem Platformunu Nasıl Oluşturduk: Arşivler, Forumlar ve Sürümler Aracılığıyla MQL ve MetaTrader’ın Gelişim Süreci En Güçlü Makine Öğrenimi Destekli İşlem Platformunu Nasıl Oluşturduk: Arşivler, Forumlar ve Sürümler Aracılığıyla MQL ve MetaTrader’ın Gelişim Süreci
MQL’nin gelişimine ilişkin teknik geçmiş: sınırlı özelliklere sahip MQL ve MQL II dillerinden, prosedürel MQL4’e ve ardından yerel derleme, zengin API’ler ve tam teşekküllü bir mühendislik ortamına sahip nesne yönelimli MQL5’e. Burada, dilin temel yeteneklerini ve Python, OpenCL, ONNX, OpenBLAS, veritabanları, DirectX, ajan tabanlı AI Assistant ve Model Bağlam Protokolü (Model Context Protocol, MCP) ile entegrasyonlarını ele alıyoruz. Model Bağlam Protokolü (MCP), AI sistemlerini terminal, MetaEditor, piyasa verileri, alım-satım işlemleri ve geliştirme araçlarıyla birbirine bağlar. Bu makale, MetaQuotes ve MetaTrader’ın kökenleri, MQL4.COM ve MQL5.COM’un kullanıma sunulması, şampiyonalar, Algo Forge ve bunların ekosistem üzerindeki etkilerine ilişkin arşiv materyallerini incelemektedir.
İşte Karışınızda Yeni MetaTrader 5 ve MQL5 İşte Karışınızda Yeni MetaTrader 5 ve MQL5
Bu MetaTrader 5 ile ilgili sadece kısa bir inceleme. Sistemin tüm yeni özelliklerini bu kadar kısa sürede açıklayamam, test süreci 09.09.2009’da başladı. Bu sembolik bir tarihtir ve şanslı sayı olacağına eminim. MetaTrader 5 terminalinin ve MQL5’in beta sürümünü beş gün önce aldım. Tüm özelliklerini deneme şansım olmadı ama şimdiden etkilendim.
Matrislerden Modellere: MQL5'te ML Veri Hattı Nasıl Oluşturulur ve ONNX'e Nasıl Dışa Aktarılır? Matrislerden Modellere: MQL5'te ML Veri Hattı Nasıl Oluşturulur ve ONNX'e Nasıl Dışa Aktarılır?
Makale, MetaTrader 5'te rollerin ayrıldığı koordine edilmiş bir makine öğrenimi (ML) veri hattının düzenlenmesini açıklamaktadır: Python, modeli eğitir ve ONNX'e dışa aktarır; MQL5 ise matris/vektör aracılığıyla normalleştirme ve PCA işlemlerini yeniden gerçekleştirir ve çıkarım yapar. Bu yaklaşım, modelin girdilerini kararlı ve doğrulanabilir hale getirir ve MetaTrader 5 strateji sınayıcı, sistem davranışını analiz etmek için ölçütler sağlar.