Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 185

 

Tünaydın.

Belli bir olaydan sonra danışmanın işini bitirmesi gerekir.

anladığım kadarıyla bu deinit() fonksiyonu, bir şekilde çağırmam gerekiyor. Ders kitabı alıntısı:

" Özel işlev deinit() müşteri terminali tarafından çalıştırılmak üzere çağrılır, ayrıca müşteri terminali kapandığında, finansal araç penceresi kapatılırken, programın MetaEditor'da başarılı bir şekilde yeniden derlenmesinden sonra, finansal araç ve/veya grafik periyodu değiştirilmeden hemen önce , giriş parametrelerini değiştirirken ve ayrıca hesabı değiştirirken.

Yani, bu işlevin çağrılması için örneğin terminali manuel olarak kapatmam gerekiyor mu?

Koşul tetiklendiğinde bu işlevi çağırmaya çalıştım, yürütüldü, ancak yeni bir onay işareti geldi ve başlatma işlevi yeniden çalıştırıldı.

 int deinit()
  {
   Alert ( "Закрываем программу" ); 
   return ( 0 );
  }

int start()
{
//код
..............
if ( OrdersTotal ()== 0 ) deinit();
return ( 0 );
}



Yine de programı nasıl tamamlarım?

Teşekkür ederim.

 
GygaByte :

Tünaydın.

Belirli bir olaydan sonra danışmanın işini bitirmesi gerekir.

anladığım kadarıyla bu deinit() işlevi, bir şekilde çağırmam gerekiyor. Ders kitabı alıntısı:

" deinit() özel işlevi, müşteri terminali tarafından, ayrıca müşteri terminali kapandığında, sembol penceresi kapatıldığında, finansal araç ve/veya grafik periyodu değiştirilmeden hemen önce, program MetaEditor'da başarılı bir şekilde yeniden derlendiğinde yürütülmek üzere çağrılır. , giriş parametreleri değiştirildiğinde ve ayrıca hesap değiştirilirken.

Yani, bu işlevin çağrılması için örneğin terminali manuel olarak kapatmam gerekir mi?

Koşul tetiklendiğinde bu işlevi çağırmaya çalıştım, yürütüldü, ancak yeni bir onay işareti geldi ve başlatma işlevi yeniden çalıştırıldı.

Yine de programı nasıl tamamlarım?

Teşekkür ederim.

Terminali programlı olarak kapatmak için kodun en başında start() işlevinden önce şunu ekleyin:

 //----
#import "user32.dll"
int GetParent( int hWnd);   // вызов API
#import
//----

start() işlevinde, terminali kapatmanız gerektiğinde, start() işlevinin dışında bildirdiğiniz ExitMT4() işlevini çağırın.

 //+----------------------------------------------------------------------------+
void ExitMT4() {   // выгрузить MT4 из памяти

   int hwnd=WindowHandle( Symbol (), Period ());
   int hwnd_parent= 0 ;
//----
   while (! IsStopped ()) {
      hwnd=GetParent(hwnd);
       if (hwnd== 0 ) break ;
      hwnd_parent=hwnd;
      }
   if (hwnd_parent!= 0 ) PostMessageA(hwnd_parent,WM_CLOSE, 0 , 0 );
}
//+----------------------------------------------------------------------------+
 
artmedia70 :

Terminali programlı olarak kapatmak için kodun en başına start() işlevinden önce şunu ekleyin:

start() işlevinde, terminali kapatmanız gerektiğinde, start() işlevinin dışında bildirdiğiniz ExitMT4() işlevini çağırın.



Ayrıntılı cevap için çok teşekkürler.

Prensip olarak, danışmanı kapatmam yeterli olacaktır , terminali kapatmak gerekli değildir. Kolay bir yolu yok mu?

Bence deinit() bir şekilde bu sorunu çözmeli, ama görünüşe göre yanlış bir şey yapıyorum ..

 

Alpari Limited, build 509'dan Terminal.exe'yi bilgisayarımdan kaldıramıyorum.

Kaldırmak için kontrol panelini kullanırken "Kaldırma için yeterli hakkınız yok. Lütfen sistem yöneticinize başvurun!" yazıyor.

Uninstall.exe'yi kullanırken "Sunucu bir bağlantı döndürdü" yazıyor.

Alpari teknik desteği anlaşılır bir şey söyleyemiyor, sadece tüm klasörü yıkmayı ve terminali başka bir dizine kurmayı öneriyorlar.

Kazanmaya Değer 7, Ultimate. Yönetici hakları etkinleştirildi, Uninstall.exe Yönetici adına çalıştı.

Bu sorunu çözmek için herhangi bir tavsiye için çok minnettar olurum.

 
GygaByte :


Ayrıntılı cevap için çok teşekkürler.

Prensip olarak, danışmanı kapatmam yeterli olacaktır, terminali kapatmak gerekli değildir. Kolay bir yolu yok mu?

