
MQL5'te Gösterge Emisyonlarının Çizimi
Giriş
Elbette, birçok yatırımcı ve alım satım stratejisi geliştiricisi şu sorularla ilgilenmektedir:- Güçlü piyasa hareketleri nasıl ortaya çıkar?
- Yaklaşan değişikliklerin doğru yönü nasıl belirlenir?
- Alım satım için karlı pozisyon nasıl açılır?
- Pozisyon maksimum karla nasıl kapatılır?
Bu soruların yanıtlarını bulmak beni piyasa araştırmasına yeni bir yaklaşım yaratmaya yöneltti: Gösterge emisyonlarının oluşturulması ve analizi. Konunun daha da netleşmesi için aşağıdaki şekillere göz atın:
Şek. 1 DCMV göstergesi emisyonu.
Şek. 2. iMA zarflarına dayalı gösterge emisyonu.
Farklı göstergelerdeki emisyonu gösterir, ancak oluşturulma prensipleri aynıdır. Her tick'ten sonra farklı renk ve şekle sahip daha fazla nokta belirir. Bulutsular, bulutlar, parçalar, çizgiler, kavisler vb. şekillerde çok sayıda küme oluştururlar. Bu şekiller, piyasa fiyatlarının hareketini etkileyen görünmez kavisleri ve güçleri tespit etmeye yardımcı olabilir. Bu emisyonların araştırılması ve analizi el falı gibi bir şeydir.
Emisyon ve Özellikleri
Emisyon, göstergenin belirli çizgilerinin kesişme noktalarında bulunan bir dizi noktadır.
Emisyonların özellikleri henüz netlik kazanmış değil; hala araştırmacıları bekliyor. Bilinen özelliklerin bir listesi şu şekildedir:
- Aynı türdeki noktalar kümelenme eğilimindedir,
- Emisyonun bir yönü vardır; şu andan geleceğe veya geçmişe doğru,
- Kümeler önemlidir; yoğun kümeler fiyatı çekebilir veya tam tersine fiyatı itebilir.
Gösterge Emisyonunu Hesaplama
Bir örnekle emisyon hesaplamasının temellerini ele alalım. İki gösterge alalım - iBands ve iMA ve bunların çizgilerinin kesişimini bulalım. Bunları emisyon noktalarını çizmek için kullanacağız. Bunun için grafik nesnelerine ihtiyacımız olacak. Algoritma Expert Advisor'larda uygulanmaktadır ancak göstergelerde yapılabilmektedir.
İlk göstergeler Şek. 3'te sunulmuştur:
Şek. 3. iBands (yeşil) ve iMA (kırmızı) göstergeleri.
Emisyon noktaları oluşturmak için bir Expert Advisor'a ihtiyacımız var. Bir Expert Advisor şablonu oluşturmak için MQL5 Sihirbazını kullanmak daha iyidir.
Şek. 4. MQL5 Sihirbazını kullanarak Expert Advisor şablonu oluşturma.
//+------------------------------------------------------------------+ //| Emission of Bands && MA.mq5 | //| Copyright DC2008 | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "DC2008" #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+
İlk olarak, bazı yardımcı çizimlere ihtiyacımız var. Işınları kullanarak gösterge çizgilerine devam etmemiz gerekiyor (Şek. 5.). Bu, emisyon noktalarının hesaplanmasının ve görselleştirilmesinin doğruluğunu kontrol etmeyi sağlayacaktır. Daha sonra, bu satırları grafikten çıkaracağız.
Şek. 5. Yardımcı çizimler. Işınlar kullanarak gösterge çizgilerine devam etme.
Böylece, Grafik nesnelerini (yatay ve trend çizgileri) Expert Advisor'ın koduna ekleyelim.
input bool H_line=true; // flag to enable drawing of the horizontal lines input bool I_line=true; // flag to enable drawing of the indicator's lines //--- string name; //---- indicator buffers double MA[]; // array for iMA indicator double BBH[]; // array for iBands indicator - UPPER_BAND double BBL[]; // array for iBands indicator - LOWER_BAND double BBM[]; // array for iBands indicator - BASE_LINE datetime T[]; // array for time coordinates //---- handles for indicators int MAHandle; // iMA indicator handle int BBHandle; // iBands indicator handle //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- MAHandle=iMA(Symbol(),0,21,0,MODE_EMA,PRICE_CLOSE); BBHandle=iBands(Symbol(),0,144,0,2,PRICE_CLOSE); //--- if(H_line) // Horizontal lines of iBands indicator { //--- iBands - UPPER_BAND name="Hi"; ObjectCreate(0,name,OBJ_HLINE,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,Red); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT); ObjectSetInteger(0,name,OBJPROP_WIDTH,1); //--- iBands - LOWER_BAND name="Lo"; ObjectCreate(0,name,OBJ_HLINE,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,Blue); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT); ObjectSetInteger(0,name,OBJPROP_WIDTH,1); //--- iBands - BASE_LINE name="MIDI"; ObjectCreate(0,name,OBJ_HLINE,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,DarkOrange); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT); ObjectSetInteger(0,name,OBJPROP_WIDTH,1); } //--- if(I_line) // Indicator lines { //--- iMA name="MA"; ObjectCreate(0,name,OBJ_TREND,0,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,Red); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,name,OBJPROP_WIDTH,2); ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1); ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1); //--- iBands - UPPER_BAND name="BH"; ObjectCreate(0,name,OBJ_TREND,0,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,MediumSeaGreen); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,name,OBJPROP_WIDTH,1); ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1); ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1); //--- iBands - LOWER_BAND name="BL"; ObjectCreate(0,name,OBJ_TREND,0,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,MediumSeaGreen); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,name,OBJPROP_WIDTH,1); ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1); ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1); //--- iBands - BASE_LINE name="BM"; ObjectCreate(0,name,OBJ_TREND,0,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,MediumSeaGreen); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,name,OBJPROP_WIDTH,1); ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1); ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1); } return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- filling the arrays with current values CopyBuffer(MAHandle,0,0,2,MA); ArraySetAsSeries(MA,true); CopyBuffer(BBHandle,0,0,2,BBM); ArraySetAsSeries(BBM,true); CopyBuffer(BBHandle,1,0,2,BBH); ArraySetAsSeries(BBH,true); CopyBuffer(BBHandle,2,0,2,BBL); ArraySetAsSeries(BBL,true); CopyTime(Symbol(),0,0,10,T); ArraySetAsSeries(T,true); //--- Horizontal lines of iBands indicator (correction) if(H_line) { name="Hi"; ObjectSetDouble(0,name,OBJPROP_PRICE,BBH[0]); name="Lo"; ObjectSetDouble(0,name,OBJPROP_PRICE,BBL[0]); name="MIDI"; ObjectSetDouble(0,name,OBJPROP_PRICE,BBM[0]); } //--- Indicator's lines (correction) if(I_line) { name="MA"; //--- iMA ObjectSetInteger(0,name,OBJPROP_TIME,T[1]); ObjectSetDouble(0,name,OBJPROP_PRICE,MA[1]); ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]); ObjectSetDouble(0,name,OBJPROP_PRICE,1,MA[0]); name="BH"; //--- iBands - UPPER_BAND ObjectSetInteger(0,name,OBJPROP_TIME,T[1]); ObjectSetDouble(0,name,OBJPROP_PRICE,BBH[1]); ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]); ObjectSetDouble(0,name,OBJPROP_PRICE,1,BBH[0]); name="BL"; //--- iBands - LOWER_BAND ObjectSetInteger(0,name,OBJPROP_TIME,T[1]); ObjectSetDouble(0,name,OBJPROP_PRICE,BBL[1]); ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]); ObjectSetDouble(0,name,OBJPROP_PRICE,1,BBL[0]); name="BM"; //--- iBands - BASE_LINE ObjectSetInteger(0,name,OBJPROP_TIME,T[1]); ObjectSetDouble(0,name,OBJPROP_PRICE,BBM[1]); ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]); ObjectSetDouble(0,name,OBJPROP_PRICE,1,BBM[0]); } } //+------------------------------------------------------------------+Emisyon geçmişe ve geleceğe doğru devam ettiği için, trend çizgisi özellikleri şu şekilde olmalıdır:
- OBJPROP_RAY_LEFT = 1, (Işın sola gider),
- OBJPROP_RAY_RIGHT = 1, (Işın sağa gider).
Sonuç olarak, ek çizgiler içeren grafik Şekil 6'da gösterildiği gibi görünecektir.
Hazırlık aşaması tamamlandı, şimdi emisyona geçelim. Aşağıdaki çizgilerin kesiştiği noktada ilk nokta dizisini oluşturacağız:
- "MA" (iMA) çizgisi ile "BH" çizgisi arasında (iBands = UPPER_BAND),
- "MA" (iMA) çizgisi ile "BL" çizgisi arasında (iBands = LOWER_BAND),
- "MA" (iMA) çizgisi ile "BM" çizgisi arasında (iBands = BASE_BAND).
Şek. 6. Yardımcı çizimler. Düz çizgiler kullanarak gösterge çizgilerine devam etme.
Şimdi sıra kesişim koordinatlarını hesaplamaya ve emisyon noktalarını çizmeye geldi. İşlevi oluşturalım:
void Draw_Point( string P_name, // Object name (OBJ_ARROW) double P_y1, // Y-coordinate of the 1st line at the [1] bar double P_y0, // Y-coordinate of the 1st line at the [0] bar double P_yy1, // Y-coordinate of the 2nd line at the [1] bar double P_yy0, // Y-coordinate of the 2nd line at the [0] bar char P_code1, // Char at the right side of the [0] bar char P_code2, // Char at the left side of the [0] bar color P_color1, // Color of point at the right side of the [0] bar color P_color2 // color of point at the left side of the [0] bar ) { double P,X; datetime P_time; if(MathAbs((P_yy0-P_yy1)-(P_y0-P_y1))>0) { P=P_y1+(P_y0-P_y1)*(P_y1-P_yy1)/((P_yy0-P_yy1)-(P_y0-P_y1)); X=(P_y1-P_yy1)/((P_yy0-P_yy1)-(P_y0-P_y1)); if(X>draw_period) { P_time=T[0]+(int)(X*PeriodSeconds()); ObjectCreate(0,P_name,OBJ_ARROW,0,0,0); ObjectSetDouble(0,P_name,OBJPROP_PRICE,P); ObjectSetInteger(0,P_name,OBJPROP_TIME,P_time); ObjectSetInteger(0,P_name,OBJPROP_WIDTH,0); ObjectSetInteger(0,P_name,OBJPROP_ARROWCODE,P_code1); ObjectSetInteger(0,P_name,OBJPROP_COLOR,P_color1); if(X<0) { ObjectSetInteger(0,P_name,OBJPROP_ARROWCODE,P_code2); ObjectSetInteger(0,P_name,OBJPROP_COLOR,P_color2); } } } }
OnTick işlevine aşağıdaki kod satırlarını ekleyin:
//+------------------------------------------------------------------+ int GTC=GetTickCount(); //+------------------------------------------------------------------+ name="H"+(string)GTC; Draw_Point(name,BBH[1],BBH[0],MA[1],MA[0],170,178,Red,Red); name="L"+(string)GTC; Draw_Point(name,BBL[1],BBL[0],MA[1],MA[0],170,178,Blue,Blue); name="M"+(string)GTC; Draw_Point(name,BBM[1],BBM[0],MA[1],MA[0],170,178,Green,Green); //--- ChartRedraw(0);
Şimdi Expert Advisor'ı çalıştıralım ve sonuca bakalım (Şekil 7.).
Bu iyi, ancak dikkate almadığımız başka kesişme durumları da var. Örneğin, iBands göstergesinin birbiriyle kesişen ve genel resmi tamamlayabilen üç çizgisi vardır.
Şek. 7. iMA ve iBands göstergelerinin emisyonu (3 kesişme noktası).
Şimdi, hesaplanan emisyona, aşağıdaki çizgiler arasındaki kesişme noktasına başka bir nokta serisi eklemeye çalışalım:- "BH" çizgisi (iBands = UPPER_BAND) ile "BL" çizgisi arasına (iBands = LOWER_BAND);
- "BH" çizgisi (iBands = UPPER_BAND) ile "BM" çizgisi arasına (iBands = BASE_BAND);
- "BL" çizgisi (iBands = LOWER_BAND) ile "BM" çizgisi arasına (iBands = BASE_BAND).
Bu kesişim noktalarından dolayı 3 puan alacağız, ancak hepsinin koordinatları aynı olacak. Bu nedenle, "BH" çizgisi ile "BL" çizgisi arasında tek bir kesişim noktası kullanmak yeterlidir.
Bu kod satırlarını Expert Advisor'a ekleyip sonuca bir göz atalım (Şek. 8.).
name="B"+(string)GTC; Draw_Point(name,BBH[1],BBH[0],BBL[1],BBL[0],170,178,Magenta,Magenta);
Şek. 8. iMA ve iBands göstergelerinin emisyonu (4 kesişim noktası).
Emisyonu aldık, ancak içimde önemli bir şeyi atladığımıza dair bir his var. Peki neyi atladık?
Neden yalnızca bu tür giriş parametrelerini kullandık? Bunları değiştirirsek ne elde ederiz? Herhangi bir şekilde, bunların emisyonlardaki rolleri nedir?
Elimizdeki emisyon, göstergenin giriş parametrelerinden kaynaklanan tek bir frekansa karşılık geliyor. Tam çoklu frekans spektrumunu hesaplamak için aynı hesaplamaları diğer frekanslar için de yapmak gerekir. Örnek olarak, olası emisyon spektrumuna ilişkin bendeki sürümü ele alalım:
//---- handles for indicators int MAHandle[5]; // handles array of iMA indicators int BBHandle[7]; // handles array of iBands indicator //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- MAHandle[0]=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE); MAHandle[1]=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE); MAHandle[2]=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE); MAHandle[3]=iMA(NULL,0,89,0,MODE_EMA,PRICE_CLOSE); MAHandle[4]=iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE); //--- BBHandle[0]=iBands(NULL,0,55,0,2,PRICE_CLOSE); BBHandle[1]=iBands(NULL,0,89,0,2,PRICE_CLOSE); BBHandle[2]=iBands(NULL,0,144,0,2,PRICE_CLOSE); BBHandle[3]=iBands(NULL,0,233,0,2,PRICE_CLOSE); BBHandle[4]=iBands(NULL,0,377,0,2,PRICE_CLOSE); BBHandle[5]=iBands(NULL,0,610,0,2,PRICE_CLOSE); BBHandle[6]=iBands(NULL,0,987,0,2,PRICE_CLOSE); //--- return(0); }
Tüm olası kombinasyonları göz önünde bulundurmak için aşağıdaki kodu Expert Advisor'a ekleyelim:
//+------------------------------------------------------------------+ CopyTime(NULL,0,0,10,T); ArraySetAsSeries(T,true); int GTC=GetTickCount(); //+------------------------------------------------------------------+ int iMax=ArraySize(BBHandle)-1; int jMax=ArraySize(MAHandle)-1; for(int i=0; i<iMax; i++) { for(int j=0; j<jMax; j++) { //--- filling the arrays with current values CopyBuffer(MAHandle[j],0,0,2,MA); ArraySetAsSeries(MA,true); CopyBuffer(BBHandle[i],0,0,2,BBM); ArraySetAsSeries(BBM,true); CopyBuffer(BBHandle[i],1,0,2,BBH); ArraySetAsSeries(BBH,true); CopyBuffer(BBHandle[i],2,0,2,BBL); ArraySetAsSeries(BBL,true); name="H"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBH[1],BBH[0],MA[1],MA[0],250,158,Aqua,Aqua); name="L"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBL[1],BBL[0],MA[1],MA[0],250,158,Blue,Blue); name="M"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBM[1],BBM[0],MA[1],MA[0],250,158,Green,Green); name="B"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBH[1],BBH[0],BBL[1],BBL[0],250,158,Magenta,Magenta); } } //--- ChartRedraw(0);
Emisyon spektrumunda ne kadar çok frekans yer alırsa grafikteki resim o kadar iyi olacaktır, ancak bunu kötüye kullanmamalısınız; bu, bilgisayar kaynaklarını tüketmenin ve kaosu grafiğe almanın en basit yoludur. Frekans sayısı deneysel olarak belirlenebilir. Grafiklerin daha iyi algılanabilmesi için çizim stiline özellikle dikkat etmeliyiz.
Şek. 9. Çoklu frekans emisyon spektrumu.
Emisyonun Çizim Stilleri
MQL5 dili, emisyon çizimleri için çok çeşitli Web Renkleri ve Windings karakterleri sağlar. Bununla ilgili düşüncelerimi paylaşmak isterim:- Her kişinin kendi grafik görüntü algısı vardır; bu nedenle emisyonları özelleştirmek için biraz zamana ihtiyacınız olacak.
- Şek. 9'daki "kaos" görüntülerdeki herhangi bir düzenin veya kalıbın tanınmasına izin vermez. Bu, bir kötü çizim örneğidir.
- Gökkuşağı spektrumundaki komşu renkleri kullanmaya çalışın.
- Geçmiş ([0] çubuğunun sol tarafından) ve gelecek ([0] çubuğunun sağ tarafından) için karakter kodları farklı olmalıdır.
- Renklerin ve noktaların şekillerinin başarılı kombinasyonu, emisyonu şaheserlere dönüştürebilir; bu, yalnızca alım satım işleminde yardımcı olmayacak, aynı zamanda gözlerinizi de memnun edecektir.
name="H"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBH[1],BBH[0],MA[1],MA[0],250,158,Aqua,Aqua); name="L"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBL[1],BBL[0],MA[1],MA[0],250,158,Blue,Blue); name="M"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBM[1],BBM[0],MA[1],MA[0],250,158,Magenta,Magenta); name="B"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBH[1],BBH[0],BBL[1],BBL[0],250,158,DarkOrchid,DarkOrchid);
iMA ve iBands Emisyon Galerisi
Bu emisyonları içeren görüntüler bu bölümde sunulmaktadır.
Şek. 10.
Şek. 11
Şek. 12.
Şek. 13.
Şek. 14.
Şek. 15.
Şek. 16.
Şek. 17.
Emisyon Analizi
Emisyonların analizi ayrı bir görevdir. En yararlı şey dinamiklerine gerçek zamanlı olarak bakmaktır; birçok etkiyi ve kalıbı anlamanın en iyi yolu budur.
Fiyat düzenlemelerine dikkat edin; görünüşe göre emisyon hedef fiyatı "biliyor". Ayrıca destek, direnç ve denge fiyat düzeylerini de görebilirsiniz.
Sonuç
- Göstergelerin emisyonları, piyasa araştırması ve analizinde yeni yaklaşımlar arayan yatırımcılar ve alım satım sistemi geliştiricileri için ilginç olabilir.
- Bir tanıtıcı makale olarak bu, hazır çözümleri içermemektedir. Ancak, emisyon hesaplaması için sunulan teknoloji, diğer göstergelere veya bunların kombinasyonlarına uygulanabilir.
- Bu makaleyi hazırlarken, yanıtlara kıyasla daha fazla soru topladım. Bunlardan bazıları şu şekildedir: Emisyon çizimi algoritması nasıl optimize edilir? Emisyon yapısında emisyon spektrumu özelliklerinin rolü nedir? Otomatik alım satımda emisyonlar nasıl kullanılır?
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/26





- Ü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