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

 

Merhaba !

Böyle bir sorunla karşılaşan

Bir gösterge veya Uzman Danışman yazılmıştır.

Birkaç Init() ve DeInit() işlevi vardır.

TF'yi (zaman çerçevesi) değiştirirken bu işlevlerin yürütme sırası nedir ???

Bir gösterge başlatırken veya eklerken Init()' in çalışması gerektiğini anlıyorum.

Grafikten kaldırıldığında DeInit() çalışmalıdır.

TF'yi değiştirirken, önce mevcut TF'den DeInit() çalışacak ve ardından yeni TF'nin Init() çalışması gerekir.

Ancak, her zaman bu sırayla yürütülmez, bu da bir program yazmanın mantığını büyük ölçüde bozar.

Gösterge ve günlüklerin bir örneği eklendi.

Bana birinin bu sorunu çözdüğünü veya sadece puan verdiğini söyle !!!

Dosyalar:
ERROR.mq5  2 kb
Log.txt  1 kb
 

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

Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Zaman çerçevesini değiştirirken, OnInit her seferinde çağrılır ve bazı rahatsızlıklar yaratır.
 
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


Cevap için teşekkürler

"Mantık bozuyor" hakkında

Ana grafiği (şamdanlar) kendi çizim tipi DRAW_CANDLES ile değiştiren bir gösterge yazdım.

Amaç, ana fiyat tablosunu kaldırmak ve sadece benimkini göstermek.

- 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.


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

Expert Advisor'ın eklendiği çizelgenin sembolü veya zaman çerçevesi değiştirilirken Expert Advisor'ın yükü boşaltılmaz veya yüklenmez . Aynı zamanda eski sembol/zaman çerçevesi üzerindeki OnDeinit() ve yeni sembol/zaman çerçevesi (varsa) üzerindeki OnInit( ) işleyicileri sırayla çağrılır, global değişkenlerin ve statik değişkenlerin değerleri sıfırlanmaz. Başlatma ( OnInit() işlevinin) tamamlanmasından önce Expert Advisor için alınan tüm olaylar atlanır.


Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
nmaratr :


Hakkında

"göstergenin önceki kopya hakkında hiçbir şey bilmeyen yeni bir kopyası oluşturulur"

Öyleyse, DeInit'te yeni Init'in bir kopyasında oluşturulan nesneler neden silinir? Eğer sadece bir kopyaysa.



 
Petros Shatakhtsyan :
Zaman çerçevesini değiştirirken, OnInit her seferinde çağrılır ve bazı rahatsızlıklar yaratır.


OnInit her seferinde ne anlama geliyor?

OnInit nedir - tüm değişkenleri ve parametreleri bir kez başlatmak için

örneğin

Mevcut TF'nin ne olduğunu yazacağım grafikte bir metin etiketi oluşturacak bir gösterge yazmak istiyorum.

Göstergeyi silerken bu metin etiketini grafikten kaldırdım.

Ve TF'yi değiştirirken, içeriğini yenisine güncelledi (eskisini silip yenisini oluşturarak)

Ne olacak

TF'yi birkaç kez değiştirdi ve metin etiketi kayboldu. (Önce OnInit çalıştığı ve ardından DeInit - bu etiketi kaldırdığı için)

Sonra TF'yi birkaç kez daha değiştirdiler ve ortaya çıktılar.

Bu yanlış.

 
nmaratr :

bunlar grafik nesnelerse, sohbete aittirler ve bu sohbette çalışan herhangi bir program tarafından kullanılabilirler.
 
Alexander Bereznyak :

bunlar grafik nesnelerse, sohbete aittirler ve bu sohbette çalışan herhangi bir program tarafından kullanılabilirler.


Peki bu sorun nasıl çözülebilir? (Bunu yapan var mı???)

Ya da olduğu gibi kabul edin. Hesaplamaları hızlandırmak için komutları sırayla değil de yürütmek mümkündür.

Belgelerle çelişen nedir


Expert Advisor'ın eklendiği çizelgenin sembolü veya zaman çerçevesi değiştirilirken Expert Advisor'ın yükü boşaltılmaz veya yüklenmez . nerede

art arda

işleyiciler OnDeinit() eski sembol/zaman çerçevesinde ve OnInit() yeni sembol/zaman çerçevesinde (varsa) çağrılır

 
nmaratr :


Peki bu sorun nasıl çözülebilir? (Bunu yapan var mı???)



Bu konunun yazarına katılıyorum. Soru aslında boşta değil. Ve çok spesifik.
Bu özelliği uzun zaman önce keşfettim. Bu konunun yazarınınkine kesinlikle benzer bir örnekle Haziran 2016'da hizmet masasıyla iletişime geçtim. Yoksayıldı - açık konu hala asılı:

Servis Masası Uygulaması

Tabii ki, teflerle, TF'yi değiştirirken göstergedeki parametrelerin transferini yaptım, üzerinde çok zaman harcadım. Ancak teflerle basit bir iş yapmak istemezsiniz.
Tabii ki, çoklu iş parçacığının çok gerekli ve çok karmaşık bir şey olduğunu anlıyorum ve senkronizasyon ile her şey o kadar basit değil.Ancak geliştiriciler, lütfen değiştirirken yeniden başlatılmayan özel türdeki göstergelerde global değişkenler oluşturma yeteneğini uygulayın. zaman aralığı. Uzman Danışmanlarda, TF değiştirilirken yeniden başlatma yoktur, ancak göstergede gerçekleşir. Göstergelerdeki bazı değişkenleri ve dizileri yeniden başlatmamak mümkün olsaydı, OnInit ve OnDeinit'in senkronizasyonu konusu ortaya çıkmaz ve programcılar için yeni ilginç olasılıklar açılırdı. Değişkenlerin yeniden başlatılamaması olasılığının varlığının bir şekilde programların güvenliğini etkileyeceğini düşünmüyorum.

Bu ne için ?
Evet, birçok durum.

Örneğin:
-Gösterge başlatıldığında, zaman dilimlerine bağlı olmayan değişkenler, indeks dizileri, veri dizileri hesaplamalarım var ve bunlar oldukça büyük ve uzun olabilir. Soru, TF'yi değiştirirken bunu neden her zaman yapmalıyım?
- veya gösterge parametrelerini parametreler penceresinden değil, kolaylık ve netlik için doğrudan fare ile grafikten değiştiririm ( bu göstergeyi , bunun teflerle uygulandığı bir örnek olarak görebilir ve kullanabilirsiniz). Ve böylece TF'yi her değiştirdiğinizde ayarlar yanlış gitmez.

 

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...

 
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...

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?
Neden: