English Русский 中文 Español Deutsch 日本語 Português
preview
Gator Oscillator göstergesine dayalı bir alım-satım sistemi nasıl geliştirilir?

Gator Oscillator göstergesine dayalı bir alım-satım sistemi nasıl geliştirilir?

MetaTrader 5Ticaret | 22 Ağustos 2024, 11:37
26 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Giriş

    MQL5 ile en popüler göstergelere dayalı alım-satım sistemlerinin nasıl tasarlanacağını öğrendiğimiz bu seride sizlerle bir yeni makaleye daha başlıyoruz. Bu seride iki görevi çözüyoruz: sadece MQL5 programlama dili ile alım-satım sistemlerinin nasıl oluşturulacağını değil, aynı zamanda bahsedilen her teknik gösterge hakkında da bilgi ediniyoruz. Bu makalede, bu popüler göstergelerden biri olan Gator Oscillator hakkında konuşacağız. Ne olduğunu, nasıl kullanılacağını ve ona dayalı olarak MetaTrader 5'te kullanılmak üzere bir alım-satım sisteminin nasıl oluşturulacağını ayrıntılı olarak öğreneceğiz. Böyle bir sistem, alım-satım sonuçlarını iyileştirmek için yeni alım-satım yaklaşımları bulmamıza yardımcı olabilir. 

      Göstergenin ayrıntılı bir şekilde incelenmesi için yazıyı birkaç alt bölüme ayıracağız:

      1. Gator Oscillator göstergesinin tanımı
      2. Gator Oscillator göstergesi stratejileri
      3. Gator Oscillator göstergesine dayalı alım-satım sisteminin planı
      4. Gator Oscillator göstergesine dayalı alım-satım sistemi
      5. Sonuç

      Bu makalede kodları yazmak için MetaTrader 5 işlem platformunda yerleşik olarak bulunan MQL5 programlama dilini (MetaQuotes Language 5) ve ortaya çıkan stratejileri test etmek için platformun kendisini kullanacağız. MetaTrader 5’in nasıl kurulacağı ve MetaEditor’ın nasıl kullanılacağı hakkında daha fazla bilgi edinmek istiyorsanız, önceki makalelerimden birinde yer alan "MetaEditor’da MQL5 kodu yazma" bölümünü okuyabilirsiniz.

      Bu makalede bahsedeceğimiz tüm stratejilerin iyice test edilmesi ve iyileştirilmesi gerekir. Herhangi bir stratejiyi gelecekte kullanmak istiyorsanız, sizin için doğru olduğundan emin olmak için onu ayrıntılı bir şekilde test ettiğinizden emin olun. Sonuçta, herkese uyan tek bir strateji diye bir şey yoktur. Neticede, bu makalenin temel amacı eğitimdir, yani biz sadece göstergenin özünü inceliyoruz. Ayrıca herkese bu makaledeki tüm kodları kendi başlarına yazmayı denemelerini tavsiye etmek istiyorum, çünkü bu, programlama becerilerini geliştiren bir pratiktir.

      Sorumluluk reddi: Sağlanan tüm bilgiler ’olduğu gibi’ yalnızca bilgilendirme amaçlıdır, alım-satım tavsiyesi değildir. Bu bilgiler herhangi bir sonucu garanti etmemektedir. Bu materyalleri herhangi bir işlem hesabında kullanırsanız, ortaya çıkabilecek tüm riskler size ait olacaktır.


      Gator Oscillator göstergesinin tanımı

      Bu bölümde, arkasındaki ana kavramı anlamak ve onu doğru ve etkili bir şekilde nasıl kullanacağımızı öğrenmek için Gator Oscillator göstergesine yakından bakacağız. Gator Oscillator göstergesi Bill Williams tarafından geliştirilmiştir. Piyasanın bir trend içinde mi yoksa yatay bir aralıkta mı hareket ettiğini ve bir trend içindeyse, bu trendin momentum açısından ne kadar sürebileceğini belirler. Bu bilgiler, bize bir işleme ne zaman girileceğini ve işlemden ne zaman çıkılacağını söyleyebilir. Hepimizin bildiği gibi, bu iki şey alım-satımda çok önemlidir. Gator Oscillator, Alligator göstergesine dayalı bir alım-satım sistemi nasıl geliştirilir? başlıklı önceki makalemde ayrıntılı olarak bahsettiğimiz Alligator göstergesine dayanmaktadır.

      Gator göstergesinin hesaplanması, Alligator çizgilerinin yakınsama ve ıraksamasına dayanır. Aşağıda Gator göstergesinin nasıl hesaplandığı yer almaktadır:

      • Birinci adım: medyan fiyatı hesaplıyoruz:

      Median Price = (High + Low) /2

      • İkinci adım: Alligator Jaws, Alligator Teeth ve Alligator Lips değerlerini hesaplamamız gerekiyor:
      Alligator Jaw = SMMA (Median Price, 13,8)
      Alligator Teeth = SMMA (Median Price, 8, 5)
      Alligator Lips = SMMA (Median Price, 5, 3)
      • Tanımlamalar:

      Median Price: fiyat türü.

      High: mumun yüksek fiyatı.

      Low: mumun düşük fiyatı.

      SMMA: yumuşatılmış hareketli ortalama. Bir tür hareketli ortalamadır. Veri, periyot ve varsa kayma için bir yumuşatma sağlar. SMMA (Median Price, 13, 5) dersek, veri türü olarak medyan fiyattan türetilen yumuşatılmış hareketli ortalama olan SMMA'nın yumuşatma periyodunun 13 ve geleceğe kayma değerinin 5 olacağı anlamına gelir. 

      Alligator Jaws: Alligator göstergesinin mavi çizgisi.

      Alligator Teeth: Alligator göstergesinin kırmızı çizgisi.

      Alligator Lips: Alligator göstergesinin yeşil çizgisi.

      Tüm bu verileri kullanarak, Gator Oscillator göstergesinin değerini manuel olarak hesaplayabiliriz. Ancak, aslında manuel olarak hesaplamanıza gerek yoktur, çünkü MetaTrader 5 işlem terminalinde zaten kullanıma hazır bir gösterge vardır ve tek yapmanız gereken onu listeden seçmektir.

      MetaTrader 5 işlem terminalini açın, Ekle --> Göstergeler --> Bill Williams --> Gator Oscillator'ı seçin.

      Gator Oscillator göstergesini ekleme

      Gator Oscillator’ı seçtikten sonra, aşağıdaki şekilde gösterildiği gibi gösterge parametreleri penceresi açılacaktır:

      Gator Oscillator göstergesi parametreleri

      Yukarıdaki görüntü, aşağıdaki parametreleri ayarlayabileceğimiz Gator Oscillator göstergesi ayarlarının bulunduğu pencereyi göstermektedir:

      1. Jaws’un periyodu.
      2. Jaws’un yatay kayması.
      3. Teeth’in periyodu.
      4. Teeth’in yatay kayması.
      5. Lips’in periyodu.
      6. Lips’in yatay kayması.
      7. Ortalamanın tercih edilen periyodu.
      8. Gator'ın hesaplanmasında kullanılacak fiyat türü.
      9. Gator’ın yükselen değerlerinin rengi.
      10. Gator’ın düşen değerlerinin rengi.
      11. Gator'ın çubuklarının kalınlığı.  

      Tercih ettiğiniz gösterge parametrelerini seçin, ‘Tamam’a tıklayın ve gösterge aşağıda gösterildiği gibi grafik üzerinde çalışacaktır:

      Grafikte Gator Oscillator göstergesi

      Yukarıdaki grafikte görebileceğimiz gibi, alt kısımda Gator Oscillator değerlerinin sıfır seviyesinin üstünde ve altında görüntülendiği ek bir gösterge penceresi vardır. Gösterge, mevcut çubuk ile önceki çubuk arasındaki farka göre rengi belirlenen yeşil ve kırmızı çubuklardan oluşmaktadır. Mevcut çubuk bir öncekinden daha yüksekse rengi yeşil, bir öncekinden daha küçükse rengi kırmızı olacaktır. 


      Gator Oscillator göstergesi stratejileri

      Bu bölümde, Gator Oscillator göstergesine dayalı birkaç basit stratejiye bakacağız. Bu stratejileri yalnızca eğitim amaçlı olarak incelediğimizi açıkça belirtmek istiyorum. Stratejileri alım-satım için kullanmadan önce onları iyi bir şekilde test etmeniz ve optimize etmeniz çok önemlidir.

        Birinci strateji: Gator durumu tanımlayıcısı:

          Bu strateji, gösterge çubuklarına göre Gator durumunu belirleyecektir. Çubukların renklerine bağlı olarak, Gator dört duruma sahip olabilir. Sıfır çizgisinin zıt taraflarındaki her iki çubuk da kırmızıysa, timsah uyuyor demektir. Sıfır çizgisinin zıt taraflarındaki her iki çubuk da yeşilse, timsah yemek yiyor demektir. Sıfır çizgisinin zıt taraflarındaki çubukların renkleri kırmızıyken yeşile dönmüşse, timsah uyanıyor demektir. Sıfır çizgisinin zıt taraflarındaki çubukların renkleri yeşilken kırmızıya dönmüşse, timsah doymuş demektir.

          Daha basit ifadeyle,

          Her iki çubuk da kırmızı ==> Uyuma aşaması

          Her iki çubuk da yeşil ==> Yemek yeme aşaması

          Her iki çubuk da kırmızıdan sonra yeşil ==> Uyanma aşaması

          Her iki çubuk da yeşilden sonra kırmızı ==> Doygunluk aşaması

            İkinci strateji: Gator sinyalleri:

              Bu strateji, gösterge durumlarına göre sinyaller üretecektir. Timsah uyanma aşamasındaysa, iyi bir giriş bulmamıza dair bir sinyal alacağız. Gösterge yemek yeme aşamasındaysa, strateji mevcut pozisyonun korunması için bir sinyal üretecektir. Gator göstergesi doygunluk aşamasındaysa, iyi bir çıkış bulmamıza dair bir sinyal alacağız. Diğer durumlarda, hiçbir şey yapmayız.

              Daha basit ifadeyle,

              Gator göstergesi = Uyanma aşaması ==> İyi bir giriş bul

              Gator göstergesi = Yemek yeme aşaması ==> Mevcut pozisyonu koru

              Gator göstergesi = Doygunluk aşaması ==> İyi bir çıkış bul

              Gator göstergesi = Diğer durumlar ==> Hiçbir şey yapma

                Üçüncü strateji: MA ile Gator:

                  Bu stratejide, Gator göstergesinden gelen sinyali hareketli ortalama sinyali ile birleştireceğiz. Her iki çubuk da yeşilse ve kapanış fiyatı hareketli ortalamanın üzerindeyse, potansiyel bir alış işlemi açmak için bir sinyal olacaktır. Tersi durumda, Gator göstergesinin her iki çubuğu da kırmızıysa ve kapanış fiyatı hareketli ortalamanın altındaysa, bu da potansiyel bir satış işlemi için bir sinyal olacaktır. Diğer koşullarda, hiçbir şey yapmayız.

                  Daha basit ifadeyle,

                  Çift yeşil çubuk ve kapanış fiyatı > Hareketli ortalama ==> İyi bir alış pozisyonu bul

                  Çift kırmızı çubuk ve kapanış fiyatı < Hareketli ortalama ==> İyi bir satış pozisyonu bul

                  Diğer koşullar ==> Hiçbir şey yapma


                  Gator Oscillator göstergesine dayalı alım-satım sisteminin planı

                  Bu bölümde, yukarıda bahsettiğimiz stratejiler için adım adım ifadeler içeren diyagramlar oluşturacağız. Bir sonraki bölümde, alım-satım sistemlerinin verimli ve kolay bir şekilde oluşturulmasına yardımcı olacaklardır. Bu adımın bir alım-satım sisteminin geliştirilmesi sırasında çok önemli ve gerekli olduğuna inanıyorum, çünkü bize çok zaman kazandıracaktır: bu tür şemaları oluşturmak için biraz zaman harcayarak, gerekli tüm adımları atlamadan veya tekrarlamadan alım-satım sistemini tutarlı bir şekilde oluşturacağız ve böylece çok daha fazla zaman kazanacağız. Fikirlerimizi adım adım gerçekleştirmesi için bilgisayarın ne yapması gerektiğini açıkça tanımlamamız gerekir.

                    Birinci strateji: Gator durumu tanımlayıcısı:

                      Bu stratejiye göre, Gator göstergesinin değerlerini her tikte otomatik olarak kontrol edecek, bunları uygun şekilde birbirleriyle karşılaştıracak ve ilgili sinyali görüntüleyecek bir Uzman Danışman programı oluşturacağız. Program göstergenin şu değerlerini kontrol edecektir: mevcut yukarı çubuk, mevcut olandan önceki iki yukarı çubuk, mevcut aşağı çubuk ve mevcut olandan önceki iki aşağı çubuk. Bu değerlerin stratejiye uygun şekilde karşılaştırmasının sonucu, Gator durumunu belirtecek sinyaller olacaktır.

                      Program, mevcut yukarı değer bir öncekinden daha düşükse ve mevcut aşağı değer bir öncekinden daha yüksekse, uyuma aşaması sinyalini grafikte yorum olarak geri döndürecektir. Bir diğer durumda, mevcut yukarı değer bir öncekinden daha yüksekse ve aynı zamanda mevcut aşağı değer bir öncekinden daha düşükse, alım-satım sistemi yemek yeme aşaması sinyalini grafikte yorum olarak geri döndürecektir. Üçüncü durumda, birinci önceki yukarı değer ikinci öncekinden daha düşükse ve birinci önceki aşağı değer ikinci önceki aşağı değerden daha yüksekse ve aynı zamanda mevcut yukarı değer birinci öncekinden daha yüksekse ve mevcut aşağı değer birinci öncekinden daha düşükse, alım-satım sistemi uyanma aşaması sinyalini grafikte yorum olarak geri döndürecektir. Dördüncü ve son durumda, birinci önceki yukarı değer ikinci öncekinden daha yüksekse ve birinci önceki aşağı değer ikinci önceki aşağı değerden daha düşükse ve aynı zamanda mevcut yukarı değer birinci öncekinden daha düşükse ve mevcut aşağı değer birinci öncekinden daha yüksekse, alım-satım sistemi doygunluk aşaması sinyalini grafikte yorum olarak geri döndürecektir.

                      Aşağıda bu alım-satım sisteminin planı yer almaktadır:

                      Gator durumu tanımlayıcısı planı


                        İkinci strateji: Gator sinyalleri:

                          Bu stratejiyi kullanarak, potansiyel giriş, çıkış veya pozisyonu tutmak için sinyaller üretmek üzere kullanılabilecek bir alım-satım sistemi oluşturacağız. Bunu yapmak için program, Gator durumlarına dayalı sinyaller oluşturmak için mevcut yukarı çubuk ve önceki iki yukarı çubuk değerlerine ek olarak mevcut aşağı çubuk ve önceki iki aşağı çubuk değerlerini sürekli olarak kontrol edecektir.

                          İlk sinyal olarak, Uzman Danışman timsahın uyanma aşamasında olduğunu belirlediğinde, potansiyel pozisyona giriş sinyalini grafikte yorum olarak gösterecektir. Bu sinyal şu şekilde oluşur: birinci önceki yukarı değer ikinci öncekinden daha düşükse ve birinci önceki aşağı değer ikinci önceki aşağı değerden daha yüksekse ve aynı zamanda mevcut yukarı değer birinci öncekinden daha yüksekse ve mevcut aşağı değer birinci öncekinden daha düşükse.

                          İkinci sinyalde, Uzman Danışman timsahın yemek yeme aşamasında olduğunu belirlediğinde, pozisyonun tutulması sinyalini grafikte yorum olarak gösterecektir. Bu sinyal şu şekilde oluşur: mevcut yukarı değer bir öncekinden daha yüksekse ve aynı zamanda mevcut aşağı değer bir öncekinden daha düşükse.

                          Üçüncü sinyalde, Uzman Danışman timsahın doygunluk aşamasında olduğunu belirlediğinde, potansiyel pozisyondan çıkış sinyalini grafikte yorum olarak gösterecektir. Bu sinyal şu şekilde oluşur: birinci önceki yukarı değer ikinci öncekinden daha yüksekse ve birinci önceki aşağı değer ikinci önceki aşağı değerden daha düşükse ve aynı zamanda mevcut yukarı değer birinci öncekinden daha düşükse ve mevcut aşağı değer birinci öncekinden daha yüksekse.

                          Önceki üç durum dışında herhangi bir durumda, herhangi bir şey yapılmasına gerek yoktur. Bu stratejiyi kullanarak bir alım-satım sistemi geliştirmek için adım adım plan:

                          Gator sinyalleri planı



                            Üçüncü strateji: MA ile Gator:

                              Bu strateji ile, Gator göstergesinin aşamasına ve kapanış fiyatının hareketli ortalamaya göre konumuna bağlı olarak potansiyel bir alış veya satış işlemine girme konusunda sinyaller alacağız: iyi bir alış pozisyonu bul ve iyi bir alış pozisyonu bul.

                              Uzman Danışman ‘iyi bir alış pozisyonu bul’ sinyalini şu durumda grafikte yorum olarak gösterecektir: “mevcut yukarı değer birinci öncekinden daha yüksekse ve birinci önceki yukarı değer ikinci öncekinden daha yüksekse ve aynı zamanda mevcut aşağı değer bir öncekinden daha düşükse ve birinci önceki aşağı değer ikinci önceki aşağı değerden daha düşükse. Yani üstte ve altta çiftler halinde yeşil çubuklara sahibiz. Ek olarak, kapanış fiyatı da hareketli ortalamanın üzerinde olmalıdır.”

                              Uzman Danışman ‘iyi bir satış pozisyonu bul’ sinyalini şu durumda grafikte yorum olarak gösterecektir: “mevcut yukarı değer birinci öncekinden daha düşükse ve birinci önceki yukarı değer ikinci öncekinden daha düşükse ve aynı zamanda mevcut aşağı değer bir öncekinden daha yüksekse ve birinci önceki aşağı değer ikinci önceki aşağı değerden daha yüksekse. Yani üstte ve altta çiftler halinde kırmızı çubuklara sahibiz. Ek olarak, kapanış fiyatı da hareketli ortalamanın altında olmalıdır.”

                              Başka herhangi bir durum oluşursa, sinyal olmayacaktır. Bu stratejiyi kullanarak bir alım-satım sistemi geliştirmek için adım adım plan:

                              MA ile Gator planı


                              Gator Oscillator göstergesine dayalı alım-satım sistemi

                              Şimdi, yukarıda bahsettiğimiz stratejilere dayalı bir alım-satım sistemi oluşturacağımız makalenin en ilginç kısmına geldik. Bu tür otomatik alım-satım sistemlerinin amacı alım-satım sürecine yardımcı olmaktır. Başlangıç olarak, stratejilerimizin alım-satım sistemine temel teşkil edecek basit bir program yazacağız.

                              “Simple Gator Oscillator System” adlı bu basit program, göstergenin mevcut değerlerini grafikte yorum olarak geri döndürecektir. Bu programın kodunun nasıl yazılacağını adım adım ele alalım:

                              Ondalıklı değerler geri döndürmek için reel türlerden biri olan “double” fonksiyonunu kullanarak upGator ve downGator değerlerinin dizilerini oluşturalım.

                                 double upGatorArray[];
                                 double downGatorArray[];

                              “ArraySetAsSeries” fonksiyonunu kullanarak dizileri mevcut veriden başlayarak sıralayalım.

                                 ArraySetAsSeries(upGatorArray,true);
                                 ArraySetAsSeries(downGatorArray,true);

                              gatorDef adında bir tamsayı değişken oluşturalım ve "iGator" fonksiyonunu kullanarak Gator Oscillator’ı tanımlayalım. Bu fonksiyon göstergenin tanıtıcısını geri döndürür ve parametreleri şunlardır:

                              • symbol - Sembol adı. Mevcut sembole uygulanmak üzere (_Symbol) kullanacağız. 
                              • period - Zaman dilimi. Mevcut zaman dilimine uygulanmak üzere (_Period) kullanacağız.
                              • jaw_period - Jaws değerinin hesaplanması için periyot. Biz (13) kullanacağız. 
                              • jaw_shift - Jaws’un yatay kayması. Biz (8) kullanacağız.
                              • teeth_period - Teeth değerinin hesaplanması için periyot. Biz (8) kullanacağız.
                              • teeth_shift - Teeth’in yatay kayması. Biz (5) kullanacağız.
                              • lips_period - Lips değerinin hesaplanması için periyot. Biz (5) kullanacağız.
                              • lips_shift - Lips’in yatay kayması.  Biz (3) kullanacağız.
                              • ma_method - Hareketli ortalama türü. (MODE_SMMA) kullanacağız.
                              • applied_price - Hesaplamada uygulanan fiyat türü. (PRICE_MEDIAN) kullanacağız.
                              int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);

                              “CopyBuffer” fonksiyonunu kullanarak, tanımladığımız Gator Oscillator göstergesine göre upGatorArray ve downGatorArray gösterge değerleri dizilerimizi dolduralım. Parametreleri şunlardır:

                              • indicator_handle - Gösterge tanıtıcısı. (gatorDef) kullanacağız.
                              • buffer_num - Gösterge arabellek numarası. upGatorArray için (0), downGatorArray için (2) kullanacağız.
                              • start_pos - Kopyalamanın başlangıç konumu. (0) ayarlayacağız.
                              • count - Kopyalanacak veri miktarı. (3) ayarlayacağız.
                              • buffer[] - Kopyalamanın yapılacağı hedef dizi. (upGatorArray) ve (downGatorArray) kullanacağız.
                                 CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                 CopyBuffer(gatorDef,2,0,3,downGatorArray);

                              Mevcut upGator ve downGator değerlerini, onlar için oluşturduğumuz double türündeki değişkenlere alalım. Değerlerin yuvarlanması için “NormalizeDouble” fonksiyonunu kullanıyoruz.

                              • value - Normalleştirilecek değer. Mevcut değer için (upGatorArray[0])/(downGatorArray[0]) kullanacağız.
                              • digits - Noktadan sonraki basamak sayısı. (6) kullanacağız.
                                 double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                 double gatorDownValue=NormalizeDouble(downGatorArray[0],6);

                              “Comment” fonksiyonunu kullanarak mevcut upGator ve downGator değerlerini grafik üzerinde yorum olarak görüntüleyelim.

                                 Comment("gatorUpValue = ",gatorUpValue,"\n",
                                         "gatorDownValue = ",gatorDownValue);

                              Bu programın tam kodu aşağıda gösterilmektedir:

                              //+------------------------------------------------------------------+
                              //|                               Simple Gator Oscillator System.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"
                              //+------------------------------------------------------------------+
                              void OnTick()
                                {
                                 double upGatorArray[];
                                 double downGatorArray[];
                                 ArraySetAsSeries(upGatorArray,true);
                                 ArraySetAsSeries(downGatorArray,true);
                                 int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                 CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                 CopyBuffer(gatorDef,2,0,3,downGatorArray);
                                 double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                 double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                 Comment("gatorUpValue = ",gatorUpValue,"\n",
                                         "gatorDownValue = ",gatorDownValue);
                                }
                              //+------------------------------------------------------------------+

                              Bu kodu yazdıktan sonra derlemeniz gerekir. Derlerken herhangi bir hata olmadığından emin olun. Sonrasında derlenmiş programı işlem terminalindeki Kılavuzdan bulabilirsiniz:

                              Kılavuz - Simple Gator Oscillator System

                              Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:

                              Simple Gator Oscillator System penceresi

                              "Algoritmik alım-satıma izin ver" seçeneğini etkinleştirip Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:

                              Grafiğe eklenmiş Simple Gator Oscillator System

                              Böylece, program mevcut Gator Oscillator değerlerini grafik üzerinde yorum olarak gösterecektir:

                              Grafikte mevcut Gator Oscillator değerleri


                                Birinci strateji: Gator durumu tanımlayıcısı:

                                  Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:

                                  //+------------------------------------------------------------------+
                                  //|                                      Gator Status Identifier.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"
                                  //+------------------------------------------------------------------+
                                  void OnTick()
                                    {
                                     double upGatorArray[];
                                     double downGatorArray[];
                                     ArraySetAsSeries(upGatorArray,true);
                                     ArraySetAsSeries(downGatorArray,true);
                                     int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                     CopyBuffer(gatorDef,0,0,5,upGatorArray);
                                     CopyBuffer(gatorDef,2,0,5,downGatorArray);
                                     double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                     double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                     double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);
                                     double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                     double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                     double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);
                                     if(gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                       {
                                        Comment("Sleeping Phase");
                                       }
                                     else
                                        if(gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                          {
                                           Comment("Eating Phase");
                                          }
                                     if(gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                        gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                       {
                                        Comment("Awakening Phase");
                                       }
                                     else
                                        if(
                                           gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                          {
                                           Comment("Sated Phase");
                                          }
                                    }
                                  //+------------------------------------------------------------------+
                                  

                                  Bu koddaki farklılıklar şunlardır:

                                  upGator'ın son üç değerini tanımlıyoruz ve bu değerleri oluşturduğumuz double türündeki değişkenlere alıyoruz:

                                     double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                     double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                     double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);

                                  downGator'ın son üç değerini tanımlıyoruz ve bu değerleri oluşturduğumuz double türündeki değişkenlere alıyoruz:

                                     double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                     double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                     double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);

                                  Stratejinin koşulları:

                                  Uyuma aşaması söz konusu olduğunda,

                                     if(gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                       {
                                        Comment("Sleeping Phase");
                                       }

                                  Yemek yeme aşaması söz konusu olduğunda,

                                     else
                                        if(gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                          {
                                           Comment("Eating Phase");
                                          }

                                  Uyanma aşaması söz konusu olduğunda,

                                     if(gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                        gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                       {
                                        Comment("Awakening Phase");
                                       }

                                  Doygunluk aşaması söz konusu olduğunda,

                                     else
                                        if(
                                           gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                          {
                                           Comment("Sated Phase");
                                          }

                                  Bu kodu herhangi bir hata olmadan derledikten ve Uzman Danışmanı Kılavuzdan başlattıktan sonra, program grafik üzerinde çalışmaya başlayacaktır:

                                  Grafiğe eklenmiş Simple Gator Status Identifier

                                  Gördüğümüz üzere, grafiğin sağ üst köşesinde Uzman Danışmanın grafik üzerinde çalıştığına dair bir ifade ortaya çıktı.

                                  Devamında program onun için belirlediğimiz koşullara uygun olarak sinyalleri gösterecektir:

                                  Uyuma aşaması durumunda sinyal:

                                  Simple Gator Status Identifier - Uyuma aşaması sinyali

                                  Grafiğin sol üst köşesinde göstergenin uyuma aşamasında olduğuna dair yorum gösterilmektedir.

                                  Yemek yeme aşaması durumunda sinyal:

                                  Simple Gator Status Identifier - Yemek yeme aşaması sinyali

                                  Grafiğin sol üst köşesinde göstergenin yemek yeme aşamasında olduğunu bildiren yorum gösterilmektedir.

                                  Uyanma aşaması durumunda sinyal:

                                  Simple Gator Status Identifier - Uyanma aşaması sinyali

                                  Bu kez de göstergenin uyanma aşamasında olduğu program tarafından bildirilmektedir.

                                  Doygunluk aşaması durumunda sinyal:

                                  Simple Gator Status Identifier - Doygunluk aşaması sinyali

                                  Ve stratejideki son sinyal türü olarak, doygunluk aşaması sinyali grafik üzerinde sol üst köşede görünmektedir.


                                    İkinci strateji: Gator sinyalleri:

                                      Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:

                                      //+------------------------------------------------------------------+
                                      //|                                                Gator signals.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"
                                      //+------------------------------------------------------------------+
                                      void OnTick()
                                        {
                                         double upGatorArray[];
                                         double downGatorArray[];
                                         ArraySetAsSeries(upGatorArray,true);
                                         ArraySetAsSeries(downGatorArray,true);
                                         int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                         CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                         CopyBuffer(gatorDef,2,0,3,downGatorArray);
                                         double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                         double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                         double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);
                                         double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                         double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                         double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);
                                         bool awakeningPhase = gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                                               gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool eatingPhase = gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool satedPhase = gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1;
                                         if(awakeningPhase)
                                           {
                                            Comment("Find a good entry");
                                           }
                                         else
                                            if(eatingPhase)
                                              {
                                               Comment("Hold current position");
                                              }
                                            else
                                               if(satedPhase)
                                                 {
                                                  Comment("Find a good exit");
                                                 }
                                               else
                                                  Comment("");
                                        }
                                      //+------------------------------------------------------------------+

                                      Bu stratejideki farklılıklar:

                                      Üç aşama için bool türünde değişkenler (awakeningPhase, eatingPhase ve satedPhase) oluşturuyoruz:

                                         bool awakeningPhase = gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                                               gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool eatingPhase = gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool satedPhase = gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1;

                                      Stratejinin koşulları:

                                      Uyanma aşaması söz konusu olduğunda,

                                         if(awakeningPhase)
                                           {
                                            Comment("Find a good entry");
                                           }

                                      Yemek yeme aşaması söz konusu olduğunda,

                                         else
                                            if(eatingPhase)
                                              {
                                               Comment("Hold current position");
                                              }

                                      Doygunluk aşaması söz konusu olduğunda,

                                            else
                                               if(satedPhase)
                                                 {
                                                  Comment("Find a good exit");
                                                 }

                                      Diğer durumlarda,

                                               else
                                                  Comment("");

                                      Bu kodu herhangi bir hata olmadan derledikten ve Uzman Danışmanı Kılavuzdan başlattıktan sonra, program grafik üzerinde çalışmaya başlayacaktır:

                                      Grafiğe eklenmiş Gator signals

                                      Gördüğümüz üzere, grafiğin sağ üst köşesinde Uzman Danışmanın grafik üzerinde çalıştığına dair bir ifade ortaya çıktı.

                                      Devamında program onun için belirlediğimiz koşullara uygun olarak sinyalleri gösterecektir:

                                      Uyanma aşaması durumunda sinyal:

                                      Gator signals - Uyanma aşaması sinyali

                                      Yukarıdaki grafikte sol üst köşede görüldüğü üzere program "İyi bir giriş bul" sinyalini göstermektedir.

                                      Yemek yeme aşaması durumunda sinyal:

                                      Gator signals - Yemek yeme aşaması sinyali

                                      Bir diğer strateji sinyali olarak, yukarıdaki grafikte sol üst köşede "Mevcut pozisyonu koru" yorumu görüntülenmektedir.

                                      Doygunluk aşaması söz konusu olduğunda,

                                      Gator signals - Doygunluk aşaması sinyali

                                      Ve stratejinin son sinyali olarak, yukarıdaki grafikte sol üst köşede "İyi bir çıkış bul" yorumu görüntülenmektedir.


                                      Üçüncü strateji: MA ile Gator:

                                      Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:

                                      //+------------------------------------------------------------------+
                                      //|                                       Gator with MA strategy.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"
                                      //+------------------------------------------------------------------+
                                      void OnTick()
                                        {
                                         double upGatorArray[];
                                         double downGatorArray[];
                                         MqlRates pArray[];
                                         double maArray[];
                                         ArraySetAsSeries(upGatorArray,true);
                                         ArraySetAsSeries(downGatorArray,true);
                                         ArraySetAsSeries(maArray,true);
                                         int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                         int maDef=iMA(_Symbol,_Period,13,0,MODE_EMA,PRICE_CLOSE);
                                         int data=CopyRates(_Symbol,_Period,0,13,pArray);
                                         CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                         CopyBuffer(gatorDef,2,0,3,downGatorArray);
                                         CopyBuffer(maDef,0,0,3,maArray);
                                         double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                         double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                         double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);
                                         double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                         double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                         double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);
                                         double maValue=NormalizeDouble(maArray[0],5);
                                         double closingPrice=pArray[0].close;
                                         bool douleGreen = gatorUpValue>gatorUpPreValue1&&gatorUpPreValue1>gatorUpPreValue2&&
                                                           gatorDownValue<gatorDownPreValue1&&gatorDownPreValue1<gatorDownPreValue2;
                                         bool douleRed = gatorUpValue<gatorUpPreValue1&&gatorUpPreValue1<gatorUpPreValue2&&
                                                         gatorDownValue>gatorDownPreValue1&&gatorDownPreValue1>gatorDownPreValue2;  
                                         if(douleGreen&&closingPrice>maValue)
                                           {
                                            Comment("Find a good buy position");
                                           }
                                         else
                                            if(douleRed&&closingPrice<maValue)
                                              {
                                               Comment("Find a good sell position");
                                              }
                                            else
                                               Comment("");
                                        }
                                      //+------------------------------------------------------------------+

                                      Bu stratejideki farklılıklar:

                                      İki ek pArray ve maArray dizilerini oluşturuyoruz. maArray dizisi için "double" fonksiyonu, fiyatlara ilişkin verileri depolamak üzere pArray dizisi için de “MqlRates” fonksiyonunu kullanacağız:

                                         MqlRates pArray[];
                                         double maArray[];

                                      "ArraySetAsSeries" fonksiyonunu kullanarak maArray dizisindeki verileri sıralıyoruz:

                                      ArraySetAsSeries(maArray,true);

                                      maDef adında bir tamsayı değişken oluşturuyoruz ve "iMA" fonksiyonunu kullanarak Moving Average’ı tanımlıyoruz. Bu fonksiyon göstergenin tanıtıcısını geri döndürür ve parametreleri şunlardır:

                                      • symbol - Sembol adı. Mevcut sembole uygulanmak üzere (_Symbol) kullanacağız.
                                      • period - Zaman dilimi. Mevcut zaman dilimine uygulanmak üzere (_Period) kullanacağız. Aynı zamanda mevcut zaman dilimi için (PERIOD_CURRENT) değerini de kullanabilirsiniz.
                                      • ma_period - Moving Average periyodu. (13) ayarlayacağız. 
                                      • ma_shift - Moving Average kayma miktarı. MA'yı kaydırmamız gerekmediği için (0) ayarlayacağız. 
                                      • ma_method - Moving Average yöntemi. Exponential Moving Average (MODE_EMA) kullanacağız. 
                                      • applied_price - Hesaplamada kullanılan fiyat türü. Kapanış fiyatını (PRICE_CLOSE) kullanacağız.
                                      int maDef=iMA(_Symbol,_Period,13,0,MODE_EMA,PRICE_CLOSE);

                                      “CopyRates” fonksiyonunu kullanılarak MqlRates'in geçmiş verilerini alıyoruz:

                                      • symbol_name - Sembol adı. Mevcut sembole uygulanmak üzere (_Symbol) kullanacağız. 
                                      • timeframe - Zaman dilimi. Mevcut zaman dilimine uygulanmak üzere (_Period) kullanacağız. 
                                      • start_pos - Kopyalamanın başlangıç konumu. Mevcut konumdan başlaması için (0) ayarlayacağız.
                                      • count - Kopyalanacak veri miktarı. (13) ayarlayacağız. 
                                      • rates_array[] - Kopyalamanın yapılacağı hedef dizi. (pArray) dizisini kullanacağız. 
                                      int data=CopyRates(_Symbol,_Period,0,13,pArray);

                                      “CopyBuffer” fonksiyonunu kullanarak, tanımladığımız Moving Average göstergesine göre maArray dizisini dolduruyoruz:

                                      CopyBuffer(maDef,0,0,3,maArray);

                                      Mevcut EMA değerini normalleştirerek alıyoruz:

                                      double maValue=NormalizeDouble(maArray[0],5);

                                      Mevcut kapanış fiyatını alıyoruz:

                                      double closingPrice=pArray[0].close;

                                      Gator Oscillator göstergesinin çift yeşil ve çift kırmızı çubukları için bool değişkenler oluşturuyoruz:

                                         bool douleGreen = gatorUpValue>gatorUpPreValue1&&gatorUpPreValue1>gatorUpPreValue2&&
                                                           gatorDownValue<gatorDownPreValue1&&gatorDownPreValue1<gatorDownPreValue2;
                                         bool douleRed = gatorUpValue<gatorUpPreValue1&&gatorUpPreValue1<gatorUpPreValue2&&
                                                         gatorDownValue>gatorDownPreValue1&&gatorDownPreValue1>gatorDownPreValue2; 

                                      Stratejinin koşulları:

                                      Alış durumunda,

                                         if(douleGreen&&closingPrice>maValue)
                                           {
                                            Comment("Find a good buy position");
                                           }

                                      Satış durumunda,

                                         else
                                            if(douleRed&&closingPrice<maValue)
                                              {
                                               Comment("Find a good sell position");
                                              }

                                      Diğer durumlarda,

                                            else
                                               Comment("");

                                      Bu kodu herhangi bir hata olmadan derledikten ve Uzman Danışmanı Kılavuzdan başlattıktan sonra, program grafik üzerinde çalışmaya başlayacaktır:

                                      Grafiğe eklenmiş Gator with MA Strategy

                                      Gördüğümüz üzere, grafiğin sağ üst köşesinde Uzman Danışmanın grafik üzerinde çalıştığına dair bir ifade ortaya çıktı.

                                      Devamında program onun için belirlediğimiz koşullara uygun olarak sinyalleri gösterecektir:

                                      Alış durumunda:

                                      Gator with MA Strategy - Alış sinyali

                                      Yukarıdaki grafikte sol üst köşede görebileceğimiz gibi “İyi bir alış pozisyonu bul” sinyaline sahibiz.

                                      Satış durumunda:

                                      Gator with MA Strategy - Satış sinyali

                                      Bu grafikte de stratejinin “İyi bir satış pozisyonu bul” sinyaline sahibiz.

                                      Böylece, sizinle birlikte farklı stratejilere dayalı alım-satım sistemlerinin nasıl oluşturulacağını gördük. Umarım bu yeni fikirler bulmanıza yardımcı olacaktır. Çünkü bu makalenin ve tüm serinin ana amacı budur.


                                      Sonuç

                                      Gator Oscillator göstergesini kullanarak alım-satım sistemlerinin nasıl geliştirileceğini öğrendiğimiz bu makaledeki tüm konuları tamamladık. Gator Oscillator göstergesinin ne olduğunu, nasıl hesaplandığını ve örnek olarak üç basit stratejisiyle alım-satımda nasıl kullanılabileceğini öğrendik:

                                      • Gator durumu tanımlayıcısı: bu strateji, farklı koşullara bağlı olarak Gator Oscillator’ın durumunun ne olduğunu (uyanma, uyuma, yemek yeme ve doygunluk) belirler.
                                      • Gator sinyalleri: Gator Oscillator’ın durumlarına bağlı olarak uygun kararın zamanlaması hakkında sinyaller almak için (iyi bir giriş bul, mevcut pozisyonu koru veya iyi bir çıkış bul).
                                      • MA ile Gator: hareketli ortalama göstergesi ile Gator Oscillator’a bağlı olarak alış veya satış girişi zamanlamasına ilişkin sinyaller almak için.

                                      Her strateji için, bunlara dayalı alım-satım sistemlerinin geliştirilmesinde kullanılan adım adım ifadeler içeren planlar hazırladık. Makalenin son bölümünde de alım-satım sistemlerini yazdık - her strateji için bir MQL5 Uzman Danışmanı oluşturduk, MetaTrader 5 işlem platformunda çalışabilen programlar elde ettik ve bu stratejiler için üretilen sinyallerin örneklerini gördük.

                                      Umarım bu makaleyi yararlı bulmuşsunuzdur ve alım-satım sonuçlarınızı iyileştirmenize, yeni yaklaşımlar bulmanıza, bu makalenin konusu veya ilgili herhangi bir konuda yeni bilgiler edinmenize katkıda bulunmuştur. Bu makaleyi beğendiyseniz, faydalı bulduysanız, en popüler teknik göstergelere dayalı alım-satım sistemlerinin nasıl geliştirildiğini öğrendiğimiz bu serideki önceki makalelerimi de okuyabilirsiniz.

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

                                      Bill Williams MFI göstergesine dayalı bir alım-satım sistemi nasıl geliştirilir? Bill Williams MFI göstergesine dayalı bir alım-satım sistemi nasıl geliştirilir?
                                      En popüler teknik göstergelere dayalı alım-satım sistemleri tasarladığımız serimizin yeni makalesindeyiz. Bu makalede Bill Williams Market Facilitation Index (BW MFI) göstergesini inceleyeceğiz.
                                      Scikit-learn kütüphanesinin sınıflandırma modelleri ve bunların ONNX'e aktarılması Scikit-learn kütüphanesinin sınıflandırma modelleri ve bunların ONNX'e aktarılması
                                      Bu makalede, Fisher'ın iris veri kümesinin sınıflandırma görevini çözmek için Scikit-learn kütüphanesinde bulunan tüm sınıflandırma modellerinin uygulanmasını inceleyeceğiz. Bu modelleri ONNX formatına dönüştürmeye ve elde edilen modelleri MQL5 programlarında kullanmaya çalışacağız. Ek olarak, orijinal modellerin doğruluğunu tam iris veri setindeki ONNX versiyonlarıyla karşılaştıracağız.
                                      Sıfırdan bir alım-satım Uzman Danışmanı geliştirme (Bölüm 29): Konuşan platform Sıfırdan bir alım-satım Uzman Danışmanı geliştirme (Bölüm 29): Konuşan platform
                                      Bu makalede MetaTrader 5 platformunu nasıl konuşturacağımızı öğreneceğiz. Uzman Danışmanı daha eğlenceli hale getirmeye ne dersiniz? Finansal piyasalarda alım-satım yapmak genellikle çok monotondur, ancak bu süreci daha eğlenceli hale getirebiliriz. Bu projenin bağımlılık gibi sorunlar yaşayanlar için tehlikeli olabileceğini lütfen unutmayın. Genel olarak alım-satım sürecini daha keyifli hale getireceğiz.
                                      MQL5’i kullanarak çizgilerle nasıl çalışılır? MQL5’i kullanarak çizgilerle nasıl çalışılır?
                                      Bu makalede, MQL5’i kullanarak trend, destek ve direnç gibi en önemli çizgilerle nasıl çalışılacağından bahsedeceğiz.