Ticaret fırsatlarını kaçırıyorsunuz:
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Doğru. Teşekkürler. Bunu hatırlamadım. Aslında bu sorunu tamamen çözmüyor çünkü emirlerin neredeyse anında yerine getirilmesine ihtiyacım var (ve sanırım bu yöntemle onu sadece saniyede bir kontrol edebiliyorum, ama en azından her tikte değil), ama gerçekten de kolayca geçici bir çözüm üretebiliyorum. onu kullanmak.
OnTimer, sistem saati ile uyumlu en hızlı hıza sahip olsa da, yani her 15 ms'de bir, 1 ms aralıklarla döngü yapmayı tercih ederim (döngüde Uyku(1)'i kullanarak).
OnTimer, sistem saati ile uyumlu en hızlı hıza sahip olsa da, yani her 15 ms'de bir, 1 ms aralıklarla döngü yapmayı tercih ederim (döngüde Uyku(1)'i kullanarak).
Bu bir sorun olmaz mıydı? Demek istediğim, MT4'te, bir tür dahili arabelleğin durmadan ve sadece döngüye girmeden haftalarca çalıştıktan sonra (EA) taşmasını veya aşırı boyutlandırılmasını önlemek için OnTick()'in yürütülmesi gerekebilecek dahili süreçler yok mu?
Cehaletten soruyorum, sorun olabilir mi bilmiyorum, sadece MT4'ün bunu yapmak için tasarlanmadığını varsayarsak.
Yani (/denediniz) bir sorun olmayacağını mı düşünüyorsunuz? (Eğer öyleyse, bunlar harika haberler).
BTW: OnTimer() 'ın 1 saniyelik aralığın altında yürütülmesini nasıl sağlarsınız? :?
EA'ları birkaç yıl önce init() içinde başlatılan bir döngüde çalıştırırdım, benzer bir nedenle - minimum gecikmeyle harici verileri okumak. Hiçbir yan etkisi olmadan haftalarca çalışırdı. Uyku(1), bilgi işlem gücü etkisinin çok hafif olması için tatmin edicidir.
Zamanlayıcı ayarları mili kabul eder.
EA'ları birkaç yıl önce init() içinde başlatılan bir döngüde çalıştırırdım, benzer bir nedenle - minimum gecikmeyle harici verileri okumak. Hiçbir yan etkisi olmadan haftalarca çalışırdı. Uyku(1), bilgi işlem gücü etkisinin çok hafif olması için tatmin edicidir.
Zamanlayıcı ayarları mili kabul eder.
BTW: OnTimer()'ın 1 saniyelik aralığın altında yürütülmesini nasıl sağlarsınız? :?
EventSetMilisaniyeZamanlayıcı
İşlev, müşteri terminaline, bu Uzman Danışman veya gösterge için zamanlayıcı olaylarının bir saniyeden daha kısa aralıklarla oluşturulması gerektiğini belirtir.
bool EventSetMillisecondTimer (
int milisaniye // milisaniye sayısı
);
parametreler
milisaniye
[içinde] Zamanlayıcı olaylarının sıklığını tanımlayan milisaniye sayısı.
döndürülen değer
Başarılı yürütme durumunda, true, aksi takdirde - false döndürür. Bir hata kodu almak için GetLastError() işlevi çağrılmalıdır.
Not
Bu özellik, yüksek çözünürlüklü zamanlayıcının gerekli olduğu durumlar için tasarlanmıştır . Başka bir deyişle, zamanlayıcı olayları saniyede bir defadan daha sık alınmalıdır. Birkaç saniyelik süreye sahip geleneksel bir zamanlayıcı sizin için yeterliyse, EventSetTimer() öğesini kullanın.
Genellikle, bu işlev OnInit() işlevinden veya sınıf yapıcısından çağrılmalıdır. Zamanlayıcıdan gelen olayları işlemek için bir Uzman Danışman veya gösterge OnTimer() işlevine sahip olmalıdır.
Her Uzman Danışman ve her gösterge, yalnızca bu zamanlayıcıdan olayları alan kendi zamanlayıcısıyla çalışır. mql4 uygulamasının kapatılması sırasında, oluşturulmuş ancak EventKillTimer() işlevi tarafından devre dışı bırakılmamışsa, zamanlayıcı zorla yok edilir.
Her program için yalnızca bir zamanlayıcı başlatılabilir. Her mql4 uygulamasının ve grafiğinin, yeni gelen tüm olayların yerleştirildiği kendi olay sırası vardır. Kuyruk zaten Zamanlayıcı olayı içeriyorsa veya bu olay işleme aşamasındaysa, yeni Zamanlayıcı olayı mql4 uygulama kuyruğuna eklenmez.
EventSetMilisaniyeZamanlayıcı
İşlev, bu Expert Advisor veya göstergesi için zamanlayıcı olaylarının bir saniyeden daha kısa aralıklarla oluşturulması gerektiğini müşteri terminaline bildirir.
bool EventSetMillisecondTimer (
int milisaniye // milisaniye sayısı
);
parametreler
milisaniye
[içinde] Zamanlayıcı olaylarının sıklığını tanımlayan milisaniye sayısı.
döndürülen değer
Başarılı yürütme durumunda, true, aksi takdirde - false döndürür. Bir hata kodu almak için GetLastError() işlevi çağrılmalıdır.
Not
Bu özellik, yüksek çözünürlüklü zamanlayıcının gerekli olduğu durumlar için tasarlanmıştır . Başka bir deyişle, zamanlayıcı olayları saniyede bir defadan daha sık alınmalıdır. Birkaç saniyelik süreye sahip geleneksel bir zamanlayıcı sizin için yeterliyse, EventSetTimer () öğesini kullanın.
Genellikle, bu işlev OnInit() işlevinden veya sınıf yapıcısından çağrılmalıdır. Zamanlayıcıdan gelen olayları işlemek için bir Uzman Danışman veya gösterge OnTimer() işlevine sahip olmalıdır.
Her Expert Advisor ve her gösterge, yalnızca bu timer'dan olayları alan kendi timer'ı ile çalışır. mql4 uygulamasının kapanması sırasında, timer oluşturulmuş ancak EventKillTimer() işlevi tarafından devre dışı bırakılmamışsa, zorla yok edilir.
Her program için yalnızca bir zamanlayıcı başlatılabilir. Her mql4 uygulaması ve grafiği, yeni gelen tüm olayların yerleştirildiği kendi olay sıralarına sahiptir. Kuyruk zaten Zamanlayıcı olayı içeriyorsa veya bu olay işleme aşamasındaysa, yeni Zamanlayıcı olayı mql4application kuyruğuna eklenmez.
Detaylı açıklama için teşekkürler; benim hatam; İnternette çok hızlı okudum. (Bağlantılar docs.mql4.com alan adını forum.mql4.com ile değiştirmiştir. Başka birinin bu konuyu kontrol etmesi durumunda...)
DÜZENLEME: Etrafta olan bir moderatörün avantajından yararlanacağım: OnTimer()'ı her N milisaniyede yürütmek ile önceki gönderilerde açıklandığı gibi her N milisaniyede aynı döngüyü yapmak arasında herhangi bir fark olup olmadığını biliyor musunuz?
Neden "ms" zamanlaması ile ilgili tüm bu yaygarayı anlamıyorum. Bu, çok düşük gecikme süreli bir aracı bağlantısında bir tür "Yüksek Frekanslı Haber Ölçekleyici" olmadığı sürece, OnTimer() üzerindeki bir saniyelik aralıklar yanıt süresi olarak fazlasıyla yeterli olmalıdır.
JAVA uygulaması yürütme, IPC (LAN ve WAN) iletişimi, Sipariş yönetimi yürütme ve Aracı sunucu gecikmesinin tüm gecikmelerini ve gecikmesini eklerseniz, normal stratejiler için "ms" zamanlamasını kullanmanın gerçek bir avantajı yoktur.
Bununla birlikte, aracıya düşük gecikme süresi olan bir VPS'de kullanılacak bir tür "Yüksek Frekanslı Haber Ölçekleyici" ise, o zaman JAVA ve IPC ile hiç uğraşmamalısınız ve stratejiyi kodlamalısınız. mümkün olan en düşük gecikmeyi elde etmek için doğrudan çok kompakt MQL'de.
DÜZENLE:
DÜZENLEME: Etrafta olan bir moderatörün avantajından yararlanacağım: OnTimer()'ı her N milisaniyede yürütmek ile önceki gönderilerde açıklandığı gibi her N milisaniyede aynı döngüyü yapmak arasında herhangi bir fark olup olmadığını biliyor musunuz?
Moderatör olmam diğerlerinden daha bilgili olduğum anlamına gelmez. Aslında, bu başlıktaki diğer afişlerin konuyla ilgili benden daha fazla bilgisi olduğu açık. Java hakkında hiçbir şey bilmiyorum.
EA'yı beklemeye aldığı için bir zamanlayıcı olayında Sleep() kullanmanın amacını anlamıyorum ve bu birçok OnTick() olayının kaçırılması anlamına gelebilir. Tabii ki, EA'ya bağlı olarak OnTick olayları önemsiz olabilir.
EA'ları birkaç yıl önce init() içinde başlatılan bir döngüde çalıştırırdım, benzer bir nedenle - minimum gecikmeyle harici verileri okumak. Hiçbir yan etkisi olmadan haftalarca çalışırdı. Uyku(1), bilgi işlem gücü etkisinin çok hafif olması için tatmin edicidir.
Biraz eğlenmek için... aşağıdaki komut dosyası birden çok eşzamanlı TCP/IP bağlantısını kabul eder ve gelen CR ile sınırlandırılmış iletileri Uzmanlar günlüğüne yazar. Örneğin, komut dosyası çalışırken Telnet aracılığıyla (varsayılan olarak 51234 numaralı bağlantı noktasına) bağlanabilirsiniz ve yazdığınız her metin satırı yazdırılacaktır.
Biraz eğlenmek için... aşağıdaki komut dosyası birden çok eşzamanlı TCP/IP bağlantısını kabul eder ve gelen CR ile sınırlandırılmış iletileri Uzmanlar günlüğüne yazar.
... bariz olanı belirterek, yukarıdakileri bir komut dosyası yerine bir EA'da yapmak istiyorsanız, o zaman basitçe aşağıdaki gibi değiştirirsiniz: