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.
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çinson kotasyonun geliş zamanıdır, bu pencerenin başlığında gösterilen aynı zamandır.
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çinson 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?
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.
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).
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ı.
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şiişlemibilmelidir:
Her zamanglobal birdeğişkenkullanın
Sembol ve periyotvarsayılanolsa bileher zamanbaş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,makalenizdüşünmeyeitecekveilginç fikirlersunacakdeğere sahip.
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 alstaticlong last_time=0;
//--- geçerli saatlong lastbar_time=SeriesInfoInteger(CurrencyPair,Period01,SERIES_LASTBAR_DATE);
//--- eğer fonksiyonun ilk çağrısı iseif(last_time==0)
{
//--- zamanı ayarlayın ve çıkın
last_time=lastbar_time;
return(false);
}
//--- zaman farklıysaif(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ürreturn(false);
}
Şimdi herhangi bir uyarı olmadan derleniyor ve iyi çalışıyor gibi görünüyor. Teşekkür ederim!
MQL5.com web sitesine giriş yapmak için çerezlerin kullanımına izin vermelisiniz.
Lütfen tarayıcınızda gerekli ayarı etkinleştirin, aksi takdirde giriş yapamazsınız.
Hesabınıza giriş yaptınız. İki faktörlü kimlik doğrulama devre dışı bırakıldı. Yeniden kurup yeni bir QR kodu tarayın veya iki faktörlü kimlik doğrulama devre dışıyken devam edin.
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.
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?
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.
Ö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?
Ö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.
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).
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ı.
Ç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.
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.
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:
Şimdi herhangi bir uyarı olmadan derleniyor ve iyi çalışıyor gibi görünüyor. Teşekkür ederim!