English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
MQL5 Sihirbazı ve Hlaiman EA Oluşturucu Kullanarak Sinir Ağı EA'ları Oluşturma

MQL5 Sihirbazı ve Hlaiman EA Oluşturucu Kullanarak Sinir Ağı EA'ları Oluşturma

MetaTrader 5Uzman Danışmanlar | 13 Ocak 2022, 16:39
38 0
Ivan Negreshniy
Ivan Negreshniy

Giriş

Neredeyse her yatırımcı, sinir ağlarının varlığından haberdardır. Ancak bunların çoğu için bu konu bir kara kutudur, bilinen tek şey sinir ağlarının modelleri tanıma, çözüm için ilişkili arama yapma ve öğrenme yeteneği ve bunların piyasa davranışını tahmin etmede ve otomatik alım satımda etkili olabildiğidir. Sinir ağlarının uygulamasına odaklanan birçok bilgi kaynağı, bu konunun iyi bir şekilde öğrenilmesi için çok ciddi zaman ve emek harcanması gerektiğini vurgulayan şekilde bunların zorluğundan ve sinir ağlarının gelecekte kullanılabileceğinden bahseder.

Bu makale, bu argümanları çürütmeyi ve gelişmiş otomasyon yöntemlerinin, yatırımcılarının sinir ağlarına kolay bir başlangıç yapmasını ve uzun öğrenme sürecinin önüne geçildiğini kanıtlamayı amaçlar. Sinir ağlarına dair kendi tecrübenizi edinmenizde zor bir şey yok. Bu kesinlikle teknik analizden daha kolay.

Bunu göz önüne alarak, MQL5 Sihirbazı ve Hlaiman EA Oluşturucuyu kullanarak MetaTrader 5 için otomatik sinir ağlı EA'lar oluşturma yöntemini açıklayacağız.

Elimizdeki soruna çözüm bulmak için araç seçimi rastgele olmaktan çok uzaktır:

  1. MQL5 Sihirbazı, ek modüller kullanarak oluşturulan kodu ölçeklendirmenize olanak sağlayan, otomatik MQL5 kod oluşturmanın etkili ve bugüne kadarki en hızlı mekanizmasıdır.
  2. Hlaiman EA Oluşturucu, bir Uzman Danışmanın MQL5kodunda doğrudan programlanabilir nesne entegrasyonunun esnek bir mekanizmasına sahip bir sinir ağı cihazıdır.

"EA" kısaltması, bir isimdeki "EA" kullanımının sıklıkla yanıltıcı olduğu ve nesnelerin asıl niteliğini yansıtmadığı diğer durumların aksine, bir sinir ağlı EA'da tanıma ve öğrenme ile ilişkili insana özgü özellikler hakim olduğundan Uzman Danışman adına kasıtlı olarak eklenmiştir.


Genel Açıklama

Makalenin amacında belirtilen nedenden dolayı, burada sinir ağlarının herhangi bir teorik bilgisini, sınıflandırmasını ve yapısını veya finans piyasaları ile ilgili araştırma verilerini bulamayacaksınız. Bu bilgi diğer kaynaklarda bulunabilir. Bu makalede, kasıtlı olarak kendimizi, sinir ağı kavramını, grafik fiyat modellerinin tanınmasına dayalı piyasa girişlerini ilişkili olarak düşünebilen ve tahmin edebilen bir kara kutu olarak sınırlayacağız. Aynı nedenle, bir kârlı fiyat hareketinden önce gelen bir alım satım enstrümanı grafiğinde çubukların kesintisiz sırası olan, modelin en basit gösterimini kullanacağız.

Sorun çözme araçları hakkında birkaç kelime. Hlaiman'ın aksine, MQL5 Sihirbazı genellikle çeşitli makalelerin ve belgelerin konusu olmuştur ve tıpkı MetaTrader 5 gibi hiçbir tanıtıma ihtiyacı yoktur. Sosyal yönlü Hlaiman projesi, içlerinden biri EA Oluşturucu olmak üzere, eklenti biçiminde çok amaçlı yazılımın geliştirilmesi ve tanıtılmasına yöneliktir. Daha önce bahsedildiği gibi, EA Oluşturucu, fonksiyonel olarak entegrasyon mekanizmasına sahip bir sinir ağı cihazını temsil eder.

Hlaiman EA Oluşturucu <hlaim.exe> - çok belgeli arayüze ve dinamik olarak yüklenebilir bileşen kitaplıkları formunda eklentilere sahip bir Windows GUI uygulamasını temsil eden bir kabuk - içerir. Sistem, hem standart olabilen hem de eklentilerin bir parçası olarak yüklenebilen bir dizi manuel ve algoritmik ayarlama ve bileşen kontrol yöntemi sağlar. Sistem çalışması sırasında, nesnelerin karmaşık hiyerarşilerini oluşturabilirsiniz ve örneğin betikler gibi otomasyon yazılım araçları ve Nesne Denetçisi kullanarak bunların yöntemleri ve özellikleri üzerinde esnek kontrole sahip olabilirsiniz.

Hlaiman EA Oluşturucunun MQL5 ile entegrasyonu Object Pascal betik yorumlayıcıyı içerirken kaynak kodu Adlandırılmış Kanallar aracılığıyla aktarılır. Bir çok katmanlı algılayıcı (MLP), ana sinir ağı bileşeni olarak kullanılır.

Hlaiman EA Oluşturucu, bir sinyal kitaplığı modülü -SignalHNN.mqh-kullanılarak MQL5 Sihirbazı ile entegre edilir. Otomatik olarak oluşturulduktan sonra Uzman Danışmana, herhangi bir sayıda enstrüman ve zaman aralığında alım satım yapması öğretilebilir. МetaТrader 5 terminalinde, sinyalleri belirten oklar, fiyat grafiğine, oklar için grafik nesneleri kullanılarak manuel olarak veya aynı zamanda Uzman Danışmanın eğitim sürecini başlatan TeachHNN.mq5 betiği kullanılarak otomatik olarak çizilebilir.

Bununla birlikte teorik açıklama sona eriyor. Şimdi iki bölüme ayrılan pratik kısma geçelim: Çalışma İlkeleri ve Uygulama.

İkinci bölüm yazılım geliştiricilerine yöneliktir ve burada esas olarak bu web sitesine saygıdan sağlanmıştır. Bu nedenle bu, özellikle programlama yetenekleri edinmeye dair az ilgili olan veya hiç ilgili olmayan, ancak sinir ağlı EA'lar oluşturma ve alım satım açısından bunların etkinliğini veya kullanışlılığını değerlendirme ile ilgilenen yatırımcılar için isteğe bağlıdır.


Çalışma İlkeleri

MQL5.community'de, ilerlemek için MetaTrader 5 terminaliniz olması gerektiğini söylemek muhtemelen gereksiz olacaktır. Eğer sizde yoksa, indirin ve yükleyin. Aynı zamanda, Hlaiman EA Oluşturucunun demo sürümünü de yüklemelisiniz.

МetaТrader 5 terminalini başlatın ve MetaEditor'ı çalıştırın. MQL5 Sihirbazını Açın. Bunu "Ctrl+N" kısayol tuşunu kullanmanın yanı sıra Dosya menüsü altındaki veya Standart araç çubuğundaki "Yeni" seçeneğini kullanarak yapabilirsiniz.

MQL5 Sihirbazı penceresinde, "Uzman Danışman (oluştur)" seçeneğini seçin "Sonraki" seçeneğine tıklayın.

Şekil 1. MQL5 Sihirbazında bir Uzman Danışman oluşturma

Şekil 1. MQL5 Sihirbazında bir Uzman Danışman oluşturma

Uzman Danışmanın konumunu ve adını belirtin, örneğin "Experts\SampleHNN" ve "Sonraki" seçeneğine tıklayın.

Şekil 2. Uzman Danışmanın Genel Özellikleri

Şekil 2. Uzman Danışmanın Genel Özellikleri

"Ekle" düğmesine tıklayın. "Sinyal Modülü Parametreleri" penceresini göreceksiniz, açılır listeden "Hlaiman Sinir Ağlı EA oluşturucu modellerinin sinyalleri" seçeneğini seçmeniz ve "Tamam" tuşuna basmanız gerekir.

Şekil 3. Hlaiman Sinir Ağlı EA oluşturucunun alım satım sinyali modülünü seçme

Şekil 3. Hlaiman Sinir Ağlı EA oluşturucunun alım satım sinyali modülünü seçme

Oldukça temel bir uygulama durumunda, MWQL5 Sihirbazının kalan adımlarının tamamında "Sonraki" seçeneğine tıklayabilirsiniz. Gerekirse, ek seçeneklerin seçilmesi ile Uzman Danışman geliştirilebilir.

Kod oluşturmanın tamamlanmasının ardından "Derle" seçeneğine tıklayın ve MetaEditor penceresini kapatın. Oluşturulan Uzman Danışman, MetaTrader 5 terminalinin Navigatör panelinde "Uzman Danışmanlar" altında görünecektir.

Şekil 4. SampleHNN Uzman Danışmanı

Şekil 4. SampleHNN Uzman Danışman

Oluşturulan Uzman Danışmanın eğitilmesine geçmeden önce, terminalde gerekli sembole ve zaman aralığına sahip bir grafik açmalıyız. Hlaiman EA Oluşturucu uygulaması yüklü ve çalışıyor durumda olmalıdır.

Şekil 5. Sinir ağı eğitimine hazırlık

Şekil 5. Sinir ağı eğitimine hazırlık

Uzman Danışmanı eğitmek için, terminalin Navigatör panelinde "Betikler" altındaki "TeachHNN" seçeneğini seçin ve bunu belirtilen grafik için etkinleştirin.

"TeachHNN" betiğini çalıştırmadan önce, uygun ayarların tamamının emin olmalısınız. Aşağıdaki parametrelere sahiptir:

  • Dosya adı - Eğitim için Uzman Danışman adı;
  • Sinir katmanları - sinir ağı katmanlarının sayısı;
  • Orta sinirler - sinirlerin sayısı;
  • Eğitim dönemleri - eğitim dönemlerinin sayısı;
  • Model çubukları - bir modeldeki çubukların sayısı;
  • Bir ağ mı eğitilecek? - sinir ağı eğitimi sürecini başlat (veya yalnızca sinyal oluşturma);
  • SignalsCreate - sinyallerin grafik nesnelerini otomatik olarak oluşturmak için;
  • SignalsBarPoints - puan cinsinden ifade edilen sinyal oluşturma eşik değeri;
  • SignalsBarsCount - puan hesaplaması için çubuk sayısı;
  • SignalsStartTime, SignalsEndTime - sinyal oluşturma döneminin başlangıç ve bitiş zamanı;
  • SignalsClear - eğitimin tamamlanmasının ardından sinyal görüntülerini otomatik olarak silmek için.

Şekil 6. TeachHNN betik parametreleri

Şekil 6. TeachHNN betik parametreleri

Her şey hazırsa, Uzman Danışman eğitim sürecini başlatmak için "Tamam" seçeneğini tıklayın. Bu, grafikteki mevcut sinyallerden her biri için grafik modellerinin otomatik oluşturulmasını başlatacaktır.

İlgili bilgi terminalin "Araç kutusu" panelindeki "Uzmanlar" sekmesinde görüntülenirken ilgili nesneler Hlaiman EA Oluşturucu penceresinde görünecektir.

Model oluşturmanın tamamlanması üzerine eğitim süreci başlar. Bu, ekranda görünen eğitim ilerleme çubuğunda görüntülenir.

Hlaiman EA Oluşturucuyu Eğitme

Şekil 7. Eğitim ilerlemesi paneli

Süreç tamamlanana kadar bekleyin. Eğitim süreci, eğitim ilerlemesi çubuğuna sağ tıklanarak ve içerik menüsünde uygun seçeneği seçerek tamamlanmadan önce sonlandırılabilir.

