
Grafik Kontrol Seçenekleri ile Gösterge Oluşturma
Giriş
Piyasa duyarlılığına aşina olanlar, bilgisayar analiz yöntemlerinin ortaya çıktığı ilk anlardan itibaren yatırımcılar tarafından kullanılan fiyat hareketi analizi için güçlü bir araç olarak MACD göstergesi (tam adı Hareketli Ortalamalar Yakınsama Iraksama) hakkında bilgi sahibidir.
Grafikte birinci gelen MACD göstergesini uzun süre inceledim. Farklı seçenekler ve farklı hesaplama algoritmaları ile bu göstergenin birçok farklı türünü gördüm; bu nedenle bildiğim tüm türleri tek bir göstergede birleştirmeye karar verdim.
MACD göstergesi türleri
Gösterge, geleneksel MACD çizgilerini ve oSMA histogramını içerecektir. MACD'nin ana değişikliklerini tanımlayalım:- Impulse Sistemi olarak da bilinen Elder MACD'si,
- Hareketli çizgi yoluyla kontrol edilmeyen Elder MACD'si,
- Büyüyen ve düşen durumlar için farklı renklerle çizilen oSMA,
- Yalnızca oSMA-histogramı çizilir,
- Yalnızca MACD çizgileri çizilir,
Göstergenin İlk Ayarları
Hesaplama için aşağıdaki parametrelere ihtiyacımız olacak:
- Hızlı bir MACD çizgisinin değeri,
- Yavaş bir MACD çizgisinin değeri,
- Bir sinyal MACD çizgisinin değeri,
- Elder yöntemiyle Trend Doğrulama çizgisinin değeri,
Bu göstergeyi çizmek için şunlara ihtiyacımız olacak:
- MACD-çizgisi,
- Sinyal çizgisi,
- 3-renkli OSMA histogramı.
MQL5 Sihirbazının menüsüne gidin:
Şekil 1. MQL5 Sihirbazını kullanarak gösterge oluşturma
Şekil 2. MQL5 Sihirbazında ortak gösterge parametrelerini tanımlama
Şekil 3. MQL5 Sihirbazında göstergenin çizim özelliklerini tanımlama
Gösterge Oluşturma
Göstergenin başlangıç şablonuna sahibiz. Öncelikle göstergemizin MACD çizgisini hesaplamamız gerekiyor.
Bu çizgiyi hesaplamak için tam formülü derinlemesine incelemeyeceğiz - iMACD işlevini kullanacağız:
int iMACD ( string symbol, // symbol name ENUM_TIMEFRAMES period, // time period int fast_ema_period, // fast averaging period int slow_ema_period, // slow averaging period int signal_period, // averaging period of a signal line ENUM_APPLIED_PRICE applied_price // type of price or a handle )
Bu işlev, göstergenin uygun kopyasının bir tanıtıcısını döndürür. Bu tanıtıcıyı kullanarak, bu gösterge tarafından hesaplanan verileri almak mümkündür. Gösterge arabelleğinden alınan veriler (teknik göstergeler, kendi dahili arabelleklerinde hesaplanan verileri içerir; bu, göstergeye bağlı olarak 5'e kadar olabilir), CopyBuffer() işlevi kullanılarak kopyalanabilir.
Ardından, iMACD işlevini kullanarak MACD verileri için bir istek oluştururuz:
int MACDhadling = iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE);
Bize gösterge kopyasının bir tanıtıcısını döndürecektir.
Verileri CopyBuffer işlevi aracılığıyla gerekli arabelleğe kopyalayın :
int CopyBuffer( int indicator_handle, // indicator's handle int buffer_num, // buffer number of the indicator int start_pos, // start position int count, // number of data to copy double buffer[] // target array for the data to copy );
Şimdi göstergenin MACD çizgisini isteyelim:
CopyBuffer(MACDhadling,0,0,NewData,MACDlineBuffer);
Göstergenin sinyal çizgisini elde ederiz:
CopyBuffer(MACDhadling,1,0,NewData,SignallineBuffer);
Hepsini bir araya getirelim ve elimizde ne olduğuna bakalım:
int MACDhadling=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE); CopyBuffer(MACDhadling,0,0,rates_total,MACDlineBuffer); CopyBuffer(MACDhadling,1,0,rates_total,SignallineBuffer);
Şu anda elimizde hesaplanmış MACD ve sinyal çizgileri var.
Devam edelim.
Çünkü verilerden elde edilen
MACDlineBuffer
ve
SignallineBuffer
arabelleklerdeki veriler kopyalanarak elde edildikleri için, indekslemeleri grafiğin sonundan yapılır.
Tarihsel olarak, fiyat dizisinin verilerine erişim, verilerin sonundan gerçekleştirilir. Fiziksel olarak, yeni veriler her zaman dizinin sonuna yazılır, ancak mevcut (tamamlanmamış) çubuğun indeksi her zaman sıfıra eşittir. Zaman serisi dizisinde 0'a eşit olan indeks, bu zaman diliminin tamamlanmamış zaman aralığına karşılık gelen mevcut çubuğun verileri anlamına gelir.
Tüm arabelleklerde aynı indeksleme yönünü kullanmak için diğer arabellekleri zaman serisi olarak tanımlamamız gerekir.
ArraySetAsSeries(HistogramBuffer,false); ArraySetAsSeries(HistogramColors,false);
Bir histogramın verilerini almamız gerekiyor; bu, MACD çizgisinden sinyal çizgisinin çıkarılması ile hesaplanır:
for(int i=0;i<rates_total;i++) { HistogramBuffer[i]=MACDlineBuffer[i]-SignallineBuffer[i]; }
Tümünü birleştirelim:
ArraySetAsSeries(HistogramBuffer,false); ArraySetAsSeries(HistogramColors,false); int MACDhadling=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE); CopyBuffer(MACDhadling,0,0,rates_total,MACDlineBuffer); CopyBuffer(MACDhadling,1,0,rates_total,SignallineBuffer); for(int i=0;i<rates_total;i++) { HistogramBuffer[i]=MACDlineBuffer[i]-SignallineBuffer[i]; HistogramColors[i]=1; }
Gösterge Kontrolünün Grafik Sistemini Oluşturma
Bu göstergenin 5 türüne sahibiz.
İlk olarak, №3 ve №4 öğelerini uyguluyoruz.
3. Yalnızca oSMA-histogramı çizilir,
4. Yalnızca MACD çizgileri çizilir.
Uygun düğmeleri oluşturalım.
Öğe 4 için:
ObjectCreate(0,"ShowMACD",OBJ_BUTTON,ChartWindowFind(),100,100); //creating the button ObjectSetInteger(0,"ShowMACD",OBJPROP_XDISTANCE,75); //assign the coordinates ObjectSetInteger(0,"ShowMACD",OBJPROP_YDISTANCE,5); ObjectSetInteger(0,"ShowMACD",OBJPROP_CORNER,CORNER_RIGHT_UPPER); // and an anchor point ObjectSetString(0,"ShowMACD",OBJPROP_TEXT,"ShowMACD"); // button label ObjectSetInteger(0,"ShowMACD",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"ShowMACD",OBJPROP_XSIZE,70); // size of buttons ObjectSetInteger(0,"ShowMACD",OBJPROP_YSIZE,20); ObjectSetInteger(0,"ShowMACD",OBJPROP_SELECTABLE,false); // to make it selectable
Düğmenin yanlışlıkla silinmesi veya bir sonraki tıklamada kayması durumunda, düğme geri dönecektir.
№3 öğesi için:
ObjectCreate(0,"ShowOsMA",OBJ_BUTTON,ChartWindowFind(),100,100); ObjectSetInteger(0,"ShowOsMA",OBJPROP_XDISTANCE,75); ObjectSetInteger(0,"ShowOsMA",OBJPROP_YDISTANCE,30); ObjectSetInteger(0,"ShowOsMA",OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSetString (0,"ShowOsMA",OBJPROP_TEXT,"Show OsMA"); ObjectSetInteger(0,"ShowOsMA",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"ShowOsMA",OBJPROP_XSIZE,70); ObjectSetInteger(0,"ShowOsMA",OBJPROP_YSIZE,20); ObjectSetInteger(0,"ShowOsMA",OBJPROP_SELECTABLE,false);
Koşul 4 için basılmış ve basılmamış düğme durumu için uygulamayı oluşturalım.
Bu, arabellek indekslerinin görüntülenmesini gerektirir.
SetIndexBuffer(0,MACDlineBuffer,INDICATOR_DATA); SetIndexBuffer(1,SignallineBuffer,INDICATOR_DATA); SetIndexBuffer(2,HistogramBuffer,INDICATOR_DATA); SetIndexBuffer(3,HistogramColors,INDICATOR_COLOR_INDEX);
if(ObjectGetInteger(0,"ShowMACD",OBJPROP_STATE)!=1) { PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_NONE); // the buffer with index 0 isn't plotted PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_NONE); // the buffer with index 1 isn't plotted } else { PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE); // the buffer with index 0 is plotted as line PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE); // the buffer with index 1 is plotted as line }
Düğmeye basıldığında MACD çizgileri çizilir ve basılmadığında çizilmez.
Koşul 3 için basılmış ve basılmamış düğme durumu için uygulamayı oluşturalım.
if(ObjectGetInteger(0,"ShowOsMA",OBJPROP_STATE)!=1) { //the buffer with index 2 isn't plotted PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_NONE); } else { //the buffer with index 2 is plotted as a color histogram PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM); }
İki düğme oluşturalım: "2color" ve "Impulse" ve bunları grafiğin sağ alt köşesine konumlandırın.
ObjectCreate(0,"2color",OBJ_BUTTON,ChartWindowFind(),100,100); ObjectSetInteger(0,"2color",OBJPROP_XDISTANCE,75); ObjectSetInteger(0,"2color",OBJPROP_YDISTANCE,50); ObjectSetInteger(0,"2color",OBJPROP_CORNER,CORNER_RIGHT_LOWER); ObjectSetInteger(0,"2color",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"2color",OBJPROP_XSIZE,70); ObjectSetInteger(0,"2color",OBJPROP_YSIZE,20); ObjectSetInteger(0,"2color",OBJPROP_SELECTABLE,false); ObjectSetString (0,"2color",OBJPROP_TEXT,"MultiColor"); ObjectCreate(0,"Impulse",OBJ_BUTTON,ChartWindowFind(),100,100); ObjectSetInteger(0,"Impulse",OBJPROP_XDISTANCE,75); ObjectSetInteger(0,"Impulse",OBJPROP_YDISTANCE,25); ObjectSetInteger(0,"Impulse",OBJPROP_CORNER,CORNER_RIGHT_LOWER); ObjectSetInteger(0,"Impulse",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"Impulse",OBJPROP_XSIZE,70); ObjectSetInteger(0,"Impulse",OBJPROP_YSIZE,20); ObjectSetInteger(0,"Impulse",OBJPROP_SELECTABLE,false);
Elder sistemine göre Impuse kontrolü için EldersMA değerlerinin konumlandırılacağı yeni bir dizi eklememiz gerekiyor.
Bunu yapmak için, toplam arabellek sayısını bir değer artırmalıyız.+
#property indicator_buffers 4
şu şekilde değiştirilmesi gerekir:
#property indicator_buffers 5
ve yeni bir arabellek bildiriyoruz.
double EldersiEMA[];
Bunu, dahili hesaplamalar için bir arabellek olarak tanımlarız:
SetIndexBuffer(4,EldersiEMA,INDICATOR_CALCULATIONS);
Şimdi üstel hareketli ortalama değerlerini arabelleğe kopyalayalım:
// you can do all in single line CopyBuffer(iMA(NULL,0,EldersEMA,0,MODE_EMA,PRICE_CLOSE),0,0,rates_total,EldersiEMA);
Arabellek, kopyalama işlevi yoluyla elde edildiği için, indekslenmesi grafiğimizin diğer arabellekleriyle aynıdır (grafiğin sonundan).
Şimdi 2 renkli OsMA için koşulları yazalım:
if (ObjectGetInteger(0,"2color",OBJPROP_STATE)) { for(int i=1;i<rates_total;i++) { // if the histogram rises, the color is set to 0 if(HistogramBuffer[i] > HistogramBuffer[i-1]) HistogramColors[i]=0; // if the histogram falls, the color is set to 1 if(HistogramBuffer[i] < HistogramBuffer[i-1]) HistogramColors[i]=1; } } else { ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor"); // Here are the conditions for multi-color OSMA }
Renk indeksleri çizgilerde belirtilir:
#property indicator_label3 "Histogram" #property indicator_type3 DRAW_COLOR_HISTOGRAM #property indicator_color3 DeepSkyBlue,Red,Green
İlk rengin indeksi 0'a eşittir, ikincisinin indeksi 1'dir vb.
Şimdi Impulse Sistemi'nin varyasyonları için koşulları yazalım:
if (ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) // // "Impulse" button is checked { ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse"); // checking for a trend using the MACD-Line for(int i=1;i<rates_total;i++) { // the histogram rises and MACD-line rises if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (MACDlineBuffer[i]>MACDlineBuffer[i-1])) HistogramColors[i]=0; else { // the histogram falls and MACD-line falls if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (MACDlineBuffer[i]<MACDlineBuffer[i-1])) HistogramColors[i]=1; else HistogramColors[i]=2; // if there isn't any conditions satisfied } } } else { ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's"); // checking for a trend using the EMA-line for(int i=1;i<rates_total;i++) { // the histogram rises and EMA-line rises if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (EldersiEMA[i]>EldersiEMA[i-1])) HistogramColors[i]=0; else { // the histogram falls and EMA-line falls if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (EldersiEMA[i]<EldersiEMA[i-1])) HistogramColors[i]=1; else HistogramColors[i]=2;// if there isn't any conditions satisfied } } }
Şimdi Impulse Sistemi koşullarını OsMA çizim koşullarına ekleyelim:
if (ObjectGetInteger(0,"2color",OBJPROP_STATE)) { for(int i=1;i<rates_total;i++) { if(HistogramBuffer[i] > HistogramBuffer[i-1]) HistogramColors[i]=0; if(HistogramBuffer[i] < HistogramBuffer[i-1]) HistogramColors[i]=1; } } else { ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor"); if(ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) { ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse"); for(int i=1;i<rates_total;i++) { if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (MACDlineBuffer[i]>MACDlineBuffer[i-1])) HistogramColors[i]=0; else { if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (MACDlineBuffer[i]<MACDlineBuffer[i-1])) HistogramColors[i]=1; else HistogramColors[i]=2; } } } else { ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's"); for(int i=1;i<rates_total;i++) { if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (EldersiEMA[i]>EldersiEMA[i-1])) HistogramColors[i]=0; else { if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (EldersiEMA[i]<EldersiEMA[i-1])) HistogramColors[i]=1; else HistogramColors[i]=2; } } } }
Şimdi düğmelerin gereksiz olarak yanıp sönmesini önlemek için koşulları yazalım:
if (ObjectGetInteger(0,"2color",OBJPROP_STATE)) ObjectSetString (0,"2color",OBJPROP_TEXT,"2ColorMACD"); else ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor"); if (ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) ObjectSetString (0,"Impulse",OBJPROP_TEXT,"Impulse"); else ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's")
Bir düğmenin metnini değiştiren kodu sileriz.
Tümünü birleştirme:
//+------------------------------------------------------------------+ //| MACD_By_CoreWinTT.mq5 | //| Copyright 2010, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "2010, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 5 #property indicator_plots 3 //---- plot MACDline #property indicator_label1 "MACDline" #property indicator_type1 DRAW_LINE #property indicator_color1 Green #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //---- plot Signalline #property indicator_label2 "Signalline" #property indicator_type2 DRAW_LINE #property indicator_color2 Red #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //---- plot Histogram #property indicator_label3 "Histogram" #property indicator_type3 DRAW_COLOR_HISTOGRAM #property indicator_color3 DeepSkyBlue,Red,Green #property indicator_style3 STYLE_SOLID #property indicator_width3 2 //--- input parameters input int Fast=12; input int Slow=26; input int Signal=9; input int EldersEMA=13; //--- indicator buffers double MACDlineBuffer[]; double SignallineBuffer[]; double HistogramBuffer[]; double HistogramColors[]; double EldersiEMA[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,MACDlineBuffer,INDICATOR_DATA); SetIndexBuffer(1,SignallineBuffer,INDICATOR_DATA); SetIndexBuffer(2,HistogramBuffer,INDICATOR_DATA); SetIndexBuffer(3,HistogramColors,INDICATOR_COLOR_INDEX); SetIndexBuffer(4,EldersiEMA,INDICATOR_CALCULATIONS); //--- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { ArraySetAsSeries(HistogramBuffer,false); ArraySetAsSeries(HistogramColors,false); int MACDhadling=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE); CopyBuffer(MACDhadling,0,0,rates_total,MACDlineBuffer); CopyBuffer(MACDhadling,1,0,rates_total,SignallineBuffer); for(int i=0;i<rates_total;i++) { HistogramBuffer[i]=MACDlineBuffer[i]-SignallineBuffer[i];HistogramColors[i]=1; } ObjectCreate(0,"ShowMACD",OBJ_BUTTON,ChartWindowFind(),100,100); ObjectSetInteger(0,"ShowMACD",OBJPROP_XDISTANCE,75); ObjectSetInteger(0,"ShowMACD",OBJPROP_YDISTANCE,5); ObjectSetInteger(0,"ShowMACD",OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSetString(0,"ShowMACD",OBJPROP_TEXT,"ShowMACD"); ObjectSetInteger(0,"ShowMACD",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"ShowMACD",OBJPROP_XSIZE,70); ObjectSetInteger(0,"ShowMACD",OBJPROP_YSIZE,20); ObjectSetInteger(0,"ShowMACD",OBJPROP_SELECTABLE,false); ObjectCreate(0,"ShowOsMA",OBJ_BUTTON,ChartWindowFind(),100,100); ObjectSetInteger(0,"ShowOsMA",OBJPROP_XDISTANCE,75); ObjectSetInteger(0,"ShowOsMA",OBJPROP_YDISTANCE,30); ObjectSetInteger(0,"ShowOsMA",OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSetString(0,"ShowOsMA",OBJPROP_TEXT,"Show OsMA"); ObjectSetInteger(0,"ShowOsMA",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"ShowOsMA",OBJPROP_XSIZE,70); ObjectSetInteger(0,"ShowOsMA",OBJPROP_YSIZE,20); ObjectSetInteger(0,"ShowOsMA",OBJPROP_SELECTABLE,false); if(ObjectGetInteger(0,"ShowMACD",OBJPROP_STATE)!=1) { PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_NONE); PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_NONE); } else { PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE); PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE); } if(ObjectGetInteger(0,"ShowOsMA",OBJPROP_STATE)!=1) { PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_NONE); } else { PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM); } ObjectCreate(0,"2color",OBJ_BUTTON,ChartWindowFind(),100,100); ObjectSetInteger(0,"2color",OBJPROP_XDISTANCE,75); ObjectSetInteger(0,"2color",OBJPROP_YDISTANCE,50); ObjectSetInteger(0,"2color",OBJPROP_CORNER,CORNER_RIGHT_LOWER); ObjectSetInteger(0,"2color",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"2color",OBJPROP_XSIZE,70); ObjectSetInteger(0,"2color",OBJPROP_YSIZE,20); ObjectSetInteger(0,"2color",OBJPROP_SELECTABLE,false); ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor"); ObjectCreate(0,"Impulse",OBJ_BUTTON,ChartWindowFind(),100,100); ObjectSetInteger(0,"Impulse",OBJPROP_XDISTANCE,75); ObjectSetInteger(0,"Impulse",OBJPROP_YDISTANCE,25); ObjectSetInteger(0,"Impulse",OBJPROP_CORNER,CORNER_RIGHT_LOWER); ObjectSetInteger(0,"Impulse",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"Impulse",OBJPROP_XSIZE,70); ObjectSetInteger(0,"Impulse",OBJPROP_YSIZE,20); ObjectSetInteger(0,"Impulse",OBJPROP_SELECTABLE,false); ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse"); if(ObjectGetInteger(0,"2color",OBJPROP_STATE)) ObjectSetString(0,"2color",OBJPROP_TEXT,"2ColorMACD"); else ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor"); if(ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse"); else ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's"); CopyBuffer(iMA(NULL,0,EldersEMA,0,MODE_EMA,PRICE_CLOSE),0,0,rates_total,EldersiEMA); if(ObjectGetInteger(0,"2color",OBJPROP_STATE)) { for(int i=1;i<rates_total;i++) { if(HistogramBuffer[i] > HistogramBuffer[i-1]) HistogramColors[i]=0; if(HistogramBuffer[i] < HistogramBuffer[i-1]) HistogramColors[i]=1; } } else { if(ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) { for(int i=1;i<rates_total;i++) { if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (MACDlineBuffer[i]>MACDlineBuffer[i-1])) HistogramColors[i]=0; else { if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (MACDlineBuffer[i]<MACDlineBuffer[i-1])) HistogramColors[i]=1; else HistogramColors[i]=2; } } } else { for(int i=1;i<rates_total;i++) { if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (EldersiEMA[i]>EldersiEMA[i-1])) HistogramColors[i]=0; else { if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (EldersiEMA[i]<EldersiEMA[i-1])) HistogramColors[i]=1; else HistogramColors[i]=2; } } } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
Algoritmanın blok diyagramı Şekil 4'te gösterilmiştir:
Şekil 4. Gösterge algoritmasının blok diyagramı
Sonuç, Şekil 5-7'de gösterilmiştir.
Şek. 5
Şek. 6
Şek. 7
Sonuç
Bu makale, fiyatların bilgisayar analizini ve göstergelerin grafiksel kontrolüne ilişkin basit yöntemlerin uygulanmasını kullanarak piyasaları incelemeye başlayan yeni başlayanlar için bir rehber olarak kabul edilebilir.
Bu makalenin grafiksel kontrol sistemleri oluşturma konusundaki teknik becerilerinizi geliştireceğini ve engel teşkil eden hususları ortadan kaldırarak kendi "piyasa vizyonunuzu" bulmanıza yardımcı olacağını umuyorum.
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/42





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