English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
NeuroSolutions Yapay Sinir Ağlarını Bağlama

NeuroSolutions Yapay Sinir Ağlarını Bağlama

MetaTrader 5Entegrasyon | 16 Aralık 2021, 15:23
104 0
ds2
ds2

Giriş

Yapay sinir ağlarıyla tanışan alım satım yapan kişilerin hepsi, onları piyasa analizinde kullanmanın ne kadar harika olacağını düşünüyordur. Herhangi bir konfigürasyonda kendi ağlarınızı rahatça oluşturmanıza, bunları görsel modda öğretmenize ve test etmenize izin veren birçok program mevcuttur. İstemci terminalinden gerekli bilgileri bir yapay sinir ağı programına aktarabilir ve orada analiz edebilirsiniz.

Peki ya oluşturulan yapay sinir ağını otomatik alım satımda kullanmak isterseniz? Bir Uzman Danışmanın yapay bir sinir ağına bağlanması ve gerçek zamanlı modda al sat yapması mümkün müdür?

Evet, mümkündür. Birçok yapay sinir ağı programı gerekli program arayüzlerine sahiptir. NeuroSolutions bunlardan biridir. En son sürümü 6'dır ancak bu sürüm herkeste yoktur ve şu an için en popüler olan sürüm 5'tir. Bu nedenle bu makale 5. sürümle olan etkileşimi açıklamaktadır. Programın tam paketine sahip olmalısınız; bu pakette ihtiyacımız olan özel Çözüm Sihirbazı bulunur.


Bir Strateji Düşünün

Test örneğimizin stratejisi basit olacaktır. Buna WeekPattern diyelim. Bir yapay sinir ağı kullanarak D1 zaman diliminde bir çubuğun açılışında kapanış fiyatını tahmin edecektir. Elde edilen bilgilere göre Al veya Sat işlemi yapacak ve tüm gün boyunca elinde tutacaktır. Fiyat tahmini önceki 5 çubuğun OHLC değerlerine dayalı olacaktır. Yapay sinir ağı işleminin doğruluğunu arttırmak için fiyatların kendisi yerine yalnızca mevcut (sıfır) çubuğun açılış fiyatına ilişkin fiyat değişikliklerini göndereceğiz.


Eğitim için Verilerin Hazırlanması

Bir ağ oluşturmaya başlamadan önce, istemci terminalinden tüm alıntıları gerekli biçimde dışa aktaracak bir MQL5 komut dosyası yazalım. Bu bilgi yapay sinir ağını eğitmek için gereklidir. Veriler bir metin dosyasına aktarılacaktır. Dosyanın ilk listesinde virgülle ayrılmış alan adlarını listeleyin. Sonraki satırlar virgülle ayrılmış veriler için kullanılacaktır. Her bir satır yapay sinir ağının girdi ve çıktılarının bir birleşimidir. Bizim durumumuzda, komut dosyası her satırda bir fiyat geçmişi çubuğu kadar geri hareket edecek ve satıra 6 çubuğun OHLC değerlerini yazacaktır (geçmişten gelen 5 çubuk girdidir ve mevcut bir çubuk da çıktıdır).

