"MQL5 Tarif Defteri Gösterge Alt Pencere Kontrolleri - Düğmeler" makalesi için tartışma - sayfa 4

 
DC2008:

Ve "düğme işlevlerinin OnInit işlevine yerleştirildiği" gerçeği çok komik!

Ancak, belki de neden bahsettiğimizi anlamıyorsunuz? Bir düğmeye basarsanız, bazı mikro görevleri yerine getirmek için bazı kullanıcı işlevleri tetiklenmelidir.

 
DC2008:

Pekala, biraz gülelim. Yazı sizin tarafınızdan yazıldı, "kimse dilinizi çekmedi".

Dolayısıyla, açıklanamayanlar için alıntı şeklinde açıklama en azından okuyucularınıza saygılı değil. Sorular örneklerle ve birincil kaynaklara bağlantılarla cevaplanmalıdır.

Gereksiz fonksiyonlarla kafa karıştırıcı ve aşırı yüklü kod sadece "yeni başlayanları" yanlış yönlendirir.

Ve "düğme işlevlerinin OnInit işlevine yerleştirildiği" gerçeği çok komik!

Kimse sizi dilinizden çekmedi. Bana kanıt verecek misin? Ya da daha doğrusu, ifademe bir yalanlama? Bilginiz olsun, henüz her şey El Kitabında açıklanmadı. Demek istediğim, el kitabı üzerindeki çalışmalar devam ediyor, eklemeler ve düzeltmeler yapılıyor. Her zaman her şeyi kendiniz kontrol etmelisiniz.

İnanın bana, makalenizdeki kod yeni başlayanlar için çok daha "kafa karıştırıcı" ve sadece bu değil, makalenizin tartışmasında da görülebilir.

Ancak, belki de neden bahsettiğimizi anlamıyorsunuz? Bir düğmeye tıklarsanız, bazı mikro görevleri yerine getirmek için bazı kullanıcı işlevleri tetiklenmelidir.

Evet, kelimesi kelimesine anladım. Sorularınızı daha açık bir şekilde sorun. Ancak bugün böyle bir işleviniz varmış gibi göründüğü için cevabımın sizin tarafınızdan alaya alınacağını tahmin ediyorum.

Bu durumda "mikro görev" düğmenin rengini değiştirmekti. Gereksiz bir şey olmaması için bilerek herhangi bir ekstra özellik eklemedim. Sadece kodu aşırı yüklemekten kaçınmak için.

Aslında makalenin konusu sadece butonlarla sınırlı değil. Çoğunluğu grafik olayları ile ilgili. Böyle birkaç örnek var, bu yüzden bir tane yazmaya karar verdim.

 

Sayın makale yazarı, bunu benim için değil, yeni başlayanlar için yazmışsınız. Aslında, çözümlerinizle ilgilenmiyorum, ancak dili yeni tanımaya başlayanlardan bahsediyoruz. Hangi "diğer programlardan" bahsediyoruz? Ve bir programın OnDeinit fonksiyonu diğer programların fonksiyonlarını nasıl etkileyebilir?

Bir makaleyi tartışıyoruz ve siz neden bu kadar öfkelisiniz?

Soruları benim için değil, yeni başlayanlar için yanıtlamaya çalışın - böylece neden ve nasıl olduğunu anlasınlar.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
DC2008:

Sayın makale yazarı, bunu benim için değil, yeni başlayanlar için yazdınız.

Kesinlikle öyle.

Aslında, sizin çözümlerinizle ilgilenmiyorum, ancak dili yeni tanımaya başlayanlardan bahsediyoruz.

Ama sorular soruyorsunuz.

Hangi "diğer programlardan" bahsediyoruz?

Daha önce bağlantılarını verdiğiniz programlardan. Ve bir kanıt sunmadan ipuçlarıyla ifadelerimi çürütmeye çalışıyorsunuz.

Peki bir programın OnDeinit fonksiyonu diğer programların fonksiyonlarını nasıl etkileyebilir?

Etkiliyor. Bunun hakkında yazmıştım. Makaleyi yayınlayan editör bunu doğruladı. Siz de kontrol edebilir ve kendiniz görebilirsiniz.

Makaleyi tartışıyoruz ve siz neye bu kadar kızıyorsunuz?

Hiçbir şeye. İddiamı çürütecek bir cevap bekliyorum. )

Soruları benim için değil, yeni gelenler için yanıtlamaya çalışın - böylece neden ve nasıl olduğunu anlasınlar.

Şu ana kadar yeni gelenlerden hiç soru gelmedi. Ve soru da olamaz. Her şey çok açık ve her kod satırı ayrıntılı olarak yorumlanmış.

 

Önce bunu sıkıştırıyoruz:

void OnTimer()
  {
//--- Fare olay izlemenin etkin olup olmadığını kontrol edin
   //CheckChartEventMouseMove();

  }

yani şimdi fare olaylarını takip etmiyoruz, değil mi?

Kodunuzu grafik üzerinde çalıştırın:

şimdi "başka bir program" çalıştırıyoruz, bu yine sizin kodunuz olsun:

Sanırım bir şeyler ters gitti? Yoksa yapmamız gereken bu mu?

şimdi göstergelerden birini siliyoruz ve kodun yazarına göre "fare takibini" kaybettik, ancak bu gerçekleşmiyor:

 
C-4:

Eğer siz uygun değilseniz, kim uygun bilmiyorum? Danald Knuth? Bill Gates mi?

Sadece bir iltifat almaya çalışıyordum. İşe yaradı.)

C-4:
Anlıyorum. Ancak açık olmayan şey, sizin tarafınızdan yaratılan Pazarın önde gelen ürünlerinin size ait olmadığıdır. Bu utanç verici değil mi?

1. Henüz akşam olmadı)

2. Panoyla kıyaslanamayacak kadar olmasa da el becerilerim de sürekli zirvede.

3. Panonun başarısı büyük ölçüde fikir sahibinin çabalarından kaynaklanıyor, bu nedenle benim ürünüm olduğunu söylemek yanlış olur.

4. Ücretsiz çalışmadım)

 
DC2008:

...

şimdi göstergelerden birini siliyoruz ve kodun yazarına göre "fare takibini" kaybettik, ancak bu gerçekleşmiyor:

Şimdi göstergelerde OnDeinit() olayının tetiklenip tetiklenmediğini kontrol edin. Bu daha önce bahsettiğim ilginç nokta. :) Yani OnDeinit() içinde, makaledeki örnekte, hareket izleme olayı devre dışı bırakılır. Bazı derlemelerden beri OnDeinit() indikatörlerde çalışmayı durdurmuş gibi görünüyor. Bu bir hatadır ve geliştiricileri bilgilendirmeliyiz.

Ayrıca, ifademin doğru olduğundan emin olmak için, bu kod satırını (vurgulanmış) eklemenin yeterli olduğu boş bir Uzman Danışman ( OnDeinit() işlevi Uzman Danışmanlarda çalışır) yapmamız gerekir:

//+------------------------------------------------------------------+
//|TEST.mq5 |
//| Telif Hakkı 2013, MetaQuotes Software Corp. | |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Özel gösterge başlatma işlevi |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Uzmanın başlangıçtan çıkarma işlevi |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Fare olayı izlemeyi devre dışı bırak
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
//| OnTick|
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+

//---

Ve şimdi, makaledeki gösterge grafik üzerindeyken Uzman Danışmanı kaldırırsanız, hareket olayının izlenmesi göstergede de devre dışı bırakılacaktır.

Bunun hakkında:

bir şeyler ters gitmiş olmalı mı yoksa bu şekilde mi tasarlandı?