Bence deinit() bir şekilde bu sorunu çözmeli, ama görünüşe göre yanlış bir şey yapıyorum ..

deinit() değil, return (0);
 
artmedia70 :
deinit() değil, return (0);


Yanılmıyorsam, return(0) sadece mevcut start() işlevini sonlandıracak ve bir sonraki onay işaretini bekleyecek ve EA'nın grafikten elle sabitlemesini kaldırmış gibi EA'nın çıkmasına ihtiyacım var.

Pratikte kontrol ettim - her tik ile sonsuz bir uyarı verir " Açık siparişler - 0 "

Sevgili "Kadar" beklemedi

 int start()
  {
   if ( OrdersTotal ()== 0 ) 
   {
   Alert ( "Открытых ордеров - " , OrdersTotal ());
   return ( 0 );
   }  
  }
//+------------------------------------------------------------------+
int deinit()
  {
 Alert ( "Пока" );  
   return ( 0 );
  }
 
polycomp :

Alpari Limited, build 509'dan Terminal.exe'yi bilgisayarımdan kaldıramıyorum.

Kaldırmak için kontrol panelini kullanırken "Kaldırma için yeterli hakkınız yok. Lütfen sistem yöneticinize başvurun!" yazıyor.

Uninstall.exe'yi kullanırken "Sunucu bir bağlantı döndürdü" yazıyor.

Alpari teknik desteği anlaşılır bir şey söyleyemiyor, sadece tüm klasörü yıkmayı ve terminali başka bir dizine kurmayı öneriyorlar.

Kazanmaya Değer 7, Ultimate. Yönetici hakları etkinleştirildi, Uninstall.exe Yönetici adına çalıştı.

Bu sorunu çözmek için herhangi bir tavsiye için çok minnettar olurum.

Bazı kötü amaçlı programlar (mail.ru'm vardı) erişim haklarını yeniden dağıtır ve yönetici haklarıyla bunları silme erişiminizin olmamasını sağlar.

Sorun, hakların yeniden dağıtılmasında bilimsel dürtme yöntemiyle çözüldü (klasördeki RMB, özellikler, güvenlik, değişiklik, ekleme, ek olarak, nesne türleri, arama .......)

Ama sonra "Revo kaldırıcı" ile tanıştım ve bir şeyin kaldırılmasıyla tüm hemoroidler kayboldu, + kayıt defterinin faaliyetlerinden temizlendiğine dair güven.

 
GygaByte :


Yanılmıyorsam, return(0) sadece mevcut start() işlevini sonlandıracak ve bir sonraki onay işaretini bekleyecek ve EA'nın grafikten elle sabitlemesini kaldırmış gibi EA'nın çıkmasına ihtiyacım var.

Pratikte kontrol ettim - her tik ile sonsuz bir uyarı verir " Açık siparişler - 0 "

Sevgili "Kadar" beklemedi

Arzunuz "dama" hakkında bir şakayı andırıyor. EA'nın ticareti durdurması gerekiyorsa, (global) bayrağını etkinleştirerek (bazı koşullar oluştuktan sonra), start() işlevini (dönüş yoluyla çıkış) kesintiye uğratmak beklenen sonucu verecektir.
 
ALXIMIKS :

Bazı kötü amaçlı programlar (mail.ru'm vardı) erişim haklarını yeniden dağıtır ve yönetici haklarıyla bunları silme erişiminizin olmamasını sağlar.

Sorun, hakların yeniden dağıtılmasında bilimsel dürtme yöntemiyle çözüldü (klasörde RMB, özellikler, güvenlik, değişiklik, ekleme, ek olarak, nesne türleri, arama .......)

Ama sonra "Revo kaldırıcı" ile tanıştım ve bir şeyin kaldırılmasıyla tüm hemoroidler kayboldu, + kayıt defterinin faaliyetlerinden temizlendiğine dair güven.

Çok teşekkürler! Revo kaldırıcı ile tanışacağım.
 
TarasBY :
Arzunuz "dama" ile ilgili bir şakayı andırıyor. EA'nın ticareti durdurması gerekiyorsa, (global) bayrağını etkinleştirerek (bazı koşulların gerçekleşmesinden sonra), start() işlevini (dönüş yoluyla çıkış) kesintiye uğratarak beklenen sonucu verecektir.

Kabaca şöyle görünür:

 bool GlobalFlag;
int init()
{
   GlobalFlag = true ;
   return ( 0 );
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   if ( GlobalFlag )
       if ( OrdersTotal () == 0 ) 
      {
         GlobalFlag = false ;
         Alert ( "Открытых ордеров - " , OrdersTotal ());
         Alert ( "Пока" );  
      }  
   return ( 0 );
}
//+------------------------------------------------------------------+
int deinit()
{
   return ( 0 );
}
//+------------------------------------------------------------------+