English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
MQL5'te Kendi Grafik Panellerinizi Oluşturun

MQL5'te Kendi Grafik Panellerinizi Oluşturun

MetaTrader 5Örnekler | 9 Aralık 2021, 12:43
101 0
MetaQuotes
MetaQuotes

Giriş

Standart Kitaplık'ta yeni bir sınıf seti bulunmaktadır. Bu sınıflar MQL5 programlarında kontrol iletişim kutularının ve ekran panellerinin bağımsız olarak geliştirilmesi için tasarlanmıştır.

Yeni sınıf seti, herkesin temel model olarak etkinlik odaklı modeli kullanarak özel arayüz bileşenleri oluşturmasını sağlar. Her şey, Terminalin gömülü grafik nesnelerini ve etkinliklerini temel alır.

Geliştirilen sınıflar aşağıdaki şekillerde kullanılabilir:
  1. Ayrı bir grafik alt penceresinde ekran paneli;
  2. bir Uzman Danışman (EA) için kontrol paneli;
  3. Özel ekran kontrol paneli.

Bu makalede, Standart Kitaplık sınıflarını kullanarak ayrı bir grafik alt penceresinde kendi ekran panellerinizi oluşturmanın ne kadar kolay olduğu gösterilecektir.


Standart Kitaplık Neler Sunabilir?

Standart Kitaplık, geliştiriciye aşağıdaki kullanıma hazır kontrolleri sağlar:

1. Basit kontroller:

Kontrol Uygulama Gömülü nesneyi temel alan uygulama Standart kitaplık dosyası

Metinli düğme

Fare ve MQL programı arasında etkileşimin sağlanması

“Düğme”  <Controls\Button.mqh>

Resimli düğme

Fare ve MQL programı arasında etkileşimin sağlanması

"Grafik etiket"  <Controls\BmpButton.mqh>

Düzenle

