English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Hareketli ortalamalara dayalı sistemler nasıl geliştirilir?

Hareketli ortalamalara dayalı sistemler nasıl geliştirilir?

MetaTrader 5Ticaret | 30 Mayıs 2022, 14:04
540 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Giriş

Ticaret alanındaki deneyim sürenizden bağımsız olarak, birçoğunuz muhtemelen “trend arkadaşınızdır” ifadesini duymuşsunuzdur. Henüz duymamışsanız, şu şekilde açıklamaya başlayayım. Bildiğiniz gibi, piyasa farklı yönlerde fiyat hareketleri veya trendler oluşturabilir.

  • Yükseliş trendi: bu hareket sırasında fiyatlar daha yüksek pikler ve daha yüksek çukurlar yapar.
  • Düşüş trendi: yükseliş trendinin tersidir, bu hareket sırasında fiyatlar daha düşük dipler ve daha düşük çukurlar yapar.
  • Yatay hareket: yükseliş trendi veya düşüş trendi ile ilişkilendirilemeyen her harekettir.

Aşağıdaki görüntüler çizgi grafik şeklinde yükseliş trendi ve düşüş trendi grafiklerini göstermektedir:

Yükseliş trendi

Düşüş trendi

Şimdi trendi tanımladık ancak trend neden arkadaşımız?

Burada, yukarı veya aşağı net bir harekete sahip oldukları için trendler, yani yükseliş ve düşüş trendi hakkında konuşacağız. Trendler sırasında piyasaya kimin hakim olduğunu ve fiyatları hareket ettirdiğini anlayabiliriz. Yükseliş trendi sırasında, piyasaya arzdan bağımsız olarak fiyatları yükselten alıcılar hakimdir, bu piyasaya boğa piyasası diyoruz. Ve tam tersi şekilde, düşüş trendi sırasında da, piyasaya arzdan bağımsız olarak fiyatları düşüren satıcılar hakimdir. Bu piyasaya da ayı piyasası diyoruz.

Ancak bazı durumlarda, piyasada yanlış kırılmalarla birlikte testere dişi hareketi görebiliriz. Bu yanlış kırılmalar ticaretimizde zararlar oluşturabilir, ama peki nasıl? Nasıl zarar verebileceklerini biraz sonra anlatacağım, ancak önce yanlış kırılmaların ne olduğunu tanımlayalım.

Yanlış kırılmalar, belirli bir yöndeki fiyat hareketi sonucunda belirli bir eylem için olan sinyalin tetiklendiği, dolayısıyla ilgili eylemin gerçekleştiği, ancak sonrasında fiyatın tersi yönde hareket ettiği durumdur. Ve elbette bu şekilde gerçekleşen eylemler ticaret sonuçlarımız için olumsuz olacaktır, dolayısıyla trend arkadaşımızdır. Bu yanlış kırılmalar, birçok stratejiyle filtrelenerek azaltılabilir. Bunu yapabilecek en iyi stratejilerden biri hareketli ortalama kullanmaktır. Bu makalede de, hareketli ortalamalara dayalı bazı stratejilerin nasıl kullanılacağını ve onlar için bir algoritmik ticaret sistemini nasıl tasarlayacağımızı öğreneceğiz.

Bu makalede şu konuları ele alacağız:

Sorumluluk reddi: Bu makalenin tüm içeriği yalnızca eğitim amaçlıdır, başka herhangi bir amaca yönelik değildir. Dolayısıyla, bu makalenin içeriğine dayalı olarak gerçekleştireceğiniz her şey, yalnızca kendi sorumluluğunuzda ve riskinizde olacaktır, bu makalenin içeriği herhangi bir sonucu garanti etmemektedir. Bu makaledeki tüm stratejilerin dikkatlice test edilmeye ve optimize edilmeye ihtiyacı olabilir, çünkü tekrarlıyorum ki, bu makalenin tüm içeriği yalnızca eğitim amaçlıdır.