Eğitim sürecinin ve betik çalışmasının tamamlanması üzerine, "Uzmanlar" sekmesinde günlüğe ilgili mesaj eklenecektir, örneğin "Sinir ağ oluşturma başarılı! 431 model", Uzman Danışman eğitiminin 431 sinyalin kullanılması ile başarıyla tamamlandığını belirtir.

Bu mesajlar, eğitim sürecine kaç modelin katıldığını gösterir ve bu modellerin sayısını ortaya koyar. Özellikle ALIŞ ve SATIŞ, aşağıdaki türde mesajlar kullanılarak belirlenir: "Model #211'de satış sinyali algılandı"

Şekil 8. Eğitim sırasında TeachHNN betik mesajları

Şekil 8. Eğitim sırasında TeachHNN betik mesajları

Uzman Danışmanın eğitim sürecinin bir hata ile başlamasının nedenleri aşağıdaki gibidir:

  1. Hlaiman uygulaması, gerektiği şekilde başlatma öncesinde açık ve çalışır durumda değildir. Bu durumda aşağıdaki hata mesajı görüntülenecektir: "CSignalHNN::InitHNN: Hata! kanal sunucusu başlatılıyor (olası neden: HLAIMAN UYGULAMASI ÇALIŞMIYOR!)".
  2. Sinyallerin otomatik oluşturulması devre dışı bırakıldığında grafikteki sinyalleri belirten okların bulunmaması (SignalsCreate değişkeni = false). Bu durumda aşağıdaki hata mesajı görüntülenecektir: "OnStart: hata, emirler oku bulunamadı!" Otomatik sinyal oluşturma etkinleştirilmişse (SignalsCreate değişkeni = true), grafikte başka grafik nesnelerinin bulunması bir hataya neden olabilir, çünkü özel işaretlerin programda kurcalanmaması gerekir. Bu nedenle, otomatik sinyal oluşturma için tüm grafiklerin ayrı ayrı açılması tavsiye edilir.

Uzman Danışmanın eğitimi tamamlandığında, GUI Hlaiman'a geçiş yaparak ve uygun nesneleri ve görselleştirme panellerini seçerek ilgili sonuçlara bakabilirsiniz.

Şekil 9. Hlaiman uygulamasının "Metin" sekmesi

Şekil 9. Hlaiman uygulamasının "Metin" sekmesi


Şekil 10. Hlaiman uygulamasının "Grafik" sekmesi

Şekil 10. Hlaiman uygulamasının "Grafik" sekmesi

En az bir alım satım enstrümanı üzerinde başarılı Uzman Danışmanın eğitiminin ardından, test ve/veya optimizasyona geçebiliriz.

Bunu yapmak için, Strateji Test Cihazında eğitilmiş Uzman Danışman adını, sembolü, zaman aralığını ve diğer test parametrelerini seçin. Gerekiyorsa harici değişkenleri ayarlayın ve testi çalıştırın.

Şekil 11. Geriye dönük test için SampleHNN Uzman Danışman ayarları

Şekil 11. Geriye dönük test için SampleHNN Uzman Danışman ayarları


Şekil 12. SampleHNN Uzman Danışman harici değişkenleri değiştirilebilir

Şekil 12. SampleHNN harici değişkenleri Uzman Danışman değiştirilebilir

Aşağıda, Strateji Test Cihazındaki Uzman Danışman işlem raporunun bir örneği yer almaktadır: Uzman Danışman, eğitim betiğinin harici parametrelerinin tamamı varsayılan olarak ayarlanmış şekilde otomatik olarak oluşturulan sinyaller kullanılarak eğitilmiştir. Eğitim dönemi: 01.01.2010-01.07.2013, enstrüman: EURUSD H4.


Strateji Test Cihazı Raporu