Metin bilgilerinin (“Salt Okunur” modda girilmesi ve görüntülenmesi

“Düzenle”  <Controls\Edit.mqh>

Resim Yazısı

Yardımcı metin bilgilerinin görüntülenmesi

"Metin etiketi"  <Controls\Label.mqh>

Panel

Yardımcı kontrol (kontrollerin görsel gruplandırması)

“Dikdörtgen etiket”  <Controls\Panel.mqh>

Resim

Dekoratif kontrol

 "Grafik etiket"  <Controls\Picture.mqh>



2. Karmaşık kontroller:


Kontrol Uygulama Kontrollere dayalı uygulama Standart kitaplık dosyası

Liste

Liste görüntüleme

"Dikdörtgen", "Resimli düğme" ve "Düzenle"  <Controls\List.mqh>

Açılır listeli alan

Açılır listeden seçim

"Düzenle", "Resimli düğme" ve "Liste"  <Controls\ComboBox.mqh>

Artırma/azaltma alanı

Değerlerin numaralandırması

"Düzenle" ve "Resimli düğme"  <Controls\SpinEdit.mqh>

Radyo düğmesi

Anahtar "Resimli düğme" ve "Resim yazısı"  <Controls\RadioButton.mqh>
 Radyo düğmesi grubu  Numaralandırma türündeki düzenleme alanları  "Dikdörtgen" ve "Radyo düğmesi"  <Controls\RadioGroup.mqh>

Onay Kutusu

Seçim seçeneği

"Resimli düğme" ve "Resim yazısı"  <Controls\CheckBox.mqh>

Onay kutusu grubu

Bayrak setini düzenleme

 "Dikdörtgen" ve "Onay Kutusu"  <Controls\CheckGroup.mqh>
 İletişim kutusu  İletişim kutusu formu  "Dikdörtgen", "Resimli düğme" ve "Düzenle"  <Controls\Dialog.mqh>



Ekran Paneli Oluşturma

Önce şartları tanımlayalım. Ekran paneli, çizim tamponu olmayan ayrı bir pencere özel ekranını tanımlamak için kullanacağımız bir terimdir. Bu tür bir panel, Terminale gömülü grafik nesneleri kullanarak gerekli bilgileri görüntüler. Bilgiler görüntülenebilir:

  • nümerik olarak,
  • metin olarak,
  • renk olarak,
  • vb.

Gereken her adıma ayrıntılı bir göz atacağız ve aşağıdaki gibi bir grafik panel oluşturacağız:



Bir ekran paneli oluşturmak için iki dosyaya ihtiyacımız olacak:

  1. Ekran paneli sınıfının açıklamasını içeren içerme dosyası.
  2. Gösterge kaynak kodu dosyası.

Bu dosyaların şablonları MQL5 Sihirbazı kullanılarak elde edilebilir. Göstergeler dizininde (MQL5\Indicators), ayrı bir klasör MyIndicators ve bir alt klasör MyPanel oluşturun. Yardımda iyi açıklandığı gibi klasör oluşturma işlemi burada ele alınmayacaktır.


Sınıf Açıklaması

Dolayısıyla, çalışma klasörünü zaten oluşturduk. Şimdi bunu "Gezgin" penceresinde bulalım ve üzerinde sağ tıklayalım. Görüntülenen menüden "Yeni Dosya" seçeneğini seçin. MQL5 Sihirbazı tarafından verilen seçeneklerden "Yeni Sınıf" seçeneğini seçin ve "Sonraki >" düğmesine tıklayın. Aşağıda gösterildiği gibi sınıf açıklaması iletişim kutusunu tamamlayın:

MQL Sihirbazında yeni sınıf oluşturma

“Bitir” düğmesine tıklayın. Sonuç olarak, aşağıdaki koda sahibiz:

//+------------------------------------------------------------------+
//|                                                  PanelDialog.mqh |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CPanelDialog : public CAppDialog
  {
private:

public:
                     CPanelDialog();
                    ~CPanelDialog();
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CPanelDialog::CPanelDialog()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CPanelDialog::~CPanelDialog()
  {
  }
//+------------------------------------------------------------------+


Standart Kitaplıktan, temel CAppDialog sınıfının açıklamasını ve yorumlarını içeren <Controls\Dialog.mqh> içerme dosyasını ekleyin.

//+------------------------------------------------------------------+
//|                                                  PanelDialog.mqh |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
//+------------------------------------------------------------------+
//| CPanelDialog class                                               |
//| Function: main application dialog                                |
//+------------------------------------------------------------------+
class CPanelDialog : public CAppDialog
  {
private:

public:
                     CPanelDialog(void);
                    ~CPanelDialog(void);
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CPanelDialog::CPanelDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CPanelDialog::~CPanelDialog(void)
  {
  }
//+------------------------------------------------------------------+

Artık sınıfın açıklamasına sahibiz, bu da göstergesinde bir iletişim kutusu kullanmamızı sağlayacaktır. İletişim kutumuz şu anda boş, ancak biraz sonra ona kontroller ekleyeceğiz. Şu anda, göstergeye geçelim.


Gösterge Kaynak Kodu

Gösterge ayrıca MQL5 Sihirbazı kullanılarak da oluşturulacaktır. Eylemlerimiz sınıf açıklamasını yazarken gerekenlere benzer olacaktır. Tek bir fark vardır - MQL5 Sihirbazı tarafından verilen seçenekler arasından "Özel Gösterge" seçeneğini seçiyoruz. Bir gösterge oluşturmak için üç iletişim kutusu doldurulmalıdır.

Birincisi, göstergenin adının belirtilmesini gerektirir:

MQL Sihirbazında yeni gösterge oluşturma


İkinci iletişim kutusunda, "OnChartEvent" (gerekli) ve "OnTimer" seçeneklerini işaretleyin:

MQL Sihirbazında özel gösterge için etkinlik işleyicilerini ayarlama



Üçüncü iletişim kutusunda "Ayrı Pencere Göstergesi" (gerekli) seçeneğini işaretleyin:

MQL Sihirbazında gösterge çizim özelliklerini ayarlama


Ve "Bitir" düğmesine tıklayın. Üretilen kod aşağıdaki gibidir:

//+------------------------------------------------------------------+
//|                                               PanelIndicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
              const int prev_calculated,
              const int begin,
              const double &price[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                const long &lparam,
                const double &dparam,
                const string &sparam)
  {
//---
   
  }
//+------------------------------------------------------------------+


Şablonumuz artık şunları ekleyerek tamamlanabilir:

  • gösterge özelliklerinin eksik açıklamaları;
  • iletişim kutumuzun sınıf açıklamasını içeren içerme dosyası;
  • bir global değişken - iletişim kutumuzun sınıf nesnesi;
  • iletişim kutusunu oluşturma, uygulamayı başlatma ve OnInit() fonksiyon gövdesine zamanlayıcı oluşturma kodu;
  • İletişim kutusunu yok eden ve zamanlayıcıyı öldüren bir kod içeren OnDeinit() fonksiyonu;
  • kodu çağıran etkinlik işleyicisine OnChartEvent(...) fonksiyonu;
  • yorumlar

Kullanıma hazır göstergemiz var:

//+------------------------------------------------------------------+
//|                                               PanelIndicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_plots               0
#property indicator_buffers             0
#property indicator_minimum             0.0
#property indicator_maximum             0.0
//+------------------------------------------------------------------+
//| Include files                                                    |
//+------------------------------------------------------------------+
#include "PanelDialog.mqh"
//+------------------------------------------------------------------+
//| Global variables                                                 |
//+------------------------------------------------------------------+
CPanelDialog ExtDialog;
//+------------------------------------------------------------------+
//| Initialization                                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- creating the application dialog
   if(!ExtDialog.Create(0,"Panel Indicator",0,0,0,0,130))
     return(-1);
//--- starting the application
   if(!ExtDialog.Run())
     return(-2);
//--- creating the timer
   EventSetTimer(1);
//--- success
   return(0);
  }
//+------------------------------------------------------------------+
//| Deinitialization                                                 |
//+------------------------------------------------------------------+
int OnDeinit()
  {
//--- destroying the dialog
   ExtDialog.Destroy();
//--- killing the timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Iteration                                                        |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
              const int prev_calculated,
              const int begin,
              const double &price[])
  {  
//--- returning the prev_calculated value for the next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer event handler                                              |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
  }
//+------------------------------------------------------------------+
//| Chart event handler                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                const long &lparam,
                const double &dparam,
                const string &sparam)
  {
//--- handling the event
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+


Yukarıdaki formdaki gösterge henüz hiçbir şey göstermiyor. Grafikteki Gezginden derlendiğinde ve bırakıldığında, ayrı bir pencerede boş bir iletişim kutusu olarak görüntülenir.

İletişim kutusunun boş olmasına rağmen, göstergemiz zaten belirli özellikler edinmiştir:

  • alt pencere yüksekliği, oluşturma sırasında gösterge tarafından iletişim yüksekliğine ayarlanmıştır;
  • iletişim kutusu genişliği her zaman grafik genişliğine eşittir;
  • gösterge kendi alt penceresini küçültebilir ve büyütülebilir.

Görüntülenmesine İzin Ver

Panelimizin herhangi bir bilgiyi görüntülemeye başlaması için üç sorunun cevabına karar vermeliyiz:

  1. Ne tür bilgiler görüntülemek istiyoruz?
  2. İletişim kutumuza hangi ek görüntü öğelerinin ve/veya kontrollerin yerleştirilmesi gerekiyor?
  3. Bu ek öğeler/kontroller nasıl etkileşime girecek?

Bir diğer önemli faktör, iletişim kutunuzun görsel olarak çekici ve kullanıcı dostu olmasıdır. Bu, iletişim kutusunun işlevselliğini etkilemez, ancak gelecekteki MQL5 programının kullanıcılarını önemsediğimizi gösterir.

   1. Adım. Ne tür bilgiler görüntülemek istiyoruz?

Makale bir öğrenme aracı olarak hizmet ettiği için, göstergenin kullanılabilirliği üzerinde durmayalım. Renk üç parametrenin bir fonksiyonu olarak görüntülenir. Parametreleri aşırı karmaşık hale getirmeyeceğiz - bunlar "kırmızı", "yeşil" ve "mavi" seviyeler olacaktır.

Parametre değerleri aşağıdaki gibi ayarlanır:

  • "Kırmızı" seviye değeri, her Calculate etkinliğinde rastgele bir şekilde değiştirilerek 0 ile 255 arasında ayarlanır;
  • "Yeşil" seviye değeri, her Timer etkinliğinde rastgele bir şekilde değiştirilerek 0 ile 255 arasında ayarlanır;
  • "Mavi" seviye değeri 0 ile 255 arasında ayarlanacak ve özel bir kontrol ile manuel olarak değiştirilecektir.

Bu arada, bu seviyelerin değerleri de göstergemizde gösterilecektir.


   2. Adım. Hangi ek kontroller gerekecek?

  1. Renk "Panel" kontrolü kullanılarak görüntülenecektir.
  2. "Kırmızı" ve "yeşil" seviyeleri ,"Salt Okunur" modda "Düzenle" kontrolü kullanılarak görüntülenir.
  3. "Mavi" seviyesi "Döndür Düzenle" kontrolü ile yönetilecektir. Aynı kontrol seviye değerini görüntülemeye yardımcı olur.
  4. Hem "Düzenle" hem de "Döndür Düzenle" kontrolleri, "Resim Yazısı" kontrolü ile açıklayıcı resim yazıları geliştirilecektir.

Standart Kitaplıktan içerme dosyalarının yanı sıra parametre değerlerini depolayan gerekli kontrolleri ve değişkenleri, yorumlar sağlanan sınıf açıklamasına ekleyin.

Şunlara sahip olacağız:

//+------------------------------------------------------------------+
//|                                                  PanelDialog.mqh |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\Panel.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Label.mqh>
#include <Controls\SpinEdit.mqh>
//+------------------------------------------------------------------+
//| CPanelDialog class                                               |
//| Function: main application dialog                                |
//+------------------------------------------------------------------+
class CPanelDialog : public CAppDialog
  {
private:
   //--- additional controls
   CPanel            m_color;                         // object for displaying color
   CLabel            m_label_red;                     // "red" level caption object
   CEdit             m_field_red;                     // "red" value display object
   CLabel            m_label_green;                   // "green" level caption object
   CEdit             m_field_green;                   // "green" value display object
   CLabel            m_label_blue;                    // "blue" level caption object
   CSpinEdit         m_edit_blue;                     // "blue" value control object
   //--- parameter values
   int               m_red;                           // "red" value
   int               m_green;                         // "green" value
   int               m_blue;                          // "blue" value

public:
                     CPanelDialog(void);
                    ~CPanelDialog(void);
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CPanelDialog::CPanelDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CPanelDialog::~CPanelDialog(void)
  {
  }
//+------------------------------------------------------------------+


   3. Adım. Bu ek iletişim kutusu kontrolleri nasıl etkileşime girer?
İletişim kutusu kontrolleri arasındaki etkileşim ilkesi çok basit olacaktır - "İletişim kutusu herhangi bir parametredeki değişiklikleri ("kırmızı", "yeşil" ve "mavi" seviyeleri) görüntüler." Etkileşim algoritmalarının uygulanması, iletişim kutusunu oluşturmaya başlama zamanı geldikten daha sonra ele alınacaktır.


Göze Hitap Etme Hakkında Birkaç Söz

İletişim kutusunu oluşturmaya geçmeden önce, göze hitap etme hakkında hızlı bir fikir edinelim. Veya daha iyisi, kullanıcı dostu bir düzenleme ve (olası) iletişim kutusu kontrollerinin gelecekteki yeniden düzenlenmesi. Adlandırılmış sabitler (#define) bu amaca en iyi şekilde hizmet eder.

Önceden tanımlanmış adlandırılmış sabitler tarafından sunulan bazı avantajlar vardır:

  • belirli durumlarda kullanılan belirli nümerik değerlerin hatırlanması gerekmez. Doğru bir şekilde seçilen sabit adlar, "Otomatik Liste Adları" aracılığıyla bunlara hızlı bir erişim sağlayacaktır;
  • sabit değerler daha fazla değiştirildiğinde, çok sayıda nümerik değer ekinin aranması ve değiştirilmesi gerekmez. Yalnızca sabit açıklamayı değiştirmek yeterlidir.

Aşağıdaki sabitlerin kullanılması önerilir:

//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
//--- indents and spacing
#define INDENT_LEFT                         (11)      // left indent (including the border width)
#define INDENT_TOP                          (11)      // top indent (including the border width)
#define INDENT_RIGHT                        (11)      // right indent (including the border width)
#define INDENT_BOTTOM                       (11)      // bottom indent (including the border width)
#define CONTROLS_GAP_X                      (10)      // spacing along the X-axis
#define CONTROLS_GAP_Y                      (10)      // spacing along the Y-axis
//--- for labels
#define LABEL_WIDTH                         (50)      // size along the X-axis
//--- for edits
#define EDIT_WIDTH                          (50)      // size along the Y-axis
#define EDIT_HEIGHT                         (20)      // size along the Y-axis
//--- for base colors (RGB)
#define BASE_COLOR_MIN                      (0)       // minimum value of the color component
#define BASE_COLOR_MAX                      (255)     // maximum value of the color component


Ekran Panelini Doldurma

Daha önce ekran paneli sınıfını oluşturduk; şimdi gerekli fonksiyonu elde etmek için aşağıdakileri yapmamız gerekiyor:

1. Üst sınıfın Create(...) yöntemini yeniden tanımlayın. Başlangıçta, yöntemimiz aşağıdaki gibi görünecektir:

//+------------------------------------------------------------------+
//| Creation                                                         |
//+------------------------------------------------------------------+
bool CPanelDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
  {
//--- calling the method of the parent class
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))  return(false);
//--- additional controls shall be created here

//--- success
   return(true);
  }


2. Ek kontroller oluşturun.

Hafif bir lirik ara söz. Tüm ek kontrolleri oluşturmak için kodlar elbette doğrudan Create(...) yöntem gövdesine eklenebilir, ancak bu şekilde büyük bir okunamayan "yığın" alma riskiyle karşı karşıyayız.

Bu nedenle, oluşturma işlemini yöntemlerle temsil edilen bağımsız parçalara böleceğiz:

  • bool CreateColor(void) - renk paneli oluşturma,
  • bool CreateRed(void) - açıklayıcı resim yazısı ile "Kırmızı” ekran öğesini oluşturma,
  • bool CreateGreen(void) - açıklayıcı resim yazısı ile "Yeşil" ekran öğesini oluşturma,
  • bool CreateBlue(void) - açıklayıcı resim yazısıyla "Mavi" kontrolünü oluşturma.

Bu yöntemler Create(...) yönteminden ardışık olarak çağrılır:

//+------------------------------------------------------------------+
//| Creation                                                         |
//+------------------------------------------------------------------+
bool CPanelDialog::Create(const long chart,const string name,const int subwin,
                             const int x1,const int y1,const int x2,const int y2)
  {
//--- calling the parent class method
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2)) return(false);

//--- creating additional elements
   if(!CreateColor()) return(false);
   if(!CreateRed())   return(false);
   if(!CreateGreen()) return(false);
   if(!CreateBlue())  return(false);
//--- success
   return(true);
  }


Kontrollerin Oluşturulması

Her ek kontrolün oluşturulmasını gözden geçirmeyeceğiz, ancak bool CreateBlue(void) yöntemine ayrıntılı bir göz atacağız.

Bu, aşağıdaki gibidir:

//+------------------------------------------------------------------+
//| Creating the "Blue" control with explanatory caption             |
//+------------------------------------------------------------------+
bool CPanelDialog::CreateBlue(void)
  {
//--- coordinates
   int x1=INDENT_LEFT;
   int y1=INDENT_TOP+2*(EDIT_HEIGHT+CONTROLS_GAP_Y);
   int x2=x1+EDIT_WIDTH;
   int y2=y1+EDIT_HEIGHT;
//--- creating the caption
   if(!m_label_blue.Create(m_chart_id,m_name+"LabelBlue",m_subwin,x1,y1+1,x2,y2)) return(false);
   if(!m_label_blue.Text("Blue")) return(false);
   if(!Add(m_label_blue)) return(false);
//--- adjusting coordinates
   x1+=LABEL_WIDTH+CONTROLS_GAP_X;
   x2=x1+EDIT_WIDTH;
//--- creating the control
   if(!m_edit_blue.Create(m_chart_id,m_name+"Blue",m_subwin,x1,y1,x2,y2)) return(false);
   if(!Add(m_edit_blue)) return(false);
   m_edit_blue.MinValue(BASE_COLOR_MIN);
   m_edit_blue.MaxValue(BASE_COLOR_MAX);
   m_edit_blue.Value(m_blue);
//--- success
   return(true);
  }

İki nüans vardır:

  1. Kontrol göreli koordinatlarla oluşturulur, yani ofset, kontrolün oluşturulduktan sonra ekleneceği taşıyıcının (karmaşık öğe) sol üst köşesine göre ayarlanır.
  2. Oluşturmadan sonra, Add(...) yöntemini kullanarak kontrolü bir taşıyıcıya eklemek gerekir. Bizim durumumuzda, iletişim kutusu taşıyıcı görevi görür.


Parametreleri Değiştirme

Renk panelinin rengini değiştirmek için void SetColor(void) yöntemini ekleyin;

Parametreleri (temel renklerin seviyelerini) dışarıdan değiştirebilmek için üç genel yöntem ekleyeceğiz:

  • void SetRed(const int value) - "kırmızı" seviyesini değiştirir ve göstergede değişikliği görüntüler,
  • void SetGreen(const int value) - "yeşil" seviyesini değiştirir ve göstergede değişikliği görüntüler,
  • void SetBlue(const int value) - "mavi" seviyesini değiştirir ve göstergede değişikliği görüntüler.

"Göstergede değişikliği görüntüler" ifadesi, temel renk seviyesinin yeni değerinin ilgili kontroldeki nümerik formda görüntülendiği ve renk panelinin rengini değiştirdiği anlamına gelir.

Aşağıda, örnek olarak hizmet verecek yöntemlerden birinin kodu verilmiştir:

//+------------------------------------------------------------------+
//| Setting the "Red" value                                          |
//+------------------------------------------------------------------+
void CPanelDialog::SetRed(const int value)
  {
//--- checking
   if(value<0 || value>255) return;
//--- saving
   m_red=value;
//--- setting
   m_field_red.Text(IntegerToString(value));
//--- setting the panel color
   SetColor();
  }

Yukarıda anlaşıldığı gibi:

  • "Kırmızı" seviye değeri her Calculate etkinliğinde rastgele bir şekilde değişecektir;
  • "Yeşil" seviye değeri her Timer etkinliğinde rastgele bir şekilde değişecektir;

İlgili kodu orijinal göstergeye ekleyelim:

//+------------------------------------------------------------------+
//|                                               PanelIndicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_plots               0
#property indicator_buffers             0
#property indicator_minimum             0.0
#property indicator_maximum             0.0
//+------------------------------------------------------------------+
//| Include files                                                    |
//+------------------------------------------------------------------+
#include "PanelDialog.mqh"
//+------------------------------------------------------------------+
//| Global variables                                                 |
//+------------------------------------------------------------------+
CPanelDialog ExtDialog;
//+------------------------------------------------------------------+
//| Initialization                                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- creating the application dialog
   if(!ExtDialog.Create(0,"Panel Indicator",0,0,0,0,130))
      return(-1);
//--- starting the application
   if(!ExtDialog.Run())
      return(-2);
//--- creating the timer
   EventSetTimer(1);
//--- success
   return(0);
  }
//+------------------------------------------------------------------+
//| Deinitialization                                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroying the dialog
   ExtDialog.Destroy();
//--- killing the timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Iteration                                                        |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//--- changing the dialog property
   ExtDialog.SetRed(MathRand()%256);
//--- returning the prev_calculated value for the next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer event handler                                              |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- changing the dialog property
   ExtDialog.SetGreen(MathRand()%256);
  }
//+------------------------------------------------------------------+
//| Chart event handler                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- handling the event
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+


Etkinlikleri İşleme

İletişim kutusu ve Terminal arasındaki tüm etkileşim ve ayrıca iletişim kutusu kontrolleri arasındaki etkileşim etkinlik mekanizmasını temel alır. Fonksiyonlarını gözden geçirmeyeceğiz, sadece kullanacağız.

Etkinlikler geleneksel olarak iki gruba ayrılabilir:

  • Terminal etkinlik sırasını atlayarak işlenen dahili etkinlikler;
  • Terminal etkinlik sırası aracılığıyla işlenen harici etkinlikler.

Her iki etkinlik türünü de ele alacağız.

Dahili etkinlikler arasında, yalnızca iletişim kutusunu yeniden boyutlandırma etkinliklerinin işlenmesi gerekir. Bu amaçla, üst sınıfın OnResize() yöntemini yeniden yükleyin. İletişim kutusu yüksekliğinde değişiklik olmadığı için yöntemimiz basit olacaktır; iletişim kutusu genişliği değişirse, yalnızca renk paneli genişliğini değiştirmemiz gerekir:

//+------------------------------------------------------------------+
//| Resize handler                                                   |
//+------------------------------------------------------------------+
bool CPanelDialog::OnResize(void)
  {
//--- calling the parent class method
   if(!CAppDialog::OnResize()) return(false);
//--- changing the color panel width
   m_color.Width(ClientAreaWidth()-(INDENT_RIGHT+LABEL_WIDTH+CONTROLS_GAP_X+EDIT_WIDTH+CONTROLS_GAP_X+INDENT_LEFT));
//--- success
   return(true);
  }

Harici etkinliklerin listesi de bir öğeyle sınırlı olacaktır - "mavi" seviyesini değiştirme etkinliği. Harici etkinlik işleyicisinin gereksinimleri minimumdur: işleyici void türünün parametresiz sınıf yöntemi olacaktır.

Bu etkinliğin işleyicisini açıklayalım:

//+------------------------------------------------------------------+
//| Handler of the event of changing the "blue" level                |
//+------------------------------------------------------------------+
void CPanelDialog::OnChangeBlue(void)
  {
//--- saving
   m_blue=m_edit_blue.Value();
//--- setting the panel color
   SetColor();
  }

Görüldüğü gibi, bunda zor bir şey yoktur.

İletişim kutumuzun harici etkinlikleri işlemesi için üst sınıf yöntemi yeniden yüklenecektir:

virtual bool  OnEvent(const int id,const long &lparam,
                       const double &dparam,const string &sparam);

Ve şimdi biraz gizem vardır. PanelDialog.mqh dosyasını Düzenleyicide zaten açtıysanız, OnEvent(...) yöntem gövdesinin olmadığını göreceksiniz.

Kafanız karışmasın - olay şu ki, harici etkinlikleri işleme açıklaması için bir makro seti oluşturuldu (bkz. Standart Kitaplıkta <Controls\Defines.mqh> dosyası).