скрипт WeekPattern-Export.mq5 komut dosyası gerekli bir sembolün gerekli bir zaman diliminde başlatılmalıdır (örneğimizde bu D1 EURUSD'dir). Ayarlarda bir dosya adı ve gerekli satır sayısını belirtmelisiniz (D1 için 260 satır yaklaşık 1 yıllık geçmiştir). Komut dosyasının tam kodu:

#property script_show_inputs
//+------------------------------------------------------------------+
input string    Export_FileName = "NeuroSolutions\\data.csv"; // File for exporting (in the folder "MQL5\Files")
input int       Export_Bars     = 260; // Number of lines to be exported
//+------------------------------------------------------------------+
void OnStart() 
  {
  
   // Create the file
   int file = FileOpen(Export_FileName, FILE_WRITE|FILE_CSV|FILE_ANSI, ',');
   
   if (file != INVALID_HANDLE)
     {
      // Write the heading of data
      
      string row="";
      for (int i=0; i<=5; i++)
        {
         if (StringLen(row)) row += ",";
         row += "Open"+i+",High"+i+",Low"+i+",Close"+i;
        }
      FileWrite(file, row);
      
      // Copy all required information from the history
      
      MqlRates rates[], rate;
      int count = Export_Bars + 5;
      if (CopyRates(Symbol(), Period(), 1, count, rates) < count)
        {
         Print("Error! Not enough history for exporting of data.");
         return;
        }
      ArraySetAsSeries(rates, true);
      
      // Write data      
      
      for (int bar=0; bar<Export_Bars; bar++)
        {
         row="";
         double zlevel=0;
         for (int i=0; i<=5; i++)
           {
            if (StringLen(row)) row += ",";
            rate = rates[bar+i];
            if (i==0) zlevel = rate.open; // level for counting of prices
            row += NormalizeDouble(rate.open -zlevel, Digits()) + ","
                 + NormalizeDouble(rate.high -zlevel, Digits()) + ","
                 + NormalizeDouble(rate.low  -zlevel, Digits()) + ","
                 + NormalizeDouble(rate.close-zlevel, Digits());
           }
         FileWrite(file, row);
        }

      FileClose(file);
      Print("Export of data finished successfully.");
     }
   else Print("Error! Failed to create the file for data export. ", GetLastError());
  }
//+------------------------------------------------------------------+

Verileri dışa aktardıktan sonra data.csv dosyasını elde ederiz; dosyanın ilk satırları (örneğin) aşağıdaki gibi görünür:

Open0,High0,Low0,Close0,Open1,High1,Low1,Close1,Open2,High2,Low2,Close2,Open3,High3,Low3,Close3,Open4,High4,Low4,Close4,Open5,High5,Low5,Close5
0,0.00463,-0.0041,0.00274,-0.00518,0.00182,-0.00721,-6e-005,0.00561,0.00749,-0.00413,-0.00402,0.02038,0.02242,0.00377,0.00565,0.03642,0.0379,0.01798,0.02028,0.0405,0.04873,0.03462,0.03647
0,0.007,-0.00203,0.00512,0.01079,0.01267,0.00105,0.00116,0.02556,0.0276,0.00895,0.01083,0.0416,0.04308,0.02316,0.02546,0.04568,0.05391,0.0398,0.04165,0.04504,0.05006,0.03562,0.0456
0,0.00188,-0.00974,-0.00963,0.01477,0.01681,-0.00184,4e-005,0.03081,0.03229,0.01237,0.01467,0.03489,0.04312,0.02901,0.03086,0.03425,0.03927,0.02483,0.03481,0.02883,0.04205,0.02845,0.03809

NeuroSolutions tarafından kabul edilen format budur. Artık bir ağ oluşturmaya ve bunu eğitmeye başlayabiliriz.


Yapay Sinir Ağı Oluşturma

Bu programı ilk kez görüyor ve yapay sinir ağı hakkında çok az şey biliyor olsanız bile NeuroSolutions'da hızlı bir şekilde yapay bir sinir ağı oluşturabilirsiniz. Bunu yapmak için program başlangıcında yeni başlayanlar yönelik sihirbaz olan NeuralExpert’i (Yeni Başlayanlar) seçin:

Seçim sonrasında yapay sinir ağı tarafından çözülmesi gereken bir problem türü belirtmelisiniz:

Ardından, önceki bölümde oluşturduğumuz eğitim bilgilerini içeren dosyayı belirtin:

Ağın girdileri olarak sıfır çubuğunun alanları dışında dosyanın tüm alanlarını seçin:

Metin alanlarımız olmadığı için burada hiçbir şey seçmeyin:

Tekrardan bilgi içeren dosyamızı belirtin:

Ağımızın yalnızca bir çıktısını seçin:

Sihirbaz varsayılan olarak en basit ağı oluşturmayı önerir. Şöyle yapalım:

Sihirbaz bizim için yapay bir ağ oluşturma işini bitirmiştir (eğitimli bir ağ değil, sadece basit bir yapıdır):

Şimdi bununla çalışabiliriz. Onu eğitebilir, test edebilir ve veri analizi için kullanabiliriz.

Test düğmesine tıklarsanız eğitilmemiş ağın sorunumuzu nasıl çözeceğini görebileceksiniz. Test sihirbazının sorularını yanıtlayın:

Testi aynı dosyadaki bilgilere dayanarak gerçekleştirin:

Test bitti. “Output vs. Desired Plot” penceresinde geçmişimizde ağdan elde edilen değerleri (kırmızı renk) ve gerçek değerleri (mavi renk) gösteren tabloyu görebilirsiniz Oldukça farklı olduklarını görebilirsiniz:

Şimdi ağı eğitelim. Bunu yapmak için menünün altındaki araç çubuğundaki yeşil Start düğmesine tıklayın. Eğitim birkaç saniye sonra bitecek ve tablo değişecektir:


Şimdi grafikte ağın doğru gibi görünen sonuçları gösterdiğini görebilirsiniz. Bu nedenle, bunları alım satım için kullanabilirsiniz. Ağa WeekPattern adını verin ve kaydedin.


Yapay sinir ağını bir DLL'de dışa aktarın

NeuroSolutions'tan çıkmadan Özel Çözüm Sihirbazı’nı başlatan CSW düğmesine tıklayın. Mevcut yapay sinir ağından bir DLL oluşturmamız gerekiyor.

Sihirbaz farklı programlar için DLL'ler oluşturabilir. Anladığım kadarıyla DLL'nin derlenmesi için aşağıdaki sürümlerden birinin Visual C++'ına ihtiyacınız var: 5.0/6.0/7.0 (.NET 2002)/7.1 (.NET 2003)/8.0 (.NET 2005). Bir sebepten dolayı Express sürümünü kullanmıyor (kontrol ettim).

Hedef uygulamalar listesinde MetaTrader yok. Bu yüzden Visual C++'ı seçin.

Sonucun kaydedileceği yol:

Her şey başarıyla tamamlandıysa sihirbaz şöyle diyecektir:

Sihirbazda belirtilen klasörde çok sayıda dosya görünecektir. En çok ihtiyacımız olanlar şunlardır: WeekPattern.dll program arayüzü ile yapay sinir ağımızı içerir; WeekPattern.nsw dosyası da yapay sinir ağının eğitiminden sonraki denge ayarlarını içerir. Diğer dosyalar arasında bu DLL-Yapay Sinir Ağıyla çalışmanın bir örneğini bulabilirsiniz. Bu durumda bu bir Visual C++ 6 projesidir.


DLL-Yapay Sinir Ağını MetaTrader'a Bağlama

Önceki bölümde oluşturulan DLL-Yapay Sinir Ağı Visual C++ projelerinde kullanılmak üzere tasarlanmıştır. MQL5'te tarif edilmesi zor ve hatta imkânsız olan karmaşık bir yapıya sahip nesnelerle çalışır. Bu nedenle bu DLL'yi doğrudan MetaTrader'a bağlamayacağız. Bunun yerine küçük bir DLL adaptörü oluşturacağız. Bu adaptör yapay sinir ağı ile çalışacak basit bir fonksiyon içerecektir. Ağı oluşturacak, giriş bilgilerini iletecek ve çıkış verilerini döndürecektir.

Bu adaptör MetaTrader 5'ten kolayca çağrılacak. Adaptör de NeuroSolutions'ta oluşturulan DLL-Yapay Sinir Ağına bağlanacaktır. Adaptör Visual C++ ile yazılacağı için bu DLL'nin nesneleri ile ilgili herhangi bir sorun yaşamayacaktır.




DLL adaptörünü kendiniz oluşturmanıza gerek yoktur. Hazır DLL bu makaleye eklenmiştir. Adaptör NeuroSolutions'ta oluşturulan herhangi bir DLL-Yapay Sinir Ağı ile çalışır. Bu bölümün daha sonraki okumalarını atlayabilirsiniz.

Ancak C++ deneyiminiz varsa ve bu adaptörün nasıl oluşturulacağıyla ilgileniyorsanız bu bölümü sonuna kadar okuyun. Muhtemelen bazı diğer fonksiyonlar bir DLL-Yapay Sinir Ağından dışa aktarılabildiği için onu geliştirmek isteyeceksiniz. Örneğin, eğitim fonksiyonu (Uzman Danışman için değişen pazara uyum sağlar, ağı otomatik olarak yeniden eğitir). Önceki bölümde gösterilen Özel Çözüm Sihirbazı tarafından oluşturulan örneği analiz ederek fonksiyonların tam listesini öğrenebilirsiniz.

Bu örnekten yalnızca birkaç dosyaya ihtiyacımız olacak.

Visual C++'da (Özel Çözüm Sihirbazında kullanılanla aynı sürüm) NeuroSolutionsAdapter adlı boş bir DLL projesi oluşturun ve NSNetwork.h, NSNetwork.cpp ve StdAfx.h dosyalarını örnekten buna kopyalayın. Ayrıca boş bir main.cpp dosyası oluşturun:


main.cpp dosyasına aşağıdaki kodu yazın:

#include "stdafx.h"
#include "NSNetwork.h"

extern "C" __declspec(dllexport) int __stdcall CalcNeuralNet(
                LPCWSTR dllPath_u, LPCWSTR weightsPath_u,
                double* inputs, double* outputs)
{       
    // Transform the lines from Unicode to normal ones
    CString dllPath     (dllPath_u);
    CString weightsPath (weightsPath_u);

    // Create neuronet
    NSRecallNetwork nn(dllPath);
    if (!nn.IsLoaded()) return (1);

    // Load balances
    if (nn.LoadWeights(weightsPath) != 0) return (2);
        
    // Pass input data and calculate the output
    if (nn.GetResponse(1, inputs, outputs) != 0) return (3);

    return 0;
}

Oluşturun. DLL adaptörü hazır!


Yapay Sinir Ağını Uzman Danışmanda Kullanma

Hâlihazırda birkaç dosya oluşturduk. Uzman Danışmanın çalışması için gerekli olan dosyaları ve bunları koymanız gereken klasörleri sıralayayım. Tüm bu dosyalar makaleye eklenmiştir.

Dosya
Tanım
Nereye koyulacağı (terminal klasöründe)
WeekPattern.dll
NeuroSolutions'ta oluşturulan DLL-Yapay Sinir Ağımız
MQL5\Files\NeuroSolutions\
WeekPattern.nswyapay sinir ağımızın denge ayarları
MQL5\Files\NeuroSolutions\
NeuroSolutionsAdapter.dll
herhangi bir DLL-Yapay Sinir Ağı için evrensel DLL adaptörü
MQL5\Libraries\


İşte Expert AdvisorWeekPattern.mq5'in tam kodu. Arama ve ileri değişiklikler açısında kolay olması için yapay sinir ağıyla ilgili her şey ayrı CNeuroSolutionsNeuralNet sınıfına yerleştirilmiştir.

input double    Lots = 0.1;
//+------------------------------------------------------------------+
// Connect the DLL adapter, using which we are going to use the DLL neuronet created in NeuroSolutions
#import "NeuroSolutionsAdapter.dll"
int CalcNeuralNet(string dllPath, string weightsPath, double& inputs[], double& outputs[]);
#import 
//+------------------------------------------------------------------+
class CNeuroSolutionsNeuralNet
{
private:
   string dllPath;     // Path to a DLL neuronet created in NeuroSolutions
   string weightsPath; // Path to a file of the neuronet balances
public:
   double in[20]; // Neuronet inputs - OHLC of 5 bars
   double out[1]; // Neuronet outputs - Close of a current bar

   CNeuroSolutionsNeuralNet();
   bool Calc();
};
//+------------------------------------------------------------------+
void CNeuroSolutionsNeuralNet::CNeuroSolutionsNeuralNet()
{
   string terminal = TerminalInfoString(TERMINAL_PATH);
   dllPath     = terminal + "\\MQL5\\Files\\NeuroSolutions\\WeekPattern.dll";
   weightsPath = terminal + "\\MQL5\\Files\\NeuroSolutions\\WeekPattern.nsw";
}
//+------------------------------------------------------------------+
bool CNeuroSolutionsNeuralNet::Calc()
  {
   // Get current quotes for the neuronet
   MqlRates rates[], rate;
   CopyRates(Symbol(), Period(), 0, 6, rates);
   ArraySetAsSeries(rates, true);
      
   // Fill the array of input data of the neuronet
   double zlevel=0;   
   for (int bar=0; bar<=5; bar++)
     {
      rate = rates[bar];
      // 0 bar is not taken for input
      if (bar==0) zlevel=rate.open; // level of price calculation
      // 1-5 bars are inputed
      else
        {
         int i=(bar-1)*4; // input number
         in[i  ] = rate.open -zlevel;
         in[i+1] = rate.high -zlevel;
         in[i+2] = rate.low  -zlevel;
         in[i+3] = rate.close-zlevel;
        }
     }
 
   // Calculate the neuronet in the NeuroSolutions DLL (though the DLL adapter)
   int res = CalcNeuralNet(dllPath, weightsPath, in, out);
   switch (res)
     {
      case 1: Print("Error of creating neuronet from DLL \"", dllPath, "\""); return (false);
      case 2: Print("Error of loading balances to neuronet from the file \"", weightsPath, "\""); return (false);
      case 3: Print("Error of calculation of neuronet");  return (false);
     }
     
   // Output of the neuronet has appeared in the array out, you shouldn't do anything with it

   return (true);
  }
//+------------------------------------------------------------------+

CNeuroSolutionsNeuralNet NN;
double Prognoze;

//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
void OnTick() 
  {
   // Get the price prediction from the neuronet
   if (NN.Calc()) Prognoze = NN.out[0];
   else           Prognoze = 0;

   // Perform necessary trade actions
   Trade();
  }
//+------------------------------------------------------------------+
void Trade() 
  {

   // Close an open position if it is opposite to the prediction

   if(PositionSelect(_Symbol)) 
     {
      long type=PositionGetInteger(POSITION_TYPE);
      bool close=false;
      if((type == POSITION_TYPE_BUY)  && (Prognoze <= 0)) close = true;
      if((type == POSITION_TYPE_SELL) && (Prognoze >= 0)) close = true;
      if(close) 
        {
         CTrade trade;
         trade.PositionClose(_Symbol);
        }
     }

   // If there is no positions, open one according to the prediction

   if((Prognoze!=0) && (!PositionSelect(_Symbol))) 
     {
      CTrade trade;
      if(Prognoze > 0) trade.Buy (Lots);
      if(Prognoze < 0) trade.Sell(Lots);
     }
  }
//+------------------------------------------------------------------+


Yapay sinir ağını doğru bir şekilde bağlayıp bağlamadığımızı kontrol etmenin iyi bir yolu da strateji test edicide Uzman Danışmanı yapay sinir ağını eğitmek için kullanılan zaman diliminde çalıştırmaktır.

Deneyimli alım satım yapan kişilerin dediği gibi, yapay sinir ağı o periyoda ilişkin bir “adaptör”dür. Bu nedenle, bu belirli periyotta baskın olan bu kesin veri modellerine yönelik bir kâr sinyalini tanımak ve hakkında bilgi vermek üzere eğitilmiştir. Böyle bir periyot için çizilen bir Uzman Danışman kârlılık grafiği yükselişte olmalıdır.

Kontrol edelim. Bizim durumumuzda aşağıdaki güzel tablo oluşacaktır:


Bu her şeyin doğru şekilde bağlandığı anlamına gelir.

İstatistiklere gelirsek, Uzman Danışmanın test edilmesine ilişkin diğer raporlar şunlardır:




Alım satım stratejilerinin ve yapay sinir ağlarının acemi geliştiricileri için her ihtimale karşı birkaç tanım yapayım.

Bir Uzman Danışmanın optimizasyonu (ilgili yapay sinir ağının eğitimi) için kullanılan bir periyottaki kârlılığı EA'nın toplam kârlılığı hakkında bilgi vermez. Diğer bir deyişle, diğer periyottaki kârlılığını garanti etmez. Başka baskın modeller olabilir.

Kârlılıklarını eğitim döneminin gerisinde tutan alım satım stratejilerinin oluşturulması karmaşık bir iştir. Bu sorunu sizin yerinize çözmesi için NeuroSolutions'a veya başka bir yapay sinir ağı uygulamasına güvenmemelisiniz. Bunlar yalnızca verileriniz için bir yapay sinir ağı oluşturur.

Elde edilen Uzman Danışmanın daha ileri testlerinin sonucunu burada vermememin sebebi de bunlardır. Kârlı bir alım satım stratejisi oluşturmak bu makalenin amacı değildir. Amaç yapay bir sinir ağının bir Uzman Danışmana nasıl bağlanacağını anlatmaktır.


Sonuç

Artık alım satım yapan kişiler otomatik alım satım analizi ve alım satım için diğer bir güçlü ve kullanımı kolay bir araca sahipler. Bunları yapay sinir ağlarının ilke ve olanaklarının yanı sıra eğitmenin kuralları üzerine derin bir anlayışa sahip olarak kullanmak kârlı Uzman Danışmanlar yaratabilmenizi sağlayacaktır.


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

Ekli dosyalar |
dll_nsw.zip (383.37 KB)
weekpattern.mq5 (3.78 KB)
Hareketli Mini-Maks: Teknik Analiz için Yeni Bir Gösterge ve MQL5'te Uygulanması Hareketli Mini-Maks: Teknik Analiz için Yeni Bir Gösterge ve MQL5'te Uygulanması
Aşağıdaki makalede, Z.G. Silagadze'nin “Moving Mini-max: a new indicator for technical analysis” (Hareketli Mini-Maks: Teknik Analiz için Yeni Bir Gösterge) başlıklı makalesine dayanan Hareketli Mini-Maks göstergesini uygulama sürecini anlatıyorum. Gösterge fikri G. Gamov tarafından alfa bozunması teorisinde önerilen kuantum tünelleme olayının simülasyonuna dayanmaktadır.
MetaTrader 5'te Çoklu Para Birimi Modunun Uygulanması MetaTrader 5'te Çoklu Para Birimi Modunun Uygulanması
Uzun zamandır çoklu para birimi analizi ve çoklu para birimi alım satımı insanların ilgisini çekmiştir. Tam teşekküllü bir çoklu para birimi rejimi uygulama fırsatı MetaTrader 5'in ve MQL5 programlama dilinin herkese açılmasıyla mümkün olmuştur. Bu makalede çeşitli sembollere yönelik gelen tüm tikleri analiz etmenin ve işlemenin bir yolunu öneriyoruz. Örnek olarak USDx dolar endeksinin çoklu para birimli RSI göstergesini ele alalım.
İşlem Geçmişine Dayalı Alım Satım Oynatıcısı İşlem Geçmişine Dayalı Alım Satım Oynatıcısı
Alım satım oynatıcısı Sadece üç kelime, başka açıklamaya gerek yok. Üzerinde düğmeler olan küçük bir kutu düşünün. Bir düğmeye bastığınızda çalar, kolu hareket ettirdiğinizde oynatma hızı değişir. Gerçekte olana çok benzer. Bu yazıda alım satım geçmişini neredeyse gerçek zamanlı bir şekilde oynatan geliştirmemi göstermek istiyorum. Makale göstergelerle çalışan ve grafikleri yöneten bazı OOP ayrıntılarını ele alır.
MQL5 Sihirbazı: Açık Pozisyonların İzlenme Modülü Nasıl Oluşturulur MQL5 Sihirbazı: Açık Pozisyonların İzlenme Modülü Nasıl Oluşturulur
MQL5 Sihirbazının alım satım stratejileri üreticisi, alım satım fikirlerinin test edilmesini büyük ölçüde basitleştirir. Bu makale MQL5 Sihirbazının alım satım stratejileri üreticisine nasıl bağlanılacağını ve alım satım yaparken kârınızı korumaya izin veren ve düşüşleri azaltan, fiyat pozisyon yönünde gittiğinde Zarar Durdur seviyesini kayıpsız bir bölgeye taşıyarak açık pozisyonları yöneten sınıfınızı nasıl yazacağınızı ele alır. Ayrıca MQL5 Sihirbazı için oluşturulan sınıfın tanımının yapısı ve formatı hakkında bilgi verir.