Gator Oscillator göstergesine dayalı bir alım-satım sistemi nasıl geliştirilir?
Giriş
Göstergenin ayrıntılı bir şekilde incelenmesi için yazıyı birkaç alt bölüme ayıracağız:
- Gator Oscillator göstergesinin tanımı
- Gator Oscillator göstergesi stratejileri
- Gator Oscillator göstergesine dayalı alım-satım sisteminin planı
- Gator Oscillator göstergesine dayalı alım-satım sistemi
- 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’ı seçtikten sonra, aşağıdaki şekilde gösterildiği gibi gösterge parametreleri penceresi açılacaktır:
Yukarıdaki görüntü, aşağıdaki parametreleri ayarlayabileceğimiz Gator Oscillator göstergesi ayarlarının bulunduğu pencereyi göstermektedir:
- Jaws’un periyodu.
- Jaws’un yatay kayması.
- Teeth’in periyodu.
- Teeth’in yatay kayması.
- Lips’in periyodu.
- Lips’in yatay kayması.
- Ortalamanın tercih edilen periyodu.
- Gator'ın hesaplanmasında kullanılacak fiyat türü.
- Gator’ın yükselen değerlerinin rengi.
- Gator’ın düşen değerlerinin rengi.
- 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:
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.
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ı
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
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.
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:
İ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:
Üçü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:
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:
Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:
"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:
Böylece, program mevcut Gator Oscillator değerlerini grafik üzerinde yorum olarak gösterecektir:
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:
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:
Grafiğin sol üst köşesinde göstergenin uyuma aşamasında olduğuna dair yorum gösterilmektedir.
Yemek yeme aşaması durumunda sinyal:
Grafiğin sol üst köşesinde göstergenin yemek yeme aşamasında olduğunu bildiren yorum gösterilmektedir.
Uyanma aşaması durumunda sinyal:
Bu kez de göstergenin uyanma aşamasında olduğu program tarafından bildirilmektedir.
Doygunluk aşaması durumunda sinyal:
Ve stratejideki son sinyal türü olarak, doygunluk aşaması sinyali grafik üzerinde sol üst köşede görünmektedir.
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:
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:
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:
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,
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:
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:
Yukarıdaki grafikte sol üst köşede görebileceğimiz gibi “İyi bir alış pozisyonu bul” sinyaline sahibiz.
Satış durumunda:
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
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz