ADX göstergesine dayalı bir ticaret sistemi nasıl geliştirilir?
Giriş
Bu makalede de, teknik ticaret için başka bir araç hakkında konuşacağız. Bu araç, piyasa hareketlerini daha iyi anlamamıza ve daha verimli ticaret yapmamıza olanak sağlayan en kullanışlı araçlardan biridir. Genel olarak, teknik göstergelerin en önemli özelliklerinden biri, hesaplanma şekilleri nedeniyle fiyatların kendisinde görünmeyen şeyleri bize gösterebilmeleridir. Bu makalede inceleyeceğimiz Average Directional Index (ADX) göstergesi de böyle bir göstergedir. Ticarette nasıl yararlı olabileceğini anlamak adına bu göstergeyi ayrıntılı olarak ele alacağız. Ayrıca basit stratejilerle nasıl kullanılacağını öğreneceğiz. Çünkü bir şeyi derinlemesine öğrenerek, onun hakkında daha fazla içgörü elde edebilir ve onu daha iyi kullanabiliriz.
Bu amaçla şu konuları değerlendireceğiz:
- ADX göstergesinin tanımı
- ADX göstergesi stratejileri
- ADX göstergesine dayalı ticaret sisteminin planı
- ADX göstergesine dayalı ticaret sistemi
- Sonuç
“ADX göstergesinin tanımı” başlığı altında, Average Directional Index (ADX) göstergesinin ne olduğunu ve neyi ölçtüğünü ve onu derinlemesine anlayabilmek ve kârlı bir şekilde kullanabilmek adına manuel olarak nasıl hesaplandığını detaylı olarak tartışacağız. Devamında, “ADX göstergesi stratejileri” bölümünde, ADX göstergesiyle ticarette kullanılabilecek bazı basit stratejileri ele alacağız. Sonrasında, “ADX göstergesine dayalı ticaret sisteminin planı” adlı bölümde ise, ele aldığımız bu stratejileri bir ticaret sistemi haline getirmek amacıyla onları programlarken bize yardımcı olacak bir plan hazırlayacağız. Son olarak, “ADX göstergesine dayalı ticaret sistemi” bölümünde de, hazırladığımız bu plan çerçevesinde bir ticaret sisteminin nasıl yazılacağını öğreneceğiz.
Tüm bu konularda, MetaTrader 5 işlem platformunu ve MetaTrader 5’te yerleşik olan MetaQuotes Language Düzenleyicisini kullanacağız. MetaTrader 5'i şu linkten indirebilirsiniz: https://www.metatrader5.com/en/download
MetaTrader 5'i indirip kurduktan sonra aşağıdaki terminal penceresini göreceksiniz:
Becerilerinizi hızla geliştirmesi ve konuyu derinlemesine anlamanızı sağlaması amacıyla bu makaledeki her şeyi kendiniz uygulamanızı tavsiye ederim. Pratik yapmak, her konuda gelişmek için en önemli anahtardır. Bu nedenle, her konsepti kendiniz uygulamaya çalışmanız ve test etmeniz sizin için çok daha iyi olacaktır. Oluşturulacak programları üzerinde test etmek için bir demo hesabınızın olması da önemlidir. Henüz böyle bir hesabınız yoksa, doğrudan MetaTrader 5 platformundan bir demo hesabı açabilirsiniz: MetaTrader 5 terminali --> Dosya sekmesi --> Hesap Aç --> demo hesabını onun aracılığıyla açmak için brokerınızın adını girebilir veya MetaQuotes'u seçebilirsiniz --> İleri --> Risksiz şekilde sanal parayla ticaret yapmak için bir demo hesabı aç --> İleri --> bilgilerinizi girin, hesap gereksinimlerini belirleyin ve pencerenin aşağısındaki kutucuğu onaylayın --> İleri --> böylece, sizin için bir demo hesabı açılacak ve bilgilerini göreceksiniz --> Tamam.
Artık bu hesabı sanal parayla ticaret yapmak için kullanabilirsiniz. Hesaba giriş yapmak adına, terminalden Dosya sekmesini açın --> İşlem Hesabına Giriş Yap --> demo hesabınızın bilgilerini girin --> Tamama tıklayın.
Sorumluluk reddi: Sağlanan tüm bilgiler 'olduğu gibi' yalnızca bilgilendirme amaçlıdır, ticaret tavsiyesi değildir. Bu materyalleri herhangi bir işlem hesabında kullanırsanız, ortaya çıkabilecek tüm riskler size ait olacaktır.
Şimdi, ticaret sonuçlarımızda olumlu şekilde fark yaratabilecek yeni bir aracı öğrenmeye başlayalım.
ADX göstergesinin tanımı
Bu bölümde, teknik ticaret dünyasındaki en popüler göstergelerden biri hakkında ayrıntılı olarak konuşacağız. Ne olduğunu, neyi ölçtüğünü ve nasıl hesaplandığını göreceğiz. Tüm bunlar, ADX göstergesine dayalı stratejileri ve onlarla nasıl ticaret yapılabileceğini daha iyi anlamamıza olanak sağlayacaktır. Average Directional Index (ADX) göstergesi Welles Wilder tarafından geliştirilmiştir. Gösterge, trendi ölçer ve bir trendin varlığının veya yokluğunun onayını sağlar. Hesaplanma mantığına bakarsak, gösterge bir periyodun işlem aralığını bir önceki periyodun işlem aralığıyla karşılaştırır.
Bu karşılaştırmanın sonucu olarak, şunları elde ederiz:
- Sadece yükseliş veya düşüş (pozitif yönlü hareket veya negatif yönlü hareket) var.
- Hem yükseliş, hem de düşüş yok.
- Hem yükseliş, hem de düşüş var.
Sadece pozitif yönlü hareket varsa, bu, periyodun yüksek değerinin bir önceki periyodun yüksek değerini aştığı anlamına gelir ve sadece +DM var olarak ifade edilir.
Aşağıdaki görüntü, bu fiyat hareketinin grafikte nasıl görünebileceğini göstermektedir:
Tersi durumda ise, sadece negatif yönlü hareket varsa, bu, periyodun düşük değerinin bir önceki periyodun düşük değerini aştığı anlamına gelir ve sadece -DM var olarak ifade edilir.
Aşağıdaki görüntü, bu fiyat hareketinin grafikte nasıl görünebileceğini göstermektedir:
Hem pozitif yönlü hem de negatif yönlü hareket yoksa, bu, periyodun yüksek ve düşük değerlerinin bir önceki periyodun yüksek ve düşük değerlerini aşmadığı anlamına gelir ve hem +DM, hem de -DM yok olarak ifade edilir.
Aşağıdaki görüntü, bu fiyat hareketinin grafikte nasıl görünebileceğini göstermektedir:
Hem pozitif yönlü hem de negatif yönlü hareket varsa, bu, periyodun yüksek ve düşük değerlerinin bir önceki periyodun yüksek ve düşük değerlerini aştığı anlamına gelir ve hem +DM, hem de -DM var olarak ifade edilir.
Aşağıdaki görüntü, bu fiyat hareketinin grafikte nasıl görünebileceğini göstermektedir:
Şimdi göstergenin nasıl hesaplandığına bakalım. Tüm değerlerin mutlak olması gerektiğini unutmayın. Hesaplama (ADX) adımları aşağıda verilmiştir:
1- +DM ve -DM'i hesapla:Bu adımda, periyodun bir önceki periyoda göre yukarı veya aşağı yönlü hareket yapıp yapmadığını belirlememiz gerekiyor. Yani, iki şeyi hesaplayacağız:
- +DM, pozitif yönlü hareketi ifade eder.
Şu şekilde hesaplanır: +DM = mevcut yüksek - önceki yüksek
- -DM, negatif yönlü hareketi ifade eder.
Şu şekilde hesaplanır: -DM = mevcut düşük - önceki düşük
Böylece, hesaplanacak her periyodu kontrol edeceğiz ve sadece +DM, sadece -DM veya diğer durumların olup olmadığına karar vereceğiz.
- Sadece +DM varsa, +DM değeri dikkate alınır:
+DM=n
-DM=0
- Sadece -DM varsa, -DM değeri dikkate alınır:
+DM=0
-DM=n
Bazı durumlarda, hem +DM, hem de -DM mevcut olmayabilir veya hem +DM hem de -DM mevcut olabilir. Bu gibi durumlara aşağıdaki şekillerde müdahale ederiz:
- Hem +DM, hem de -DM yoksa, 0 değeri dikkate alınır:
+DM=0
-DM=0
- Hem +DM, hem de -DM varsa, iki değeri karşılaştırırız ve büyük olanı dikkate alırız, eğer eşitlerse ikisini de yok sayarız:
+DM>-DM ise +DM değeri dikkate alınır:
2- Gerçek aralığı (True Range, TR) hesapla:+DM<-DM ise -DM değeri dikkate alınır:
+DM=-DM ise ikisi de yok sayılır ve 0 değeri dikkate alınır:
DM'i hesapladıktan sonra, bu adımda, hesaplanan her periyodun TR değerini hesaplayacağız. Bu değer aşağıdakilerin en büyük olanı olacaktır:
- Mevcut yüksek ve düşük arasındaki fark.
- Mevcut yüksek ve önceki kapanış arasındaki fark.
- Mevcut düşük ve önceki kapanış arasındaki fark.
İlk 14 periyot için +DM,-DM ve TR toplamlarını hesapladıktan sonra, 14'ten sonraki günümüze olan periyotlar için her 14 periyotluk toplamları hesaplamak adına aşağıdaki formülleri kullanacağız (her 14 periyotluk toplamlar: +DM14, -DM14 ve TR14 olarak ifade edilecek):
4- 14’üncü periyot ve devamındakiler için +DI ve -DI’ları hesapla (+DI ve -DI’ları hesaplayabilmek için 14’üncü periyottan başlıyoruz, çünkü +DI ve -DI’ları hesaplayabilmemiz adına +DM14, -DM14 ve TR14’ler gereklidir):15’inci periyot ve devamındakiler için her +DM14 toplamı = (önceki +DM14 - ((önceki +DM14)/14)) + mevcut +DM
15’inci periyot ve devamındakiler için her -DM14 toplamı = (önceki -DM14 - ((önceki -DM14)/14)) + mevcut -DM
15’inci periyot ve devamındakiler için her TR14 toplamı = (önceki TR14 - (önceki TR14)/14)) + mevcut TR
+DI = 100*(+DM14/TR14)
-DI = 100*(-DM14/TR14)
5- +DI ve -DI’ların farklarını hesapla:
DI farkı = (+DI) - (-DI)
6- +DI ve -DI’ların toplamlarını hesapla:
DI toplamı = (+DI) + (-DI)
7- DX’leri hesapla:
DX = 100*((DI farkı)/(DI toplamı))8- ADX'i hesapla (ADX’in hesaplanabilmesi adına 14 periyot boyunca DX’ler gereklidir):
ADX = 14 DX’in ortalaması
Bunlar ADX göstergesinin hesaplama adımlarıydı. Şimdi örnek olarak belirli bir veri kümesini kullanarak ADX göstergesinin nasıl hesaplanacağını görelim. Varsayalım ki aşağıdaki verilere sahibiz:
Gün | Yüksek | Düşük | Kapanış |
---|---|---|---|
1 | 110 | 90 | 100 |
2 | 140 | 120 | 130 |
3 | 160 | 120 | 140 |
4 | 150 | 110 | 130 |
5 | 140 | 100 | 130 |
6 | 150 | 130 | 140 |
7 | 170 | 150 | 160 |
8 | 180 | 160 | 170 |
9 | 170 | 150 | 155 |
10 | 170 | 130 | 140 |
11 | 180 | 155 | 160 |
12 | 190 | 175 | 180 |
13 | 220 | 190 | 190 |
14 | 230 | 200 | 200 |
15 | 215 | 205 | 210 |
16 | 200 | 190 | 200 |
17 | 195 | 180 | 190 |
18 | 195 | 180 | 185 |
19 | 210 | 185 | 195 |
20 | 220 | 190 | 200 |
21 | 233 | 195 | 208 |
22 | 246 | 200 | 216 |
23 | 258 | 205 | 223 |
24 | 271 | 210 | 231 |
25 | 283 | 215 | 238 |
26 | 296 | 220 | 246 |
27 | 308 | 225 | 253 |
28 | 321 | 230 | 261 |
29 | 333 | 235 | 268 |
30 | 346 | 240 | 276 |
Hadi bu verileri kullanarak ADX'i hesaplayalım:
1- +DM ve -DM'i hesapla:
+DM = mevcut yüksek - önceki yüksek
-DM = mevcut düşük - önceki düşük
2- TR'ı hesapla:
Aşağıdakilerden en büyüğü TR olacaktır:
- Mevcut yüksek ve düşük arasındaki fark.
- Mevcut yüksek ve önceki kapanış arasındaki fark.
- Mevcut düşük ve önceki kapanış arasındaki fark.
Aşağıdaki tablo her gün için hesaplanan TR'ı göstermektedir:
3- Hesaplanan ilk 14 periyodun değerlerinin (+DM, -DM ve TR) toplamını hesapla:
+DM14 = +DM’lerin toplamı (2. günden 15. güne kadar)
-DM14 = -DM’lerin toplamı (2. günden 15. güne kadar)
TR14 = TR’ların toplamı (2. günden 15. güne kadar)
4- +DI ve -DI’ları hesapla (+DI ve -DI’ları hesaplayabilmek için +DM14, -DM14 ve TR14’ler gerektiğinden onları hesaplayabilmemiz adına tabloda 15. günden başlıyoruz):
+DI = 100*(+DM14/TR14)
-DI = 100*(-DM14/TR14)
5- +DI ve -DI’ların farklarını hesapla:
DI farkı = (+DI) - (-DI)
6- +DI ve -DI’ların toplamlarını hesapla:
DI toplamı = (+DI) + (-DI)
7- DX’leri hesapla:
DX = 100*((DI farkı)/(DI toplamı))
8- ADX'i hesapla (ADX'i hesaplamak adına 14 DX’e ihtiyacımız olduğu için ADX’in ilk hesaplaması 28. gün olacaktır):
ADX = 14 DX’in ortalaması (15. günden 28. güne kadar)
ADX göstergesini manuel olarak hesapladık. Ancak, gösterge MetaTrader 5'te yerleşik olduğundan, bu hesaplamaları yapmamız gerekmez. Sadece ADX göstergesini ve nasıl çalıştığını daha iyi anlamak için tüm bu adımları inceledik. Gösterge değerlerini grafikte görmek için, tek yapmamız gereken işlem terminalindeki göstergeler listesinden ADX göstergesini seçmektir (Ekle sekmesi --> Göstergeler --> Trend --> Average Directional Movement Index). Bunu nasıl yapabileceğinizi göstermek adına:
Average Directional Movement Index’i seçtikten sonra aşağıdaki pencere açılacaktır:
Bu pencere ADX göstergelerinin parametreleri içindir. Yukarıda İşaret edilenler şu anlamlara gelir:
- ADX’in periyodu
- ADX çizgisinin rengi
- ADX çizgisinin türü
- ADX çizgisinin kalınlığı
- +DI çizgisinin rengi
- +DI çizgisinin türü
- +DI çizgisinin kalınlığı
- -DI çizgisinin rengi
- -DI çizgisinin türü
- -DI çizgisinin kalınlığı
Gösterge parametrelerini belirleyin ve Tamama tıklayın. Gösterge grafikte şu şekilde görüntülenecektir:
ADX göstergesi stratejileri
Bu bölümde ADX göstergesiyle kullanılabilecek basit stratejileri ele alacağız. Şunu belirtmek isterim ki burada ADX göstergesi için sadece bazı basit stratejileri konu alıyoruz. Bu gösterge için çok basitten çok karmaşığa kadar birçok strateji mevcuttur. Ancak, bu makalede göstergenin ana fikrini anlamak ve ona dayalı bir ticaret sisteminin nasıl geliştirileceğini öğrenmek için bu basit stratejilerle çalışacağız.
ADX göstergesi, hesaplanma mantığına göre, trendin tipinden (yükseliş veya düşüş) bağımsız olarak bir trendin mevcut olup olmadığını gösterir. ADX eğrisi yukarı doğru hareket ediyorsa bir trend var demektir ve tersi şekilde ADX eğrisi aşağı doğru hareket ediyorsa bir trend yok demektir. Ama her şeyden önce, trendi tanımlamamız gerekiyor:
Trendin tanımı:
Piyasada fiyat hareketleri çok önemlidir, çünkü trendin tipini belirlemenize olanak sağlar. Önceki makalelerde de bahsettiğimiz üzere, üç tür piyasa yönü vardır (yükseliş trendi, düşüş trendi ve yatay hareket).
Yükseliş trendi: Yükseliş trendi, fiyatların daha yüksek pikler ve daha yüksek çukurlar oluşturduğu ve piyasanın alıcıların kontrolünde olduğu piyasa yönüdür.
Bu piyasa yönünün oluşumu aşağıdaki görüntüde gösterilmektedir:
Aşağıdaki görüntü de yükseliş trendi için piyasadan bir örneği göstermektedir:
Düşüş trendi: Düşüş trendi, fiyatların daha düşük dipler ve daha düşük çukurlar oluşturduğu ve piyasanın satıcıların kontrolünde olduğu piyasa yönüdür.
Bu piyasa yönünün oluşumu aşağıdaki görüntüde gösterilmektedir:
Aşağıdaki görüntü de düşüş trendi için piyasadan bir örneği göstermektedir:
Yatay hareket: Net bir yönün olmadığı, alıcılar ve satıcılar arasında dengenin olduğu yükseliş veya düşüş trendi dışındaki herhangi bir fiyat hareketidir.
Aşağıdakiler bu piyasa yönünün bazı oluşumlarıdır:
Aşağıdaki görüntü de yatay hareket için piyasadan bir örneği göstermektedir:
Trendi tanımladık, şimdi ise ADX göstergesiyle kullanılabilecek basit stratejilere devam edelim.
- Birinci strateji: ADX hareketi:
Strateji, ADX eğrisinin hareketine dayanmaktadır,
Mevcut ADX değeri > Önceki ADX değeri = ADX yükseliyor.
Mevcut ADX değeri < Önceki ADX değeri = ADX düşüyor.
- İkinci strateji: Yükseliş trendi:
Bu stratejiye göre, yükseliş trendi sırasında,
(Mevcut ADX değeri > 25) ve (Mevcut ADX değeri > Önceki ADX değeri) ise (+DI değeri > -DI değeri) olduğunda = Alış.
- İkinci strateji: Düşüş trendi:
Bu stratejiye göre, düşüş trendi sırasında,
(Mevcut ADX değeri > 25) ve (Mevcut ADX değeri > Önceki ADX değeri) ise (+DI değeri < -DI değeri) olduğunda = Satış.
ADX göstergesine dayalı ticaret sisteminin planı
Bu bölümde, ticaret sistemini oluşturmamıza yardımcı olacak bir plan tasarlayacağız. Bu plan, gelecekteki programdan ne istediğimizi, ne yapması gerektiğini adım adım net bir şekilde tanımlayacak ve böylece bize kolaylık sağlayacaktır.
- Birinci strateji: ADX hareketi:
Bu stratejiye göre, program her tikte mevcut ve önceki ADX değerini kontrol etmelidir. Mevcut ADX değerinin önceki ADX değerinden büyük olup olmadığını belirlemelidir. Eğer mevcut ADX değeri önceki ADX değerinden büyükse, program grafik üzerinde şu 3 satırı yorum olarak göstermelidir: en üst satırda "ADX is rising", bir alt satırda "ADX Value is (n)" ve en alt satırda da "ADX Value last is (n)". Eğer mevcut ADX değeri önceki ADX değerinden küçükse, program grafik üzerinde bu kez şu 3 satırı yorum olarak göstermelidir: en üst satırda "ADX is falling", bir alt satırda "ADX Value is (n)" ve en alt satırda da "ADX Value last is (n)". Eğer mevcut ADX değeri önceki ADX değerine eşitse, program hiçbir şey yapmamalıdır.
Aşağıdaki görüntü bu stratejinin planını göstermektedir:
- İkinci strateji: Yükseliş trendi:
Bu stratejiye göre, program her tikte mevcut ADX değerini, önceki ADX değerini, +DI değerini ve -DI değerini kontrol etmelidir. Ardından, mevcut ADX değerinin 25’ten ve önceki ADX değerinden büyük olup olmadığını belirlemelidir. Bu iki değerden de büyük değilse program hiçbir şey yapmamalıdır. Eğer mevcut ADX değeri her iki değerden de büyükse, program +DI ve -DI değerlerini kontrol etmelidir: +DI, -DI'dan büyük olduğunda, program grafikte alış sinyaline ek olarak toplam 5 satır halinde şu yorumları göstermelidir, "ADX Value is (n)", “ADX Value last is (n)”, “+DI Value is (n)” ve “-DI Value is (n)”; eğer +DI, -DI'dan büyük değilse, program hiçbir şey yapmamalıdır.
Aşağıdaki görüntü bu stratejinin planını göstermektedir:
- İkinci strateji: Düşüş trendi:
Bu stratejiye göre, program her tikte mevcut ADX değerini, önceki ADX değerini, +DI değerini ve -DI değerini kontrol etmelidir. Ardından, mevcut ADX değerinin 25’ten ve bir önceki ADX değerinden büyük olup olmadığını belirlemelidir. Bu iki değerden de büyük değilse program hiçbir şey yapmamalıdır. Eğer mevcut ADX değeri her iki değerden de büyükse, program +DI ve -DI değerlerini kontrol etmelidir: -DI, +DI'dan büyük olduğunda, program grafikte satış sinyaline ek olarak toplam 5 satır halinde şu yorumları göstermelidir, "ADX Value is (n)", “ADX Value last is (n)”, “+DI Value is (n)” ve “-DI Value is (n)”; eğer -DI, +DI'dan büyük değilse, program hiçbir şey yapmamalıdır.
Aşağıdaki görüntü bu stratejinin planını göstermektedir:
ADX göstergesine dayalı ticaret sistemi
Bu bölümde, MetaTrader 5 ticaret terminalinde kullanmak adına ele aldığımız basit stratejilere dayalı bir ticaret sisteminin nasıl oluşturulacağını öğreneceğiz. Ticaret sisteminin kodunu yazmak için yerleşik MetaQuotes Language Düzenleyicisini (MQL5) kullanacağız. Düzenleyiciyi açmak için MetaTrader 5 ticaret terminali açıkken F4 tuşuna basabilir veya terminalin Araçlar sekmesinden MetaQuotes Language Düzenleyicisini seçebilirsiniz.
Bunu nasıl yapılabileceği aşağıda gösterilmektedir.
Veya araç çubuğundaki IDE düğmesine de basabilirsiniz:
Böylece MetaQuotes Language Düzenleyicisi penceresi açılacaktır:
Ardından Yeniye tıklayarak ticaret sistemimizi oluşturmak için yeni bir dosya açacağız:
Sonrasında şu pencere açılacaktır:
Yeni dosyanın türü için seçenekler şunlardır:
- Uzman Danışman: Terminalde çalışan ve ticaret süreçlerini önceden belirlenmiş koşullara göre otomatikleştirmeye olanak sağlayan bir program türüdür.
- Özel gösterge: Ticaret kararlarını iyileştirmek için grafiği okumaya yardımcı olan bir program türüdür.
- Komut dosyası: Yürütüldükten sonra bir görevi bir kez gerçekleştirebilen bir program türüdür.
Biz ticaret sistemimizi oluşturmak adına Uzman Danışman dosyası oluşturmayı seçeceğiz.
Öncelikle mevcut ADX değerini grafik üzerinde yorum olarak gösterecek bir program oluşturalım. Adım adım nasıl yapılacağını görelim:
- Bir fiyat dizisi oluşturuyoruz, burada değerleri kesirli olarak sunan double fonksiyonunu kullanacağız:
double PriceArray[];
- Bu oluşturulan fiyat dizisini mevcut veriden sıralamamız gerekiyor, bunun için ArraySetAsSeries fonksiyonunu kullanacağız; fonksiyon başarılı olursa true, başarısız olursa da false geri döndürecektir (bool). Gerekli parametreleri şunlardır:
Referansa göre array[] ve bayrak.
ArraySetAsSeries(PriceArray,true);
- ADX göstergesini tanımlamak için iADX fonksiyonunu kullanacağız, bu fonksiyon ADX göstergesinin tanıtıcı değerini geri döndürür. Parametreleri ise şunlardır:
Dizge olarak sembol, zaman dilimi ve ADX periyodu:
- _Symbol: Mevcut sembol için.
- _Period: Mevcut zaman dilimi için.
- 14: ADX periyodu için.
int ADXDef = iADX(_Symbol,_Period,14);
- Oluşturulan ADX göstergesine göre verileri dolduracağız. Bu amaçla, kopyalanan veri sayısını veya bir hata durumunda -1 değerini geri döndüren CopyBuffer fonksiyonunu kullanacağız. Parametreleri:
Gösterge tanıtıcı değeri, buffer_num (gösterge arabelleği numarası), start_time (başlangıç tarihi ve saati), stop_time (bitiş tarihi ve saati) ve buffer[] (hedef dizi).
CopyBuffer(ADXDef,0,0,3,PriceArray);
- double fonksiyonunu kullanarak ADXValue için bir değişken oluşturduktan sonra ADX değerini alıyoruz. Ardından NormalizeDouble fonksiyonunu kullanıyoruz, bu fonksiyon belirli hassasiyetle double tipi değer geri döndürür. Parametreleri şunlardır:
double olarak değer (normalleştirilmiş sayı) ve int olarak rakam (ondalık basamak sayısı).
double ADXValue=NormalizeDouble(PriceArray[0],2);
- Mevcut ADX değerini grafik üzerinde yorum olarak görüntülemek amacıyla comment fonksiyonunu kullanacağız. Fonksiyonun parametreleri:
Değerleri temsil eden değişkenleri virgülle ayırarak giriyoruz. Bilgileri yeni satırda görüntülemek için de \n satır sonu karakterini kullanacağız.
Comment("ADX Value is ", ADXValue);
Bu programın tam kodu aşağıda gösterilmektedir:
//+------------------------------------------------------------------+ //| Simple ADX 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() { //creating an array for prices double PriceArray[]; //sort price array from current data ArraySetAsSeries(PriceArray,true); //identify ADX int ADXDef = iADX(_Symbol,_Period,14); //Filling data according to created ADX CopyBuffer(ADXDef,0,0,3,PriceArray); //Getting value of current data double ADXValue=NormalizeDouble(PriceArray[0],2); //Comment with ADX value Comment("ADX Value is ", ADXValue); } //+------------------------------------------------------------------+
Programı editörde derledikten sonra program işlem terminalinin Kılavuz penceresinde görünecektir:
Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:
"Algoritmik ticarete izin ver" seçeneğini etkinleştirip Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:
Böylece, gösterge mevcut ADX değerini grafik üzerinde yorum olarak gösterecektir:
Mevcut ADX değerini görüntüleyen bir program oluşturduk. Şimdi ise ADX göstergesinin diğer değerlerini (+DI ve -DI) gösterecek bir program oluşturalım. Böylece, ticaret sistemimizi oluşturma yolunda ilerlemiş olacağız. Nasıl yazılacağını görelim:
- Her bir değer (ADX, +DI ve -DI) için bir fiyat dizisi oluşturalım ve ayrıca double fonksiyonunu kullanarak onlar için değişkenler oluşturalım:
- ADXArray: ADX değeri için
- PDIArray: +DI değeri için
- NDIArray: -DI değeri için
double ADXArray[]; double PDIArray[]; double NDIArray[];
- ArraySetAsSeries fonksiyonunu kullanarak mevcut veriden her fiyat dizisini sıralayalım:
ArraySetAsSeries(ADXArray,true); ArraySetAsSeries(PDIArray,true); ArraySetAsSeries(NDIArray,true);
- iADX fonksiyonunu kullanarak ADX göstergesini tanımlayalım:
int ADXDef = iADX(_Symbol,_Period,14);
- CopyBuffer fonksiyonunu kullanarak verileri tanımlanan ADX göstergesine göre dolduralım:
CopyBuffer(ADXDef,0,0,3,ADXArray); CopyBuffer(ADXDef,1,0,3,PDIArray); CopyBuffer(ADXDef,2,0,3,NDIArray);
- double fonksiyonunu kullanarak her bir değer için değişkenler oluşturduktan sonra mevcut verilerin değerlerini alalım. Bunu yapmak için NormalizeDouble fonksiyonunu kullanıyoruz:
double ADXValue=NormalizeDouble(ADXArray[0],2); double PDIValue=NormalizeDouble(PDIArray[0],2); double NDIValue=NormalizeDouble(NDIArray[0],2);
- comment fonksiyonunu kullanarak tüm gösterge değerlerini grafik üzerinde yorum olarak görüntülüyoruz:
Comment("ADX Value is ", ADXValue,"\n""+DI Value is ", PDIValue,"\n""-DI Value is ", NDIValue);
Bu Uzman Danışmanın tam kodu aşağıdadır:
//+------------------------------------------------------------------+ //| Simple ADX System - 3 lines.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() { //creating an array for prices double ADXArray[]; double PDIArray[]; double NDIArray[]; //sort price array from current data ArraySetAsSeries(ADXArray,true); ArraySetAsSeries(PDIArray,true); ArraySetAsSeries(NDIArray,true); //identify ADX int ADXDef = iADX(_Symbol,_Period,14); //Filling data according to created ADX CopyBuffer(ADXDef,0,0,3,ADXArray); CopyBuffer(ADXDef,1,0,3,PDIArray); CopyBuffer(ADXDef,2,0,3,NDIArray); //Getting value of current data double ADXValue=NormalizeDouble(ADXArray[0],2); double PDIValue=NormalizeDouble(PDIArray[0],2); double NDIValue=NormalizeDouble(NDIArray[0],2); //Comment with ADX value Comment("ADX Value is ", ADXValue,"\n""+DI Value is ", PDIValue,"\n""-DI Value is ", NDIValue); } //+------------------------------------------------------------------+
Programı yazdıktan sonra dosyasını Kılavuz penceresinden bulabiliriz:
Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:
"Algoritmik ticarete izin ver" seçeneğini etkinleştirip Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:
Böylece, gösterge mevcut ADX, +DI ve -DI değerlerini grafik üzerinde yorum olarak gösterecektir:
Şimdi ele aldığımız stratejiler (ADX hareketi, yükseliş ve düşüş trendi) için ticaret sistemimizi oluşturacağız.
- Birinci strateji: ADX hareketi:
Mevcut ADX değeri > Önceki ADX değeri = ADX yükseliyor.
Mevcut ADX değeri < Önceki ADX değeri = ADX düşüyor.
Bunu yapabilen programın kodunu aşağıdaki şekilde yazarız:
- ADX değerleri için fiyat dizisi oluşturacağız (mevcut, önceki):
- ADXArray0: mevcut ADX değeri için.
- ADXArray1: önceki ADX değeri için.
double ADXArray0[]; double ADXArray1[];
- Fiyat dizisini mevcut veriden sıralayacağız:
ArraySetAsSeries(ADXArray0,true); ArraySetAsSeries(ADXArray1,true);
- ADX'i tanımlayacağız:
int ADXDef = iADX(_Symbol,_Period,14);
- ADX'e göre verileri dolduracağız:
CopyBuffer(ADXDef,0,0,3,ADXArray0); CopyBuffer(ADXDef,0,0,2,ADXArray1);
- Onlar için değişkenler oluşturduktan sonra değerlerini alacağız:
double ADXValue=NormalizeDouble(ADXArray0[0],2); double ADXValuelast=NormalizeDouble(ADXArray1[1],2);
- Stratejisi koşullarını ADX değerine göre ayarlayacağız:
if (ADXValue>ADXValuelast) { Comment("ADX is rising","\n""ADX Value is ", ADXValue,"\n""ADX Value last is ", ADXValuelast); } if (ADXValue<ADXValuelast) { Comment("ADX is falling","\n""ADX Value is ", ADXValue,"\n""ADX Value last is ", ADXValuelast); }
Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:
//+------------------------------------------------------------------+ //| Simple ADX System - ADX Movement.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() { //creating an array for prices double ADXArray0[]; double ADXArray1[]; //sort price array from current data ArraySetAsSeries(ADXArray0,true); ArraySetAsSeries(ADXArray1,true); //identify ADX int ADXDef = iADX(_Symbol,_Period,14); //Filling data according to created ADX CopyBuffer(ADXDef,0,0,3,ADXArray0); CopyBuffer(ADXDef,0,0,2,ADXArray1); //Getting value of current data double ADXValue=NormalizeDouble(ADXArray0[0],2); double ADXValuelast=NormalizeDouble(ADXArray1[1],2); //ADX movement signal if (ADXValue>ADXValuelast) { Comment("ADX is rising","\n""ADX Value is ", ADXValue,"\n""ADX Value last is ", ADXValuelast); } if (ADXValue<ADXValuelast) { Comment("ADX is falling","\n""ADX Value is ", ADXValue,"\n""ADX Value last is ", ADXValuelast); } } //+------------------------------------------------------------------+
Uzman Danışmanı oluşturduktan sonra onu Kılavuz penceresinden bulabiliriz:
Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:
"Algoritmik ticarete izin ver" seçeneğini etkinleştirip Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:
Devamında program onun için belirlediğimiz koşullara uygun olarak çalışacaktır:
- ADX yükselirken Uzman Danışman değerlerinin yorum olarak nasıl görüntülendiğini aşağıdaki görüntüden görebilirsiniz:
- ADX düşerken Uzman Danışman değerlerinin yorum olarak nasıl görüntülendiğini de aşağıdaki görüntüden görebilirsiniz:
- İkinci strateji: Yükseliş trendi:
(Mevcut ADX değeri > 25) ve (Mevcut ADX değeri > Önceki ADX değeri) ise (+DI değeri > -DI değeri) olduğunda = Alış.
Aşağıda, bu stratejiyi yürütmek için bir Uzman Danışmanın nasıl oluşturulacağı anlatılmaktadır:
- Boş bir atama ile bir sinyal değişkeni oluşturuyoruz. Değişkenin değeri kodda sonradan hesaplanacaktır. Burada string fonksiyonunu kullanıyoruz:
string signal="";
- Mevcut ADX değeri, önceki ADX değeri, +DI değeri ve -DI değeri için diziler oluşturuyoruz:
- ADXArray0: mevcut ADX değeri için
- ADXArray1: önceki ADX değeri için
- PDIArray: +DI değeri için
- NDIArray: -DI değeri için
double ADXArray0[]; double ADXArray1[]; double PDIArray[]; double NDIArray[];
- Fiyat dizisini mevcut veriden sıralıyoruz:
ArraySetAsSeries(ADXArray0,true); ArraySetAsSeries(ADXArray1,true); ArraySetAsSeries(PDIArray,true); ArraySetAsSeries(NDIArray,true);
- ADX göstergesini tanımlıyoruz:
int ADXDef = iADX(_Symbol,_Period,14);
- Oluşturulan ADX'e göre verileri dolduruyoruz:
CopyBuffer(ADXDef,0,0,3,ADXArray0); CopyBuffer(ADXDef,0,0,2,ADXArray1); CopyBuffer(ADXDef,1,0,3,PDIArray); CopyBuffer(ADXDef,2,0,3,NDIArray);
- Mevcut verilerin değerlerini alıyoruz:
double ADXValue=NormalizeDouble(ADXArray0[0],2); double ADXValueLast=NormalizeDouble(ADXArray1[1],2); double PDIValue=NormalizeDouble(PDIArray[0],2); double NDIValue=NormalizeDouble(NDIArray[0],2);
- Yükseliş stratejisinin koşullarını belirliyoruz:
if (ADXValue>25&&ADXValue>ADXValueLast) if(PDIValue>NDIValue) { signal = "BUY"; }
- Her biri yeni satırda olacak şekilde alış sinyalini ve değerleri grafikte yorum olarak görüntülüyoruz:
Comment("Simple ADX System - Signal is ",signal,"\n""ADX Value is ", ADXValue, "\n""ADX Value Last is ", ADXValueLast, "\n""+DI Value is ", PDIValue, "\n""-DI Value is ", NDIValue);
Bu stratejiye dayalı Uzman Danışmanın tam kodu aşağıda gösterilmektedir:
//+------------------------------------------------------------------+ //| Simple ADX System - Uptrend - Buy Signal.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() { // creating a variable for signal string signal=""; //creating an array for prices double ADXArray0[]; double ADXArray1[]; double PDIArray[]; double NDIArray[]; //identify ADX, positive DI, negative DI int ADXDef = iADX(_Symbol,_Period,14); //sort price array from current data ArraySetAsSeries(ADXArray0,true); ArraySetAsSeries(ADXArray1,true); ArraySetAsSeries(PDIArray,true); ArraySetAsSeries(NDIArray,true); //Filling data according to created ADX CopyBuffer(ADXDef,0,0,3,ADXArray0); CopyBuffer(ADXDef,0,0,2,ADXArray1); CopyBuffer(ADXDef,1,0,3,PDIArray); CopyBuffer(ADXDef,2,0,3,NDIArray); //Getting value of current data double ADXValue=NormalizeDouble(ADXArray0[0],2); double ADXValueLast=NormalizeDouble(ADXArray1[1],2); double PDIValue=NormalizeDouble(PDIArray[0],2); double NDIValue=NormalizeDouble(NDIArray[0],2); //Comment with Buy signal according to Buy Strategy if (ADXValue>25&&ADXValue>ADXValueLast) if(PDIValue>NDIValue) { signal = "BUY"; } Comment("Simple ADX System - Signal is ",signal,"\n""ADX Value is ", ADXValue, "\n""ADX Value Last is ", ADXValueLast, "\n""+DI Value is ", PDIValue, "\n""-DI Value is ", NDIValue); } //+------------------------------------------------------------------+
Uzman Danışmanı oluşturduktan sonra onu Kılavuz penceresinden bulabiliriz:
Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:
"Algoritmik ticarete izin ver" seçeneğini etkinleştirip Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:
Sonrasında, stratejiye göre uygun olarak sinyali ve mevcut gösterge değerlerini grafik üzerinde görebiliriz:
- Alış sinyali.
- Mevcut ADX değerine sahip yeni satır.
- Önceki ADX değerine sahip yeni satır.
- +DI değerine sahip yeni satır.
- -DI değerine sahip yeni satır.
- İkinci strateji: Düşüş trendi:
(Mevcut ADX değeri > 25) ve (Mevcut ADX değeri > Önceki ADX değeri) ise (+DI değeri < -DI değeri) olduğunda = Satış.
Bu strateji için ticaret sistemi kodu aşağıdaki gibi olacaktır:
//+------------------------------------------------------------------+ //| Simple ADX System - Downtrend - Sell 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() { // creating a variable for signal string signal=""; //creating an array for prices double ADXArray0[]; double ADXArray1[]; double PDIArray[]; double NDIArray[]; //identify ADX, positive DI, negative DI int ADXDef = iADX(_Symbol,_Period,14); //sort price array from current data ArraySetAsSeries(ADXArray0,true); ArraySetAsSeries(ADXArray1,true); ArraySetAsSeries(PDIArray,true); ArraySetAsSeries(NDIArray,true); //Filling data according to created ADX CopyBuffer(ADXDef,0,0,3,ADXArray0); CopyBuffer(ADXDef,0,0,2,ADXArray1); CopyBuffer(ADXDef,1,0,3,PDIArray); CopyBuffer(ADXDef,2,0,3,NDIArray); //Getting value of current data double ADXValue=NormalizeDouble(ADXArray0[0],2); double ADXValueLast=NormalizeDouble(ADXArray1[1],2); double PDIValue=NormalizeDouble(PDIArray[0],2); double NDIValue=NormalizeDouble(NDIArray[0],2); //Comment with Buy signal according to Buy Strategy if (ADXValue>25&&ADXValue>ADXValueLast) if(PDIValue<NDIValue) { signal = "SELL"; } Comment("Simple ADX System - Signal is ",signal,"\n""ADX Value is ", ADXValue, "\n""ADX Value Last is ", ADXValueLast, "\n""+DI Value is ", PDIValue, "\n""-DI Value is ", NDIValue); } //+------------------------------------------------------------------+
Aşağıdaki farklılıklarla birlikte yükseliş stratejisinin aynı adımlarıdır:
- Düşüş trendi stratejisinin koşulları:
if (ADXValue>25&&ADXValue>ADXValueLast) if(PDIValue<NDIValue) { signal = "SELL"; }
- Yorumlar:
Comment("Simple ADX System - Signal is ",signal,"\n""ADX Value is ", ADXValue, "\n""ADX Value Last is ", ADXValueLast, "\n""+DI Value is ", PDIValue, "\n""-DI Value is ", NDIValue);
Uzman Danışmanı oluşturduktan sonra onu Kılavuz penceresinden bulabiliriz:
Programa çift tıklayarak veya onu grafiğe sürükleyerek başlatıyoruz. Devamında, aşağıdaki pencere açılacaktır:
"Algoritmik ticarete izin ver" seçeneğini etkinleştirip Tamama tıkladıktan sonra, program aşağıdaki gibi grafiğe eklenecektir:
Sonrasında, stratejiye göre uygun olarak sinyali ve mevcut gösterge değerlerini grafik üzerinde görebiliriz:
- Satış sinyali.
- Mevcut ADX değerine sahip yeni satır.
- Önceki ADX değerine sahip yeni satır.
- +DI değerine sahip yeni satır.
- -DI değerine sahip yeni satır.
Aşağıdaki görüntü, oluşturduğumuz Uzman Danışmandan bir sinyal örneğini göstermektedir:
Sonuç
Umarım bu makale sizin için birçok yararlı bilgi sağlamıştır. Bugün en popüler ve kullanışlı göstergelerden biri olan Average Directional Index (ADX) göstergesini inceledik ve onu kullanarak bir ticaret sisteminin nasıl geliştirileceği hakkında ayrıntılı olarak konuştuk. Makalemizde ilk olarak ADX göstergesinin ne olduğundan, neyi ölçtüğünden ve nasıl hesaplandığından bahsettik. Devamında, yükseliş ve düşüş trendi sırasında ADX göstergesine dayalı kullanılabilecek bazı basit stratejileri ele aldık. Ardından, bu stratejiler için bir ticaret sistemi geliştirirken bize yardımcı olması adına, ticaret sisteminin neler yapması gerektiğine dair adım adım ifadeler sunan bir plan hazırladık. Ve son olarak da, bu ADX stratejilerinin kodlarını MQL5 (MetaQuotes Language) ile yazarak onlara dayalı olarak otomatik şekilde çalışacak bir ticaret sisteminin nasıl oluşturulacağını gördük.
ADX göstergesi, ticarette kullanılabilecek basitten karmaşığa birçok farklı stratejiye sahiptir. Ancak biz burada göstergenin temel kavramını anlamak adına sadece bazı basit stratejilerden bahsettik. Buradaki ana amacımız, teknik göstergelere dayalı ticaret stratejilerini incelemek ve MetaTrader 5 işlem platformunda kullanılmak üzere MQL5'te onlara dayalı bir ticaret sistemi geliştirmektir.
Ayrıca şunu belirtmek istiyorum ki, ticarette kullanabilecek birçok farklı faydalı araç ve onların stratejileri vardır. Bu araçlar tek tek kullanılabilir veya daha iyi sonuçları elde etmek amacıyla farklı kombinasyonlar şeklinde birleştirilebilir. Ve işte bu da, teknik analizin en kullanışlı özelliklerinden biridir. Çünkü ticaret kararları verme sürecimizi geliştirebilecek ve daha iyi ticaret sonuçları elde etmemize yardımcı olabilecek farklı konseptlere dayalı birçok araç bulunmaktadır. Bu konuda daha fazla bilgi edinmek için, diğer popüler göstergeleri ve onlarla kullanılabilecek bazı basit stratejileri ele aldığımız ve MetaTrader 5'te kullanılmak üzere bu stratejilere dayalı basit bir ticaret sisteminin nasıl oluşturulacağını incelediğimiz önceki makalelerimi okumanızı tavsiye ederim. Dolayısıyla görevimiz, bu araçları ve konseptleri keşfetmek ve ticaret tarzımız ve planımız için hangilerinin uygun olduğunu bulmaktır. Bir kişi için faydalı olabilen ticaret stratejileri bir başkası için faydalı olmayabilir, çünkü her kişinin ticaretle ilişkili olarak kendi görüşlerine dayanan kendi ticaret planı vardır. Bu nedenle, size kişisel olarak fayda sağlayacaklarından emin olmak adına tüm yeni araçları veya stratejileri gerçek hesaplarda kullanmadan önce test etmelisiniz.
Programlama ise bize bu aşamada birçok açıdan çok faydalı olabilir - ticareti daha kolay, daha sorunsuz ve daha verimli hale getirmeye yardımcı olur. Karlı bir strateji bulduğumuzda, ilgili stratejiye dayalı şartlara göre bilgisayarın bizim için otomatik olarak çalışmasına olanak sağlayan bir ticaret sistemi geliştirebiliriz. Bu, ticaret sürecimizde mevcut olabilecek zararlı duygulardan kaçınmamızı mümkün kılacaktır. Ve nihayetinde programlama, başarılı ticaretin en önemli anahtarlarından biri olan disiplinle ticaret yapmamıza yardımcı olacaktır. Dolayısıyla, programlama ve MQL5 hakkında eğitim almanın çok faydalı olduğunu düşünüyorum çünkü bu hedeflere bu şekilde ulaşabiliriz.
Bu makale umarım gözlerinizi yeni fikirlere açar ve size makalenin konusu veya ticaret sonuçlarınızı iyileştirmenize yardımcı olacak ilgili herhangi bir konu hakkında yeni içgörüler sağlar. Çünkü ticaretimizin ana amacı iyi sonuçlar ve istikrarlı kârlar elde etmektir. Bu makalenin bu değerli hedefe ulaşmada size yardımcı olacağına inanıyorum. Bir sonraki makalede görüşmek üzere.
MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/10715
- Ü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