MQL'de asenkron ve çok iş parçacıklı programlama - sayfa 25

 
Yuriy Asaulenko :


Konuyu yeniden okumaya başladı ve Igor zaten bunun hakkında yazdı.

Пишите dll (в которой Вы должны выделить память и зарегистрировать новый поток! - затем при выходе все аккуратно уничтожить!) и вызывайте ее из MQL

Yur'un söylemeye çalıştığım şey buydu, bellek ayırmanız ve akışı kaydetmeniz gerekiyor.
İgor, tahsis ve kayıt yaptırmanız gerektiğini yazıyor, hiçbir şey yapmanıza gerek yok yazıyor.
İşte burada başım dönüyor. Sonunda bir çıkmaz..

Igor kulede özel bir şekilde çalıştı ve bu konuda kendi kendine öğrettiğimizden daha fazlasını anlamalı.
Başlangıçta, bellek ayırmak ve başlatmak için gerekli olan aynı şeye meyilliydim.
Bu hala farklı C derslerinden, hafızamda başlatma ve bellek tahsisi ertelendi , bu doğru kodlamanın anahtarı, çünkü bu akmayacak ve çöp olmayacaktı.

Igor'a bu soruda, lütfen bunun C ++ ile nasıl yapıldığını açıklayın.
Sadece kelimelerle değil, bir örnekle, kelimeler nifiga anlamaz))

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved )
{
         switch (ul_reason_for_call)
        {
         case DLL_PROCESS_ATTACH:
         case DLL_THREAD_ATTACH:
         case DLL_THREAD_DETACH:
         case DLL_PROCESS_DETACH:
                 break ;
        }
         return TRUE;
}
 
Roman :

Konuyu yeniden okumaya başladı ve Igor zaten bunun hakkında yazdı.

Yur'un söylemeye çalıştığım şey buydu, bellek ayırmanız ve akışı kaydetmeniz gerekiyor.

Tabii ki, her şey gerekli, her şey gerekli .. Ama DllMain hiçbir taraftan burada değil.) - başka bir şey için gerekli. Ve senin için değil. Onu unut, sonsuza kadar daha iyi.) Senin için o yok.
Bir fonksiyon dışa aktarımı yazın. Diğer her şey kesinlikle geleneksel programlardakiyle aynıdır. Ve ayrıca bir ihtiyaç var.
Gerisi daha sonra, zaten uyuyorum))
 
C# alın çünkü C/C++ sizin için çok karmaşık.
 
Roman :

Konuyu yeniden okumaya başladı ve Igor zaten bunun hakkında yazdı.

Başlangıçta, bellek ayırmak ve başlatmak için gerekli olan aynı şeye meyilliydim.
Bu hala belleğimdeki farklı C derslerinden, başlatma ve bellek ayırma , bu doğru kodlamanın anahtarıdır, çünkü bu akmaz ve çöp olmaz.

Igor'a bu soruda, lütfen bunun C ++ ile nasıl yapıldığını açıklayın.

Bu konuyu ustaca tartışmanın en üstüne itiyorsunuz, giderek daha fazla tartışma katılımcısını probleminize çekmeye çalışıyorsunuz)))

Yazışmayı bağlamdan çıkarmayın:

- Bunu WinAPI'nin nasıl çalıştığını anlamak istiyorsanız dll yazmak için hazır örnekler kullanabilirsiniz bağlamında yazdım = bu kaynakta 20'den fazla makale

- Bunu, sistem programcılarının size yazmış olduğu içerme dosyalarını değiştirerek saf WinAPI çağrılarına ulaşabileceğiniz bağlamında yazdım.

....

yazışmanın özü: yazmaya ve yazmaya değil, okumaya ve bir şeyler yapmaya başlayın... proje türü, kodunuzu eklediniz, derlendi = sonucu aldı - yüzlerce veya binlerce sistem programcısı sizin için tüm işi yaptı. Şablonlarda ve dahil edilen dosyalarda yapılacak herhangi bir değişiklik mantıklı olmalıdır - eğer bilmiyorsanız, o zaman "neden bu kadar çok kod, zaten çalışıyor!" kisvesi altında. - OS / PC ile tekrarlanamayan bir hata ve / veya uyumluluk (taşınabilirlik) eksikliği alacaksınız

 
Vladimir Simakov :
İçerik oluşturucular için yayın. Troller geçer. Grafik arayüzler için, OnChartEvent'i ayrı bir iş parçacığına koymak oldukça öyle görünüyor.

geliştiricilerin yaptığı modeli neden bozsun? - MQL programının modeli basit ve anlaşılır, olaylar var - bu olayları işleyen giriş noktaları var (OnTick(),OnInit()....OnChartEvent() )

