Ticaret robotlarını ücretsiz olarak nasıl indirebileceğinizi izleyin
Bizi Twitter üzerinde bulun!
Fan sayfamıza katılın
Komut dosyasını ilginç mi buldunuz?
Öyleyse bir link gönderin -
başkalarının da faydalanmasını sağlayın
Komut dosyasını beğendiniz mi? MetaTrader 5 terminalinde deneyin
Görüntülemeler:
445
Derecelendirme:
(53)
Yayınlandı:
2022.03.21 09:25
Bu koda dayalı bir robota veya göstergeye mi ihtiyacınız var? Freelance üzerinden sipariş edin Freelance'e git

Moving Average Uzman Danışmanı, MetaTrader 5 müşteri terminalinin standart paketine dahildir ve Moving Average göstergesini kullanarak işlem yapan bir Uzman Danışman örneğidir.

Moving Average.mq5 Uzman Danışman dosyası, terminal_veri_klasörü\MQL5\Experts\Examples\Moving Average\ klasöründe bulunur. Bu Uzman Danışman, Standart Kütüphanesinin teknik göstergelerinin, işlem geçmişi fonksiyonlarının ve ticaret sınıflarının kullanımına bir örnektir. Ayrıca Uzman Danışman, işlem sonuçlarına dayalı bir para yönetimi sistemi de içerir.

Uzman Danışmanın yapısına ve nasıl çalıştığına daha yakından bakalım.

1. Uzman Danışmanın özellikleri

//+------------------------------------------------------------------+
//|                                              Moving Averages.mq5 |
//|                   Copyright 2009-2013, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2009-2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00

İlk 5 satır yorum içerir, sonraki üç satırsa #property önişlemci yönergesini kullanarak MQL5 programının özelliklerini (telif hakkı, link, sürüm) ayarlar.

Uzman Danışman başlatıldığında, bunlar "Genel" sekmesinde görüntülenir:


Şekil 1. Moving Average Uzman Danışmanının genel parametreleri


1.2. Dosyaları dahil et

Ardından, #include yönergesini kullanarak derleyiciye "Trade.mqh" dosyasını eklemesi talimatı verilir.

Bu dosya Standart Kütüphanenin bir parçasıdır, ticaret fonksiyonlarına kolay erişim için CTrade sınıfını içerir.

#include <Trade\Trade.mqh>

Dahil edilen dosyasının adı "<>" köşeli parantez içinde belirtilir, bu nedenle yol, terminal_veri_klasörü\Include\ klasörüne göre ayarlanır.

1.3 Girdiler

Sonrasında türler, adlar, varsayılan değerler ve yorumlar belirtilir. Rolleri şekil 2'de gösterilmiştir.

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage
input double DecreaseFactor     = 3;       // Descrease factor
input int    MovingPeriod       = 12;      // Moving Average period
input int    MovingShift        = 6;       // Moving Average shift

MaximumRisk ve DecreaseFactor girdi parametreleri para yönetiminde kullanılır ve MovingPeriod ve MovingShift girdi parametreleriyse, ticaret koşullarının oluşumunu kontrol etmek için kullanılacak Moving Average teknik göstergesinin periyodunu ve kaymasını ayarlar.

Girdi parametresi satırındaki yorumdaki metin, varsayılan değerlerle birlikte, girdi parametresinin adı yerine "Girdiler" sekmesinde görüntülenir:


Şekil 2. Moving Average Uzman Danışmanının girdi parametreleri

1.4. Global değişkenler

Ardından ExtHandle global değişkeni bildirilir. Moving Average göstergesinin tanıtıcı değerini saklamak için kullanılır.

//---
int   ExtHandle=0;

Bunu 6 fonksiyon takip eder. Her birinin amacı, yorumlarda açıklanmıştır:

  1. TradeSizeOptimized() - optimum lot büyüklüğünü hesapla;
  2. CheckForOpen() - pozisyon açma koşullarını kontrol et;
  3. CheckForClose() - pozisyonu kapatma koşullarını kontrol et;
  4. OnInit() - Uzman Danışman başlatma fonksiyonu;
  5. OnTick() - Uzman Danışman tik fonksiyonu;
  6. OnDeinit() - Uzman Danışman sonlandırma fonksiyonu;

Son üç fonksiyon, olay yönetimi fonksiyonlarıdır; ilk üç hizmet fonksiyonu ise kodlarında çağrılır.


2. Olay yönetimi fonksiyonları

2.1. OnInit() başlatma fonksiyonu

OnInit() fonksiyonu, Uzman Danışmanın ilk başlatılması sırasında bir kez çağrılır. Genellikle OnInit() olay yöneticisinde Uzman Danışman çalışma için hazırlanır: girdi parametreleri kontrol edilir, göstergeler ve parametreler başlatılır, vb. Daha fazla çalışmanın anlamsız olduğu kritik hata olması durumunda, INIT_FAILED geri dönüş koduyla fonksiyondan çıkılır.

//+------------------------------------------------------------------+
//| Uzman Danışman başlatma fonksiyonu                               |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//---
   ExtHandle=iMA(_Symbol,_Period,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE);
   if(ExtHandle==INVALID_HANDLE)
     {
      printf("MA göstergesi oluşturulurken hata oluştu");
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }

Uzman Danışmanın ticareti Moving Average göstergesine dayalı olduğundan, iMA() çağrılarak Moving Average göstergesi oluşturulur ve tanıtıcı değeri ExtHandle global değişkenine kaydedilir.

Bir hata durumunda, OnInit()'ten INIT_FAILED geri dönüş koduyla çıkılır - bu, başarısız başlatma durumunda Uzman Danışmanın / göstergenin çalışmasını sonlandırmanın doğru yoludur.


2.2. OnTick() fonksiyonu

OnTick() fonksiyonu, Uzman Danışmanın üzerinde çalıştığı grafiğin sembolü için her yeni teklif alındığında çağrılır.

//+------------------------------------------------------------------+
//| Uzman Danışman tik fonksiyonu                                    |
//+------------------------------------------------------------------+
void OnTick(void)
  {
//---
   if(PositionSelect(_Symbol))
      CheckForClose();
   else
      CheckForOpen();
//---
  }

PositionSelect() fonksiyonu, mevcut sembol için açık pozisyon olup olmadığını belirler.

Açık pozisyonlar varsa, piyasanın mevcut durumunu analiz eden ve açık pozisyonu kapatan CheckForClose() fonksiyonu çağrılır, aksi takdirde piyasaya giriş koşullarını kontrol eden ve bu koşullar varsa yeni pozisyon açan CheckForOpen() fonksiyonu çağrılır.


2.3. OnDeinit() Uzman Danışman sonlandırma fonksiyonu

OnDeInit(), Uzman Danışman grafikten kaldırıldığında çağrılır. Program çalışma sırasında grafik nesneleri yerleştirirse, bunlar tablodan kaldırılabilir.

//+------------------------------------------------------------------+
//| Uzman Danışman sonlandırma fonksiyonu                            |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+

Bu durumda Uzman Danışman sonlandırılırken herhangi bir eylem yapılmaz.


3. Hizmet fonksiyonları

3.1. TradeSizeOptimized() fonksiyonu

Bu fonksiyon, belirtilen risk seviyesini ve işlem sonuçlarını dikkate alarak pozisyon açılması için en uygun lot büyüklüğünün değerini hesaplar ve bu değeri geri döndürür.

//+------------------------------------------------------------------+
//| optimum lot büyüklüğünü hesapla                                  |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
   double price=0.0;
   double margin=0.0;
//--- lot büyüklüğünü hesaplayın
   if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))
      return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
      return(0.0);
   if(margin<=0.0)
      return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/margin,2);
//--- ardışık zararla kapanan işlem serisinin uzunluğunu hesapla
   if(DecreaseFactor>0)
     {
      //--- tüm işlem geçmişini iste
      HistorySelect(0,TimeCurrent());
      //--
      int    orders=HistoryDealsTotal();  // toplam işlem sayısı
      int    losses=0;                    // serideki zararla kapanan işlemlerin sayısı

      for(int i=orders-1;i>=0;i--)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(ticket==0)
           {
            Print("HistoryDealGetTicket başarısız oldu, işlem geçmişi yok");
            break;
           }
         //--- işlem sembolünü kontrol et
         if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol)
            continue;
         //--- kârı kontrol et
         double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
         if(profit>0.0)
            break;
         if(profit<0.0)
            losses++;
        }
      //---
      if(losses>1)
         lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//--- izin verilen işlem hacmi değerlerini normalleştir ve kontrol et
   double stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

   double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol)
      lot=minvol;

   double maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol)
      lot=maxvol;
//--- işlem hacmi değerini geri döndür
   return(lot);
  }