Tüm kodlar MQL5'te yazılacak ve MT5 üzerinde test edilecektir.

Herhangi bir ticaret sistemi tarafından üretilen sinyalleri filtrelemenin birçok farklı stratejisi vardır. Muhtemelen bunların en basiti hareketli ortalama kullanmaktır. Bu makalede, bazı hareketli ortalama stratejilerin nasıl kullanılacağını ve onlar için algoritmik ticaret sistemlerini nasıl tasarlayacağımızı öğreneceğiz. Makalenin amacı, okuyuculara kendi algoritmik ticaret sistemlerini nasıl oluşturacaklarına dair bilgiler paylaşmaktır. Şimdi “Hareketli ortalamalara dayalı sistemler nasıl geliştirilir?” başlıklı ana konumuza geçelim. Bu bilgileri sizlerle paylaşmaktan büyük heyecan duyuyorum…


Hareketli ortalama tanımı


Hareketli ortalama göstergeleri teknik analizde çok yaygındır. Belirli bir periyot boyuncaki fiyatların ortalaması olarak hesaplanır. Başka bir deyişle, gösterge, fiyat verilerini yumuşatır ve rastgele kısa vadeli hareketlerin ve dalgalanmaların grafik üzerindeki etkisini azaltır.

Birçok hareketli ortalama türü vardır. Aralarındaki fark, bir sonraki bölümde ayrıntılı olarak bahsedeceğim gibi, her biri için farklı hesaplamalar olmasıdır. Şimdilik, birçok farklı türün olduğunu ve belirli durumlarda en iyi sonuçları elde etmek için farklı hesaplama seçeneklerini kullanabileceğimizi bilmeniz yeterlidir.

Hareketli ortalama, fiyat analizine dayanan bir trend göstergesidir. Yani, fiyat belirli bir yönde hareket ederse, hareketli ortalama da fiyatı aynı yönde takip edecektir.

Hareketli ortalama, mevcut fiyatı takip ederek periyodun ortalamasını hesapladığı için gecikmeli bir göstergedir. Bu, hesaplama mantığından doğan normal bir durumdur.

Hareketli ortalamanın doğası gereği, hareketli ortalama:

  • Ortalamayı gösterir.
  • Trende sahip piyasalarda daha iyi çalışır.
  • Trend olduğunu teyit eder veya trendin tanımlanmasına yardımcı olur.
  • Fiyatlardan gürültü veya rastgele hareketi temizler.
  • Ortadan kaldırılacağı için rastgele hareketler nedeniyle yanlış kırılmalardan kaçınılmasına yardımcı olur.
  • Ve daha fazlası...

Hareketli ortalama türleri


Birçok farklı hareketli ortalama türü vardır. En yaygın olanları:

  • Simple Moving Average.
  • Weighted Moving Average.
  • Exponential Moving Average.

Aralarındaki temel fark, hesaplama yöntemlerinde yatar.

Şimdi her birine bakalım ve aralarındaki farkları görelim. Ayrıca bu hareketli ortalamaların MQL5'te nasıl kullanılacağını veya belirli bir türü kullanmak istiyorsak nasıl çağıracağımızı da inceleyeceğiz.

Simple Moving Average

Bu, en basit hareketli ortalama türüdür ve yaygın olarak kullanılan kısayolu SMA'dır.

Belirli bir periyottaki fiyat kümesinin aritmetik ortalaması şeklinde hesaplanır. Yani belirli sayıdaki fiyatlar toplanır ve ardından sonuç bu sayıya bölünür.

SMA

Örnek: 5 işlem günümüz var ve bu 5 gündeki kapanış fiyatları şu şekilde:

  • 1. gün = 10
  • 2. gün = 15
  • 3. gün = 20
  • 4. gün = 30
  • 5. gün = 35

Bu 5 gün için SMA değeri şu şekilde hesaplanır:


SMA örneği

Weighted Moving Average