Herhangi bir MQL programından ticaret ortamının durumunu almak mümkündür (göstergeler bile açık bir siparişin karını görebilir, vb.) ve bir uzman + komut dosyası, uzman + özel göstergeyi tek bir grafikte birleştirebilirsiniz - eşzamansız olursunuz MQL programlarının yürütülmesi, uzman işlemler, gösterge grafiksel görselleştirme görüntüler - özel gösterge akışının performansı yeterli değilse (aynı iş parçacığında çalışırlar), o zaman elbette bir sorun var - 2 Expert kullanmanız gerekir 2 çizelge üzerinde danışmanlar ve çizelgeler arasındaki etkileşimi düzenler...

tekrar - belirli bir görev var, bir uygulama var, birçok kez bu özelliğin neden gerekli olduğunu sordum, henüz bir cevap yok - sadece 3D görselleştirme hakkında uzamsal akıl yürütme .... ve DirectX'in nereden alınacağı hakkında bir konuşma yok 3D ile çalışmak için;)

IMHO, dokunma! )))

 
Igor Makanu :

geliştiricilerin yaptığı modeli neden bozsun? - MQL programının modeli basit ve anlaşılır, olaylar var - bu olayları işleyen giriş noktaları var (OnTick(),OnInit()....OnChartEvent() )

Herhangi bir MQL programından ticaret ortamının durumunu almak mümkündür (göstergeler bile açık bir siparişin karını görebilir, vb.) ve bir uzman + komut dosyası, uzman + özel göstergeyi tek bir grafikte birleştirebilirsiniz - eşzamansız olursunuz MQL programlarının yürütülmesi, uzman işlemler, gösterge grafiksel görselleştirme görüntüler - özel gösterge akışının performansı yeterli değilse (aynı iş parçacığında çalışırlar), o zaman elbette bir sorun var - 2 Expert kullanmanız gerekir 2 çizelge üzerinde danışmanlar ve çizelgeler arasındaki etkileşimi düzenler...

tekrar - belirli bir görev var, bir uygulama var, birçok kez bu özelliğin neden gerekli olduğunu sordum, henüz bir cevap yok - sadece 3D görselleştirme hakkında uzamsal akıl yürütme .... ve DirectX'in nereden alınacağı hakkında bir konuşma yok 3D ile çalışmak için;)

IMHO, dokunma! )))

Bak. Bir düğme var. Onu ara. OnChartEvent kuyruğa alındı. Yalnızca bu kuyrukta zaten OnTick, ardından OnTime var ve içlerinde, bir saniyeliğine bloke eden ve boktan bir yineleme bulutu için bir döngü olan tüm enstrümanlar için CopyRate var. Sonuç olarak, örneğin, bir düğmede bir iletişim kutusu açılırsa, arayüzün askıda kalmasını sağlarız. Eleştirel değil elbette ama çirkin.
 
Vladimir Simakov :
Bak. Bir düğme var. Onu ara. OnChartEvent kuyruğa alındı. Yalnızca bu kuyrukta zaten OnTick, ardından OnTime var ve içlerinde, bir saniyeliğine bloke eden ve boktan bir yineleme bulutu için bir döngü olan tüm enstrümanlar için CopyRate var. Sonuç olarak, örneğin, bir düğmede bir iletişim kutusu açılırsa, arayüzün askıda kalmasını sağlarız. Elbette kritik değil, ama çirkin.

GUI, ana Uzman Danışmanda ve diğer her şey ayrı bir Uzman Danışmanda çalışmalıdır. Bu ayrı bağımlı EA, görünmez bir OBJ_CHART üzerine yerleştirilir ve ana EventSendCustom() yolu ile etkileşime girer.

Çoklu iş parçacığı gibi bir şey ortaya çıkıyor. Ben bu şekilde uyguladım.

 
Vladimir Simakov :
Bak. Bir düğme var. Onu ara. OnChartEvent kuyruğa alındı. Yalnızca bu kuyrukta zaten OnTick, ardından OnTime var ve içlerinde, bir saniyeliğine bloke eden ve boktan bir yineleme bulutu için bir döngü olan tüm enstrümanlar için CopyRate var. Sonuç olarak, örneğin, bir düğmede bir iletişim kutusu açılırsa, arayüzün askıda kalmasını sağlarız. Elbette kritik değil, ama çirkin.

OnChartEvent OnTick ve OnTime'ın önceliğini bilmiyorum, ancak geliştiriciler, Expert Advisor meşgulse ve olayı işlemediyse, bu olayın bir kuyruk oluşturmadığını, yani. sadece bir onay işareti veya zamanlayıcıyı atlayacaktır ( OnChartEvent - Bilmiyorum, kontrol etmedim)