SymbolInfoDouble() fonksiyonu kullanılarak, mevcut sembol için fiyatların varlığı kontrol edilir, ardından OrderCalcMargin() fonksiyonu kullanılarak, emir (bu durumda bir alış emri) vermek için gereken marjin istenir. Başlangıç lot büyüklüğü, emir vermek için gereken marjine, hesabın serbest marjinine (AccountInfoDouble(ACCOUNT_FREEMARGIN)) ve MaximumRisk girdi parametresinde belirtilen izin verilen maksimum risk değerine göre belirlenir.

DecreaseFactor girdi parametresinin değeri pozitifse, geçmişteki işlemler analiz edilir ve lot büyüklüğü, ardışık zararla kapanan işlemlerin maksimum serisi bilgisi dikkate alınarak ayarlanır: başlangıç lot büyüklüğü (1-losses/DecreaseFactor) ile çarpılır.

Ardından işlem hacmi, mevcut sembol için izin verilen minimum hacim adımının (stepvol) katı olan bir değere "yuvarlanır". Ayrıca işlem hacminin minimum (minvol) ve maksimum (maxvol) mümkün değerleri de istenir ve lot değeri izin verilen limitlerin dışına çıkarsa ayarlanır. Sonuç olarak fonksiyon, işlem hacminin hesaplanan değerini geri döndürür.


3.2. CheckForOpen() fonksiyonu

CheckForOpen() fonksiyonu, pozisyon açma koşullarını kontrol eder ve ticaret koşulları oluştuğunda (bu durumda, fiyat hareketli ortalamayı çaprazladığında) pozisyon açar.

//+------------------------------------------------------------------+
//| pozisyon açma koşullarını kontrol et                             |
//+------------------------------------------------------------------+
void CheckForOpen(void)
  {
   MqlRates rt[2];
//--- fiyat değerlerini kopyala
   if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
     {
      Print("",_Symbol," için CopyRates başarısız oldu, geçmiş yok");
      return;
     }
//--- yalnızca yeni çubuğun ilk tikiyle işlem yap
   if(rt[1].tick_volume>1)
      return;
//--- mevcut çubuğun Moving Average göstergesinin değerini al
   double   ma[1];
   if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
     {
      Print("iMA için CopyBuffer başarısız oldu, veri yok");
      return;
     }
//--- sinyalleri kontrol et
   ENUM_ORDER_TYPE signal=WRONG_VALUE;

   if(rt[0].open>ma[0] && rt[0].close<ma[0])
      signal=ORDER_TYPE_SELL;    // satış koşulu
   else
     {
      if(rt[0].open<ma[0] && rt[0].close>ma[0])
         signal=ORDER_TYPE_BUY;  // alış koşulu
     }
//--- ek kontroller
   if(signal!=WRONG_VALUE)
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         if(Bars(_Symbol,_Period)>100)
           {
            CTrade trade;
            trade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),
                               SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),
                               0,0);
           }
//---
  }

Hareketli ortalama kullanarak ticaret yaparken, fiyatın hareketli ortalamayı çaprazlayıp çaprazlamadığını kontrol etmeniz gerekir. CopyRates() fonksiyonu kullanılarak, mevcut fiyatların iki değeri rt[] yapı dizisine kopyalanır, rt[1] mevcut çubuğa karşılık gelir, rt[0] ise tamamlanmış çubuğa karşılık gelir.

Yeni bir çubuğun başlangıcı, mevcut çubuğun tik hacmi kontrol edilerek gerçekleştirilir - mevcut çubuğun tik hacmi 1'e eşitse, yeni bir çubuğun oluşumu başlamıştır. Bu yeni çubuğu tespit etme yönteminin bazı durumlarda (fiyatlar paketler halinde geldiğinde) çalışmayabileceğine dikkat edilmelidir, bu nedenle yeni bir çubuk oluşumunun başladığı gerçeği, mevcut fiyatın zamanının kaydedilerek ve karşılaştırılarak yapılması önerilir (bkz. IsNewBar).

Mevcut çubuğun Moving Average göstergesinin değeri CopyBuffer() fonksiyonu kullanılarak istenir ve yalnızca bir değer içeren ma[] dizisine kaydedilir. Program daha sonra fiyatın hareketli ortalamayı çaprazlayıp çaprazlamadığını kontrol eder ve ek kontroller (Uzman Danışman ile ticaretin mümkün olup olmadığı ve geçmişte çubukların varlığı) yapar. Başarılı olursa, ticaret nesnesinin (CTrade sınıfının bir örneği) PositionOpen() metodu çağrılarak sembol için uygun pozisyon açılır.