Weighted Moving Average (WMA) da periyodun ortalama fiyatını gösterir, ancak burada son verilere daha fazla ağırlık verilir. Yani örneğin 10 gün için WMA'yı hesaplayacaksak, tüm 10 günün ortalama fiyattaki ağırlıkları aynı olmayacaktır, son günlerin ağırlığı ortalama fiyat üzerinde daha fazla olacaktır.

WMA, şu formül kullanılarak hesaplanır:

WMA


Örnek:

Aynı kapanış fiyatlarına sahip 5 işlem gününü WMA için ele alalım:

  • 1. gün = 10
  • 2. gün = 15
  • 3. gün = 20
  • 4. gün = 30
  • 5. gün = 35

Bu 5 gün için WMA değeri şu şekilde hesaplanır:

WMA örneği


WMA örneği


Exponential Moving Average

Bu MA türünün özelliği, hesaplamanın, hesaplama periyodundan bir önceki periyodu da dikkate almasıdır.

EMA, şu formül kullanılarak hesaplanır:

İlk olarak, periyodun ağırlığını hesaplamak için “K” olarak ifade edilen üssü hesaplayacağız (burada “n”, periyodu ifade edecek):

EMA

Sonrasında,

EMA

Örnek:

Aynı kapanış fiyatlarına sahip 5 işlem gününü WMA için ele alalım:

  • 1. gün = 10
  • 2. gün = 15
  • 3. gün = 20
  • 4. gün = 30
  • 5. gün = 35
  • 6. gün = 40

Bu 5 gün için EMA değeri şu şekilde hesaplanır:

EMA örneği


EMA örneği

Lütfen EMA hesaplamasının ilk gününün 6. gün olduğunu ve önceki beş günün SMA'sının (22) hesaplandığını unutmayın.


Hareketli ortalamanın tanımı ve türleri hakkında bilgi sahibi olduk. Şimdi bu makalenin en ilginç kısmına geçelim. Bazı hareketli ortalamaya stratejilerinden ve onlar için algoritmik ticaret sistemlerini nasıl tasarlayabileceğimizden bahsedeceğiz.


Strateji 1: Tek hareketli ortalamanın çaprazlaması

Bu makalede örneklerde Simple Moving Average (SMA) ile çalışacağız. Ancak, kodunuzda istediğiniz herhangi bir hareketli ortalama türünü kullanabilirsiniz.

Bu stratejide, fiyat ve SMA her tikte kontrol edilecek:

  • Fiyat > SMA: alış sinyali, bu sinyali grafikte yorum olarak göstereceğiz.
  • Fiyat < SMA: satış sinyali, bu sinyali grafikte yorum olarak göstereceğiz.
  • Diğer tüm durumlarda, hiçbir şey yapmıyoruz.

Aşağıdaki görüntü, tek SMA'nın çaprazlamasına dayalı stratejinin planını göstermektedir:

1 MA planı


Strateji kodu şu şekilde olacak:

