""Yeni Çubuk" Olay İşleyicisi" makalesi için tartışma - sayfa 2

[Silindi]  

Prival:

Nadiren, ancak bir enstrüman için tekliflerin uzun süre donduğu durumlar vardır (yende böyle bir durum gördüm). Ve Uzman Danışman bu çifte takılırsa, tüm kodu OnTime() içine çevirmediyseniz başınız belada demektir.

OOP üzerinde çalışıyorsanız veya belirli algoritmalar kullanıyorsanız, kodu çevirmenize gerek kalmayacaktır. Ancak genel bakıştaki tüm çiftler için gerçek zamanlı tik almanın daha uygun olduğunu kabul edin (ve kendi başınıza bir şey icat etmeyin) ....

Lizar:

Böyle bir olay TimeCuurent() kullanılarak alınabilir, ancak bununla daha sonra ne yapılacağı, nasıl senkronize edileceği bir sorudur.

TimeCuurent() işlevinin bununla ne ilgisi var?
 
Interesting:
TimeCuurent() işlevinin bununla ne ilgisi var?

Yardım bölümünde şöyle yazıyor:

OnTick() işleyicisinde, bu fonksiyon gelen işlenmiş tikin zamanını döndürür. Diğer durumlarda (örneğin, OnInit(), OnDeinit(), OnTimer() işleyicilerindeki çağrılar vb.) bu, "Market Watch" penceresinde bulunan herhangi bir sembol için son kotasyonun geliş zamanıdır, bu pencerenin başlığında gösterilen aynı zamandır.

[Silindi]  
Lizar:

Özet şöyle:

OnTick() işleyicisinde, bu fonksiyon işlenmekte olan tikin varış zamanını döndürür. Diğer durumlarda (örneğin, OnInit(), OnDeinit(), OnTimer() ve benzeri işleyicilerde çağrı) bu, "Market Watch" penceresinde bulunan herhangi bir sembol için son fiyat teklifinin var ış zamanıdır, bu pencerenin başlığında gösterilen aynı zamandır.

Evet, açık. sadece OnTime'a koyarsak, zamanı dakikada bir defadan fazla güncelleyemeyiz ve mevcut OnTick()'e koyarsak, bazı çiftlerde (mults'ta) tikleri kaçırma riskiyle karşı karşıya kalırız.

Ve işleme bloğunda ne yapılacağı açıktır (çoklular için) - Yeni bir değer alırız, mevcut olanla karşılaştırırız ve yeni bir tik olup olmadığı sonucuna varırız.

Ama söyle bana, bunu neden Uzman Danışman'da yapalım?

 
Lizar:

Özet şöyle:

hata. işte yardımın söylediği şey https://www.mql5.com/tr/docs/basis/function/events

NewTick olayı, yalnızca Uzman Danışmanın grafiğine bağlı olduğu sembolde yeni bir tik alındığında Uzman Danışmanlar için oluşturulur.

Bir kez daha. Bazı sembollere asılı kalan bir Uzman Danışmandan bahsediyoruz. Olay tarafından tetiklenir

void OnTick() {}

Bu işlevin içindeyseniz ve bu çiftte bir saatten uzun süredir tik yoksa, bir saat içinde hiçbir şey yapamazsınız. Şimdiye kadar, tek çıkış yolu bunu bir zamanlayıcıda yapmaktır, enstrümana tiklerin gelmesine bakılmaksızın başlar.

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

Ancak bunu OnTime'a koyarsak, zamanı dakikada bir defadan fazla güncelleyemeyiz ve mevcut OnTick()'e koyarsak, bazı çiftlerin tik'lerini kaçırma riskiyle karşı karşıya kalırız (mults olarak).

Mesele de bu, olayı alabiliriz ama kullanamayız.
 
Prival:

Hata. https://www. mql5.com/ru/docs/basis/function/events adresindeki yardım bölümünde şöyle yazıyor.

Bir kez daha. Bazı sembollere asılı bir Uzman Danışmandan bahsediyoruz. Etkinlik tarafından başlatıldı

void OnTick() {}

Bu işlevin içindeyseniz ve bu çiftte bir saatten uzun süredir tik yoksa, bir saat içinde hiçbir şey yapamazsınız. Şimdiye kadar, tek çıkış yolu bunu zamanlayıcıda yapmaktır, enstrümana kenelerin gelmesine bakılmaksızın başlatılır.

Evet, bu https://www.mql5.com/tr/docs/basis/function/events çerçevesinde hareket edersek, şu anda gördüğümüz gibi en iyi seçeneğin OnTime olduğuna katılıyorum. Ancak bizi sadece tiklerin gelişine olan bağımlılıktan kurtaracaktır. Ve bizi tek iş parçacıklı olmaktan kurtarmayacaktır: bir enstrüman için bir sinyali işlerken, diğer enstrümanların işlenmesini kaçırma veya geciktirme riskimiz vardır. Bu, özellikle "alım satım emirlerinin işlenme süresi 2 ila 7 saniye arasında" + yeniden talepler olduğunda geçerlidir.

TimeCuurent() hakkında hatırladım çünkü İlginç, piyasa incelemesindeki tüm çiftler için gerçek zamanlı keneler hakkında konuşmaya başladı.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
[Silindi]  
Güzel makale, teşekkürler.
 
Teşekkürler
 

Çok ilginç bir makale. Tüm bunları paylaştığınız için teşekkür ederim.

Ancak, bazı açıklamalar:

Bu işlev hakkında konuşurken, diyorsunuz ki :

If you call this prototype function from one place, then we have what we need. But if we want to use this function, for example, again in another place in the same calculation loop, it will always return false, which means that there is no bar. And this will not always be true. Static variable in this case imposes an artificial limit on the number of prototype function calls.

  • Haklısınız. Ancak isnewbar() gibi bir fonksiyonu 1 tik sırasında birkaç kez çağırmak kötü bir uygulamadır. Sadece bir kez çağırın ve sonucu bir değişkende tutun.
  • Sorun şu ki, statik değişkeni olmayan bir sınıf kullanarak sağladığınız çözüm, vurguladığınız şeyi çözmüyor. Ve hatta durum şimdi daha da kötü. Sınıfınızın örneğini global bir değişken (nesne) olarak bildirmek zorundasınız, ayrıca bunu OnInit() üzerinde ilklendirmek zorundasınız. Sınıfınızı kullanacakolan kişi işlemi bilmelidir:
  1. Her zaman global bir değişkenkullanın
  2. Sembol ve periyot varsayılanolsa bileher zaman başlatın (zaman grafiği için).
  • Son olarak, "bu fonksiyonu, örneğin aynı hesaplama döngüsünde başka bir yerde tekrar kullanmak istersek". Yine de HER ZAMAN YANLIŞ DÖNER.

Statik bir yerel değişkeni aynı olan global bir değişkenle değiştirdiniz ve sorununuzu çözmediniz.


Yine de, makaleniz düşünmeye itecek ve ilginç fikirler sunacak değere sahip.

[Silindi]  

Güzel makale, paylaşım için teşekkürler! Tüm bunlar çok faydalı oldu!

Her neyse, isNewBar fonksiyonunuzu aldım ve derlerken aşağıdaki mesajı atıyor:" tür dönüşümü nedeniyleolası veri kaybı ".

Bu yüzden var türlerini datetime'dan long'a bu şekilde değiştirdim:

//+------------------------------------------------------------------+
//| Bir sembol/periyot çifti için yeni bir çubuk oluşmuşsa true döndürür |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//--- son çubuğun açılış zamanını statik değişkende hafızaya al
   static long last_time=0;
//--- geçerli saat
   long lastbar_time=SeriesInfoInteger(CurrencyPair,Period01,SERIES_LASTBAR_DATE);

//--- eğer fonksiyonun ilk çağrısı ise
   if(last_time==0)
     {
      //--- zamanı ayarlayın ve çıkın
      last_time=lastbar_time;
      return(false);
     }

//--- zaman farklıysa
   if(last_time!=lastbar_time)
     {
      //--- zamanı hafızaya al ve true döndür
      last_time=lastbar_time;
      return(true);
     }
//--- eğer bu satırı geçtiysek, çubuk yeni değildir; false döndür
   return(false);
  }

Şimdi herhangi bir uyarı olmadan derleniyor ve iyi çalışıyor gibi görünüyor. Teşekkür ederim!


Documentation on MQL5: Language Basics / Data Types / Typecasting
  • www.mql5.com
Language Basics / Data Types / Typecasting - Documentation on MQL5