English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
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ı

MetaTrader 5Örnekler | 16 Aralık 2021, 15:25
169 0
investeo
investeo

Giriş

Teorik ve matematiksel fizik yöntemlerini kullanarak finansal türev fiyatlandırma modellerinin incelenmesine izin veren Kantitatif Finans adlı bir bilim dalı vardır.

Son zamanlarda kuantum fiziğinden fikirleri birleştiren ve onları finansa aktaran; teknik analiz için yeni bir göstergeyi tanımlayan bir makaleye rastladım. İlgimi çekti ve MQL5'te bilimsel makalelere dayalı göstergelerin nasıl uygulanacağını öğretmeye karar verdim.

Orijinal Hareketli Mini-Maks makalesi [2] ZK tarafından yazılmıştır. Silagadze, Budker Nükleer Fizik Enstitüsü ve Novosibirsk Devlet Üniversitesi'nden bir fizikçidir. Makalenin bağlantısı ve MQL5 kaynak kodu makalenin sonunda mevcuttur.


Gösterge

Bu cümleyi yazacağımı hiç beklemiyordum ama şimdi kuantum tünellemeyi açıklayacağım. Okuyucuların çoğunun nicel analiz yapan kişiler olmadığını düşündüğüm için bunu basit terimlerle anlatacağım, umarım buna gücenmezsiniz. Önce finansal zaman serilerinin teknik analizinin arkasındaki fikri bir cümleyle tanımlayalım. Çoğunlukla bunları bulmaya çalışıyoruz:

  • destek ve direnç fiyat seviyeleri;
  • kısa vadeli ve uzun vadeli trendlerin yönü;
  • trendlerin pikleri ve dipleri.

Hareketli Mini-Maks göstergesinin orijinal fikrinin temelinde, bir çekirdekten kaçmaya çalışan kuantum alfa parçacığının analogunu kullanarak grafikteki tepeleri ve dipleri bulmak yer alır. Problem George Gamov'un [1] alfa bozunması teorisinden alınmıştır.

Bir resim bin kelimeye bedeldir, bu yüzden aşağıya küçük bir tablo ekledim.

 Şekil.1 Zaman serisi tablosunda hayali kuantum topu

Şekil 1. Forex fiyat tablosunda hayali kuantum topu

Bir tepenin üstünden veya bizim durumumuzda zaman serisi tablosundaki güncel bir tepeden bir topun atıldığını hayal edin. Klasik mekanikte top engellerden atlayacaktır ve yolda bir yere takılıp kalabileceği için en baştaki engelin önünde durma şansı olmayabilir.

Ancak kuantum mekaniğine ve alfa bozunma teorisine göre, böyle bir topun engelleri aşıp potansiyel kuyu dibine ulaşma ve orada salınım yapma olasılığı çok küçük ama sıfırdan farklı olabilir.

Bu fiyat tablosunda yerel bir minimum bulmaya benzer. Z.K. Silagadze [2] tarafından yazılan makalede, gerçek kuantum-mekanik problemini çözmek yerine hesaplama karmaşıklıklarını azaltmak için kuantum davranışını taklit etmenin yeterli olduğu öne sürülüyor. Orijinal makalede sunulan matematiksel arka planı ve sonrasında MQL5'teki uygulamayı sunacağım.

Bunun bir zaman aralığı için bir fiyat serisi olduğunu düşünelim. Hareketli Mini-Maks fiyat serisinin doğrusal olmayan bir dönüşümüdür: 

uSi

 ise  aşağıdaki gibi tanımlanır:

 

Görüldüğü gibi bu tekrarlayan bir ilişkidir, yani i’inci i-1 ögesine bağlıdır. Hareketli mini-maks serisi tüm ögelerin toplamının bire eşit olduğu normalizasyon şartını sağlar.

 

Kuantum topunun tünelleme olasılıkları geçiş olasılıkları olarak adlandırılır çünkü bunlar fiyat serilerinin dar engellerini, yani yokuş aşağısında yer alan hayali küçük engelleri aşma olasılıklarını modellemektedir:


ile

 

Parametre m, kuantum topunun (ters) kütlesini ve küçük engellerden geçme becerisini taklit eden bir düzleme penceresinin genişliğidir. Alternatif olarak, yerel maksimumları vurgulayan hareketli mini-maks d(si), exp() fonksiyonuna iletilen parametreye eksi işareti koyarak oluşturulabilir: 

 


Uygulama

Göstergenin ardındaki matematiği okuyup anladıktan sonra onu MQL5’de uygulayabiliriz. Bunu yapmak için en iyi yöntem, son denklemden yukarıya bakmaktır. m ve n değişkenlerine dikkat ederseniz bu göstergenin bir mini-maks penceresi için n+2m öge dizisine ihtiyaç duyduğunu ve m çubuğu gecikme boyutuna sahip olacağını göreceksiniz.

Bunun nedeni, Q değişkenleri hesaplamasındaki S i+k ve Si i-k endeksleridir. i değişkeni 1'den n'ye doğru arttırılır ve k değişkeni de 1'den m'ye doğru arttırılır, bu nedenle başlamak için n+2m tamponuna ihtiyacımız olacaktır. Bu aşağıdakileri çağırarak gerçekleştirilebilir:

double S[];
ArrayResize(S,n+2*m);
CopyClose(Symbol(),0,0,n+2*m,S);

Bu çiftler dizisini bildirecek, onu n+2m olarak yeniden boyutlandıracak ve en son çubuktan başlayarak mevcut sembol tablosundan son n+2m çubukların yakın değerlerini kopyalayacaktır.

Bir sonraki adım Q değerlerini hesaplamaktır. Tanımı dikkatlice okursanız analiz edilen fiyat serisinin i’inci için exp() fonksiyonunun m sonucunu fiyat değerleri değişkenleriyle toplamamız gerektiğini göreceksiniz. Bu nedenle, 1'den n'ye kadar tüm Q değerlerini sayacak bir döngü yapmamız gerekiyor:

void calcQii()
  {
   int i,k;

   for(i=0; i<n; i++)
     {
      double sqiip1=0;
      double sqiim1=0;
      double dqiip1=0;
      double dqiim1=0;

      for(k=0; k<m; k++)
        {
         sqiip1 += MathExp(2*(S[m-1+i+k]-S[i])/(S[m-1+i+k]+S[i]));
         sqiim1 += MathExp(2*(S[m-1+i-k]-S[i])/(S[m-1+i-k]+S[i]));

         dqiip1 += MathExp(-2*(S[m-1+i+k]-S[i])/(S[m-1+i+k]+S[i]));
         dqiim1 += MathExp(-2*(S[m-1+i-k]-S[i])/(S[m-1+i-k]+S[i]));       
        }
      sQiip1[i] = sqiip1;
      sQiim1[i] = sqiim1;
      dQiip1[i] = dqiip1;
      dQiim1[i] = dqiim1;

     }
  }

Gördüğünüz gibi calcQii fonksiyonu, n boyutundaki gözlemlenen fiyat penceresi için i’inci Q ve Q` değerlerini hesaplar. S dizisi fiyat değerlerini tutar ve sQiip1, sQiim1, dQiip1, dQiim1 de Q ve Q' ara hesaplama değişkenleri olarak kullanılır.

Olasılıklar Q ve Q` değişkenlerine dayalı olarak hesaplanır, bu nedenle sQii ve dQii dizileri arasında 1'den n'ye döngüye giren başka bir fonksiyon oluşturabiliriz:

void calcPii()
  {
   int i;

   for(i=0; i<n; i++)
     {
      sPiip1[i] = sQiip1[i] / (sQiip1[i] + sQiim1[i]);
      sPiim1[i] = sQiim1[i] / (sQiip1[i] + sQiim1[i]);
      dPiip1[i] = dQiip1[i] / (dQiip1[i] + dQiim1[i]);
      dPiim1[i] = dQiim1[i] / (dQiip1[i] + dQiim1[i]);
     }
  }

Geriye sadece uSi ve sonraki dSi ögelerini hesaplamak ve sonuçları uSi ve dSi dizilerine koymak kalıyor. 

void calcui()
  {
   int i;

   sui[0] = 1;
   dui[0] = 1;

   for(i=1; i<n; i++) 
     {
      sui[i] = (sPiim1[i]/sPiip1[i])*sui[i-1];
      dui[i] = (dPiim1[i]/dPiip1[i])*dui[i-1];
     }

   double uSum = 0;
   double dSum = 0;

   ArrayInitialize(uSi, 0.0);
   ArrayInitialize(dSi, 0.0);
   
   for(i=0; i<n; i++) { uSum+=sui[i]; dSum+=dui[i]; }
   for(i=0; i<n; i++) { uSi[n-1-i] = sui[i] / uSum; dSi[n-1-i] = dui[i] / dSum; }
 
  }

Normalizasyon koşulunun geçerli olup olmadığını kontrol etmek için aşağıdaki satırlar eklenebilir:

   double result=0;
   for(i=0; i<n; i++) { /* Print("i = "+i+" uSi = "+uSi[i]); */ result+=uSi[i]; }

   Print("Result = "+ DoubleToString(result));

Tüm hesaplamalar yapıldıktan sonra bunu gösterge penceresinde göstermemiz gerekiyor. Bunu yapmak için biri uSi ve ikincisi dSi dizisi için olmak üzere en az iki gösterge tamponu bildirilmeli ve gösterge türü DRAW_LINE olarak tanımlanmalıdır. 

    #property indicator_separate_window

    #property indicator_buffers 2
    #property indicator_plots 2
    #property indicator_type1 DRAW_LINE
    #property indicator_type2 DRAW_LINE
    #property indicator_color1 SeaGreen
    #property indicator_color2 BlueViolet

Daha sonra SetIndexBuffer() fonksiyonunu çağırarak INDICATOR_DATA olarak görüntülenecek uSi ve dSi dizilerini atarız:

   SetIndexBuffer(0,uSi,INDICATOR_DATA);
   SetIndexBuffer(1,dSi,INDICATOR_DATA);

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);

   PlotIndexSetInteger(0,PLOT_SHIFT,-(m-1));
   PlotIndexSetInteger(1,PLOT_SHIFT,-(m-1));

Fig.2 Hareketli mini-maks göstergesi

 Şekil 2. Uygulanan Hareketli Mini-Maks göstergesi 

Makalede açıklanan göstergenin olası uygulamaları, destek ve direnç çizgilerinin belirlenmesi ve göstergenin özünde olan düzleme aracılığıyla grafik modellerinin belirlenmesidir. Destek ve direnç çizgileri ise fiyat serisinin hareketli mini-maks’ı ve hareketli ortalamasının hareketli mini-maks'ı ile kesişerek oluşturulur.

Fiyat yerel maksimumu geçerse ve hareketli ortalama ile kesişirse bir direncimiz olur. Uyguladıktan sonra yöntemin birkaç yanlış sinyal sıkıntısı olduğunu gördüm, ancak ChartObjectsLines.mqh kütüphanesini kullanarak MQL5'te satırların nasıl yerleştirileceğine ilişkin referans için bir kaynak kodu ekliyorum: 

void SR()
{
   // if price goes through local maximum and crosses a moving average draw resistance
   int i, cnt=0;
   int rCnt=CopyClose(Symbol(),0,0,n+2*m,S);
      
   for (i=n-2; i>=0; i--)
      if (uSi[i]<uSi_MA[i] && uSi[i+1]>=uSi_MA[i+1]) 
      {
      Print("Resistance at " + i);
      CChartObjectHLine *line=new CChartObjectHLine();
      line.Create(0, "MiniMaxResistanceLine:"+IntegerToString(cnt), 0, S[i]);
      line.Color(LightSkyBlue);
      line.Width(1);
      line.Background(true);
      line.Selectable(false);
      cnt++;
      }
   // if price goes through local minimum and crosses a moving average draw support

   for (i=n-2; i>=0; i--)
      if (dSi[i]<dSi_MA[i] && dSi[i+1]>=dSi_MA[i+1]) 
      {
      Print("Support at " + i);
      CChartObjectHLine *line=new CChartObjectHLine();
      line.Create(0, "MiniMaxSupportLine:"+IntegerToString(cnt), 0, S[i]);
      line.Color(Tomato);
      line.Width(1);
      line.Background(true);
      line.Selectable(false);
      cnt++;
      }
}

Bununla birlikte, göstergenin ilginç bir yönünün belirli bir zaman penceresi için yerel kısa trend minimumlarını ve maksimumlarını oldukça iyi tanıması olduğunu gördüm. Hareketli minimum ve maksimumların en yüksek ve en düşük okumaları arasındaki yayılımı filtrelemek ve bunları kısa vadeli bir boğa veya ayı trendinin başlangıcı olarak işaretlemek yeterlidir.

Kârlı bir Uzman Danışman yapmak için bu davranışı diğer göstergelere ve para yönetimine uygun bir şekilde kullanabiliriz.

Geçerli zaman penceresindeki en yüksek okumaları işaretlemek için yayılma en büyük olduğunda yukarı ve aşağı okları görüntüleyecek ek gösterge tamponları kullanabiliriz. Ek olarak, göstergeyi daha çekici hale getirmek için MQL5'in yeni özelliği olan bir renk histogramı kullanmaya karar verdim. Düşüş trendi ve yükseliş trendi farklı renklerle renklendirilir ve trend değişikliği sarı bir çubukla belirtilir. 

Renk histogramını iki tampon arasında kullanmak için 2 veri tamponu ve renk indeksleri için de bir tampon kullanmalıyız. Lütfen grafiklerin nasıl tanımlanacağına dikkat edin. Toplamda 5 gösterge tamponu vardır ve renk histogramı için üç renk tanımlanmıştır.

//+------------------------------------------------------------------+
//|                                                MovingMiniMax.mq5 |
//|                                      Copyright 2011, Investeo.pl |
//|                                               http://Investeo.pl |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2011, Investeo.pl"
#property link        "http://Investeo.pl"