//+------------------------------------------------------------------+
//|                                            One SMA crossover.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //create an array for price
   double myMovingAverageArray1[];
   
   //define Ask, Bid
   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
   
   //define the properties of  MAs - simple MA 24
   int movingAverage1 = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE);
   
   //sort the price arrays current candle
   ArraySetAsSeries(myMovingAverageArray1,true);
   
   //Defined MA - one line - currentcandle, 3 candles - store result
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   
   //Check if we have a buy entry signal
   if (
      (Ask>myMovingAverageArray1[0])
      )
         {
         Comment("BUY");
         }
    
   //check if we have a sell entry signal      
   if (
      (Bid<myMovingAverageArray1[0])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+

Aşağıdaki görüntüler, kodu yürüttükten sonra oluşan ve grafikte yorum olarak gösterilen sinyalleri göstermektedir:

1 MA - alış sinyali

1 MA - satış signal

Strateji 2: İki hareketli ortalamanın çaprazlaması

Bu stratejide iki SMA kullanacağız. Kısa SMA'nın periyodu 24, uzun SMA'nın periyodu 50 olacak.

Bu stratejide, her tikte iki SMA'nın konumu kontrol edilecek:

  • 24 SMA > 50 SMA: alış sinyali, bu sinyali grafikte yorum olarak göstereceğiz.
  • 24 SMA < 50 SMA: satış sinyali, bu sinyali grafikte yorum olarak göstereceğiz.
  • Diğer tüm durumlarda, hiçbir şey yapmıyoruz.

Aşağıdaki görüntü, iki SMA'nın çaprazlamasına dayalı stratejinin planını göstermektedir:

2 MA planı


Strateji kodu şu şekilde olacak:

//+------------------------------------------------------------------+
//|                                            Two SMA crossover.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //create an array for several prices
   double myMovingAverageArray1[], myMovingAverageArray2[];
   
   //define the properties of  MAs - simple MA, 1st 24 / 2nd 50
   int movingAverage1 = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE);
   int movingAverage2 = iMA(_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE);
   
   //sort the price arrays 1, 2 from current candle
   ArraySetAsSeries(myMovingAverageArray1,true);
   ArraySetAsSeries(myMovingAverageArray2,true);
   
   //Defined MA1, MA2 - one line - currentcandle, 3 candles - store result
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2);
   
   //Check if we have a buy entry signal
   if (
      (myMovingAverageArray1[0]>myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]<myMovingAverageArray2[1])
      )
         {
         Comment("BUY");
         }
    
   //check if we have a sell entry signal      
   if (
      (myMovingAverageArray1[0]<myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]>myMovingAverageArray2[1])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+

Aşağıdaki görüntüler, kodu yürüttükten sonra oluşan ve grafikte yorum olarak gösterilen sinyalleri göstermektedir:

2 MA - alış sinyali


2MA - satış sinyali


Strateji 3: Üç hareketli ortalamanın çaprazlaması

Bu stratejide, üç SMA kullanacağız: 10 periyotlu kısa, 24 periyotlu orta ve 48 periyotlu uzun.

Bu stratejide, her tikte üç SMA'nın konumu kontrol edilecek:

  • 10 SMA > 24 SMA, 10 SMA > 48 SMA ve 24 SMA > 48 SMA: alış sinyali, bu sinyali grafikte yorum olarak göstereceğiz.
  • 10 SMA < 24 SMA, 10 SMA < 48 SMA ve 24 SMA < 48 SMA: satış sinyali, bu sinyali grafikte yorum olarak göstereceğiz.
  • Diğer tüm durumlarda, hiçbir şey yapmıyoruz.

Aşağıdaki görüntü, üç SMA'nın çaprazlamasına dayalı stratejinin planını göstermektedir:

3 MA planı


Strateji kodu şu şekilde olacak:

//+------------------------------------------------------------------+
//|                                          Three SMA crossover.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //create an array for several prices
   double myMovingAverageArray1[], myMovingAverageArray2[],myMovingAverageArray3[];
   
   //define the properties of  MAs - simple MA, 1st 10 / 2nd 24, 3rd 48
   int movingAverage1 = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE);
   int movingAverage2 = iMA(_Symbol,_Period,24,0,MODE_SMA,PRICE_CLOSE);
   int movingAverage3 = iMA(_Symbol,_Period,48,0,MODE_SMA,PRICE_CLOSE);
   
   //sort the price arrays 1, 2, 3 from current candle
   ArraySetAsSeries(myMovingAverageArray1,true);
   ArraySetAsSeries(myMovingAverageArray2,true);
   ArraySetAsSeries(myMovingAverageArray3,true);
   
   //Defined MA1, MA2, MA3 - one line - currentcandle, 3 candles - store result
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2);
   CopyBuffer(movingAverage3,0,0,3,myMovingAverageArray3);
   
   //Check if we have a buy entry signal
   if (
      (myMovingAverageArray1[0]>myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]<myMovingAverageArray2[1])
   && (myMovingAverageArray1[0]>myMovingAverageArray3[0])
   && (myMovingAverageArray1[1]<myMovingAverageArray3[1])
   && (myMovingAverageArray2[0]>myMovingAverageArray3[0])
   && (myMovingAverageArray2[1]<myMovingAverageArray3[1])
      )
         {
         Comment("BUY");
         }
    
   //check if we have a sell entry signal      
   if (
      (myMovingAverageArray1[0]<myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]>myMovingAverageArray2[1])
   && (myMovingAverageArray1[0]<myMovingAverageArray3[0])
   && (myMovingAverageArray1[1]>myMovingAverageArray3[1])
   && (myMovingAverageArray2[0]<myMovingAverageArray3[0])
   && (myMovingAverageArray2[1]>myMovingAverageArray3[1])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+

Aşağıdaki görüntüler, kodu yürüttükten sonra oluşan ve grafikte yorum olarak gösterilen sinyalleri göstermektedir:

3 MA - alış sinyali


3 MA - satış sinyali


Sonuç

Bu makalede, en popüler ve en kullanışlı göstergelerden biri olan hareketli ortalamayı inceledik ve türleri hakkında bilgi sahibi olduk. Ayrıca hareketli ortalamanın bir türü olan Simple Moving Average'a ilişkin üç farklı stratejiyi paylaşarak hareketli ortalamaları nasıl kullanabileceğimize ve onlar için algoritmik ticaret sistemlerini nasıl tasarlayabileceğimize baktık. Bu stratejileri kullanmak istiyorsanız, kullanmadan önce kapsamlı test ve optimizasyon yaptığınızdan emin olun.



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

Klasik zararı durdur veya RSI'a dayalı zararı durdur (akıllı zararı durdur) Klasik zararı durdur veya RSI'a dayalı zararı durdur (akıllı zararı durdur)
Zararı durdur, ticarette ana para yönetimi araçlarından biridir. Kârı al ve lot büyüklüğüyle birlikte etkin kullanımı, ticareti daha istikrarlı ve genel olarak daha kârlı hale getirebilir. Zararı durdur harika bir araç olmasına rağmen, kullanırken karşılaşılabilecek zorlukları vardır. Bunlardan en önemlisi zararı durdur avıdır. Bu makalede, zararı durdur avının nasıl en aza indirileceği ele alınmakta ve bu amaçla kullanılacak zararı durdur yönteminin etkinliği ve karlılığı klasik zararı durdur yöntemiyle karşılaştırılarak incelenmektedir.
Sıfırdan bir ticaret Uzman Danışmanı geliştirme Sıfırdan bir ticaret Uzman Danışmanı geliştirme
Bu makalede minimum derecede programlamayla bir ticaret robotunun nasıl geliştirileceğini ele alacağız. MetaTrader 5 elbette ticaret işlemleri üzerinde yüksek düzeyde kontrol sağlamaktadır. Ancak, yalnızca manuel olarak emir verme yeteneğinin kullanılması, daha az deneyimli kullanıcılar için oldukça zor ve riskli olabilir.
Linux'ta MetaTrader 4 Linux'ta MetaTrader 4
Bu makalede, MetaTrader 4'i popüler Linux sürümleri olan Ubuntu ve Debian'a kolay bir şekilde nasıl kurabileceğinizi göstereceğiz. Bu sistemler yalnızca sunucularda değil, aynı zamanda yatırımcılar tarafından kişisel bilgisayarlarda da yaygın olarak kullanılmaktadır.
Algoritmik Ticaret Sisteminizi Neden ve Nasıl Tasarlayacağınızı Öğrenin Algoritmik Ticaret Sisteminizi Neden ve Nasıl Tasarlayacağınızı Öğrenin
Bu makalede MQL5 programlama dilinin bazı temellerini ele alacağız. Makalenin amacı, yeni başlayanların kendi algoritmik ticaret sistemlerini (Uzman Danışman) tasarlamalarına yardımcı olmaktır.