
Fibonacci’ye dayalı bir alım-satım sistemi nasıl geliştirilir?
Giriş
En popüler teknik analiz araçlarına dayalı alım-satım sistemlerinin nasıl tasarlanacağını öğrendiğimiz serimizin bu yeni makalesinde, alım-satımda yaygın olarak kullanılan teknik araçlardan biri olan Fibonacci Düzeltmesinden bahsedeceğiz. Bu araca dayalı olarak MetaTrader 5 işlem terminalinde kullanılabilecek bir alım-satım sistemi oluşturacağız. Makalede, kodlarımızı yazmak için MetaQuotes Language 5 (MQL5) programlama dilini ve MetaTrader 5 işlem platformunda yerleşik MetaEditor kod düzenleyicisini 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.
Aşağıdaki konu başlıklarıyla ilerleyeceğiz:
- Fibonacci tanımı
- Fibonacci stratejileri
- Fibonacci’ye dayalı alım-satım sisteminin planı
- Fibonacci’ye dayalı alım-satım sistemi
- Sonuç
Bu Fibonacci aracını trend analizi, destek, direnç vb. gibi diğer teknik araçlarla birlikte kullanmanın daha iyi olacağını belirtmek gerekir, çünkü size daha iyi içgörüler ve sonuçlar sağlayacaktır. Ayrıca, alım-satımınız için faydalı ve kârlı olacağından emin olmak için bu makaleden veya herhangi bir yerden öğrendiğiniz herhangi bir stratejiyi veya aracı gerçek dünyada kullanmadan önce detaylıca test etmelisiniz. Makale boyunca göreceğiniz tüm kodları kendiniz yazmanızı ve tüm adımların üzerinden geçmenizi tavsiye ederim. Yapacağınız bu alıştırma programlama becerilerinizi geliştirmenize yardımcı olacaktır.
Fibonacci tanımı
Bu bölümde, Fibonacci düzeltmesi aracının ne olduğunu ve bir grafik üzerinde nasıl kullanılabileceğini göreceğiz. Fibo, grafikteki destek veya direnç alanlarını bulmak için kullanılabilecek teknik bir araçtır (bunlar fiyat sıçraması beklediğimiz alanlardır). Matematiksel bir sayı dizisi olan Fibonacci dizisine dayanmaktadır. Bu dizideki her bir sayı, önceki iki sayının toplamıdır. Fibonacci seviyeleri bir grafik üzerinde yatay çizgiler olarak çizilir. En popüler çizgiler %23.6, %38.2, %50 ve %61.8'dir.
Bu seviyeleri grafikte görmek için, MetaTrader 5'teki mevcut teknik araçlar listesinden bu aracı seçmeniz ve grafiğe eklemeniz yeterlidir:
MetaTrader 5 terminalini açın, Ekle menüsünü seçin -> Nesneler -> Fibonacci düzeltmesi.
Ardından, bir yükseliş trendinden sonra bir geri çekilme varsa, düşükten yükseğe doğru çizerek ve bunun tersi şekilde, bir düşüş trendinden sonra bir geri çekilme varsa, yüksekten düşüğe doğru çizerek aracı grafiğe yerleştirin.
Yükseliş trendinden sonra FIBO:
Düşüş trendinden sonra FIBO:
Yukarıdaki örneklerde görebileceğimiz gibi, grafikte en yüksek ve en düşük değerlerin iki noktası arasına çizilen bir trend çizgisinin yanı sıra 23.6, 38.2, 50 ve 61.8 seviyelerine sahip yatay çizgiler gösterilmektedir. Bunlar, bir yükseliş veya düşüş trendinden sonra bir düzeltme veya geri çekilme bekleyebileceğimiz seviyelerdir, yani fiyatın bu seviyelere ulaşmasını ve buralardan sıçramasını bekleyebiliriz. Bu özelliği sayesinde FIBO seviyeleri destek veya direnç seviyeleri olarak kullanılabilir.
Seviyeler aracın özellikler penceresi aracılığıyla kontrol edilebilir. Bunu yapmak için, grafik üzerindeki çizilmiş araca sağ tıklayın ve özellikler penceresini açın. Ya da grafiğe sağ tıklayın, içerik menüsünden “Nesne listesi”ni seçin, listeden ilgili Fibonacci aracını seçin ve özellikler penceresini açın. Devamında, aşağıdakine benzer bir pencere açılacaktır:
Genel sekmesinden nesnenin adını ve trend çizgisinin rengini, türünü ve kalınlığını ayarlayabilirsiniz.
Seviyeler sekmesinden istediğiniz seviyeleri ve bu seviyelerin stilini ayarlayabilirsiniz.
Parametreler sekmesinden seviyelerin oluşturulmaya başlanacağı tarih, saat ve değeri ve oluşturulmasının sona ereceği tarih, saat ve değeri belirleyebilirsiniz.
Fibonacci stratejileri
Bu bölümde, bazı basit stratejiler kullanarak Fibonacci düzeltmesini nasıl kullanacağımızı göreceğiz. Ana olarak iki yaklaşıma bakacağız. Bunlardan biri FIBO seviyelerini son günlük muma göre belirlemek, ikincisi ise herhangi bir zaman diliminde belirli bir mum sayısı ayarlamak ve buna göre seviyeleri belirlemektir. Bu yaklaşımlarda ayrıca şu stratejiyi kullanacağız: önceden belirlenen bir FIBO seviyesine göre alış veya satış sinyali alacağız. Şimdi bu stratejilerin her birine ayrıntılı olarak bakalım.
İlk yaklaşım: Günlük verileri kullanarak:
Basit FIBO sistemi:
Bu stratejiye göre, günlük mumun verilerine ve durumuna dayalı olarak FIBO düzeltmesi seviyelerini elde edeceğiz. Son günlük mum yükseliş gösteriyorsa, mumun düşük seviyesinden yüksek seviyesine kadar yeşil yükseliş FIBO seviyeleri oluşturacağız ve her seviyenin fiyat değerlerini alacağız. Son günlük mum düşüş gösteriyorsa, bu sefer de mumun yüksek seviyesinden düşük seviyesine kadar kırmızı düşüş FIBO seviyeleri oluşturacağız ve yine her bir seviyenin fiyat değerlerini alacağız.
Daha basit ifadeyle,
Son gün kapanış > Son gün açılış ==> Yükseliş mumu
Yeşil FIBO seviyeleri oluşturacağız ve bu seviyelerin fiyatlarını alacağız.
Son gün kapanış < Son gün açılış ==> Düşüş mumu
Kırmızı FIBO seviyeleri oluşturacağız ve bu seviyelerin fiyatlarını alacağız.
FIBO sinyalleri:
Bu stratejiye göre, yükseliş veya düşüş FIBO seviyesi olarak belirlediğimiz seviyeye göre alış ve satış sinyalleri alacağız. Örneğin, yükseliş FIBO seviyesini 38.2 olarak ayarlayalım, devamında bir alış işlemi açmak için bu seviyenin fiyat değerini alacağız. Düşüş FIBO seviyesi için de yine bu seviyeyi belirlersek, bu kez de bir satış işlemi açmak için bu seviyenin fiyat değerini alacağız.
İkinci yaklaşım: Belirli mum dizisini kullanarak:
Basit FIBO sistemi 2:
Bu stratejiye göre, bir mum dizisine dayalı olarak FIBO düzeltmesi seviyelerini elde edeceğiz. Mum dizisinin yönüne göre yükseliş veya düşüş FIBO seviyeleri oluşturacağız.
Daha basit ifadeyle,
Dizideki ilk mumun açılışı < Aynı dizinin son mumunun kapanışı ==> Yükseliş FIBO seviyeleri oluşturacağız ve bu seviyelerin fiyatlarını alacağız.
Dizideki ilk mumun açılışı > Aynı dizinin son mumunun kapanışı ==> Düşüş FIBO seviyeleri oluşturacağız ve bu seviyelerin fiyatlarını alacağız.
FIBO sinyalleri 2:
Bu stratejiye göre, giriş seviyesi olarak hizmet edecek seçilen FIBO seviyesine göre alış ve satış sinyalleri alacağız. İkinci yaklaşıma dayanarak yükseliş FIBO'muz varsa, alış işlemine gireceğimiz belirli bir FIBO seviyesinin fiyatını alacağız. Düşüş FIBO'muz varsa, satış işlemine gireceğimiz belirli bir FIBO seviyesinin fiyatını alacağız.
Fibonacci’ye dayalı alım-satım sisteminin planı
Bu bölümde, ele alınan iki yaklaşımın stratejileri için kod yazmak üzere planlar oluşturacağız. Böyle bir plan/şema, alım-satım sistemi geliştirme sürecini görsel olarak organize etmemize olanak sağlar.
İlk yaklaşım: Günlük verileri kullanarak:
Bu yaklaşımda, son günlük mumu ve onun açılış, kapanış, yüksek ve düşük değerlerini kullanacağız. Açılış ve kapanış fiyatlarını karşılaştırarak mumun yükseliş mi yoksa düşüş mü olduğunu belirleyebiliriz. Bu son günlük mumun hareket türüne bağlı olarak, bir Fibonacci nesnesi oluşturacağız ve istenen sinyalleri alacağız.
Basit FIBO sistemi:
FIBO sinyalleri:
İkinci yaklaşım: Belirli mum dizisini kullanarak:
Bu yaklaşımda, dizide belirli sayıda mumla çalışacağız. İlk mumun açılış fiyatını ve son mumun kapanış fiyatını, ayrıca en yüksek ve en düşük değerleri belirleyeceğiz. Açılış ve kapanış fiyatlarını karşılaştırarak yönün yükseliş mi yoksa düşüş mü olduğunu belirleyebiliriz. Yine bu dizideki hareket türüne göre bir Fibonacci nesnesi oluşturup istenen sinyalleri alacağız.
Basit FIBO sistemi 2:
FIBO sinyalleri 2:
Fibonacci’ye dayalı alım-satım sistemi
Bu bölümde, yukarıda bahsettiğimiz her şeyi bir alım-satım sisteminde nasıl uygulayacağımızı göreceğiz. Fibonacci seviyelerini grafik üzerinde yorum olarak geri döndürecek bir program oluşturacağız. İki yaklaşım kullanarak Fibonacci seviyelerini oluşturup değerlerini alacağız: son günlük muma göre ve belirli sayıdaki mum dizisine göre. Ayrıca, bu iki yaklaşımın her birini kullanarak belirli bir Fibonacci seviyesine dayalı alış ve satış sinyallerini nasıl geri döndüreceğimizi de öğreneceğiz. Şimdi her şeye ayrıntılı olarak bakalım.
İlk yaklaşım: Günlük verileri kullanarak:
Basit FIBO sistemi:
Bu strateji için günlük mum verilerini kullanacağız. Aşağıdaki adımları izleyeceğiz:
Derlemeden önce kaynak kodu önceden işlemek için makro ikamesi (#define) kullanarak nesne adını tanımlayalım.
#define FIB_OBJ "Fibonacci Retracement"
barsTotal tamsayı değişkenini oluşturalım.
int barsTotal;
Devamında, onTick'te, bars adında bir tamsayı değişkeni oluşturalım. Bu değişkene, sembolde mevcut olan geçmiş çubuk sayısını geri döndüren “iBar” fonksiyonunu atayalım. Parametreleri şunlardır:
- symbol - Sembol adı. Mevcut sembole uygulanmak üzere (_Symbol) kullanacağız.
- timeframe - Zaman dilimi. D1 zaman dilimine uygulanmak üzere (PERIOD_D1) kullanacağız.
int bars = iBars(_Symbol, PERIOD_D1);
Fibonacci nesnesi için kullanılacak günlük mumu belirlemek üzere bir koşul oluşturalım. barsTotal değişkeni bars değişkenine eşit olmamalıdır - bunu (!=) operatörü ile kontrol ederiz. Ek olarak, mevcut zaman bu günlük mumun kapanış zamanından daha büyük olmalıdır. Bu amaçla, “TimeCurrent” fonksiyonunu ve zamanı içeren bir dizgeyi datetime türünde bir değere dönüştüren “StringToTime” fonksiyonunu kullanırız.
if(barsTotal != bars && TimeCurrent() > StringToTime("00:05"))
Bu koşul doğru olduğunda, programın aşağıdakileri yapmasına ihtiyacımız var:
bars’ı barsTotal'e atayalım.
barsTotal=bars;
“ObjectDelete” fonksiyonunu kullanarak grafikten tüm FIB_OBJ nesnelerini silelim. Parametreleri şunlardır:
- chart_id - Grafik kimliği. Mevcut grafik anlamına gelen (0) değerini kullanacağız.
- name - Nesne adı. (FIB_OBJ) kullanacağız.
ObjectDelete(0,FIB_OBJ);
Fiyat değerleri için dört değişken oluşturalım (open, close, high ve low) ve bunlara günlük çubuğumuzun karşılık gelen değerlerini geri döndüren “iOpen”, “iClose”, “iHigh” ve “iLow” fonksiyonlarını atayalım. Parametreleri şunlardır:
- symbol - Sembol adı. Mevcut sembole uygulanmak üzere (_Symbol) kullanacağız.
- timeframe - Zaman dilimi. D1 zaman dilimine uygulanmak üzere (PERIOD_D1) kullanacağız.
- shift - Zaman serisinden istenen değerin indeksi. Son mum için (1) kullanacağız.
double open = iOpen(_Symbol,PERIOD_D1,1); double close = iClose(_Symbol,PERIOD_D1,1); double high = iHigh(_Symbol,PERIOD_D1,1); double low = iLow(_Symbol,PERIOD_D1,1);
Fibonacci nesnemizi çizmek için daha sonra kullanılacak olan başlangıç ve bitiş zamanını tanımlayalım. Bunu yapmak için, çubuk açılış zamanını geri döndüren “iTime” fonksiyonunu kullanacağız. Parametreleri şunlardır:
- symbol - Sembol adı. Mevcut sembole uygulanmak üzere (_Symbol) kullanacağız.
- timeframe - Zaman dilimi. D1 zaman dilimine uygulanmak üzere (PERIOD_D1) kullanacağız.
- shift - Zaman serisinden istenen değerin indeksi. Başlangıç zamanı için (1) ve bitiş zamanı için (0) kullanacağız.
Bitiş zamanı için, geri döndürülen değer yeni gün (hesaplama sırasında mevcut günlük çubuk) olacağından, bu değerden 1 çıkaracağız. Böylece, bir önceki çubuğun son zamanını elde edeceğiz.
datetime startingTime = iTime(_Symbol,PERIOD_D1,1); datetime endingTime = iTime(_Symbol,PERIOD_D1,0)-1;
Sonrasında, Fibonacci nesnesini çizmek için if-else koşullu operatörünü kullanarak iki koşul belirleyelim.
Kapanış açılıştan daha büyükse, bu bir yükseliş mumudur ve ardından aşağıdakileri yaparız.
Belirtilen parametrelerle bir nesne çizmek için “ObjectCreate” fonksiyonunu kullanarak bir nesne oluşturalım. Parametreleri şunlardır:
- chart_id - Grafik kimliği. Mevcut grafiği temsil etmek için (0) kullanacağız.
- name - Nesne adı. (FIB_OBJ) kullanacağız.
- type - Nesne türü. Fibonacci düzeltmesi için (OBJ_FIBO) kullanacağız.
- nwin - Pencere indeksi. Ana pencere için (0) kullanacağız.
- time1 - İlk noktanın zamanı. (startingTime) değişkenimizi kullanacağız.
- price1 - İlk noktanın fiyatı. (low) değişkenimizi kullanacağız.
- timeN=0 - Son noktanın zamanı. (endingTime) değişkenimizi kullanacağız.
- priceN=0 - Son noktanın fiyatı. (high) değişkenimizi kullanacağız.
“ObjectSetInteger” ve bir for döngüsü kullanarak nesnenin rengini çubuğun yönüne göre güncelleyelim. Parametreleri şunlardır:
- chart_id - Grafik kimliği. Mevcut grafiği temsil etmek için (0) kullanacağız.
- name - Nesne adı. (FIB_OBJ) kullanacağız.
- prop_id - Özellik kimliği. Renk için (OBJPROP_COLOR) kullanacağız.
- prop_value - Özellik değeri. (clrGreen) kullanacağız.
- Nesnenin rengini sürekli olarak güncellemek için bir for döngüsü kullanıyoruz.
if(close>open) { ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,low,endingTime,high); ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen); for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++) { ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen); } double fibRetracLvl1 = NormalizeDouble(high - (high-low) * 23.6 / 100,_Digits); double fibRetracLvl2 = NormalizeDouble(high - (high-low) * 38.2 / 100,_Digits); double fibRetracLvl3 = NormalizeDouble(high - (high-low) * 50 / 100,_Digits); double fibRetracLvl4 = NormalizeDouble(high - (high-low) * 61.8 / 100,_Digits); double fibRetracLvl5 = NormalizeDouble(high - (high-low) * 100 / 100,_Digits); Comment("Last Day Open = ",open,"\n", "Last Day Close = ",close,"\n", "Fib lvl 0% = ",high,"\n", "Fib lvl 23.6% = ",fibRetracLvl1,"\n", "Fib lvl 38.2% = ",fibRetracLvl2,"\n", "Fib lvl 50% = ",fibRetracLvl3,"\n", "Fib lvl 61.8% = ",fibRetracLvl4,"\n", "Fib lvl 100% = ",fibRetracLvl5); }
Düşüş günlük mumu olması durumunda da benzer şeyleri yaparız, farklılıklar aşağıdaki gibidir:
- Yüksekten düşüğe doğru bir nesne oluştururuz.
- Nesnenin rengi kırmızı olacaktır.
else { ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,high,endingTime,low); ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed); for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++) { ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed); } double fibRetracLvl1 = NormalizeDouble(low + (high-low) * 23.6 / 100,_Digits); double fibRetracLvl2 = NormalizeDouble(low + (high-low) * 38.2 / 100,_Digits); double fibRetracLvl3 = NormalizeDouble(low + (high-low) * 50 / 100,_Digits); double fibRetracLvl4 = NormalizeDouble(low + (high-low) * 61.8 / 100,_Digits); double fibRetracLvl5 = NormalizeDouble(low + (high-low) * 100 / 100,_Digits); Comment("Last Day Open = ",open,"\n", "Last Day Close = ",close,"\n", "Fib lvl 0% = ",low,"\n", "Fib lvl 23.6% = ",fibRetracLvl1,"\n", "Fib lvl 38.2% = ",fibRetracLvl2,"\n", "Fib lvl 50% = ",fibRetracLvl3,"\n", "Fib lvl 61.8% = ",fibRetracLvl4,"\n", "Fib lvl 100% = ",fibRetracLvl5); }
Aşağıda bu stratejinin tam kodu yer almaktadır:
//+------------------------------------------------------------------+ //| Simple Fibo System#2.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #define FIB_OBJ "Fibonacci Retracement" #property script_show_inputs input double fibRetracLvl = 38.2; int barsTotal; //+------------------------------------------------------------------+ void OnTick() { int bars = iBars(_Symbol, PERIOD_D1); if(barsTotal != bars && TimeCurrent() > StringToTime("00:05")) { barsTotal=bars; ObjectDelete(0,FIB_OBJ); double open = iOpen(_Symbol,PERIOD_D1,1); double close = iClose(_Symbol,PERIOD_D1,1); double closeCandle = iClose(_Symbol,_Period,1); double high = iHigh(_Symbol,PERIOD_D1,1); double low = iLow(_Symbol,PERIOD_D1,1); datetime startingTime = iTime(_Symbol,PERIOD_D1,1); datetime endingTime = iTime(_Symbol,PERIOD_D1,0)-1; if(close>open) { ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,low,endingTime,high); ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen); for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++) { ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen); } double fibRetracLvl1 = NormalizeDouble(high - (high-low) * 23.6 / 100,_Digits); double fibRetracLvl2 = NormalizeDouble(high - (high-low) * 38.2 / 100,_Digits); double fibRetracLvl3 = NormalizeDouble(high - (high-low) * 50 / 100,_Digits); double fibRetracLvl4 = NormalizeDouble(high - (high-low) * 61.8 / 100,_Digits); double fibRetracLvl5 = NormalizeDouble(high - (high-low) * 100 / 100,_Digits); double entryLvl = NormalizeDouble(high - (high-low) * fibRetracLvl /100,_Digits); Comment("Last Day Open = ",open,"\n", "Last Day Close = ",close,"\n", "Buy Entry Price: ",entryLvl,"\n", "Close: ",closeCandle,"\n"); } else { ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,high,endingTime,low); ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed); for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++) { ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed); } double fibRetracLvl1 = NormalizeDouble(low + (high-low) * 23.6 / 100,_Digits); double fibRetracLvl2 = NormalizeDouble(low + (high-low) * 38.2 / 100,_Digits); double fibRetracLvl3 = NormalizeDouble(low + (high-low) * 50 / 100,_Digits); double fibRetracLvl4 = NormalizeDouble(low + (high-low) * 61.8 / 100,_Digits); double fibRetracLvl5 = NormalizeDouble(low + (high-low) * 100 / 100,_Digits); double entryLvl = NormalizeDouble(low + (high-low) * fibRetracLvl /100,_Digits); { Comment("Last Day Open = ",open,"\n", "Last Day Close = ",close,"\n", "Sell Entry Price: ",entryLvl,"\n", "Close: ",closeCandle); } } } } //+------------------------------------------------------------------+
Aşağıda bu stratejinin tam kodu yer almaktadır:
//+------------------------------------------------------------------+ //| Simple Fibo System#1.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #define FIB_OBJ "Fibonacci Retracement" int barsTotal; //+------------------------------------------------------------------+ void OnTick() { int bars = iBars(_Symbol, PERIOD_D1); if(barsTotal != bars && TimeCurrent() > StringToTime("00:05")) { barsTotal=bars; ObjectDelete(0,FIB_OBJ); double open = iOpen(_Symbol,PERIOD_D1,1); double close = iClose(_Symbol,PERIOD_D1,1); double high = iHigh(_Symbol,PERIOD_D1,1); double low = iLow(_Symbol,PERIOD_D1,1); datetime startingTime = iTime(_Symbol,PERIOD_D1,1); datetime endingTime = iTime(_Symbol,PERIOD_D1,0)-1; if(close>open) { ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,low,endingTime,high); ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen); for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++) { ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen); } double fibRetracLvl1 = NormalizeDouble(high - (high-low) * 23.6 / 100,_Digits); double fibRetracLvl2 = NormalizeDouble(high - (high-low) * 38.2 / 100,_Digits); double fibRetracLvl3 = NormalizeDouble(high - (high-low) * 50 / 100,_Digits); double fibRetracLvl4 = NormalizeDouble(high - (high-low) * 61.8 / 100,_Digits); double fibRetracLvl5 = NormalizeDouble(high - (high-low) * 100 / 100,_Digits); Comment("Last Day Open = ",open,"\n", "Last Day Close = ",close,"\n", "Fib lvl 0% = ",high,"\n", "Fib lvl 23.6% = ",fibRetracLvl1,"\n", "Fib lvl 38.2% = ",fibRetracLvl2,"\n", "Fib lvl 50% = ",fibRetracLvl3,"\n", "Fib lvl 61.8% = ",fibRetracLvl4,"\n", "Fib lvl 100% = ",fibRetracLvl5); } else { ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,high,endingTime,low); ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed); for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++) { ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed); } double fibRetracLvl1 = NormalizeDouble(low + (high-low) * 23.6 / 100,_Digits); double fibRetracLvl2 = NormalizeDouble(low + (high-low) * 38.2 / 100,_Digits); double fibRetracLvl3 = NormalizeDouble(low + (high-low) * 50 / 100,_Digits); double fibRetracLvl4 = NormalizeDouble(low + (high-low) * 61.8 / 100,_Digits); double fibRetracLvl5 = NormalizeDouble(low + (high-low) * 100 / 100,_Digits); Comment("Last Day Open = ",open,"\n", "Last Day Close = ",close,"\n", "Fib lvl 0% = ",low,"\n", "Fib lvl 23.6% = ",fibRetracLvl1,"\n", "Fib lvl 38.2% = ",fibRetracLvl2,"\n", "Fib lvl 50% = ",fibRetracLvl3,"\n", "Fib lvl 61.8% = ",fibRetracLvl4,"\n", "Fib lvl 100% = ",fibRetracLvl5); } } } //+------------------------------------------------------------------+
Uzman Danışman kodunu hatasız olarak derleyin ve terminaldeki Kılavuz penceresinde görünecektir. Oradan grafik üzerinde çalıştırıyoruz. Aşağıda yükseliş ve düşüş mumları için örnekler verilmiştir:
Yükselen günlük mum:
FIBO düşükten yükseğe doğru çizilir, renk yeşildir ve FIBO seviyeleri ve günlük mumun açılış/kapanış değerleri hesaplanır. Bu, aşağıdaki ekran görüntüsünde gösterilmektedir:
Böylece, beklediğimiz şeyleri elde ettik: FIBO düşükten yükseğe doğru çizildi, yeşil renkle gösterildi ve ek olarak, grafikte aşağıdaki değerlere sahip bir yorum görüntülendi:
- Son günün açılışı ==> Günlük grafiğin veri penceresindeki ile aynıdır.
- Son günün kapanışı ==> Günlük grafiğin veri penceresindeki ile aynıdır.
- Beş Fibonacci düzeltmesi fiyat seviyesi.
Düşen günlük mum:
FIBO yüksekten düşüğe doğru çizilir, renk kırmızıdır ve FIBO seviyeleri ve günlük mumun açılış/kapanış değerleri hesaplanır. Bu, aşağıdaki ekran görüntüsünde gösterilmektedir:
Böylece burada da beklediğimiz şeyleri elde ettik: FIBO yüksekten düşüğe doğru çizildi, kırmızı renkle gösterildi ve ek olarak, grafikte aşağıdaki değerlere sahip bir yorum görüntülendi:
- Son günün açılışı ==> Günlük grafiğin veri penceresindeki ile aynıdır.
- Son günün kapanışı ==> Günlük grafiğin veri penceresindeki ile aynıdır.
- Beş Fibonacci düzeltmesi fiyat seviyesi.
FIBO sinyalleri:
Bu stratejiye göre, belirli bir Fibonacci seviyesine dayalı olarak alış ve satış sinyalleri geri döndürebilen bir alım-satım sistemi oluşturacağız. Aşağıda bu sistemin tam kodu bulunmaktadır:
//+------------------------------------------------------------------+ //| Simple Fibo System#2.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #define FIB_OBJ "Fibonacci Retracement" #property script_show_inputs input double fibRetracLvl = 38.2; int barsTotal; //+------------------------------------------------------------------+ void OnTick() { int bars = iBars(_Symbol, PERIOD_D1); if(barsTotal != bars && TimeCurrent() > StringToTime("00:05")) { barsTotal=bars; ObjectDelete(0,FIB_OBJ); double open = iOpen(_Symbol,PERIOD_D1,1); double close = iClose(_Symbol,PERIOD_D1,1); double closeCandle = iClose(_Symbol,_Period,1); double high = iHigh(_Symbol,PERIOD_D1,1); double low = iLow(_Symbol,PERIOD_D1,1); datetime startingTime = iTime(_Symbol,PERIOD_D1,1); datetime endingTime = iTime(_Symbol,PERIOD_D1,0)-1; if(close>open) { ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,low,endingTime,high); ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen); for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++) { ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen); } double fibRetracLvl1 = NormalizeDouble(high - (high-low) * 23.6 / 100,_Digits); double fibRetracLvl2 = NormalizeDouble(high - (high-low) * 38.2 / 100,_Digits); double fibRetracLvl3 = NormalizeDouble(high - (high-low) * 50 / 100,_Digits); double fibRetracLvl4 = NormalizeDouble(high - (high-low) * 61.8 / 100,_Digits); double fibRetracLvl5 = NormalizeDouble(high - (high-low) * 100 / 100,_Digits); double entryLvl = NormalizeDouble(high - (high-low) * fibRetracLvl /100,_Digits); Comment("Last Day Open = ",open,"\n", "Last Day Close = ",close,"\n", "Buy Entry Price: ",entryLvl); } else { ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,high,endingTime,low); ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed); for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++) { ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed); } double fibRetracLvl1 = NormalizeDouble(low + (high-low) * 23.6 / 100,_Digits); double fibRetracLvl2 = NormalizeDouble(low + (high-low) * 38.2 / 100,_Digits); double fibRetracLvl3 = NormalizeDouble(low + (high-low) * 50 / 100,_Digits); double fibRetracLvl4 = NormalizeDouble(low + (high-low) * 61.8 / 100,_Digits); double fibRetracLvl5 = NormalizeDouble(low + (high-low) * 100 / 100,_Digits); double entryLvl = NormalizeDouble(low + (high-low) * fibRetracLvl /100,_Digits); { Comment("Last Day Open = ",open,"\n", "Last Day Close = ",close,"\n", "Sell Entry Price: ",entryLvl); } } } } //+------------------------------------------------------------------+
Bu koddaki farklılıklar şunlardır:
Kullanıcının bir değer girebileceği bir pencere görüntülemek için bir özellik ekliyoruz. Bu, bir ayar penceresi görüntüleyen #property script_show_inputs özelliğidir.
#property script_show_inputs
Varsayılan değeri 38.2 olan double türünde fibRetracLvl adlı bir girdi değişkeni kullanıyoruz.
input double fibRetracLvl = 38.2;
Yükseliş durumunda, kullanıcının belirlediği seviyeye dayalı olarak giriş seviyesini tanımlıyoruz.
double entryLvl = NormalizeDouble(high - (high-low) * fibRetracLvl /100,_Digits);
Düşüş durumunda, kullanıcının belirlediği seviyeye dayalı olarak giriş seviyesini tanımlıyoruz.
double entryLvl = NormalizeDouble(low + (high-low) * fibRetracLvl /100,_Digits);
Yükseliş durumunda, grafik üzerinde yorum görüntülüyoruz.
Comment("Last Day Open = ",open,"\n", "Last Day Close = ",close,"\n", "Buy Entry Price: ",entryLvl,"\n", "Close: ",closeCandle,"\n");
Düşüş durumunda, grafik üzerinde yorum görüntülüyoruz.
Comment("Last Day Open = ",open,"\n", "Last Day Close = ",close,"\n", "Sell Entry Price: ",entryLvl,"\n", "Close: ",closeCandle);
Uzman Danışman kodunu hatasız olarak derleyin ve terminaldeki Kılavuz penceresinde görünecektir. Oradan grafik üzerinde çalıştırıyoruz. Aşağıda yükseliş ve düşüş mumları için örnekler verilmiştir:
Yükselen günlük mum:
15 dakikalık zaman diliminde düşükten yükseğe doğru yeşil Fibonacci seviyeleri çizilir ve alış işlemine giriş seviyesi (38.2 FIBO seviyesi) ve günlük mumun açılış/kapanış değerleri hesaplanır. Bu, aşağıdaki ekran görüntüsünde gösterilmektedir:
Gördüğümüz gibi, yukarıdaki grafikte aşağıdaki değerlere sahip bir sinyal oluşmuştur:
- Son günün açılışı ==> Günlük grafiğin veri penceresindeki ile aynıdır.
- Son günün kapanışı ==> Günlük grafiğin veri penceresindeki ile aynıdır.
- Alış giriş fiyatı ==> 38.2 FIBO seviyesinin bulunduğu fiyat seviyesidir.
Düşen günlük mum:
Bu sefer de 15 dakikalık zaman diliminde yüksekten düşüğe doğru kırmızı Fibonacci seviyeleri çizilir ve satış işlemine giriş seviyesi (38.2 FIBO seviyesi) ve günlük mumun açılış/kapanış değerleri hesaplanır. Aşağıdaki grafikte kontrol edelim:
Gördüğümüz gibi, yukarıdaki grafikte aşağıdaki değerlere sahip bir sinyal oluşmuştur:
- Son günün açılışı ==> Günlük grafiğin veri penceresindeki ile aynıdır.
- Son günün kapanışı ==> Günlük grafiğin veri penceresindeki ile aynıdır.
- Satış giriş fiyatı ==> 38.2 FIBO seviyesinin bulunduğu fiyat seviyesidir.
İkinci yaklaşım: Belirli mum dizisini kullanarak:
Basit FIBO sistemi 2:
Bu yaklaşıma göre, Fibonacci seviyelerini oluşturmak için belirli sayıda mum kullanacağız. Bunu nasıl yapacağımızı adım adım ele alalım:
#define kullanarak FIB_OBJ'yi tanımlayalım.
#define FIB_OBJ "Fibonacci Retracement"
En yüksek ve en düşük mumlar için tamsayı değişkenler oluşturalım.
int highestCandle, lowestCandle;
Yüksek ve düşük için iki dizi oluşturalım.
double high[],low[];
“ArraySetAsSeries” fonksiyonunu kullanarak dizilerdeki verileri sıralayalım. Parametreleri şunlardır:
- array[] - Sıralamanın yapılacağı dizi. (high) ve (low) kullanacağız.
- flag - Dizi indeksleme yönü. (true) ayarlayacağız.
ArraySetAsSeries(high,true); ArraySetAsSeries(low,true);
“CopyHigh” ve “CopyLow” fonksiyonlarını kullanarak en yüksek ve en düşük geçmiş verilerini elde edelim. “CopyHigh” fonksiyonunun parametreleri şunlardır:
- 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ı. (100) ayarlayacağız.
- high_array[] - Kopyalamanın yapılacağı hedef dizi. (high) dizisini kullanacağız.
“CopyLow” için parametreler aynı olacaktır, ancak (low) dizisi hedef dizi olarak oluşturulacaktır.
CopyHigh(_Symbol,_Period,0,100,high); CopyLow(_Symbol,_Period,0,100,low);
“iOpen” ve “iClose” fonksiyonlarını kullanarak dizideki ilk mumun açılış fiyatını ve son mumun kapanış fiyatını belirleyelim.
double openCandle = iOpen(_Symbol,_Period,100); double closeCandle = iClose(_Symbol,_Period,1);
“ArrayMaximum” ve “ArrayMinimum” fonksiyonlarını kullanarak oluşturulan high ve low dizilerindeki en yüksek ve en düşük değerleri belirleyelim. Fonksiyonların parametreleri şunlardır:
- array[] - Kontrolün yapılacağı dizi. En yüksek değer için (high) ve en düşük değer için (low) kullanacağız.
- start=0 - Kontrole başlanacak indeks. (0) değerini kullanacağız.
- count - Kontrol edilecek eleman sayısı. (100) kullanacağız. Ayrıca (WHOLE_ARRAY)’de kullanabilirdik.
highestCandle=ArrayMaximum(high,0,100); lowestCandle=ArrayMinimum(low,0,100);
Fiyat bilgilerini saklamak için “MqlRates” fonksiyonunu kullanarak bir fiyat dizisi oluşturalım ve “ArraySetAsSeries” fonksiyonunu kullanarak bu dizideki verileri sıralayalım.
MqlRates pArray[]; ArraySetAsSeries(pArray,true);
“CopyRates” fonksiyonunu kullanarak MqlRates'ten geçmiş verileri alalım. Parametreleri şunlardır:
- 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ı. (Bars) değişkenimizi ayarlayacağız.
- rates_array[] - Kopyalamanın yapılacağı hedef dizi. (pArray) dizisini kullanacağız.
int pData=CopyRates(_Symbol,_Period,0,Bars(_Symbol,_Period),pArray);
“ObjectGetInteger” ve “ObjectGetDouble” fonksiyonlarıyla FIBO’nun başlangıç ve bitiş zamanlarını ve sıfır ve 100 seviyesinin fiyatlarını tanımlayalım.
datetime dTlvl0 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,0); double PriceFibLvl00 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,0); datetime dTlvl1 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,1); double PriceFibLvl0 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,1);
if-else operatörünü kullanarak yükseliş ve düşüş durumu koşullarını belirleyelim.
Yükseliş durumunda (CloseCandle openCandle'dan büyüktür), sonraki adımlar aşağıdaki gibi olacaktır:
- “ObjectDelete” kullanarak önceden oluşturulmuş FIBO nesnesini siliyoruz.
- “ObjectCreate” kullanarak, dizinin en düşüğünden başlayıp en yükseğinde biten yeni bir FIBO nesnesi oluşturuyoruz.
- “ObjectSetInteger” kullanarak FIBO nesnesinin rengini yeşile güncelliyoruz ve yöne göre güncellemeye devam etmek için bir for döngüsü kullanıyoruz.
- Yüksek ve düşük arasındaki farkı alarak fiyat aralığını belirliyoruz.
- FIBO seviyelerini tanımlıyoruz: 23.6, 38.2, 50 ve 61.8.
- Dizinin ilk mumunun açılış fiyatını, dizinin son mumunun kapanış fiyatını ve FIBO seviyelerini grafik üzerinde yorum olarak görüntülüyoruz.
if(closeCandle>openCandle) { ObjectDelete(_Symbol, "Fibonacci Retracement"); ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time, pArray[lowestCandle].low,pArray[0].time,pArray[highestCandle].high); ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen); for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++) { ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen); } double pRange = PriceFibLvl0 - PriceFibLvl00; double PriceFibLvl1 = NormalizeDouble (PriceFibLvl0 - pRange * 23.6/100,_Digits); double PriceFibLvl2 = NormalizeDouble (PriceFibLvl0 - pRange * 38.2/100,_Digits); double PriceFibLvl3 = NormalizeDouble (PriceFibLvl0 - pRange * 50/100,_Digits); double PriceFibLvl4 = NormalizeDouble(PriceFibLvl0 - pRange * 61.8/100,_Digits); Comment("Array Open: ",openCandle,"\n", "Array Close: ",closeCandle,"\n", "Fib lvl 0% = ",PriceFibLvl0,"\n", "Fib lvl 23.6% = ",PriceFibLvl1,"\n", "Fib lvl 38.2% = ",PriceFibLvl2,"\n", "Fib lvl 50% = ",PriceFibLvl3,"\n", "Fib lvl 61.8% = ",PriceFibLvl4,"\n", "Fib lvl 100% = ",PriceFibLvl00); }
Düşüş durumunda (CloseCandle openCandle'dan küçüktür), adımlar aşağıdaki gibidir:
- “ObjectDelete” kullanarak önceden oluşturulmuş FIBO nesnesini siliyoruz.
- “ObjectCreate” kullanarak, dizinin en yükseğinden başlayıp en düşüğünde biten yeni bir FIBO nesnesi oluşturuyoruz.
- “ObjectSetInteger” kullanarak FIBO nesnesinin rengini kırmızıya güncelliyoruz ve yöne göre güncellemeye devam etmek için bir for döngüsü kullanıyoruz.
- Düşük ve yüksek arasındaki farkı alarak fiyat aralığını belirliyoruz.
- FIBO seviyelerini tanımlıyoruz: 23.6, 38.2, 50 ve 61.8.
- Dizinin ilk mumunun açılış fiyatını, dizinin son mumunun kapanış fiyatını ve FIBO seviyelerini grafik üzerinde yorum olarak görüntülüyoruz.
else { ObjectDelete(_Symbol, "Fibonacci Retracement"); ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time, pArray[highestCandle].high,pArray[0].time,pArray[lowestCandle].low); ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed); for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++) { ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed); } double pRange = PriceFibLvl00 - PriceFibLvl0; double PriceFibLvl1 = NormalizeDouble (PriceFibLvl0 + pRange * 23.6/100,_Digits); double PriceFibLvl2 = NormalizeDouble (PriceFibLvl0 + pRange * 38.2/100,_Digits); double PriceFibLvl3 = NormalizeDouble(PriceFibLvl0 + pRange * 50/100,_Digits); double PriceFibLvl4 = NormalizeDouble (PriceFibLvl0 + pRange * 61.8/100,_Digits); Comment("Array Open: ",openCandle,"\n", "Array Close: ",closeCandle,"\n", "Fib lvl 0% = ",PriceFibLvl0,"\n", "Fib lvl 23.6% = ",PriceFibLvl1,"\n", "Fib lvl 38.2% = ",PriceFibLvl2,"\n", "Fib lvl 50% = ",PriceFibLvl3,"\n", "Fib lvl 61.8% = ",PriceFibLvl4,"\n", "Fib lvl 100% = ",PriceFibLvl00); }
Aşağıda bu sistemin tam kodu bulunmaktadır:
//+------------------------------------------------------------------+ //| Simple Fibo System 2.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #define FIB_OBJ "Fibonacci Retracement" //+------------------------------------------------------------------+ void OnTick() { int highestCandle, lowestCandle; double high[],low[]; ArraySetAsSeries(high,true); ArraySetAsSeries(low,true); CopyHigh(_Symbol,_Period,0,100,high); CopyLow(_Symbol,_Period,0,100,low); double openCandle = iOpen(_Symbol,_Period,100); double closeCandle = iClose(_Symbol,_Period,1); highestCandle=ArrayMaximum(high,0,100); lowestCandle=ArrayMinimum(low,0,100); MqlRates pArray[]; ArraySetAsSeries(pArray,true); int pData=CopyRates(_Symbol,_Period,0,Bars(_Symbol,_Period),pArray); datetime dTlvl0 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,0); double PriceFibLvl00 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,0); datetime dTlvl1 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,1); double PriceFibLvl0 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,1); if(closeCandle>openCandle) { ObjectDelete(_Symbol, "Fibonacci Retracement"); ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time, pArray[lowestCandle].low,pArray[0].time,pArray[highestCandle].high); ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen); for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++) { ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen); } double pRange = PriceFibLvl0 - PriceFibLvl00; double PriceFibLvl1 = NormalizeDouble (PriceFibLvl0 - pRange * 23.6/100,_Digits); double PriceFibLvl2 = NormalizeDouble (PriceFibLvl0 - pRange * 38.2/100,_Digits); double PriceFibLvl3 = NormalizeDouble (PriceFibLvl0 - pRange * 50/100,_Digits); double PriceFibLvl4 = NormalizeDouble(PriceFibLvl0 - pRange * 61.8/100,_Digits); Comment("Array Open: ",openCandle,"\n", "Array Close: ",closeCandle,"\n", "Fib lvl 0% = ",PriceFibLvl0,"\n", "Fib lvl 23.6% = ",PriceFibLvl1,"\n", "Fib lvl 38.2% = ",PriceFibLvl2,"\n", "Fib lvl 50% = ",PriceFibLvl3,"\n", "Fib lvl 61.8% = ",PriceFibLvl4,"\n", "Fib lvl 100% = ",PriceFibLvl00); } else { ObjectDelete(_Symbol, "Fibonacci Retracement"); ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time, pArray[highestCandle].high,pArray[0].time,pArray[lowestCandle].low); ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed); for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++) { ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed); } double pRange = PriceFibLvl00 - PriceFibLvl0; double PriceFibLvl1 = NormalizeDouble (PriceFibLvl0 + pRange * 23.6/100,_Digits); double PriceFibLvl2 = NormalizeDouble (PriceFibLvl0 + pRange * 38.2/100,_Digits); double PriceFibLvl3 = NormalizeDouble(PriceFibLvl0 + pRange * 50/100,_Digits); double PriceFibLvl4 = NormalizeDouble (PriceFibLvl0 + pRange * 61.8/100,_Digits); Comment("Array Open: ",openCandle,"\n", "Array Close: ",closeCandle,"\n", "Fib lvl 0% = ",PriceFibLvl0,"\n", "Fib lvl 23.6% = ",PriceFibLvl1,"\n", "Fib lvl 38.2% = ",PriceFibLvl2,"\n", "Fib lvl 50% = ",PriceFibLvl3,"\n", "Fib lvl 61.8% = ",PriceFibLvl4,"\n", "Fib lvl 100% = ",PriceFibLvl00); } } //+------------------------------------------------------------------+
Kodu derleyin ve grafik üzerinde çalıştırın. Uzman Danışman sinyaller üretecektir. Aşağıda örnek sinyaller bulunmaktadır.
Yükselen dizi durumunda:
Yukarıdaki grafikte yeşil renkli Fibonacci seviyeleri çizilmiş ve grafiğin sol üst köşesinde aşağıdaki değerlere sahip bir yorum görüntülenmiştir:
- Dizinin ilk mumunun açılış fiyatı.
- Dizinin son mumunun kapanış fiyatı.
- FIBO seviyeleri: 0, 23.6, 38.2, 50, 61.8 ve 100.
Düşen dizi durumunda:
Burada da Fibonacci seviyeleri kırmızı renkte çizilmiş ve grafiğin sol üst köşesinde aşağıdaki değerleri içeren bir yorum görüntülenmiştir:
- Dizinin ilk mumunun açılış fiyatı.
- Dizinin son mumunun kapanış fiyatı.
- FIBO seviyeleri: 0, 23.6, 38.2, 50, 61.8 ve 100.
FIBO sinyalleri 2:
Şimdi, ikinci yaklaşıma dayalı olarak, belirli bir Fibonacci seviyesine göre alış ve satış sinyalleri geri döndürecek bir alım-satım sistemi oluşturalım. Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:
//+------------------------------------------------------------------+ //| Fibo Signals 2.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #define FIB_OBJ "Fibonacci Retracement" #property script_show_inputs input double fibRetracLvl = 38.2; //+------------------------------------------------------------------+ void OnTick() { int highestCandle, lowestCandle; double high[],low[]; ArraySetAsSeries(high,true); ArraySetAsSeries(low,true); CopyHigh(_Symbol,_Period,0,100,high); CopyLow(_Symbol,_Period,0,100,low); double openCandle = iOpen(_Symbol,_Period,100); double closeCandle = iClose(_Symbol,_Period,1); highestCandle=ArrayMaximum(high,0,100); lowestCandle=ArrayMinimum(low,0,100); MqlRates pArray[]; ArraySetAsSeries(pArray,true); int pData=CopyRates(_Symbol,_Period,0,Bars(_Symbol,_Period),pArray); datetime dTlvl0 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,0); double PriceFibLvl00 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,0); datetime dTlvl1 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,1); double PriceFibLvl0 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,1); if (closeCandle>openCandle) { ObjectDelete(_Symbol, "Fibonacci Retracement"); ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time, pArray[lowestCandle].low,pArray[0].time,pArray[highestCandle].high); ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen); for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++) { ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen); } double pRange = PriceFibLvl0 - PriceFibLvl00; double PriceFibLvl1 = NormalizeDouble(PriceFibLvl0 - pRange * 23.6/100,_Digits); double PriceFibLvl2 = NormalizeDouble(PriceFibLvl0 - pRange * 38.2/100,_Digits); double PriceFibLvl3 = NormalizeDouble(PriceFibLvl0 - pRange * 50/100,_Digits); double PriceFibLvl4 = NormalizeDouble(PriceFibLvl0 - pRange * 61.8/100,_Digits); double entryLvl = NormalizeDouble(PriceFibLvl0 - pRange * fibRetracLvl/100,_Digits); Comment("Array Open: ",openCandle,"\n", "Array Close: ",closeCandle,"\n", "Buy Entry Price: ",entryLvl); } else { ObjectDelete(_Symbol, "Fibonacci Retracement"); ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time, pArray[highestCandle].high,pArray[0].time,pArray[lowestCandle].low); ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed); for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++) { ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed); } double pRange = PriceFibLvl00 - PriceFibLvl0; double PriceFibLvl1 = NormalizeDouble(PriceFibLvl0 + pRange * 23.6/100,_Digits); double PriceFibLvl2 = NormalizeDouble(PriceFibLvl0 + pRange * 38.2/100,_Digits); double PriceFibLvl3 = NormalizeDouble(PriceFibLvl0 + pRange * 50/100,_Digits); double PriceFibLvl4 = NormalizeDouble(PriceFibLvl0 + pRange * 61.8/100,_Digits); double entryLvl = NormalizeDouble(PriceFibLvl0 + pRange * fibRetracLvl/100,_Digits); Comment("Array Open: ",openCandle,"\n", "Array Close: ",closeCandle,"\n", "Sell Entry Price: ",entryLvl); } } //+------------------------------------------------------------------+
Bu koddaki farklılıklar şunlardır:
Burada, ayar penceresini görüntüleyen #property script_show_inputs özelliğini ekliyoruz. Varsayılan değeri 38.2 olan double türünde fibRetracLvl adlı bir girdi değişkeni kullanıyoruz.
#property script_show_inputs input double fibRetracLvl = 38.2;
Yükseliş durumunda, kullanıcının belirlediği seviyeye dayalı olarak giriş seviyesini tanımlıyoruz.
double entryLvl = NormalizeDouble(PriceFibLvl0 - pRange * fibRetracLvl/100,_Digits);
Düşüş durumunda, kullanıcının belirlediği seviyeye dayalı olarak giriş seviyesini tanımlıyoruz.
double entryLvl = NormalizeDouble(PriceFibLvl0 + pRange * fibRetracLvl/100,_Digits);
Yükseliş durumunda, grafik üzerinde yorum görüntülüyoruz.
Comment("Array Open: ",openCandle,"\n", "Array Close: ",closeCandle,"\n", "Buy Entry Price: ",entryLvl);
Düşüş durumunda, grafik üzerinde yorum görüntülüyoruz.
Comment("Array Open: ",openCandle,"\n", "Array Close: ",closeCandle,"\n", "Sell Entry Price: ",entryLvl);
Uzman kodunu derleyip grafik üzerinde çalıştıralım. Yükseliş ve düşüş dizileri için örnekler aşağıda gösterilmiştir.
Yükselen dizi:
Yukarıdaki grafikte, düşükten yükseğe doğru çizilmiş yeşil Fibonacci seviyeleri ve aşağıdaki değerleri içeren bir yorum bulunmaktadır.
- Dizinin ilk mumunun açılış fiyatı.
- Dizinin son mumunun kapanış fiyatı.
- Alış giriş fiyatı ==> 38.2 FIBO seviyesinin bulunduğu fiyat seviyesidir.
Düşen dizi:
Bu grafikte de yüksekten düşüğe doğru çizilmiş kırmızı Fibonacci seviyeleri ve aşağıdaki değerleri içeren bir yorum bulunmaktadır.
- Dizinin ilk mumunun açılış fiyatı.
- Dizinin son mumunun kapanış fiyatı.
- Satış giriş fiyatı ==> 38.2 FIBO seviyesinin bulunduğu fiyat seviyesidir.
Sonuç
Böylece, MetaTrader 5 işlem terminalinde çalıştırmak üzere MQL5’i kullanarak Fibonacci düzeltmesine dayalı basit bir alım-satım sisteminin nasıl oluşturulacağını öğrendik. Makalenin ilk bölümünde, Fibonacci teknik aracının kendisine ayrıntılı olarak değindik ve MetaTrader 5'te nasıl kullanılacağını gördük.
Devamında, Fibonacci seviyelerini oluşturmak için biri günlük verileri kullanan ve diğeri herhangi bir zaman diliminde bir mum dizisini kullanan iki yaklaşımı inceledik. Burada ayrıca belirli bir Fibonacci seviyesine dayalı olarak alış veya satış sinyali elde etme stratejisini de gördük. Önceki tüm makalelerde olduğu gibi, alım-satım tarzınıza ve anlayışınıza uygun olduğundan emin olmak için gerçek hesabınızda uygulamadan önce tüm yeni bilgileri iyice test etmenin çok önemli olduğunu yineleyeceğim. Sonuçta, başkaları için işe yarayan şey sizin için işe yaramayabilir. Ayrıca, stratejilerin temel amacının eğitim olduğunu da unutmayın.
Umarım bu makale alım-satımınızı daha iyi hale getirmenize yardımcı olur ve size bazı yeni fikirler verir. Makaleyi beğendiyseniz ve faydalı bulduysanız, farklı popüler teknik göstergelere dayalı alım-satım sistemlerinin nasıl geliştirileceğini öğrenmek için aynı serideki önceki makalelerimi okuyabilirsiniz. Daha önce ADX, Moving Average, MACD, Bollinger Bands, Envelopes, Stochastic, RSI dahil olmak üzere çok çeşitli popüler göstergeleri inceledik. Sonraki makalelerim de tekrar görüşmek dileğiyle. Hepinize kârlı bir alım-satım diliyorum!
MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/12301





- Ücretsiz alım-satım 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