#property description "Moving Mini-Max indicator"
#property description "proposed by Z.K. Silagadze"
#property description "from Budker Institute of Nuclear Physics"
#property description "and Novosibirsk State University"
#property description "Original paper can be downloaded from:"
#property description "http://arxiv.org/abs/0802.0984"

#property version     "0.6"
#property indicator_separate_window

#property indicator_buffers 5
#property indicator_plots 3

#property indicator_type1 DRAW_COLOR_HISTOGRAM2
#property indicator_type2 DRAW_ARROW
#property indicator_type3 DRAW_ARROW

#property indicator_color1 Chartreuse, OrangeRed, Yellow
#property indicator_color2 RoyalBlue
#property indicator_color3 RoyalBlue

#property indicator_width1 5
#property indicator_width2 4
#property indicator_width3 4

Lütfen histogramın INDICATOR_DATA türünde iki tampon ve bir INDICATOR_COLOR_INDEX tamponu kullandığını unutmayın. Tamponlar tam olarak aşağıdaki sıraya göre ayarlanmalıdır; önce veri tamponları gelir, ardından bir renk indeksi tamponu tanımlanır.

   SetIndexBuffer(0,uSi,INDICATOR_DATA);
   SetIndexBuffer(1,dSi,INDICATOR_DATA);
   SetIndexBuffer(2,trend,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3,upArrows,INDICATOR_DATA);
   SetIndexBuffer(4,dnArrows,INDICATOR_DATA);
   
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0.0);
   
   PlotIndexSetInteger(1,PLOT_ARROW,234);
   PlotIndexSetInteger(2,PLOT_ARROW,233); 

0,1,2 tamponları renk histogramı içindir; 3 ve 4 tamponlarıysa ok gösterimi içindir.

Renklendirme algoritması aşağıdaki gibidir:

   if (upind<dnind) 
    { 
      for (i=0; i<upind; i++) trend[i]=0;
      for (i=upind; i<dnind; i++) trend[i]=1;
      for (i=dnind; i<n; i++) trend[i]=0 ;
    } else
    {
      for (i=0; i<dnind; i++) trend[i]=1;
      for (i=dnind; i<upind; i++) trend[i]=0;
      for (i=upind; i<n; i++) trend[i]=1;
   }
   
   trend[upind] = 2;
   trend[dnind] = 2;

 Nihai sonucun ekran görüntüsünü yapıştırıyorum:

Şekil 2. Hareketli Mini-Maks göstergesinin son sürümü

Şekil 3. Hareketli Mini-Maks göstergesinin son sürümü

Her yeni çubuk oluştuğunda belirli bir zaman penceresi için düşüş trendi ve yükseliş trendi değerlerinin hesaplandığı unutulmamalıdır; göstergeye hareketli mini-maks denmesinin nedeni budur.

m çubukları tarafından gecikmesine rağmen, mevcut zaman penceresindeki trend için şaşırtıcı derecede iyi bir genel bakış ile piyasanın nasıl “nefes alan” bir şey olduğu hakkında yorum sunmaktadır.

Bu göstergenin kârlı olabileceğine ikna oldum.

 

Sonuç

Teknik analiz ve MQL5'te uygulanması için yeni bir göstergenin ardındaki matematiği sunmuş oldum.

Z.K. Silagadze tarafından yazılan orijinal makaleye http://arxiv.org/abs/0802.0984 adresinden erişilebilir. Ekte bulunan kaynak kodu indirilebilir.

Gelecekte daha ilginç teknik göstergeler ve bunların MQL5 uygulamalarını sunmayı umuyorum.

 

Referanslar:

1. G.Gamov, Theory of alpha decay.
2. Z.K. Silagadze, Moving Mini-Max - a new indicator for technical analysis.

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

Ekli dosyalar |
movingminimax.mq5 (7.34 KB)
İş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.
NeuroSolutions Yapay Sinir Ağlarını Bağlama NeuroSolutions Yapay Sinir Ağlarını Bağlama
NeuroSolutions yazılım paketi, yapay sinir ağlarının oluşturulmasına ek olarak bunların DLL olarak dışa aktarılmasına da izin verir. Bu makale yapay bir sinir ağı ve bir DLL oluşturma ve bunu MetaTrader 5'te alım satım yapmak için bir Uzman Danışmana bağlama sürecini açıklar.
Rastgele Yürüyüş ve Trend Göstergesi Rastgele Yürüyüş ve Trend Göstergesi
Rastgele Yürüyüş gerçek piyasa verilerine çok benzer ancak bazı önemli özellikleri vardır. Bu makalede yazı tura oyunu kullanılarak simüle ettiğimiz Rastgele Yürüyüşün özelliklerini ele alacağız. Bu verinin özellikleri üzerinde çalışmak için trend olma göstergesi geliştirilmiştir.
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.