Pozisyonun açılış fiyatı, sinyal değişkeninin değerine bağlı olarak Alış fiyatını (Ask) veya Satış (Bid) fiyatını geri döndüren SymbolInfoDouble() fonksiyonu kullanılarak ayarlanır. Pozisyonun hacmiyse, yukarıda bahsedilen TradeSizeOptimized() çağrılarak belirlenir.


3.3. CheckForClose() fonksiyonu

CheckForClose(), pozisyonu kapatma koşullarını kontrol eder ve eğer pozisyonu kapatmak için koşullar oluşursa pozisyonu kapatır.

//+------------------------------------------------------------------+
//| pozisyonu kapatma koşullarını kontrol et                         |
//+------------------------------------------------------------------+
void CheckForClose(void)
  {
   MqlRates rt[2];
//--- fiyat değerlerini kopyala
   if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
     {
      Print("",_Symbol,"  için CopyRates başarısız oldu, geçmiş yok");
      return;
     }
//--- yalnızca yeni çubuğun ilk tikiyle işlem yap
   if(rt[1].tick_volume>1)
      return;
//--- mevcut çubuğun Moving Average göstergesinin değerini al
   double   ma[1];
   if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
     {
      Print("iMA için CopyBuffer başarısız oldu, veri yok");
      return;
     }
//--- daha önce PositionSelect() kullanılarak seçilen pozisyon türünü al
   bool signal=false;
   long type=PositionGetInteger(POSITION_TYPE);

   if(type==(long)POSITION_TYPE_BUY   && rt[0].open>ma[0] && rt[0].close<ma[0])
      signal=true;
   if(type==(long)POSITION_TYPE_SELL  && rt[0].open<ma[0] && rt[0].close>ma[0])
      signal=true;
//--- ek kontroller
   if(signal)
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         if(Bars(_Symbol,_Period)>100)
           {
            CTrade trade;
            trade.PositionClose(_Symbol,3);
           }
//---
  }

CheckForClose() fonksiyonunun algoritması, CheckForOpen() algoritmasına benzerdir. Mevcut açık pozisyonun yönüne bağlı olarak, pozisyonu kapatma koşulları yeniden kontrol edilir (fiyat MA'yı yukarı doğru çaprazladığında alış veya fiyat MA'yı aşağı doğru çaprazladığında satış). Açık pozisyon, ticaret nesnesinin (CTrade sınıfının bir örneği) PositionClose() metodu çağrılarak kapatılır.


4. Geriye dönük test

En iyi girdi parametreleri kümesi, MetaTrader 5 müşteri terminalinin Strateji Sınayıcısı kullanılarak bulunabilir.

Örneğin, 2012.01.01-2013.08.01 aralığında MovingPeriod parametresini optimize ederken, en iyi sonuçlar MovingPeriod=45 ile elde edilmiştir:

Moving Average Uzman Danışmanının geriye dönük test sonuçları

Moving Average Uzman Danışmanının geriye dönük test sonuçları

Sonuçlar

MetaTrader 5 terminalinin standart paketinde bulunan Moving Average Uzman Danışmanı, Standart Kütüphanenin teknik göstergelerinin, işlem geçmişi fonksiyonlarının ve ticaret sınıflarının kullanımına bir örnektir. Ayrıca Uzman Danışman, işlem sonuçlarına dayalı bir para yönetimi sistemi de içerir.


MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal kod: https://www.mql5.com/ru/code/1921

ALGLIB - Sayısal Analiz Kütüphanesi ALGLIB - Sayısal Analiz Kütüphanesi

MQL5'e port edilen ALGLIB (sürüm 3.19) matematiksel fonksiyon kütüphanesi.

IndicatorParameters() Fonksiyonuyla Çalışma Örneği IndicatorParameters() Fonksiyonuyla Çalışma Örneği

Bu Uzman Danışman, girdi parametrelerinin sayısı, türleri ve değerleri hakkında bilgi almak için IndicatorParameters() fonksiyonun kullanımını gösterir.

MACD Sample MACD Sample

MACD Sample Uzman Danışmanı, MACD'nin ana ve sinyal çizgilerinin çaprazlamasıyla işlem gerçekleştirir. Bu Uzman Danışman, Uzman Danışman geliştirmede nesne yönelimli yaklaşımın bir örneğidir.

SignalsDemo SignalsDemo

Bu Uzman Danışman, sinyallerin özelliklerini görüntüler, sinyal kopyalama ayarlarının yönetilmesine ve seçilen ticaret sinyaline abone olunmasına veya aboneliğin iptal edilmesine olanak sağlar.