MQL ile yazılmış kullanıcı arayüzleri galerisi - sayfa 69

 
Maxim Kuznetsov proje hangi cehennemde?

Orada bir şeyin deposu (IMHO'nun kaynak kodu olarak adlandırılması zor ) ve dokümantasyon

Neden arıyorsunuz, arıyorsunuz ve bulamıyorsunuz))). Proje, kurulum talimatları ile birlikte şube sayfalarında. Size tam sayfayı söylemeyeceğim, geri kaydırın.

Bir sonraki sürüm kodobase'de yayınlanacaktır. İsterseniz biraz bekleyebilirsiniz.
 

Eleman çerçevelerinin rengini programlı olarak değiştirme ve bunları parametre değerleriyle ilişkilendirme özelliği eklendi. Bu, girilen değerlerin risk seviyesini hızlı bir şekilde anlamaya yardımcı olan bilgilendirici ve kullanışlı bir göstergedir. Pratik ve net olduğu ortaya çıktı. Ayrıca, belirlenen limitlerin aşılması durumunda uyarı pencereleri görünür.

Birkaç örnek:


Yarın örneklerle ve kodla üzerinden geçeceğiz.

 
Yeni bir sayfayla başlayalım.
 

Kademeli parametre sınırı koruması ve kullanıcı uyarılarının uygulanması konusuna devam etmeden önce, bundan hemen önce gelen başka bir konudan bahsetmeliyiz. Yani, parametre ön ayarı.

İyi bilinenle başlayacağım: çoğu MQL programında giriş kategorisinde değişkenler bulunur. Bunlar global seviyede beyan edilir ve tek bir ayar penceresinde görülebilir. Bu pencere programın başlangıcında görünür ve eğer böyle bir ihtiyaç ortaya çıkarsa kullanıcı "harici" değişkenlerin başlangıç değerlerini değiştirebilir. Ancak bundan önce, kullanıcı harici değişkenleri programın içinde başlatır. Mesele şu ki, program ön ayarları evrensel değildir ve bu nedenle her başlangıçta ayarlama imkanı gerektiren bir değişken kategorisi vardır. Ayrıca, programın yürütülmesi sırasında harici değişkenlere manuel olarak erişme girişiminin imkansız olduğu ve yeniden başlatma gerektirdiği de bilinmektedir. Grafiksel bir arayüz ile bu gereklilik ortadan kaldırılmıştır. Program ayarları çalışma zamanında açılabilir.

Bununla birlikte, başlangıçta program parametrelerine başlangıç değerlerini ayarlamak için hala aynı gereklilik vardır.

Eğer bir grafik arayüzümüz varsa , girdi tipindeki değişkenleri bildirmenin bir anlamı yoktur , çünkü artık standart ayarlar penceresine ihtiyacımız yoktur , ancak özü aynı kalır. Girdi değişkenleri yerine, kontrollerin parametrelerine başlangıç değerleri ayarlamalıyız.

Programın başlatılmasında , başlangıç değerlerini standart pencereye değil , kendi pencerelerimize ayarlayan bir işlev çağırmalıyız. Bir seçenek olarak, bu, arayüz oluşturma aşamasında, V_CURRENT değerleri veya ON/OFF durumları vb. ayarlandığında KIB-yapıcıda yapılabilir, ancak şimdi öğeleri programlı olarak başlatmak mümkündür. Artık elemanların yapıcıda ve programda başlatılmasını birleştirmek mümkündür.

Bu nedenle, bu işi yapmak için OnInit() 'ten çağrılan özel bir fonksiyona ihtiyacımız var.

Bu fonksiyon tam olarak ne yapacaktır:

  • Programın başlangıcında gerekli pencereleri açın.
  • Hedef kontrollerdeki değerleri ayarlayın.

Bu fonksiyon nasıl çağrılacak?

Ben buna Initialize() derdim, ancak herkes kendi varyantını bulabilir.

Önemli olan, bu işlevin herhangi bir arayüz Uzman Danışmanında olması gerektiğidir. Bir Uzman Danışmanın OnTick () işlevi veya bir göstergenin OnCalculate () işlevi ile karşılaştırılabilir. Bunu anlamak önemlidir.


İşlev hangi değeri döndürecek?

İşlev void türüne sahip olacaktır. Bir değer döndürmeye gerek yoktur. Çağrıldığında, gerekli pencereleri açacak, öğelerin parametrelerini başlatacak ve muhtemelen bazı özellikleri önceden ayarlayacaktır. Temelde hepsi bu kadar. Teorik olarak, içinde ilk parametre sınırlarını ayarlayabilirsiniz, ancak değer kontrolünün API dosyasından ve zamanlayıcıdan eleman olaylarında çağrılan ayrı bir işlevde uygulanacağını düşünüyorum. Muhtemelen bir sonraki sürümde kontrol çağrılarının bir çıktısını yazacağım.

*Şu anda arayüz Uzman Danışmanları kavramının yeni oluşmakta olduğunu ve önümüzde birçok keşif olduğunu dikkate almak önemlidir.


İşte mevcut demo projesi bağlamında bir arayüz Uzman Danışmanının başlatma işlevinin bir örneği:

1. İşlev çağrısı:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int _OnInit()
  {
   //------------------------------------------------
   //Initializing program interface:
   //------------------------------------------------
   Initialize();
   //------------------------------------------------


2. Fonksiyon uygulaması:

void Initialize()   
{
   //------------------------------------------------
   //Opening the windows:
   //------------------------------------------------
   //1. "Main Parameters". 

    w_14_Main_Parameters();
   //------------------------------------------------

   //------------------------------------------------
   //2. "Input parameters".

   w_10_Input_parameters();
   //------------------------------------------------

   //------------------------------------------------
   //3. "Setting example 1"

   w_6_Settings_example_1();
   //------------------------------------------------


  //------------------------------------------------
  //Initializing the elements:
  //------------------------------------------------
  
   w6_d_p5_S_EDIT_Spin_the_value(55);

   w6_i_p3_H_SLIDER_Roll_the_value(55);

   w14_i_p3_V_SLIDER_Vertical_slider(55);

   w14_s_p4_EDIT_Max("100");

   w14_s_p4_EDIT_Min("0");

   w14_s_p4_EDIT_Selected("55");

   w15_i_p2_P_BAR_P1(55);

   w15_s_p4_VALUE_V1("55");
  //------------------------------------------------
}


Şimdiye kadar, fonksiyonun yapısını aşağıdaki gibi görüyorum. Çok basit bir işlev. Pencereleri açar ve eleman parametrelerine gerekli değerleri gönderir. Elemanların başlatılmasını ve pencerelerin açılmasını yer yer değiştirmek mümkündür, çünkü pencereleri açmak, ek yeniden çizim yapmadan elemanların gerekli değerlerini hemen gösterecektir. Ancak, bunlar küçük şeylerdir.


O zaman ana konuya geçelim: parametrelerin adım adım korunmasının uygulanması.

 

14.Parametre sınırlarının adım korumasının gerçekleştirilmesi:

  • 1. Önceden ayarlanmış sınırlardaki ayarları kontrol etmek ve bir uyarı sistemi oluşturmak için mantık yazmak.
  • 2. İlk uyarı: kullanıcı, ayarlardan sorumlu öğelerin parçalarının renginin değişmesi şeklinde bir sinyal alır.( Metin, taban, çerçeve vekaydırma çubuğunun rengini değer sınırlarına bağlayalım ).
  • 3. İkinci uyarı: bir risk bildirimi ve orijinal ayarlara dönme önerisi içeren bir diyalog kutusunun açılması.("İptal" düğmesine tıklandığında önceki ayarlara dönme olasılığını test edelim).
  • 4. üçüncü uyarı: ayarların daha fazla değiştirilmesini engelleyen ve kullanıcının manuel onayını gerektiren bir uyarı penceresinin açılması.(Uyarı penceresi göründüğünde pencerelerin ve öğelerin engellenmesini kontrol edelim).

//------------------------------------------------------------------------------------------------------------

Ayarları önceden belirlenmiş sınırlar içinde kontrol etme mantığını yazmak ve bir uyarı sistemi oluşturmak:

  • Uygulamanın ilk kısmı, seçilen elemanların parametrelerinin başlangıç değerlerini ayarlamak ve gerekli pencereleri açmaktır. Bunu yapmak için Initialise() fonksiyonunu yazacağız ve çağrısını _OnInit() fonksiyonuna koyacağız.
  • Uygulamanın ikinci kısmı - API dosyasını açalım ve elemanların bağlantısını yazalım. Ortak zincirdeki her bir eleman için çağrılar yazacağız ve değeri diğer hedef elemanlara aktaracağız. Örneğin: düğmeli alanın olayında yatay kaydırıcıyı çağırıyoruz ve değeri ona aktarıyoruz. Ardından, olay kaydırıcı durumuna geldiğinde, değeri düğmeli alana ve ek olarak dikey kaydırıcıya geri iletiriz. Sonuncusu da değeri kendi yanındaki giriş alanlarına ve ilerleme çubuğu penceresine aktarır.... Sonuç olarak, zincirde değeri çeşitli yönlere aktaran yedi ana unsur olacaktır. İşte bunlar:"Değeri döndür" ve"Değeriyuvarla" öğeleriyle"Ayarlar örneği 1","V_SLIDER","Seçili" alanı ve"Yüzde" öğeleriyle"Ana parametreler" ve VALUE ve P_BAR öğeleriyle"Verilerin işlenmesi..." .
  • Üçüncü Bölüm: Bağlantıyı test edin.
  • Dördüncü bölüm: Koşullu bir isimle parametre kontrolü fonksiyonu yazalım: void Risk_management_group_1(). Görevi, kullanıcıyı bu eleman grubu içindeki tehlikeli değerlerin sınırlarına yaklaştığı konusunda uyarmak ve izin verilen sınırlar aşıldığında uyarmaktır. Fonksiyon, ilgili elemanlardan değerleri kabul edecek ve bunları koşulların içindeki set filtrelerinden geçirecektir. Uyarıyı uygun risk seviyelerinde metin ve çerçeve rengi değişiklikleriyle uygulayacağız ve zincirin tüm elemanlarına göndereceğiz. Buna paralel olarak, kullanıcının ek onay olmadan eyleme devam etmesine izin vermeyen engelleme pencerelerini çağıracağız.
  • Beşinci bölüm: fonksiyonun çalışmasını test edelim.

//-----------------------------------------------------------------------------

Devam edelim:

1. Seçilen elemanların parametrelerinin ilk değerlerini ayarlayın ve gerekli pencereleri açın. Bunu yapmak içinInitialise() fonksiyonunu yazalım ve _OnInit() fonksiyonu içinde çağıralım.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int _OnInit()
  {
   //------------------------------------------------
   //Initializing program interface:
   //------------------------------------------------
   Initialize();
   //------------------------------------------------
void Initialize()   
{
   //------------------------------------------------
   //Opening the windows:
   //------------------------------------------------
   //1. "Main Parameters". 
    w_14_Main_Parameters();

   //2. "Input parameters".
   w_10_Input_parameters();

   //3. "Setting example 1"
   w_6_Settings_example_1();

   //------------------------------------------------
  //Initializing the elements:
  //------------------------------------------------
   w6_d_p5_S_EDIT_Spin_the_value(55);
   w6_i_p3_H_SLIDER_Roll_the_value(55);
   w14_i_p3_V_SLIDER_Vertical_slider(55);
   w14_s_p4_EDIT_Max("100");
   w14_s_p4_EDIT_Min("0");
   w14_s_p4_EDIT_Selected("55");
   w15_i_p2_P_BAR_P1(55);
   w15_s_p4_VALUE_V1("55");
  //------------------------------------------------
}

Sonuç: Gerekli pencereler açılır ve hedef elemanlara ilk değerler atanır.


2. API dosyasını açın ve elemanların bağlantısınıyazın.Her eleman durumunda, çağrıları yazın ve değeri zincirdeki diğer hedef elemanlara geçirin :

case Settings_example_1___Spin_the_value:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when the value is set?
               //------------------------------------------------------------------------------------------------------
               //Min value:  NOT SET  |   Max value:  NOT SET  |   V_step:  1.7  |   Default value:  468.99  |  Digits: 3
               //------------------------------------------------------------------------------------------------------
               w6_i_p3_H_SLIDER_Roll_the_value((int)value);

               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
case Settings_example_1___Roll_the_value:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when the slider's handle is moved?
               //------------------------------------------------------------------------------------------------------
               //Min value:  0  |   Max value:  100  |   V_step:  1  |   Default value:  55  |  Digits: Integer value
               //------------------------------------------------------------------------------------------------------
               //Transferring the value:
               w14_i_p3_V_SLIDER_Vertical_slider((int)value);

               w6_d_p5_S_EDIT_Spin_the_value((double)value);
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
case Main_Parameters___Vertical_slider:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when the slider's handle is moved?
               //------------------------------------------------------------------------------------------------------
               //Min value:  0  |   Max value:  100  |   V_step:  1  |   Default value:  50  |  Digits: Integer value
               //------------------------------------------------------------------------------------------------------
               {
                //----------------------------------------------------- 
                //Transferring value to other destinations:
                //----------------------------------------------------- 
                w14_s_p4_EDIT_Percent(value);
                //-----------------------------------------------------
                w14_s_p4_EDIT_Selected(value);
                //-----------------------------------------------------
                w15_i_p2_P_BAR_P1((int)value);
                //-----------------------------------------------------
                w15_s_p4_VALUE_V1(value);
                //-----------------------------------------------------
                w6_i_p3_H_SLIDER_Roll_the_value((int)value);
                //-----------------------------------------------------
                w6_d_p5_S_EDIT_Spin_the_value((double)value);
                //-----------------------------------------------------
                w8_s_p4_CELL_Account_balance__Value(value);
                //------------------------------------------------------------------------------------------------------
                //Your comment:
                //------------------------------------------------------------------------------------------------------
               }
               break;


3. Bağlantıyı test edin:

Sonuç: eleman değerleri amaçlandığı gibi bağlanmıştır.



4. Eleman grubumuzun parametrelerini kontrol etmek için bir fonksiyon yazın: void Risk_management_group_1().

void Risk_management_group_1(string value)
{
 uint Color = 0;
 //--------------------
 static uint This_color;
 static bool User_warned, Last_warning;
 //------------------------------------------------------------
 //Setting limit colors:
 //------------------------------------------------------------
 if((int)value < 25)                      Color = clrLightGreen;
 //------------------------------------------------------------
 if((int)value >= 25 && (int)value < 50)  Color = clrLimeGreen;
 //------------------------------------------------------------
 if((int)value >= 50 && (int)value < 70)  Color = clrGreen;
 //------------------------------------------------------------
 if((int)value >= 70 && (int)value < 85)  Color = clrDarkGreen;
 //------------------------------------------------------------
 if((int)value >= 85 && (int)value < 90)  Color = clrBrown;
 //------------------------------------------------------------
 if((int)value >= 90 && (int)value < 95)  Color = C'170,0,0';
 //------------------------------------------------------------
 if((int)value >= 95 && (int)value <=100) Color = clrRed;
 //------------------------------------------------------------  

 //------------------------------------------------------------ 
 //Changing colors when the limits are passed:
 //------------------------------------------------------------
 if(This_color != Color)
   {
    w14_s_p4_EDIT_Percent((string)Color, p4_COLOR_base); 
    //-----------------------------------------------------
    w14_s_p4_EDIT_Selected((string)Color, p4_COLOR_base); 
    //-----------------------------------------------------
    w15_i_p2_P_BAR_P1(Color, p2_COLOR_bar);
    w15_i_p2_P_BAR_P1(Color, p2_COLOR_frame);
    w15_s_p4_VALUE_V1((string)Color, p4_COLOR_frame);
                   
    w8_s_p4_CELL_Account_balance__Value((string)Color, p4_COLOR_text);
    w8_s_p4_CELL_Account_balance__Value((string)Color, p4_COLOR_frame);
    //-----------------------------------------------------
    w14_i_p3_V_SLIDER_Vertical_slider(Color,p3_COLOR_bar);
    //-----------------------------------------------------
    w15_s_p4_VALUE_V1((string)Color, p4_COLOR_text);
    //-----------------------------------------------------
    w6_i_p3_H_SLIDER_Roll_the_value(Color,p3_COLOR_bar);
    //-----------------------------------------------------
    w6_d_p5_S_EDIT_Spin_the_value((double)Color, p5_COLOR_text);
    //-----------------------------------------------------
    w6_d_p5_S_EDIT_Spin_the_value((double)Color, p5_COLOR_frame);
    //-----------------------------------------------------
    w14_i_p1_BUTTON_BUY_OFF(Color, p1_N_COLOR_frame);
    w14_i_p1_BUTTON_BUY_OFF(Color, p1_A_COLOR_frame);
    //-----------------------------------------------------
    w14_i_p1_BUTTON_SELL_OFF(Color, p1_N_COLOR_frame);
    w14_i_p1_BUTTON_SELL_OFF(Color, p1_A_COLOR_frame);
    //-----------------------------------------------------
    w7_s_p4_EDIT_Comment_1(Color, p4_COLOR_frame);
    //-----------------------------------------------------
    This_color = Color;
    //-----------------------------------------------------
   }   
 //-----------------------------------------------------
 //Opening warning window 1:
 //-----------------------------------------------------
 if((int)value >= 85 && (int)value < 95 && !User_warned)
   { 
    //---------------------------------
    //Opening dialog window:
    //---------------------------------
    w_13_Risky_managment(); 
    //---------------------------------
    //Setting flag of warning 1:
    //---------------------------------
    User_warned = true;
    //---------------------------------
   }
 //-----------------------------------------------------
 if((int)value < 85)User_warned = false;
 //-----------------------------------------------------
 //Opening warning window 2:
 //-----------------------------------------------------
 if((int)value >= 96 && !Last_warning)
   { 
    //---------------------------------
    //Calling blocking window:
    //---------------------------------
    w_17_Last_warning();
    //---------------------------------
    //Setting flag of warning 2:
    //---------------------------------
    Last_warning = true;
    //---------------------------------
   }
 //-----------------------------------------------------
 if((int)value < 95)Last_warning = false;                
 //-----------------------------------------------------                 
}

Risk_management_group_1() fonksiyonunu _OnInit() fonksiyonundan çağırın:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int _OnInit()
  {
   //------------------------------------------------
   //Initializing program interface:
   //------------------------------------------------
   Initialize();
   //----------------------------------------------------------
   //Checking default value of the parameters in the group:  
   //----------------------------------------------------------
   Risk_management_group_1();
   //----------------------------------------------------------
 

Sonuç: amaçlandığı gibi çalışıyor, ancak giriş alanına bir değer girerken, uyarı penceresi göründüğünde girilen değeri sıfırlamıyor(iyileştirme gerektiriyor).

(*Ayrıca - çerçeve renginin ayarlanması güncellemede eklendi, ancak mevcut sürümde eksik).


 

Bir sonraki görev, "İptal" düğmesine basarak girilen parametreleri iptal etmeyi düşünmektir.

Bu çok zor bir görev, ancak zaten kısmen uyguladım. Önceki işlevselliği geri getirmeye çalışacağım.