Bağlandı() - sayfa 4

 
7bit :

Kontrol edilebilir, sadece kontrolü sonsuz bir döngüde çalıştırın. bir bağlantı kesintisi sırasında terminali başlatırken bu döngünün nasıl başlatılacağı tamamen ayrı bir sorundur. Döngünüzü çalıştırdığınızda, bekleneni yapacaktır.

Sorununuzun IsConnected() işleviyle hiçbir ilgisi yok. Aynı argümanla, Print() veya Alert() veya tamamen farklı bir nedenden dolayı tüm kodu ilk etapta başlatamadığınız için çağıramayacağınız diğer işlevler hakkında da şikayet edebilirsiniz.


tamam, bir şey açıklayayım çünkü çok fazla terminlas kullanıyorum cpu kullanımım yüzde 100'e kadar çıkıyor bu yüzden birkaç terminali kapatmam gerekiyor

Ve onları açtığımda (tabii ki otomatik) birkaç kez bağlı olmadıklarını ve EA'nın üzerlerinde çalıştığını gördüm, bağlantı olmadığını bildirmedi,

bu konuyu sen başlattın ve şimdiye kadar bulduğum tek yol yukarıda söylediğim gibi harici bir program

 

Belki de, Windows XP SP2 ile ilk kez tanıtılan "özellik" ile, herhangi bir zamanda yalnızca bir avuçtan fazla yarı açık bağlantıya sahip olmayı reddetmesi, özellikle ağ yoğun uygulamaları kullanmak isteyen insanları rahatsız etmekle ilgilidir. AFAIK, bu can sıkıcı "özelliği" ortadan kaldırmak ve normal çalışabilirliği geri yüklemek için yöntemler var: http://blog.davidkaspar.com/archives/2005/04/windows-xp-sp2-and-event-id-4226.php

Windows olay günlüğünde 4226 olayını arayın.

 
7bit :
Bir EA'da init() içinden bir start() öğesini zorlamanın tek doğru yolu budur . GUI iş parçacığında start() çalışacağından bunu bir göstergede yapmanıza izin verilmez.

Bu güzel ama her zaman işe yaramaz çünkü kene initi() geri dönmeden önce bile gitmiş olabilir, bu durumda kene atılır. Bunu vurgulamak için, sonra 5 ms'lik bir duraklama eklerseniz

PostMessageA(hwnd, msg, 2 , 1 ); // enqueue a fake tick and let init() return

sonra start() yürütülmez.

Aracıdan gerçek bir onay işareti gerektirmeden uzman danışmanın yükünde start() yürütmek için daha iyi bir çözüm var mı?

 

Biraz yaşlıyım ama bu konuda aldığım aynı soruna bir çözüm arıyorum.

Aslında, qjol'ün "bunu yapmanın tek yolu bir komut dosyası kullanmaktır; sorun şu ki terminali Yüklenen bir komut dosyasıyla açmanın bir yolu yoktur" iddiası kısmen doğrudur. Bir komut dosyası ile tamam, ancak istemci terminali ile bir komut dosyası başlatmanın bir yolu var. Bu, metatrader yardımında (F1, Araçlar, Başlangıçta Yapılandırma) belgelenmiştir. Bu konunun açıldığı tarihte aynı olmayabilir.

Bu yüzden işi yapmak için küçük bir senaryo geliştirdim. Bunu bir başlangıç komut dosyasıyla kullanın, örneğin:

  ; open chart and run expert and/or script
   Symbol =EURUSD
   Period =H4
  Template=popular.tpl
  Expert=
  ExpertParameters=
  Script=CheckConnection
  ScriptParameters=

Ve terminale şunun gibi bir şeyle lauch:

 "...\Metatrader 4\terminal.exe" config\start.ini

Dosyalar:
 

Merhaba millet,

Herhangi birinizi tanıyor musunuz , neden script sahte keneler çalışmıyor - https://www.mql5.com/en/forum/128803/page2#373539 (sayfa 2) 600++ derlemesi için bu konu?

İşletim sistemim Vista. Teşekkür ederim.

 
endy5 :

Merhaba millet,

Herhangi birinizi tanıyor musunuz , neden script sahte keneler çalışmıyor - https://www.mql5.com/en/forum/128803/page2#373539 (sayfa 2) 600++ derlemesi için bu konu?

İşletim sistemim Vista. Teşekkür ederim.

600'den büyük olduğundan, ansi için "A" yı unicode için "W" ile değiştirmeniz gerekir.

 int PostMessage A ( int hWnd, int Msg, int wParam, int lParam);
int RegisterWindowMessage A ( string lpString);
 

neden parametrede 2 ve 1 kullanıyor?

PostMessageA(hwnd, msg, 2 , 1 )
 
iamsuman2 :

neden parametrede 2 ve 1 kullanıyor?

MQL kapsamı dışındadır, işlevi buradan işaretleyin:

 

Başka birinin IsConnected() işleviyle ilgili bilgi araması durumunda.

Yani evet, işlev start() işlevi veya OnTick() işlevi altında çalışmayacaktır, çünkü bağlantı yoksa yeni bir onay işareti gelmez ve işlev yine de tetiklenmez....

Yani ne yapmalıyız?

Gelen onay işaretlerinden bağımsız olarak bağlantıyı düzenli olarak kontrol etmek için OnTimer() işlevini kullanın.

 int timer = 60 ;   //60 seconds, for example
int OnInit ()
  {
//--- create timer
   EventSetTimer (timer);   //could use EventSetMillisecondTimer(timer) for millisecond resolution
//---
   return ( INIT_SUCCEEDED );
  }

// Metatrader self-triggered function, will be called regularly
void OnTimer ()
  {
     if (! IsConnected ())
       Alert ( "Problem, not connection to the server!" );
  }

void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();

  }
      
 

fridayda13 :

Yani evet, işlev start() işlevi veya OnTick() işlevi altında çalışmayacaktır, çünkü bağlantı yoksa yeni bir onay işareti gelmez ve işlev yine de tetiklenmez....

Yani ne yapmalıyız?

Gelen onay işaretlerinden bağımsız olarak bağlantıyı düzenli olarak kontrol etmek için OnTimer() işlevini kullanın.

Hiçbir şey yapmamalısın çünkü yapabileceğin hiçbir şey yok. Ağın zaman aşımına uğraması ve işlevin değeri değiştirmesi 30+ saniye sürer. Hiçbir şey değişmediğinde ve bağlantınız olmadığında ne yapacaksınız?

Yalnızca başlangıçtan/OnTick'ten (bir OrderSend'den önce kontrol edin.) veya aynı tik içinde yeniden denemeler için OrderSend'den sonra geri dönmezseniz yararlıdır.

Bunun yerine, OrderSend başarısız olursa, oturum açın, geri dönün ve bir sonraki onay işaretinde test edin/tekrar deneyin. Tamamlandı.