Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 204

 
Andrey Khatimlianskii :

Hiç kimse diğer olay işleyicilerinin kesintiye uğrayacağını (veya çalıştırılmayacağı) garanti etmedi.

Uyarıdan sonra hem deinit hem de init gerçekleşir, değil mi?

Evet, tam bir yeniden başlatma. Sadece bir zamanlayıcı (bir saniye bile) çalışır - bir özellik, bir hata değil.

 
fxsaber :

Bu EA, hesaplar arasında geçiş yaparken uyarı verir. Kurala göre bunu yapmaması gerekiyor gibi görünüyor.

Ancak, bu zamanlayıcıdan kaynaklanmaktadır.

Bu özellik , formülasyonu basit, ancak uygulanması zor olan bir sorunu çözmek için kullanılabilir.

 // Если произошла смена счета, советник выгружается.

const bool Init = EventSetMillisecondTimer ( 1 );

void OnTimer ()
{
   static const long Account = AccountInfoInteger ( ACCOUNT_LOGIN );
  
   if (Account != AccountInfoInteger ( ACCOUNT_LOGIN ))
     ExpertRemove ();
}
 
fxsaber :

Bu özellik , formülasyonu basit, ancak uygulanması zor olan bir sorunu çözmek için kullanılabilir.

Neden her Açık işlevinin girişindeki hesap değişikliğini kontrol edemiyorsunuz?

Neden bir milisaniye zamanlayıcı? Çalışma sırasında yeniden oturum açma gerçekleşirse, programın yürütülmesini yine de kesintiye uğratmaz.

 
Andrey Khatimlianskii :

Neden her Açık işlevinin girişindeki hesap değişikliğini kontrol edemiyorsunuz?

Neden bir milisaniye zamanlayıcı? Çalışma sırasında yeniden oturum açma gerçekleşirse, programın yürütülmesini yine de kesintiye uğratmaz.

Dene. Bu konuyla ilgili uzun bir tartışma için yukarıdaki bağlantıya bakın.

 
fxsaber :

Evet, tam bir yeniden başlatma. Sadece bir zamanlayıcı (bir saniye bile) çalışır - bir özellik, bir hata değil.

ExpertRemove() komutundan sonra, durdurma bayrağı basitçe yükseltilir ve EA bir sonraki onay işaretine kadar çalışmaya devam eder. Yeni bir kene üzerinde, eğilmiş dur bayrağıyla tanışan danışman boşaltılır. Bu, yeni bir onay işareti gelene kadar tüm Açık işlevlerinin normal şekilde çalışmaya devam edeceği anlamına gelir.

Buna göre, bu bayrağın durumunu programlı olarak alamıyorsak (özellikle bu özelliği aramadık), o zaman global olarak kendi bayrağımıza sahip olmamız gerekir. ExpertRemove() komutundan önce kendi bayrağımızı belirleriz ve her On-fonksiyonunda bunu kontrol ederiz. Bayrak çekilirse gideriz. Ardından zamanlayıcı, içine gömülü kodu yürütmez.

Yoksa her şeyi anlamadım ve soru farklı mı?

 
Artyom Trishkin :

ExpertRemove() komutundan sonra, durdurma bayrağı basitçe yükseltilir ve EA bir sonraki onay işaretine kadar çalışmaya devam eder. Yeni bir kene üzerinde, eğilmiş dur bayrağıyla tanışan danışman boşaltılır. Bu, yeni bir onay işareti gelene kadar tüm Açık işlevlerinin normal şekilde çalışmaya devam edeceği anlamına gelir.

Buna göre, bu bayrağın durumunu programlı olarak alamıyorsak (özellikle bu özelliği aramadık), o zaman global olarak kendi bayrağımıza sahip olmamız gerekir. ExpertRemove() komutundan önce kendi bayrağımızı belirleriz ve her On-fonksiyonunda bunu kontrol ederiz. Bayrak çekilirse gideriz. Ardından zamanlayıcı, içine gömülü kodu yürütmez.

Yoksa her şeyi anlamadım ve soru farklı mı?

Hangi sorunu tanımladığınızdan emin değilsiniz.

 
Artyom Trishkin :

ExpertRemove() komutundan sonra, durdurma bayrağı basitçe yükseltilir ve EA bir sonraki onay işaretine kadar çalışmaya devam eder. Yeni bir kene üzerinde , eğilmiş dur bayrağıyla karşılaşan danışman boşaltılır. Bu, yeni bir onay işareti gelene kadar tüm Açık işlevlerinin normal şekilde çalışmaya devam edeceği anlamına gelir.

Buna göre, bu bayrağın durumunu programlı olarak alamıyorsak (özellikle bu özelliği aramadık), o zaman global olarak kendi bayrağımıza sahip olmamız gerekir. ExpertRemove() komutundan önce kendi bayrağımızı belirleriz ve her On-fonksiyonunda bunu kontrol ederiz. Bayrak çekilirse gideriz. Ardından zamanlayıcı, içine gömülü kodu yürütmez.

Yoksa her şeyi anlamadım ve soru farklı mı?

Yeni bir onayda değil, bir sonraki dönüşte;

ExpertRemove() öğesini OnInit() içine koyun ve hata ayıklamada adım adım kontrol edin.

 
Alexey Viktorov :

Yeni bir kene üzerinde değil, en yakın dönüşte;

ExpertRemove() öğesini OnInit() içine koyun ve hata ayıklamada adım adım kontrol edin.

Evet, yanılmışım. Sonraki herhangi bir olay artık yürütülmeyecek. İhtiyacım olmayan işlevlerin yardımına bakmayalı uzun zaman oldu :)

 
fxsaber :

Hangi sorunu tanımladığınızdan emin değilsiniz.

Cevabın anlamı net değil. İyi tamam.

 
Artyom Trishkin :

Cevabın anlamı net değil.

ExpertRemove aramadı .