Init() ve DeInit() yürütme sırası - sayfa 2

 
Alexey Viktorov :

Bu sorun 2 parmak gibi çözüldü...

OnDeinit'te nesneyi silmeden önce başlatmadan arındırma nedeninin koşulunu ayarlamak gerekir... Dönem değişikliği DEĞİLSE, nesneyi silin. VE HERŞEY...


Evet, TF'yi değiştirirken bazı nesneleri veya kaynakları silemiyorum, kaynak nesnesi aracılığıyla bazı küçük dizileri bile kaydedebiliyor ve TF'nin değiştiğini kaynak bilgisine yazabiliyorum, ancak işin gerçeği şu ki Deunit başlayabilir Birim yeni zaman diliminde tamamlandıktan sonra yürütülüyorsa, bir zaman dilimi değişikliği olduğunu ve eski verilerin okunması gerektiğini birime nasıl söylemeliyim, bu yüzden teflerle izleme işlevleri oluşturmanız ve artık beklememeniz gerekiyor Birim, ancak OnTimer'da. Bu çarpık ya da başka bir şey değil mi?
 
Slawa :

Hangi mantık bozulur?

Zaman çerçevesini değiştirirken, önceki kopya hakkında hiçbir şey bilmeyen göstergenin yeni bir kopyası oluşturulur. Bir süredir (çok kısa) göstergenin her iki kopyası da paralel olarak mevcuttur. Ardından önceki kopya kaldırılır.

Belgeleri okuyun https://www.mql5.com/ru/docs/runtime/running


Linkteki açıklamayı okudum ama verdiğiniz gibi bir bilgi bulamadım. Ve eğer bu doğruysa, o zaman bu gösterge geliştiricileri için büyük bir problemdir. Zaman çerçevesini değiştirirken böyle bir göstergelerin yeniden yüklenmesi mantığının kabul edilmesi çok garip ve çok kötü. Neden aynı göstergenin iki kopyası bellekte var? Kimler için uygundur? Ne veriyor? Sonuçta, önce göstergenin bir kopyasının yürütülmesini tamamlamak, boşaltmak ve ancak daha sonra bir sonraki kopyayı yüklemek daha mantıklı olacaktır.
 
Nikolai Semko :
Ve HER ŞEY nedir!?
Bu neden kodunu (REASON_CHARTCHANGE) sonuna kadar denedim ve kullandım. Ve tüm değişkenler yeniden orijinal durumlarına sıfırlanırsa ve OnDeinit, yeni bir TF'nin OnInit'inden sonra çalıştırılabilirse, bunun anlamı nedir?
Yalnızca başlatmadan kaldırma ile ilgili bir nesneyi silme hakkında okudum ve yalnızca bu sorunu yanıtladım. Geçmiş hesaplamaları kaydetmek daha zordur. Ve görünüşe göre bu sorun asla çözülmeyecek. Slava bu soruyu yanıtladı, yeni gösterge, yeni hesaplamalar. Ve bu adil.
 
Alexey Viktorov :
Slava bu soruyu yanıtladı, yeni gösterge, yeni hesaplamalar. Ve bu adil.
İşin aslı, gösterge statik, sadece zaman çerçevesi yeni. Ve konunun konusu, ünite ve deunit'in senkronizasyonu, yani. ters (mantıksız) bir yürütme sırası vardır ve bazen ve bazen mantıklıdır. Bir programcı için, değişken bir hata ve mantıktan daha kötü bir şey yoktur.
 
Alexey Viktorov :
Ve görünüşe göre bu sorun asla çözülmeyecek.

Ve geliştirme ekibine inanıyorum, onlar harika adamlar ve inanılmaz bir şey yaptılar ve daha fazlasını yapacaklar. Sadece henüz ellerine geçmediler. Doğru, onlardan her zaman teflerle geri bildirim almak zorundasın. :))
Bunun yapılması gerektiğine onları ikna etmeyi benim görevim olarak görüyorum. Bunu yapmamanın daha iyi olduğuna beni ikna edeceklerini dışlamasam da, belki de bir şeyleri yakalayamıyorum.
 
Nikolai Semko :

Ve geliştirme ekibine inanıyorum, onlar harika adamlar ve inanılmaz bir şey yaptılar ve daha fazlasını yapacaklar. Sadece henüz ellerine geçmediler. Doğru, onlardan her zaman teflerle geri bildirim almak zorundasın. :))
Bunun yapılması gerektiğine onları ikna etmeyi benim görevim olarak görüyorum. Bunu yapmamanın daha iyi olduğuna beni ikna edeceklerini dışlamasam da, belki de bir şeyleri yakalayamıyorum.


Slava, " Kütüphaneler " belgelerinde ifade ne anlama geliyor?   herhangi bir olayı işlemeyin"?

çok sisli
 

 
nmaratr :

- Inita ile ana tablonun rengini şeffaf olarak ayarladım.

Programımı çiziyorum (parametrelerime göre)


Çünkü göstergemi çıkardıktan sonra ana grafiğin rengini eski haline getirmek istiyorum

- DeInit'te ana grafiğin rengini geri yüklerim


TF'yi değiştirirken , önce DeInit'i (renk restorasyonu) ve ardından Init'i (Yine şeffaf) kastediyorum.


Bu nedenle, komutların yürütülmesi, TF değiştirilirken periyodik olarak sıralı değildir.

göstergemdeki ana grafiği (geri yüklenen renkte) kaplayın.

İşte bir "mantık yozlaşması" örneği.


Belki grafik nesnelere adlarının önekinin bir bileşeni olarak TF dönemini atamaya çalışın,

ve sonra şöyle bir şey uygulayın:

 // --- Переменная для хранения текущего ТФ
ENUM_TIMEFRAMES currentTF;

//+---------------------------------------------------------------------------+
void OnInit ()
{
  currentTF = ( ENUM_TIMEFRAMES ) Period ();
}

//+---------------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   // --- на момент выгрузки индикатора уже сменился ТФ
   if (currentTF != Period ()) 
  {
     // если нужно, удалим объекты имеющие префикс старого ТФ и выходим, не трогаем цвет основного графика
     return ;
  }

   // раз дошли сюда, ТФ не сменился, восстанавливаем цвет основного графика
   // удалим объекты имеющие префикс старого ТФ
}
 
nmaratr :

- Inita ile ana tablonun rengini şeffaf olarak ayarladım.

Programımı çiziyorum (parametrelerime göre)


Çünkü göstergemi çıkardıktan sonra ana grafiğin rengini eski haline getirmek istiyorum

- DeInit'te ana grafiğin rengini geri yüklerim


TF'yi değiştirirken , önce DeInit'i (renk restorasyonu) ve ardından Init'i (Yine şeffaf) kastediyorum.


Bu nedenle, komutların yürütülmesi, TF değiştirilirken periyodik olarak sıralı değildir.

göstergemdeki ana grafiği (geri yüklenen renkte) kaplayın.

İşte bir "mantık yozlaşması" örneği.

Elbette her şey mantıklı bir sıra içinde gerçekleştiğinde daha keyifli oluyor ama elimizdekilerle çalışmak zorunda olduğumuz için mevcut değeri kontrol ederek ana tablonun renk ayarını OnCalculate'e aktarabiliyoruz.
 
Nikolai Semko :
Ve HER ŞEY nedir!?
Bu neden kodunu (REASON_CHARTCHANGE) sonuna kadar denedim ve kullandım. Ve tüm değişkenler yeniden orijinal durumlarına sıfırlanırsa ve OnDeinit, yeni bir TF'nin OnInit'inden sonra çalıştırılabilirse, bunun anlamı nedir?


Terminali 1065 sürümüne güncellemeyi deneyin. Önceki sürümlerde, tam zaman çerçevesi değiştirilirken yeniden başlatma hatası oluştu. Yardımcı olabilir :)

https://www.mql5.com/ru/forum/187690

Новая версия платформы MetaTrader 4 build 1065
Новая версия платформы MetaTrader 4 build 1065
  • www.mql5.com
Новая версия платформы MetaTrader 4 build 106523 марта 2017 года будет опубликовано обновление платформы MetaTrader 4...
 
Aleksei Radchenko :


Terminali 1065 sürümüne güncellemeyi deneyin. Önceki sürümlerde, tam zaman çerçevesi değiştirilirken yeniden başlatma hatası oluştu. Yardımcı olabilir :)

https://www.mql5.com/ru/forum/187690

MT5 hakkında konuşmak