Etkinlik işleyicimiz aşağıdaki gibidir:

//+------------------------------------------------------------------+
//| Handling events                                                  |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CPanelDialog)
   ON_EVENT(ON_CHANGE,m_edit_blue,OnChangeBlue)
EVENT_MAP_END(CAppDialog)

İlk bakışta belirsiz olabilecek bu sahte kod aşağıdakileri yapar:

  • ON_CHANGE etkinliği m_edit_blue kontrolünden alındığında, OnChangeBlue yöntemi çağrılır ve etkinliğin işlenmesi tamamlanır (doğru verilir);
  • Başka bir etkinlik alındıktan sonra, kontrol üst sınıf yöntemine aktarılır.

Sonuç

Bu makalede, Standart Kitaplık sınıflarını kullanarak bir ekran paneli oluşturma işleminin gözden geçirilmesi sağlanmıştır.

Göstergeyi oluşturulduğu gibi kullanamazsınız, ancak gereksiz bilgilerle aşırı yüklenmemiştir ve oluştururken işlemin neredeyse tüm özelliklerini kapsamayı başardık.

Daha karmaşık standart teslimat örnekleri Terminalinizin aşağıdaki dizinlerinde bulunabilir:

  • Experts\Examples\Controls\
  • Indicators\Examples\Panels\ChartPanel\
  • Indicators\Examples\Panels\SimplePanel\

MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/345

Ekli dosyalar |
paneldialog.mqh (13.04 KB)
panelindicator.mq5 (3.38 KB)
Nesne Yönelimli Programlamanın Temelleri Nesne Yönelimli Programlamanın Temelleri
Nesne yönelimli programlamayı (OOP) kullanmak için polimorfizm, kapsülleme vb.'nin ne olduğunu bilmenize gerek yok... basit şekilde bu özellikleri kullanabilirsiniz. Bu makale, uygulamalı örneklerle OOP'nin temellerini kapsar.
MQL5 Cloud Network ile Hesaplamaları Hızlandırın MQL5 Cloud Network ile Hesaplamaları Hızlandırın
Ana bilgisayarınızda kaç çekirdek var? Bir alım satım stratejisini optimize etmek için kaç bilgisayar kullanabilirsiniz? Burada, bir fare tıklamasıyla dünya çapında bilgi işlem gücünü alarak hesaplamaları hızlandırmak için MQL5 Cloud Network’ün nasıl kullanılacağını gösteriyoruz. "Vakit nakittir" ifadesi her geçen yıl daha da güncel hale geliyor ve önemli hesaplamalar için onlarca saat hatta günlerce beklemeyi göze alamayız.
Çok Zaman Dilimli ve Çok Para Birimli Paneller Oluşturmaya Yönelik Nesne Yönelimli Yaklaşım Çok Zaman Dilimli ve Çok Para Birimli Paneller Oluşturmaya Yönelik Nesne Yönelimli Yaklaşım
Bu makale, MetaTrader 5 için çok zaman dilimli ve çok para birimli paneller oluşturmak için nesne yönelimli programlamanın nasıl kullanılabileceğini açıklar. Ana amaç, panelin kodunu değiştirmeye gerek kalmadan fiyatlar, fiyat değişiklikleri, gösterge değerleri veya özel alım/satım koşulları gibi birçok farklı veri türünü görüntülemek için kullanılabilecek evrensel bir panel oluşturmaktır.
Özel Grafik Kontrolleri. Kısım 3. Formlar Özel Grafik Kontrolleri. Kısım 3. Formlar
Bu, grafik kontrollere ayrılmış üç makalenin sonuncusudur. Ana grafik arayüz bileşeninin - form - oluşturulmasını ve diğer kontrollerle birlikte kullanımını kapsar. Kontrol kitaplığına form sınıflarının yanı sıra CFrame, CButton, CLabel sınıfları eklenmiştir.