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

 
fxsaber :

Deinit'te, globallerdeki tüm verilerin kaydını kaydedin. Aynı zamanda, GlobalVariableSetOnCondition aracılığıyla bir globali semafor olarak ayarlayın.

Init'te semafor "veri sıfırlama" durumundaysa semaforu "tümünü oku" durumuna ayarlayarak okuyup çalıştığımızı yazın.

Eğer semafor "Anlamıyorum" durumundaysa, o zaman semaforu bekleriz (ya döngülü bir Uyku ya da OnTimer aracılığıyla).


Ve elbette, semafor tamamen yoksa, o zaman bu, ilk kez başlattığımız ve gelecekteki TF değişikliklerini değil, aynı anda bir semafor oluşturmuş olarak her şeyi dikkate aldığımız anlamına gelir.


Böyle bir uygulamada zor olan nedir? Bir zamanlar reçete edilecek bir kitaplık ve bu kadar.


Uyku göstergelerde çalıştıysa, daha kolay olurdu. Göstergelerde uyku çalışmıyor.
 
Stanislav Korotky :
Her biri kendi başına, tekrar tekrar ortak bir sorunu çözecek küçük insanların sayısını çarparsanız, harcanan adam-saatler birçok kez (sınırda sonsuz sayıda ;-)) aşacaktır. terminalin kendisinde herhangi bir düzenleme seçeneği için gereken süre. Varsayımsal bir kütüphanenin varlığı bile, herkesin onun varlığından ve onu kullanma ihtiyacından haberdar olacağını garanti etmez. Genel olarak, neden böyle bir "tırmık" yapıp bırakılacağı açık değil mi?

Yani bu bir komisyon değil, göstergenin yeni bir kopyası eskisini bilmediğinde mantıklı bir davranış. Bu mantıklı!

Ama BİRİMLER fazla insan istiyor. işlevsellik, böylece kopya hala bilir! Peki, bu birimlerin çözümü bir kez yazıp kullanmasını engelleyen nedir?

Neden başkalarını umursuyormuş gibi davranıyorsun. Gerçekten ihtiyacı olan, önce çözümler arayacaktır. Ve değilse, yazmayı deneyin. Merkezileştirilmiş kod tabanı tam olarak bu amaca hizmet eder.

 
Sergey Chalyshev :

Uyku göstergelerde çalıştıysa, daha kolay olurdu. Göstergelerde uyku çalışmıyor.
İyi OnTimer teklif etti. Sorun önemsiz.
 
fxsaber :

Yani bu bir komisyon değil, göstergenin yeni bir kopyası eskisini bilmediğinde mantıklı bir davranış. Bu mantıklı!

Ama BİRİMLER fazla insan istiyor. işlevsellik, böylece kopya hala bilir! Peki, bu birimlerin çözümü bir kez yazıp kullanmasını engelleyen nedir?

Neden başkalarını umursuyormuş gibi davranıyorsun. Gerçekten ihtiyacı olan, önce çözümler arayacaktır. Ve değilse, yazmayı deneyin. Merkezileştirilmiş kod tabanı tam olarak bu amaca hizmet eder.

Eh, hayır, o kadar basit değil. Göstergeler başka bir varlığın içine oturur - bir çizelge / çizelge ve ona tabidir (karmaşık bire çok ilişkilerinin farkındayım, ancak bu özü değiştirmiyor). Grafik, göstergelerin yaşam döngüsünün sınırları olan bazı iç olaylar init ve deinit dahil olmak üzere kendi yaşam döngüsüne sahiptir. Başka bir deyişle, gösterge grafiğinde hayatta kalamaz. Grafik tanımlama, tüm göstergelerin tanımlama veya tanımlama zaman aşımını beklemelidir. Ancak o zaman yeni zaman çerçevesi için grafik başlatılabilir ve bundan iç içe göstergelerin başlangıcı çağrılabilir.

Tırmık, tanımı gereği üzerine basılabilen bir şeydir. Zaten geldi. İyi yazılım, prensipte tırmıklamaya izin vermez.

 
fxsaber :

Yani bu bir komisyon değil , göstergenin yeni bir kopyası eskisini bilmediğinde mantıklı bir davranış. Bu mantıklı!

Ama BİRİMLER fazla insan istiyor. işlevsellik, böylece kopya hala bilir! Peki, bu birimlerin çözümü bir kez yazıp kullanmasını engelleyen nedir?

Neden başkalarını umursuyormuş gibi davranıyorsun. Gerçekten ihtiyacı olan, önce çözümler arayacaktır. Ve değilse, yazmayı deneyin. Merkezileştirilmiş kod tabanı tam olarak bu amaca hizmet eder.


Zaman çerçevesini değiştirdiğinizde, giriş parametrelerini yenisine girdiğinizi nasıl bilmez?
 
Sergey Chalyshev :


Ve sonra Deinit işini tamamlayacak ve her şeyi mahvedecek. Normal Init ve Deinit'te kendi özel girişlerinizi ve tanımlarınızı yapmanın bir anlamı yoktur.

Ayrıca bu sorunla karşı karşıya kaldı. (

fxsaber zaten her şeyi boyadı, ancak kendimden daha fazlasını ekleyeceğim.

Tüm MT programlarının bir özelliği olaya dayalı işlemdir. Burada OnInit ve OnDeinit, olay modeline göre oldukça mantıklı ve uygun şekilde çalışır.

Ancak girdi değişkenlerinin davranışında anlaşılmaz bir nüans vardır: dahili terminal göstergeleri ve standart teslimatla gelenler dahil tüm standart göstergeler, her seferinde son başlatmadan sonra yüklenen aynı girdi parametreleriyle başlatılır. Çok rahat. Ancak, özel göstergeler ve standart olanlar da dahil olmak üzere tüm Uzman Danışmanlar ve komut dosyaları için durum böyle değildir, bu bazı rahatsızlıklardır ( MQ'yu isteyin: standart göstergelerle aynı girdi değişkenleri davranışını ekleyin ). grafikte.

Ancak init ve deinit'in çalışmasıyla ilgili olarak, programın global değişkenleriyle çalışırken programların sıfırlanmasının nedenlerine kişisel olarak asla güvenmem, her zaman programın belirli fikrine göre mantık kurarım. Örneğin, bir Expert Advisor'ın sıfırlanmasından sonra global program değişkenlerinin kaydedilmesi çok sık gereklidir (sebepler farklı olabilir, aynı bağlantı kesilmesi, örneğin OnDeinit'e ve sonraki OnInit'e neden olur), o halde neden her şeyi yeniden hesaplayıp yeni gösterge oluşturalım? kolları vs?

Bu nedenle daha önce yazdığım gibi ve fxsaber , belirli durumlarda programın global değişkenlerini kaydetmeniz gerekiyorsa, bunu uygun flagları kullanarak terminalin global değişkenlerinde yapabilirsiniz.

MQL'de ne yazık ki her şey yolunda gitmiyor, ancak OnInit ve Ondeinit'in çalışması mantıklı ve anlaşılır, bu yüzden boşuna çitin üzerine gölge düşürdüler.)

 
Sergey Chalyshev :

Zaman çerçevesini değiştirdiğinizde, giriş parametrelerini yenisine girdiğinizi nasıl bilmez?
Az önce kontrol ettim - hayır, TF'yi değiştirirken giriş değişkenlerini yeniden girmenize gerek yok.
 
Andrey Dik :

ancak OnInit ve Ondeinit'in çalışması mantıklı ve anlaşılır, bu yüzden boşuna burada çitin üzerine gölge düşürdüler.)


Lütfen zaman çerçevesini değiştirirken göstergede OnInit ve OnDeinit'in yürütme sırasının mantığını açıklayın. Çok minnettar kalırım. Ve sadece ben değil düşünüyorum.
 
Nikolai Semko :

Lütfen zaman çerçevesini değiştirirken göstergede OnInit ve OnDeinit'in yürütme sırasının mantığını açıklayın. Çok minnettar kalırım. Ve sadece ben değil düşünüyorum.

SW. Glory açıkça her şeyi söyledi.

Göstergenin bir kopyası oluşturulur ve eskisi bir süre sonra boşaltılır.

Programın global değişkenlerini kaydetmeniz gerekiyorsa, OnInit'i çağırırken bunu önceden halletmeniz gerekir (global uçbirim değişkenleri bu amaç için çok uygundur).

Ve gösterge arabellekleri her durumda yeniden hesaplanacaktır, çünkü çubuklar (şamdanlar) değişti, görünüşe göre bu yüzden oluyor (bir kopyanın başlatılması ve göstergenin önceki örneğinin terminal tarafından tamamlanması).

Gösterge geliştiricisi grafik nesnelerle çalışırken bir sorun görürse, göstergeyi başlatırken, grafik nesnelerin adlarını TF adına bağlamanız gerekir, ardından göstergenin yeni bir kopyası yeni nesneler oluşturur ve önceki göstergenin kopyası eskilerini temizleyecektir.

Hiç sorun değil.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

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

Slava , 2017.04.07 15:31

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

 
Andrey Dik :

SW. Glory açıkça her şeyi söyledi.

Göstergenin bir kopyası oluşturulur ve eskisi bir süre sonra boşaltılır.

Programın global değişkenlerini kaydetmeniz gerekiyorsa, OnInit'i çağırırken bunu önceden halletmeniz gerekir (global uçbirim değişkenleri bu amaç için çok uygundur).

Ve gösterge arabellekleri her durumda yeniden hesaplanacaktır, çünkü çubuklar (şamdanlar) değişti, görünüşe göre bu yüzden oluyor (bir kopyanın başlatılması ve göstergenin önceki örneğinin terminal tarafından tamamlanması).

Gösterge geliştiricisi grafik nesnelerle çalışırken bir sorun görürse, göstergeyi başlatırken, grafik nesnelerin adlarını TF adına bağlamanız gerekir, ardından göstergenin yeni bir kopyası yeni nesneler oluşturur ve önceki göstergenin kopyası eskilerini temizleyecektir.

Hiç sorun değil.


Evet, her şey açık. Yürütme sırası mantığını sordum. Olay bu, o yok. Bazen ilk OnDeinit tarafından (layenin mantığına göre olması gerektiği gibi) ve bazen de ilk OnInit tarafından yürütülür.

Cevabın " Bir süredir (çok kısa) göstergenin her iki kopyası da paralel olarak var" sözlerinde yattığını anlıyorum. Ama bu soru bu farkındalıktan net değil.