Hatalar, hatalar, sorular - sayfa 2541

 
Ilyas :
Böylece kontrolü terminale geri döndürmediniz, DLL'de Fn içindeki "sonsuz" bir döngüde "asıldınız".
Ne normal bir son!

Böyle bir davranışa ihtiyacınız varsa, o zaman DLL'deki Fn içinde, ayrı bir FnStop işlevinde ayarlanmış bir bayrak tarafından durdurulabilen bir döngü ile ayrı bir iş parçacığı başlatmanız gerekir ve DLL_PROCESS_DETACH

Kontrolü geri döndürmemesi bir örnek için yapılmıştır, while mql thread'ini bloke etmemek için ayrı bir thread'de çalıştırılması gerektiği açıktır.
Ancak başka bir iş parçacığında çalıştırdığımda aynı davranışı alıyorum, sorun DLL_PROCESS_DETACH içinde, bu tanımlayıcı zaten var olan Ayır bayrağı için çalışmıyor.
Evet, ayrı bir dışa aktarılan işlev oluşturmanız ve bayrağı bunun üzerinden kontrol etmeniz gerektiğini zaten yazdık.
Fakat örnekte görüldüğü gibi DLL_PROCESS_DETACH içindeki flag çalışmıyor.
Bu nedenle, terminalde bir hata olabilir, ancak DLL_PROCESS_DETACH'ın bayrağı başka bir duruma aktarması mantıklıdır.
Bu durumu alan while döngüsü döngüden çıkar, yolda meydana gelen her şey yürütülür ve Fn() işlevinin kendisini tamamlar.
Ve ancak bundan sonra dll kaldırılmalıdır!
Ancak bu olmuyor, terminalin gizli mekanizmaları tarafından dll'nin bir tür erken boşaltıldığı ortaya çıkıyor, bu yüzden bir çökme alıyoruz.

 
TheXpert :

böylece sizin gibi beceriksiz insanlar, Fedoseev vb. yorumları ile böcekler ve tasarımlar tartışmasına girmesin.

böylece MQL'de bir bütün olarak C++'dan alınan ve C++'dakiyle aynı görünen yapılar ve mekanizmalar, C++'dakiyle aynı şekilde çalışır.

bu saçmalık ve bunu biliyorsun ama atmalısın.

sadece sen ağla. nasıl elde ettikleri, ayrı bir dil ve ayrı bir dal hakkında.

kendine ve sempati duyanlara ve Nuh'a ayrı bir şube aç.

Senin hakkında daha iyi bir fikrim vardı. Yanlış. Olur. Sen bir boorsun ve ... akıllı değilsin.

 
Roman :

Kontrolü geri döndürmemesi bir örnek için yapılmıştır, while mql thread'ini bloke etmemek için ayrı bir thread'de çalıştırılması gerektiği açıktır.
Ancak başka bir iş parçacığında çalıştırdığımda aynı davranışı alıyorum, sorun DLL_PROCESS_DETACH içinde, bu tanımlayıcı zaten var olan Ayır bayrağı için çalışmıyor.
Evet, ayrı bir dışa aktarılan işlev oluşturmanız ve bayrağı bunun üzerinden kontrol etmeniz gerektiğini zaten yazdık.
Fakat örnekte görüldüğü gibi DLL_PROCESS_DETACH içindeki flag çalışmıyor.
Bu nedenle, terminalde bir hata olabilir, ancak DLL_PROCESS_DETACH'ın bayrağı başka bir duruma aktarması mantıklıdır.
Bu durumu alan while döngüsü döngüden çıkar, yolda meydana gelen her şey yürütülür ve Fn() işlevinin kendisini tamamlar.
Ve ancak bundan sonra dll kaldırılmalıdır!
Ancak bu olmuyor, terminalin gizli mekanizmaları tarafından dll'nin bir tür erken boşaltıldığı ortaya çıkıyor, bu yüzden bir çökme alıyoruz.

Tahmin etmeme izin ver. Terminal iş parçacığında dll'den bir döngü çalıştırırsanız, donuyor ve ayrı bir iş parçacığında detach() yaparsanız, terminal bir hatayla çöküyor mu?
 
Roman :

Kontrolü geri döndürmemesi bir örnek için yapılmış, iş parçacığını engellememek için ayrı bir iş parçacığında çalıştırılması gerektiği açıktır.

bu yüzden doğru örneği verin. ve ek müfrezelerini rahat bırakın. iş parçacıklarının oluşturulmasını/kaldırılmasını açıkça kendiniz yönetin.
 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

Sergey Dzyublik , 2019.05.26 15:12

Ne yazık ki, şu anda MT4/MT5'teki işlev işaretçisi türlerinin olanakları çok sınırlıdır ve bir dizi kusur nedeniyle pratik değildir:
  (MT5(build 2118)'de düzeltilmedi) "Bir typedef içinde aynı işlev imzasını yeniden kullanırken derleme hatası ".
  (MT5(build 2118 )'de sabit değil) "Bir typedef ile çalışırken, açık bir uzmanlığa sahip bir şablon işlevi kullanmak, şablon işlev kodunun oluşturulmasına neden olmaz."


Ad alanının beklenen uygulaması göz önüne alındığında, kusur düzeltmelerinin bir parçası olarak aşağıdaki C++ benzeri davranış için destek uygulama olasılığını değerlendirmenizi rica ediyorum:
 //#include <iostream>

template < typename T>
class A{
public :
     typedef void (*callback)(T&);   //class namespace for function pointer type
    callback f_ptr;
    T data;
};

template < typename T>
class B{
public :
     typedef void (*callback)(T&);   //class namespace for function pointer type
    callback f_ptr;
};

template < typename T>
void func(T& value){
    ++value;
}


void OnStart (){
//int main(){
    A< int > a;
    B< int > b;
    
    a.f_ptr = func< int >;       // automatic code generation of templates functions
    b.f_ptr = a.f_ptr;         // assignment operation for function pointers with the same function signatures and different function pointer types.
    
     int x = 1 ;
    b.f_ptr(x);
     printf ( "%d\r\n" , x);                   //2
     printf ( "%d\r\n" , b.f_ptr == a.f_ptr); //1     // equal operation for function pointers with the same function signatures and different function pointer types.
}

MT5 (build 2118), typedef işlevinde hata düzeltmeleri için ne kadar bekleyebiliriz?
Bir tür saçmalık - typedef kullanmanın ilkel bir örneğinden sola doğru bir adım ve hepsi bu - daha fazla gelişmeyi engelleyen bir grup hata .

 
Vladimir Simakov :
Tahmin etmeme izin ver. Terminal iş parçacığında dll'den bir döngü çalıştırırsanız, donuyor ve ayrı bir iş parçacığında detach() yaparsanız, terminal bir hatayla çöküyor mu?

Kesinlikle bu şekilde değil.
Döngüyü çalıştırmak iyi çalışıyor.
Sorun, programı zorla durdurduğunuzda ve döngüden çıkması ve çalışan işlevi sonlandırması için döngüye bir bayrak ilettiğinizde ortaya çıkar.
Ancak terminal, dll'nin erken boşaltılması zaten çalıştığından, döngüden doğru bir şekilde çıkmanıza ve çalışan işlevi tamamlamanıza izin vermiyor. Bir askı alıyoruz.
dll, bayrak durumu geçilmeden önce kaldırılır ve Fn işlevi tamamlanmaz, erken boşaltma her şeyi bozar.

Tüm kodu yazmamak için örnek olarak terminal akışında yaptım, çünkü engelleme modunda sorun daha iyi görülebilir.
Döngü bayrağı için zaten ayrı bir işlev başlattım, çalışan döngü farklı bir iş parçacığında çalışıyor, ancak hepsi aynı davranış.
Engellenmemiş bir mql kodundan denediğimde, döngüden çıkmak için bayrağı başka bir duruma aktarmak için işlevi kullanın,
terminal, çalışan döngünün tamamlanmasını beklemez ve döngünün döndüğü yerde Fn işlevinin tamamlanmasına izin vermez.
Terminal, Fn işlevinin tamamlanmasını beklemeden dll'nin erken boşaltılmasını hemen gerçekleştirir. Sorunun olduğu yer burası.

TheXpert :
bu yüzden doğru örneği verin. ve ek müfrezelerini rahat bırakın. iş parçacıklarının oluşturulmasını/kaldırılmasını açıkça kendiniz yönetin.

Kilitli modda sorunu daha iyi görebilirsiniz. Aslında bayrağın durumunun nasıl değiştiği önemli değil. Giriş noktası veya bağımsız işlev.
Engelleme modu için, kontrol geri aktarılmadığından giriş noktası daha iyidir ve bayrak değiştirme işlevini çağırmak işe yaramaz. Bu nedenle, bir örnek için ayrıntıları ekleyin.
Ek ayrıntılarını yalnız bıraktım, önerdiğiniz gibi ayrı bir işlev başlattım, nifiga, çalışan bir projede engellemesiz modda, aynı davranış.
Askı geldiğinde, while döngüsünün döndüğü çalışma işlevi olan dll'nin erken boşaltılması var, tamamlamak için zaman yok.

 
Roman :

Askı geldiğinde, while döngüsünün döndüğü çalışma işlevi olan dll'nin erken boşaltılması var, tamamlamak için zaman yok.

normal bir uygulamada asılı olamaz

 

Özel sembollerle ilgili aşağıdaki sorunla karşılaşan var mı? CustomRatesUpdate işlevine normal alıntılar iletilir, ancak aslında grafikte ve veri penceresinde garip bir şey olur (bu durumda, yakın ve düşük değerler, geçenlerden 100 kat daha küçüktür):

Ayrıca, tek tikler, CustomTicksAdd kullanılarak günlüktekiyle aynı kapanış fiyatı değerleriyle (CustomRatesUpdate'den hemen önce) eş zamanlı olarak öykünür, yani. tırnak içindeki azaltılmış değerlerin nereden geldiği belli değil.

UPD:

USDCAD'de bir anlamda "ters" bir durum var - kayıttan sonra fiyatlar 10 kat artıyor. Bu aldığım günlük:

 2019.08 . 23 00 : 04 : 10.579 RenkoCharts (USDCAD,M1)                  [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2019.08 . 23 00 : 04 : 10.579 RenkoCharts (USDCAD,M1) [ 0 ] 2019.08 . 23 00 : 02 : 00 1.32987 1.32987 1.32980 1.32987            457        48              0
2019.08 . 23 00 : 04 : 10.579 RenkoCharts (USDCAD,M1) Retry: 1 0
2019.08 . 23 00 : 04 : 10.579 RenkoCharts (USDCAD,M1)                  [time]  [open]   [high]   [low]  [close] [tick_volume] [spread] [real_volume]
2019.08 . 23 00 : 04 : 10.579 RenkoCharts (USDCAD,M1) [ 0 ] 2019.08 . 23 00 : 02 : 00 1.32980 13.29730 1.32980 13.29730            457        52              0

İlk ArrayPrint, CustomRatesUpdate'e yazılan şeydir ve ikinci ArrayPrint, yazmadan hemen sonra en son en yeni çubuktan CopyRates kullanılarak okunan şeydir. İlk olarak, fark açılışta son hanededir, ancak daha da önemlisi, yüksek ve yakın 10 kat artar.

 
Stanislav Korotky :

Özel sembollerle ilgili aşağıdaki sorunla karşılaşan var mı? CustomRatesUpdate işlevine normal alıntılar iletilir, ancak aslında grafikte ve veri penceresinde garip bir şey olur (bu durumda, yakın ve düşük değerler, geçenlerden 100 kat daha küçüktür):

Ayrıca, tek tikler, CustomTicksAdd kullanılarak günlüktekiyle aynı kapanış fiyatı değerleriyle (CustomRatesUpdate'den hemen önce) eş zamanlı olarak öykünür, yani. tırnak içindeki azaltılmış değerlerin nereden geldiği belli değil.

Evet, rastladım, sadece anlaşılmayan bir sıfırım vardı. 100 kat sliplerde sizlerle.
Sıfır için ek bir kontrol yaptım, yardımcı olmadı, çarpık çalıştı, sonra bu tür sivri uçlar çekmek normaldi.
Temel olarak, bu davranış, programın ilk başlangıcında gözlemlendi ve ilk başlatmada, var olmayan bir tarihle geçmiş dosyaları oluşturuldu.
Tikler klasörünü temizledim, bug'ın nerede olduğunu bulmak için kodu düzelttim, yoruldum, şimdilik erteledim ama bu soruna da dönmek zorundayım ((
Ayrıca özel geçmiş klasörünü de kontrol edin, tarihi olmayan dosyalar olabilir))
Genel olarak, belirli bir böcek orada yaşıyor.

Lütfen sorunu bu konuya gönderin.
Görünüşe göre Slava özel sembollerden sorumlu.
Size sorunu hatırlatmak için.
 

Bu hatadan daha önce bahsedildi mi? Ben bulamıyorum. Alt satır: Bir önbellek dosyasından optimizasyon sonuçları yüklenirken, iletme sonuçları yanlış görüntüleniyor. Parametre değerlerinde soldaki rakamlar.

Optimizasyon sekmesine gidin. Bir uzman seçersiniz. Önceki optimizasyonlardan birini seçersiniz. Geri testler iyi yükleniyor. Forvetler bunu yayınlar:



MT5, son yapı. x64.