burada geliştiricilerin mantığı basittir, her olay uzmanın belirli bir eylemidir, ancak bu olay için kesin olarak biliyorum ve bir kereden fazla kontrol ettim (MT5'te teoride daha fazla çalışıyorum, bilmiyorum ONTick fiziksel olarak nasıl çalışır):

MT4 hakkında kesinlikle söyleyeceğim: tüm ticaret işlemleri yalnızca gelen bir onay işaretiyle yapılmalıdır, aksi takdirde 10'dan 9'unda sunucudan bir ticaret işlemini gerçekleştirmeyi reddedersiniz,

onlar. SATIN AL butonlu bir arayüz yaptım - fikre göre, SATIN AL'a basıyorsunuz - hemen bir sipariş gönderiyorsunuz, ancak bu doğrudan işe yaramayacak, kullanıcının komutunu hatırlamanız gerekiyor (ideal olarak, yapmamak için düğmeyi kilitleyin) ellerinizle dürtün))) ve OnTick()'te bir kene geldiğinde - sunucuya bir sipariş gönderin - vakaların% 99'unda bu şekilde çalışacaktır, yani. bir onay işareti geldi - bir ticaret talebi gerçekleştirebilirsiniz (ve MQL'deki herhangi bir yerden değil)



ve asenkron iş parçacığına OnChartEvent'i de koyarsak, yürütülebilir kodun kilitlenmelerini de alır mıyız? - örneğin, OnChartEvent'te bir düğmeye bastığımda ticaret istatistikleri alıyorum ve OnTick'te aynı işlevi (son kaybeden ticaret) kullanıyorum - bir şeyle ilgili bir şey olacak! - IMHO hepsini tırmıklamayacaksın

 
Andrey Barinov :

GUI, ana Uzman Danışmanda ve diğer her şey ayrı bir Uzman Danışmanda çalışmalıdır. Bu ayrı bağımlı EA, görünmez bir OBJ_CHART üzerine yerleştirilir ve ana EventSendCustom() yolu ile etkileşime girer.

Çoklu iş parçacığı gibi bir şey ortaya çıkıyor. Ben bu şekilde uyguladım.

Aynen öyle. Hizmetçi olmadığı için... Koltuk değneği deniyor.
 
Igor Makanu :

OnChartEvent OnTick ve OnTime'ın önceliğini bilmiyorum, ancak geliştiriciler, Expert Advisor meşgulse ve olayı işlemediyse, bu olayın bir kuyruk oluşturmadığını, yani. sadece bir onay işareti veya zamanlayıcıyı atlayacaktır ( OnChartEvent - Bilmiyorum, kontrol etmedim)


burada geliştiricilerin mantığı basittir, her olay uzmanın belirli bir eylemidir, ancak bu olay için kesin olarak biliyorum ve bir kereden fazla kontrol ettim (MT5'te teoride daha fazla çalışıyorum, bilmiyorum ONTick fiziksel olarak nasıl çalışır):

MT4 hakkında kesinlikle söyleyeceğim: tüm ticaret işlemleri yalnızca gelen bir onay işaretiyle yapılmalıdır, aksi takdirde 10'dan 9'unda sunucudan bir ticaret işlemini gerçekleştirmeyi reddedersiniz,

onlar. SATIN AL butonlu bir arayüz yaptım - fikre göre, SATIN AL'a basıyorsunuz - hemen bir sipariş gönderiyorsunuz, ancak bu doğrudan işe yaramayacak, kullanıcının komutunu hatırlamanız gerekiyor (ideal olarak, yapmamak için düğmeyi kilitleyin) ellerinizle dürtün))) ve OnTick()'te bir kene geldiğinde - sunucuya bir sipariş gönderin - vakaların% 99'unda bu şekilde çalışacaktır, yani. bir onay işareti geldi - bir ticaret talebi gerçekleştirebilirsiniz (ve MQL'deki herhangi bir yerden değil)



ve asenkron iş parçacığına OnChartEvent'i de koyarsak, yürütülebilir kodun kilitlenmelerini de alır mıyız? - örneğin, OnChartEvent'te bir düğmeye bastığımda ticaret istatistikleri alıyorum ve OnTick'te aynı işlevi (son kaybeden ticaret) kullanıyorum - bir şeyle ilgili bir şey olacak! - IMHO hepsini tırmıklamayacaksın

Senkronizasyon programcının işidir, nasıl olduğunu bilmiyorsunuz, multithreading kullanmıyorsunuz. Yaratıcıların görevi bir araç vermektir ve zaten her kötü Pinokyo kendisinde vardır. Aynı a la mutex'in kendisi, uygulanması için bir sorun değildir.