Bu biliniyor. Bu şekilde tasarlanmadı, sadece bu makalede dikkate alınmadı. Makale, her zaman olduğu gibi, basit bir örnektir, tüm durumlar için hazır bir çözüm değildir. )

 
Sergey, yaygara yapma. Örneğin, neden bir zamanlayıcı kullanmam gerektiği benim için açık değildi. Ancak birkaç dakika içinde makalede bir açıklama buldum ve hemen her şeyi anladım. Bu ifadeyi pratikte kontrol etmedim, ancak bu konuda yazara güveniyorum, bunu bir nedenle yazdığını ve zamanlayıcı tanıtıldıysa bunun nedenleri olduğunu fark ettim.
 
void OnDeinit(const int reason)
  {
//--- Fare olayı izlemeyi devre dışı bırak
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }

Genel olarak, bu kod çok sorunlu görünüyor. Uzman Danışmanı/göstergeyi devre dışı bırakırken fare hareketi izlemeyi kapatmak için gerçek bir neden yoktur. Bu kadar çok uğraşmak istiyorsanız, Uzman Danışman başlatılmadan önce var olan durumu geri yüklemelisiniz:

bool mouseStatus;
void OnInit()
  {
  mouseStatus = ChartGetInteger(0,CHART_EVENT_MOUSE_MOVE);
  }

void OnDeinit(const int reason)
  {
   //--- Fare olayı izlemeyi devre dışı bırak
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,mauseStatus);
  }
 
C-4:

Genel olarak, bu kod oldukça sorunlu görünüyor. Uzman Danışmanı / göstergeyi devre dışı bırakırken fare hareketi izlemeyi kapatmak için gerçek bir neden yoktur.

Hayır, yanılıyorsunuz. Fare izlemeyi devre dışı bırakmak için gerçek nedenler var. Ve şimdi bunu kanıtlayacağım. )

Örneğin, bir grafik üzerinde çalışan iki programınız var. Fare hareketi olayını izlemeniz gereken Uzman Danışman. Ve fare hareketi olayını izlemeniz gerekmeyen, ancak diğer bazı grafik olaylarını izlemeniz gereken bir gösterge.

Şimdi Uzman Danışmanın bu kodunu çalıştırın:

#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Özel gösterge başlatma işlevi |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Fare olayı izlemeyi etkinleştir
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Uzmanın başlangıçtan çıkarma işlevi |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Fare olayı izlemeyi devre dışı bırak
   //ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
//| OnTick|
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+
//| ChartEvent fonksiyonu|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Fare hareketini ve sol fare düğmesine basmayı izleme
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static int count=1;
      Print("CHARTEVENT_MOUSE_MOVE; EXPERT; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

İçinde, başlatma sırasında, OnInit() işlevinde, fare hareketi olayının izlenmesi etkinleştirilir. Ancak, bu izlemenin devre dışı bırakılması gereken OnDeinit() işlevindeki satır kasıtlı olarak yorumlanmıştır.

Göstergeyi grafik üzerine de yükleyin. İşte kodu:

#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Özel gösterge başlatma işlevi |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Uzmanın başlangıçtan çıkarma işlevi |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Özel gösterge yineleme işlevi |
//+------------------------------------------------------------------+
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[])
  {
//---
   
//--- sonraki çağrı için prev_calculated değerini döndürür
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent fonksiyonu|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Fare hareketini ve sol fare düğmesine basmayı izleme
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static long count=1;
      Print("CHARTEVENT_MOUSE_MOVE; INDICATOR; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

Hem birinci hem de ikinci program, günlüğe olayın alındığına dair bir mesaj yazdırır. Şimdi Uzman Danışmanı grafikten kaldırın. Onun yardımıyla bazı hesaplamalar yaptığınızı ve artık ona ihtiyacınız olmadığını varsayalım. Kaldırıldıktan sonra, fare hareketi izleme olayı devre dışı bırakılmadığından, gösterge bu olayı almaya devam eder. Ve sizin buna ihtiyacınız yok.

Şimdi aynı fikirde misiniz? )