Uzman Danışman:SampleHNN
Sembol: EURUSD
Dönem: H4 (2010.01.01-2013.07.12)
Para birimi: USD
İlk Para Yatırma: 10.000,00
Kaldıraç: 0,111111111
Geriye dönük test
Geçmiş Kalitesi: %100
Çubuklar: 5497
Net Kâr: 9.159,58
Brüt Kâr: 29.735,97
Brüt Zarar: -20.576,39
Kâr Faktörü: 1,45
Kurtarma Faktörü: 12,81
AHPR: 1,0005 (%0,05)
GHPR: 1,0005 (%0,05)
Toplam Alım Satım: 1417
Toplam İşlemler: 2246
Tikler: 60211228
Mutlak Bakiye Düşüşü: 0,00
Maksimum Bakiye Düşüşü: 679,98 (%3,81)
Bağıl Bakiye Düşüşü: %4.00 (715.08)
Beklenen Geri Ödeme: 6,46
Sharpe Oranı: 0,16
LR Korelasyonu: 0,98
LR Standart Hatası: 595.06
Kısa Alım Satımlar (kazanılan %): 703 (%56,61)
Kâr Alım Satımları (toplamın %'si): 793 (%55,96)
En Büyük Kâr Alım Satımı: 53.00
Ortalama Kâr Alım Satımı: 37,50
Maksimum ardışık kazançlar: 9 (450,38)
Maksimum ardışık kâr: 450,38 (9)
Ortalama ardışık kazançlar: 2
Semboller: 1
Öz Varlık Düşüşü Mutlak: 6,60
Öz Varlık Düşüşü Maksimum: 715.08 (%4.00)
Öz Varlık Düşüşü Bağıl: %4.00 (715.08)
Marj Düzeyi: %6929.24
Z-Hesabı: -1,24 (%78,50)
OnTester Sonucu: 0
Uzun Alım Satımlar (kazanılan %): 714 (%55,32)
Zarar Eden Alım Satımlar (toplamın %'si) 624 (%44.04)
En Büyük Zarar Alım Satımı: -53,30
Ortalama Zarar Alım Satımı: -32,97
Maksimum ardışık zararlar: 9 (-234.00)
Maksimum ardışık zarar: -276,67 (7)
Ortalama ardışık zararlar: 2

Şekil 13. SampleHNN Uzman Danışman geriye dönük test sonuçları

Şekil 13. SampleHNN Uzman Danışman geriye dönük test sonuçları


Şekil 14. SampleHNN Uzman Danışman piyasaya giriş istatistikleri

Şekil 14. The SampleHNN Uzman Danışman piyasaya giriş istatistikleri


Şekil 15. SampleHNN Uzman Danışman MFE/MAE'si ile kâr arasındaki korelasyon

Şekil 15. SampleHNN Uzman Danışman MFE/MAE'si ile kâr arasındaki korelasyon


Şekil 16. SampleHNN Uzman Danışman pozisyon tutma süresi istatistikleri

Şekil 16. SampleHNN Uzman Danışman pozisyon tutma süresi istatistikleri

Uygulama

Ana MQL5 uygulama bileşeni, SignalHNN.mqh sinyal modülünde açıklanan CSignalHNN sınıfıdır. Sınıf CExpertSignal temel sınıfından devralınır ve Hlaiman çalışması ve entegrasyonunun yanı sıra MQL5 Sihirbazı kullanılarak Uzman Danışmanlar ile çalışma için gerekli veri alanları ve yöntemlerinin tamamını içerir.

Sınıf şablonu aşağıdaki gibidir:

//+------------------------------------------------------------------+
//| Class CSignalHNN.                                                |
//| Purpose: Class of generator of trade signals based on            |
//|          the 'Hlaiman EA Generator Neural Net' indicator.        |
//| Is derived from the CExpertSignal class.                         |
//+------------------------------------------------------------------+
class CSignalHNN :public CExpertSignal
  {
protected:
   //--- variables
   int               m_hnn;                   // handle of HNN connect
   string            hnn_path;                // MT5 Terminal data path
   string            hnn_fil;                 // HNN file w neural net 
   string            hnn_nam;                 // Expert name
   string            hnn_sym;                 // Symbol name
   string            hnn_per;                 // Period name
   ENUM_TIMEFRAMES   hnn_period;              // Period timeframe
   int               hnn_index;               // Index ext multinet
   int               hnn_bar;                 // index of last bar
   int               hnn_in;                  // input layer 
   int               hnn_out;                 // output layer
   int               hnn_layers;              // layers count
   int               hnn_neurons;             // neurons count
   int               hnn_epoch;               // learn epoch
   double            hnn_signal;              // value of last signal
   double            pattern[];               // values of the pattern
   bool              hnn_norm;                // normalize pattern

public:
                     CSignalHNN(void);        // class constructor
                    ~CSignalHNN(void);        // class destructor
   //--- methods of setting adjustable parameters
   void              PatternBarsCount(int value) { hnn_in = value; ArrayResize(pattern, value + 1);  }
   void              LayersCount(int value)      { hnn_layers = value;  }
   void              NeuronsCount(int value)     { hnn_neurons = value;  }
   void              EpochCount(int value)       { hnn_epoch = value;  }
   void              Normalize(bool value)       { hnn_norm = value;  }
   //--- method of verification of settings
   virtual bool      ValidationSettings(void);
   //--- method of creating the indicator and timeseries
   virtual bool      InitIndicators(CIndicators *indicators);
   //--- methods of checking conditions of entering the market
   virtual double    Direction(void);

   bool              FillPattern(datetime tim = 0);      // prepare pattern
   bool              AddPattern(string name, int ptype);  // add new pattern
   bool              TeachHNN(void);                     // learn neural net
   bool              SaveFileHNN(void);                  // neural net file
   double            CalculateHNN(void);                 // calc neural signal

                                                        //protected:
   //--- method of initialization of the Hlaiman Application
   bool              InitHNN(bool openn);                // Hlaiman App Init
   void              FreeHNN(void)
     {                     // Hlaiman App Deinit
      if(m_hnn!=0 && m_hnn!=INVALID_HANDLE)
        {
         FileClose(m_hnn);
         m_hnn=0;
        }
     };
  };

Oluşturucu kullanarak sınıf örneğinin oluşturulmasının ardından bu nesne iki ana modda çalışabilir:

  1. Eğitim modu: Bu mod, piyasa modellerinin toplanması ve sinir ağının eğitilmesi ile ilgilidir.
  2. Gösterge modu: Bu modda, sinir ağı mevcut model kullanılarak hesaplanır.

Bu mod, Boolean parametresi openn kullanılarak InitHNN başlatma modunun çağrılması üzerine tanımlanır. Bu parametrenin true değeri, gösterge modunda (2) eğitilen sinir ağının veri dosyalarının aranması ve açılmasının yanı sıra yüklenmesi ve çalışmasını başlatır. Bu mod, çalıştırma modu olarak değerlendirilir ve Uzman Danışmanda alım satım için kullanılır.

openn=false ile InitHNN yöntemi çağrıldığında başlatılan eğitim modunun (1) aksine gösterge modu, Uzman Danışman için hazırlık niteliğindedir ve eğitim betiğinin çalışması için kullanılır.

Başlatma yöntemi aşağıdaki şekilde uygulanır:

//+------------------------------------------------------------------+
//| Initialize HNN                                                   |
//+------------------------------------------------------------------+
bool CSignalHNN::InitHNN(bool openn)
  {
//--- initialize Hlaiman Application
   int num=0;
   ulong res=0;
   if(m_symbol!=NULL)
     {
      hnn_sym=m_symbol.Name();
      hnn_period=m_period;
        } else {
      hnn_sym=_Symbol;
      hnn_period=_Period;
     }
   hnn_per = string(PeriodSeconds(hnn_period) / 60);
   hnn_fil = hnn_nam + NAME_DELIM + hnn_sym + hnn_per + NAME_DELIM + string(hnn_index) + TYPE_NEURO;
   if(m_hnn== 0|| m_hnn == INVALID_HANDLE)
      m_hnn=FileOpen(HLAIMAN_PIPE,FILE_READ|FILE_WRITE|FILE_BIN);
   if(m_hnn!=0 && m_hnn!=INVALID_HANDLE)
     {
      string source,result="";
      if(openn==true)
        {
         result=CON_OPENN+CON_TRUE;
         if(!FileIsExist(hnn_fil,FILE_READ))
           {
            if(FileIsExist(hnn_fil,FILE_READ|FILE_COMMON))
               hnn_fil=TerminalInfoString(TERMINAL_COMMONDATA_PATH)+PATH_FILES+hnn_fil;
            else
              {
               //              hnn_fil = hnn_path + PATH_MQL5 + PATH_FILES + hnn_fil;
               hnn_fil=TerminalInfoString(TERMINAL_DATA_PATH)+PATH_MQL5+PATH_FILES+hnn_fil;
              }
           }
         else hnn_fil=TerminalInfoString(TERMINAL_DATA_PATH)+PATH_MQL5+PATH_FILES+hnn_fil;
           } else {
         result=CON_OPENN+CON_FALSE;
         hnn_fil=TerminalInfoString(TERMINAL_DATA_PATH)+PATH_MQL5+PATH_FILES+hnn_fil;
        }
      source="unit InitHNN; Interface "+result+" var libr, term, exp, sym: TObject;"
             " Implementation function main: integer;\n\r" // Line #1
             " begin"
             " Result := 0;"
             " libr := Open('mt45.dll');\n\r" // Line #2
             " if (libr <> nil) then"
             " begin"
             " term := Open('"+hnn_path+"');\n\r" // Line #3
             " if (term <> nil) then"
             " begin"
             " exp := term.ObjectOfName('"+hnn_nam+"');"
             " if (exp = nil) then exp := term.AddObject('TMT45Expert');\n\r" // Line #5
             " if (exp <> nil) then"
             " begin"
             " if (exp.Name <> '"+hnn_nam+"') then exp.Name := '"+hnn_nam+"';\n\r" // Line #6
             " sym := exp.ObjectOfName('"+hnn_sym+hnn_per+"');"
             " if (sym = nil) then sym := exp.AddObject('TMT45Symbol');"
             " if (sym <> nil) then"
             " begin"
             " sym.Log.Add('"+hnn_sym+hnn_per+"');\n\r"
             " if (sym.Name <> '"+hnn_sym+hnn_per+"') then sym.Name := '"+hnn_sym+hnn_per+"';"
             " if (sym.Period <> "+hnn_per+") then sym.Period := "+hnn_per+";"
             " if (openn = true) then"
             " begin"
             //                   " sym.Log.Add('" + hnn_fil + "');"
             " if (sym.Open('"+hnn_fil+"')) then Result := sym.TeachInput;\n\r" // ret input Line #8
             " end else"
             " begin"
             " sym.TeachInput := "+IntegerToString(hnn_in)+";"
             " sym.TeachOutput := "+IntegerToString(hnn_out)+";"
             " sym.TeachLayer := "+IntegerToString(hnn_layers)+";"
             " sym.TeachNeurons := "+IntegerToString(hnn_neurons)+";"
             " sym.TeachEpoch := "+IntegerToString(hnn_epoch)+";"
             " sym.FileName := '"+hnn_fil+"';"
             " Result := sym.TeachInput;\n\r" // ret input Line #9
             " end;"
             " end;"
             " end;"
             " end;"
             " end;"
             " end; end.";
      FileWriteString(m_hnn,source,StringLen(source));
      FileFlush(m_hnn);
      while(res<=0 && (MQL5InfoInteger(MQL5_TESTER) || num<WAIT_TIMES))
        {
         Sleep(SLEEP_TIM);
         res=FileSize(m_hnn);
         num++;
        }
      if(res>0)
        {
         result=FileReadString(m_hnn,int(res/2));
         res=StringToInteger(result);
         if(res<=RES_OK)
            printf(__FUNCTION__+": Error! Initialization data(possible reason: FILE NOT EXIST OR CORRUPTED "+hnn_fil);
         else
           {
            printf(__FUNCTION__+": Initialization successful! NEURAL PATTERN "+string(res));
            ArrayResize(pattern,int(res+1));
            return(true);
           }
        }
      else
         printf(__FUNCTION__+": Error! pipe server not responding(possible elimination: RESTART HLAIMAN APPLICATION)");
     }
   else
      printf(__FUNCTION__+": Error! initializing pipe server (possible reason: HLAIMAN APPLICATION IS NOT RUNNING!)");
//--- ok
   return(false);
  }

Koddan görülebileceği gibi, ilk başlatma adımı, Hlaiman uygulaması ile bağlantı için bir adlandırılmış kanalı açma girişimini içerir. Bu girişim başarısız olursa (örneğin <hlaim.exe> çalışmıyorsa) bir negatif durum ile çıkış gerçekleştirilir. İkinci adımda (birinci adımın başarıyla tamamlanması ve gösterge modunun çalıştırılması üzerine) terminalin yerel ve ortak klasörleri, sinir ağı verilerine sahip gerekli dosya adı için aranır. Üçüncü adım ise, doğrudan Hlaiman uygulamasında başlatma için ObjectPascal (Delphi) içindeki kodun hazırlanması ile ilgilidir.

Ardından kod metni kaynak dizeye taşınır. Biçimlendirme uygunluğu için, "\n\r" kullanılarak alt dizelere ayrılır ve Hlaiman nesne özelliklerinin çağrılarını ve yöntemleri (yorumlara bakınız) içerir. Metinde tanımlandığı gibi, MetaTrader 5 Hlaiman eklentisinin nesne tabanlı ortamı ağaç mimarisini temsil eder, burada eklenti nesnesi kökte bulunur.

МetaТrader 5 terminal nesnesi sonraki seviyededir ve bunu Uzman Danışman ve sembol nesneleri izler. Adlandırılmış kanal aracılığıyla aktarılan kaynak kodunun başarılı dönüşümü ve yürütmesi durumunda, döndürülen Sonuç değeri sinir ağı giriş vektörünün öğe sayısını içerecektir. Kodun belirttiği şekilde bu değer, model dizisini başlatmak için kullanılır ve yöntem yürütme bir pozitif durum ile tamamlanır.

CSignalHNN sınıfının diğer kilit yöntemleri CalculateHNN, AddPattern ve TeachHNN'dir. İlki, gösterge modunda sinir ağı hesaplamasının sonucunu döndürür. Diğer iki yöntem ise, sırasıyla modelleri toplarken ve sinir ağı eğitimi sürecini başlatırken eğitim modunda kullanılır.

Bu yöntemlerin <SignalHNN.mqh> içinde uygulanması şu şekildedir:

//+------------------------------------------------------------------+
//| Calculate HNN signal                                             |
//+------------------------------------------------------------------+
double CSignalHNN::CalculateHNN(void)
  {
   if(m_hnn==0 || m_hnn==INVALID_HANDLE) return(0.0);
   int num = 0;
   ulong siz = 0;
   double res=0.0;
   string source,result="";
   if(FillPattern(0)==true)
     {
      result=CON_START;
      for(int i=1; i<(ArraySize(pattern)-1); i++)
         result= result+DoubleToString(pattern[i])+CON_ADD;
      result = result + DoubleToString(pattern[ArraySize(pattern) - 1]) + CON_END;
      source = "unit CalcHNN; Interface " + result + " var i: integer; libr, term, exp, sym, lst: TObject;"
              " Implementation function main: double;\n\r" // Line #1
              " begin"
              " Result := 0.0;"
              " libr := Open('mt45.dll');\n\r" // Line #2
              " if (libr <> nil) then"
              " begin"
              " term := Open('"+hnn_path+"');\n\r" // Line #3
              " if (term <> nil) then"
              " begin"
              " exp := term.ObjectOfName('"+hnn_nam+"');\n\r" // Line #4
              " if (exp <> nil) then"
              " begin"
              " sym := exp.ObjectOfName('"+hnn_sym+hnn_per+"');\n\r" // Line #5
              " if (sym <> nil) then"
              " begin"
              " lst := TStringList.Create;"
              " if (lst <> nil) then"
              " begin"
              " lst.Text := cons;"
              " if (lst.Count >= sym.NetInputs.Count) then"
              " begin"
              " for i := 0 to sym.NetInputs.Count - 1 do"
              " begin"
              " sym.NetInputs.Objects[i].NetValue := StrToFloat(lst[i]);\n\r" // Line #6
              //                    " sym.Log.Add('Input ' + IntToStr(i) + ' = ' + lst[i]);"              
              " end;"
              " sym.Computed := true;"
              " Result := sym.NetOutputs.Objects[0].NetValue;\n\r" // ret input Line #7
              " end;"
              " lst.Free;"
              " end;"
              " end;"
              " end;"
              " end;"
              " end;"
              " end; end.";
      FileWriteString(m_hnn,source,StringLen(source));
      FileFlush(m_hnn);
      while(siz<=0 && (MQL5InfoInteger(MQL5_TESTER) || num<WAIT_TIMES))
        {
         Sleep(SLEEP_TIM);
         siz=FileSize(m_hnn);
         num++;
        }
      if(siz>0)
        {
         result=FileReadString(m_hnn,int(siz/2));
         res=StringToDouble(result);
        }
     } //else Print("fill pattern error!");
   return(res);
  }
//+------------------------------------------------------------------+
//| AddPattern                                                       |
//+------------------------------------------------------------------+
bool CSignalHNN::AddPattern(string name,int ptype)
  {
   int num=0;
   long res=0;
   ulong siz=0;
   string result,source,nam=name;
   if(m_hnn!=0 || m_hnn!=INVALID_HANDLE)
     {
      pattern[0]=ptype;
      result=CON_START;
      for(int i=0; i<(ArraySize(pattern)-1); i++)
         result= result+DoubleToString(pattern[i])+CON_ADD;
      result = result + DoubleToString(pattern[ArraySize(pattern) - 1]) + CON_END;
      source = "unit AddPatternHNN; Interface " + result + " Implementation function main: integer;"
              " var i: integer; out: double; onam: string;"
              " libr, term, exp, sym, ord, tck, lst: TObject;\n\r" // Line #1
              " begin"
              " Result := 0;"
              " libr := Open('mt45.dll');\n\r" // Line #2
              " if (libr <> nil) then"
              " begin"
              " term := Open('"+hnn_path+"');\n\r" // Line #3
              " if (term <> nil) then"
              " begin"
              " exp := term.ObjectOfName('"+hnn_nam+"');\n\r" // Line #4
              " if (exp <> nil) then"
              " begin"
              " sym := exp.ObjectOfName('"+hnn_sym+hnn_per+"');\n\r" // Line #5
              " if (sym <> nil) then"
              " begin"
              " lst := TStringList.Create;"
              " if (lst <> nil) then"
              " begin"
              " lst.Text := cons;"
              " if (lst.Count >= (sym.TeachInput + sym.TeachOutput)) then"
              " begin"
              " out := StrToFloat(lst[0]);"
              " if(out >= 0) then onam := 'BUY-"+nam+"'"
              " else onam := 'SELL-"+nam+"';"
              " ord := sym.ObjectOfName(onam);"
              " if (ord = nil) then ord := sym.AddObject('TMT45Order');\n\r" // Line #6                    
              " if (ord <> nil) then"
              " begin"
              " if (ord.Name <> onam) then ord.Name := onam;\n\r" // Line #7
              " if (out >= 0) then ord.OrderType := 0 else ord.OrderType := 1;"
              " if (ord.NetOutput <> out) then ord.NetOutput := out;\n\r" // Line #8
              " for i := 1 to sym.TeachInput do"
              " begin"
              " if(i <= ord.Count) then tck := ord.Items[i - 1] else"
              " tck := ord.AddObject('TMT45Tick');\n\r" // Line #10                    
              " if (tck <> nil) then"
              " begin"
              " tck.x := i;"
              " tck.y := StrToFloat(lst[i]);\n\r" // Line #11
              " end;"
              " end;"
              " end;"
              " Result := sym.Count;\n\r" // ret input Line #12
              " end;"
              " lst.Free;"
              " end;"
              " end;"
              " end;"
              " end;"
              " end;"
              " end; end.";
      FileWriteString(m_hnn,source,StringLen(source));
      FileFlush(m_hnn);
      while(siz<=0 && (MQL5InfoInteger(MQL5_TESTER) || num<WAIT_TIMES))
        {
         Sleep(SLEEP_TIM);
         siz=FileSize(m_hnn);
         num++;
        }
      if(siz>0)
        {
         result=FileReadString(m_hnn,int(siz/2));
         res=StringToInteger(result);
        }
     }
   return(res>0);
  }
//+------------------------------------------------------------------+
//| TeachHNN                                                         |
//+------------------------------------------------------------------+
bool CSignalHNN::TeachHNN(void)
  {
   int num=0;
   long res=0;
   ulong siz=0;
   string result,source;
   if(m_hnn!=0 || m_hnn!=INVALID_HANDLE)
     {
      source="unit TeachHNN; Interface const WAIT_TIM = 100; WAIT_CNT = 100;"
             "  var i: integer; libr, term, exp, sym: TObject;"
             " Implementation function main: integer;\n\r" // Line #1
             " begin"
             " Result := 0;"
             " libr := Open('mt45.dll');\n\r" // Line #2
             " if (libr <> nil) then"
             " begin"
             " term := Open('"+hnn_path+"');\n\r" // Line #3
             " if (term <> nil) then"
             " begin"
             " exp := term.ObjectOfName('"+hnn_nam+"');\n\r" // Line #4
             " if (exp <> nil) then"
             " begin"
             " sym := exp.ObjectOfName('"+hnn_sym+hnn_per+"');\n\r" // Line #5
             " if (sym <> nil) then"
             " begin"
             " if (sym.Teached) then sym.Teached := false;\n\r" // Line #6
             " sym.Teached := true;\n\r" // Line #7
             " Result := sym.Count;\n\r" // ret input Line #8
             " end;"
             " end;"
             " end;"
             " end;"
             " end; end.";
      FileWriteString(m_hnn,source,StringLen(source));
      FileFlush(m_hnn);
      while(siz<=0)
        {// && (MQL5InfoInteger(MQL5_TESTER) || num < WAIT_TIMES)) {
         Sleep(SLEEP_TIM);
         siz=FileSize(m_hnn);
         num++;
        }
      if(siz>0)
        {
         result=FileReadString(m_hnn,int(siz/2));
         res=StringToInteger(result);
        }
     }
   return(res>0);
  }

Kodda görülebileceği gibi, yöntem gövdesi esas olarak kaynak satırlardan oluşur, bunun metni InitHNN yöntemi açıklamasında yukarıda değerlendirilen metinlere benzer bir şekilde düzenlenir. Tek fark, eklentinin nesne tabanlı hiyerarşisinin model temsili için iki seviyeye daha sahip olmasıdır: emir ve tik. Ayrıca kod, ek nesne özellikleri ve yöntemler içerir. Örneğin sinir ağı hesaplama başlangıcı "sembol" nesnesinin Hesaplanmış bayrağı ile işaretlenirken Eğitilmiş bayrak eğitim süreci başlatılırken kullanılır.

CalculateHNN yöntemi de, bu durumda fonksiyon tarafından döndürülen "ana" değer türünün "double" olması bakımından diğer yöntemlerden farklıdır. Bu değer sinir ağı çıktısıdır: sinyal, burada ALIŞ seviyesi 0..1 aralığında yer alır ve SATIŞ seviyesi 0..-1 aralığındadır. Bu sinyal, Uzman Danışman tarafından, alım satım pozisyonlarını açmaya veya kapatmaya ilişkin kararlar alınırken kullanılır ve Yön yöntemi ile kontrol edilir. Bu yöntem, yeni bir çubuk olması durumunda yeniden hesaplama gerçekleştirir ve yüzde cinsinden ifade edilen değerini döndürür.

//+------------------------------------------------------------------+
//| Check conditions for trading signals.                            |
//+------------------------------------------------------------------+
double CSignalHNN::Direction(void)
  {
   if( m_hnn == 0 || m_hnn == INVALID_HANDLE) return(EMPTY_VALUE);
//--- check new bar condition
   int cur_bar = Bars(hnn_sym, hnn_period);
   if (hnn_bar != cur_bar) {
//--- condition OK
      hnn_signal = CalculateHNN() * 100;
      hnn_bar = cur_bar;
   }
   return(hnn_signal);
  }

Alım satım pozisyonlarının açılması ve kapatılması için sinyaller bakımından Uzman Danışmanın sinyal yanıt eşik değerini ayarlamak için aşağıdaki harici değişkenleri kullanabilirsiniz:

  • input int    Signal_ThresholdOpen =10;      // Açılış için sinyal eşik değeri [0...100]
  • input int    Signal_ThresholdClose=10;      // Kapanış için sinyal eşik değeri [0...100]

Sinyal seviyeleri, pratikte, çoğunlukla eğitim sırasında göstergede görüntülenen hesaplama hatasının düşüş dinamiklerinin görsel olarak izlenmesi ile değerlendirilebilen sinir ağı eğitimi kalitesi ve yoğunluğuna bağlıdır.


Sonuçlar

Hlaiman EA Oluşturucu, MQL5 ile entegrasyon için bileşenler ve bir şeffaf kontrollü nesne tabanlı ortam sağlar, böylece:

  1. MQL5 Sihirbazı arayüzü, sinir ağlı EA'lar oluşturma imkanının yanı sıra sinyal ve model tanımaya dayalı ek bir tür elde eder.
  2. Hızlı bir şekilde sinir ağlı EA'lar oluşturma yeteneğine ek olarak, bunları değişen piyasa davranışına hızlıca uyarlayabilirsiniz ve bunları farklı alım satım enstrümanları ve zaman aralıkları üzerinde tekrarlı biçimde eğitebilirsiniz.
  3. MQL5 Sihirbazının birçok sinyal modülünü etkinleştirebilmesinden dolayı karmaşık, çok para birimli, sinir ağlı EA'lar ve/veya bileşik gösterge tabanlı, sinir ağlı EA'lar oluşturabilirsiniz. Bunlar aynı zamanda örneğin zaman filtreleri olmak üzere çeşitli ek filtreler ile birleştirilebilir.
  4. Son olarak, sinir ağı modülü kendi içinde, hazır bir Uzman Danışmanın verimini arttırmak için ek bir filtre olarak kullanılabilir. Bu, bir sinir ağının orijinal Uzman Danışmanın test sonuçlarının görselleştirme grafikleri kullanılarak eğitilebilmesi yeteneği sayesinde mümkündür.

Entegre bilgi işlem sisteminin çok iyi performans göstermeyen şekilde görünmesine neden olan betik yorumlayıcı kullanımı, yukarıda sağlanan uygulamanın dezavantajlarından biri olarak değerlendirilebilir. Ancak, ilk olarak, Hlaiman eklentisinin çalışmasının yanı sıra betik kodu yorumlamasının EX5 ile eş zamansız olduğu belirtilmelidir, yani paralel görev ile işlem yapıyoruz. İkinci olarak, örneğin büyük sinir ağları ile işlem yapmak olmak üzere zaman alan hesaplamaların hızını artırmak için, MetaTrader 5 ve Hlaiman adlandırılmış ağ kanalları aracılığıyla bağlanmış farklı bilgisayarlar üzerinde çalıştırılabilir. Bir alım satım terminalinin ayrı bir bilgisayar üzerinde başlatılması ile hem performans kazanırsınız hem de bunun güvenliğini arttırabilirsiniz.

Bir mantığa oturtulduğunda, alım satım sürecinde kendi kendine öğrenebilen Uzman Danışmanların gelişmesine bakabiliriz. Bu noktada, bunu yapmanın en kolay kolu, her ikisi de gerekli fonksiyonelliği sağlayan aynı CSignalHNN sınıfını kullandığından, Uzman Danışmanın kodunu eğitim betiği kodu ile birleştirmektir. Bu materyal, bir devam makalesinin konusu olabilir veya ilgi çekici görünüyorsa tamamen yeni bir makalenin temelini oluşturabilir.

Hlaiman EA Oluşturucunun demo sürümü buradan indirilebilir.

Ekler:

  • SignalHNN.mqh - sinyal modülü "MQL5\Include\Expert\Signal\".
  • TeachHNN.mq5 - eğitim betiği "MQL5\Scripts\".
  • SampleHNN.mq5 - "Hlaiman Sinir Ağlı EA oluşturucu modellerinin sinyalleri" alım satım sinyal modülü temelli ve MQL5 Sihirbazı kullanılarak oluşturulan Uzman Danışman.

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

Ekli dosyalar |
signalhnn.mqh (23.88 KB)
teachhnn.mq5 (9.67 KB)
samplehnn.mq5 (6.35 KB)
Otomatik Haber Yatırımcısı Oluşturma Otomatik Haber Yatırımcısı Oluşturma
Bu makale, size basit bir OO EA'nın sıfırdan nasıl oluşturulacağını gösteren ve nesne yönelimli programlamaya dair bazı ipuçları sağlayan bir diğer MQL5 OOP sınıfı makalesinin devamıdır. Bugün size haberlere göre alım satım yapabileceğiniz bir EA geliştirmek için gereken teknik temelleri göstereceğim. Amacım, size OOP hakkında fikir vermeye devam etmek ve ayrıca, bu makale dizisinde dosya sistemi ile çalışan yeni bir konuyu ele almak.
Bir Diğer MQL5 OOP Sınıfı Bir Diğer MQL5 OOP Sınıfı
Bu makale, bir teorik alım satım fikri tasarlamaktan bu fikri deneysel dünyada gerçek hale getiren bir MQL5 EA programlamaya kadar bir Nesne Yönelimli Uzman Danışmanı sıfırdan nasıl oluşturacağınızı gösterir. Bana göre, yaparak öğrenmek başarılı olmak için sağlam bir yaklaşımdır, bu yüzden fikirlerinizi nihai olarak Forex robotlarınızı kodlamak için nasıl sıraya dizeceğinizi görmeniz için pratik bir örnek göstereceğim. Ayrıca amacım sizi OO ilkelerine bağlı kalmaya davet etmek.
MQL5 Sihirbazı: EA'ya Herhangi bir Fiyattaki Bekleyen Emirleri Açması Nasıl Öğretilir? MQL5 Sihirbazı: EA'ya Herhangi bir Fiyattaki Bekleyen Emirleri Açması Nasıl Öğretilir?
Bu makale, mevcut fiyattan herhangi bir uzaklıkta olan bekleyen emirleri ayarlamanıza olanak sağlayan fonksiyonelliğin uygulanması için bir alım satım sinyali modülünün kodunun değiştirilmesi yöntemini açıklamaktadır: bu fiyat, önceki çubuğun Kapanış veya Açılış fiyatı veya hareketli ortalama değeri olabilir. Birçok seçenek vardır. Önemli olan, bekleyen bir emir için herhangi bir açılış fiyatı belirleyebilmenizdir. Bu makale, bekleyen emirler ile alım satım yapan yatırımcılar için faydalı olacaktır.
Hesaplamalar için OpenCL Nasıl Yüklenir ve Kullanılır? Hesaplamalar için OpenCL Nasıl Yüklenir ve Kullanılır?
MQL5'in OpenCL için yerel destek sağlamaya başlamasının üzerinden bir yıldan fazla zaman geçti. Ancak, Uzman Danışmanlarında, göstergelerinde veya betiklerinde paralel bilgi işlem kullanmanın gerçek değerini pek de çok kullanıcı görmemiştir. Bu makale, bu teknolojiyi MetaTrader 5 alım satım terminalinde kullanmayı deneyebilmeniz için OpenCL'yi bilgisayarınıza yüklemenize ve kurmanıza yardımcı olma görevi görür.