6 numaralı hata - sayfa 29

 
gönderilen günlükler.
Bu kodu nereye koyacağız?
 while(!IsStopped() && !IsTradeAllowed()) Sleep(1000);
    GlobalVariableSet(strTradeSemaphore, 0.0);


başlatma fonksiyonunun çıkışında
 
Uykuyu almaya çalıştım()
Görünür bir gelişme olmadan 100.000'e kadar

değiştirildi
 if(!IsTesting())
	{
		uyku(1000);
		GlobalVariableSet(strTradeSemaphore, 0.0);
	}


üzerinde

 while(!IsStopped() && !IsTradeAllowed()) Sleep(1000);
    GlobalVariableSet(strTradeSemaphore, 0.0);



Aynı biber.
Hata 146

 
sonrasında. biraz düşündükten sonra kesin bir yöntemin olduğu ortaya çıktı. formüle etmeye çalışacağım
    while(!IsStopped() && !IsTradeAllowed()) Sleep(1000);
    GlobalVariableSet(strTradeSemaphore, 0.0);


yani, biz kendimiz işgal ettiğimiz ticaret bağlamının serbest bırakılmasını bekliyoruz

ve genel olarak, son derece garip bir durum. bir ticaret operasyonundan sonra, bağlam hemen serbest bırakılır. aksi takdirde döngüdeki pozisyonları kapatmak imkansız olurdu



Tekrar.

Yukarıdaki kod, ticaret bayrağı temizlenirse EA'nın donmasına neden olur.
Bu, hiç kimse semaforu işaret etmeyeceğinden, ticaretin tamamen durmasına yol açacaktır. Bayrak sadece elle kaldırıldığı için bu durum en azından bir şekilde kontrol edilebilir.
Semaforda durum daha kötü. GlobalVariableSet , semaforu kapattığında başka bir Expert Advisor'a düşebilir. Sonuç olarak, birkaç Uzman Danışman aynı anda ticaret yapmaya çalışacaktır.
Gördüğünüz gibi, geliştiriciler arasında, terminalde gerçekleşen asenkron süreçlerin tamamen yanlış anlaşılması var. Ve bu yanlış anlama foruma aktarılıyor.
Burada tartışılana benzer ölümcül hataların ortaya çıkması şaşırtıcı değildir ve bu hatalar düzeltilemez.

Neden kötü tavsiye veriyorsun?
 
Neden вредные tavsiye veriyorsun?

danışman bu yere ulaştıysa, ticaret bayrağının yükseldiği varsayılır!
 
Зачем давать вредные советы?

danışman bu yere ulaştıysa, ticaret bayrağının yükseldiği varsayılır!

Böyle bir varsayımın temeli nedir? Varsayımlar gerçeğe uymadığında beklenmedik hatalar ortaya çıkar.
Bayrak saçmalık.
Senkronizasyon, muteksler, paylaşılan kaynaklar - sorun gerçektir. Kullanıcı düzeyinde global değişkenler yardımıyla çözmeyi önermek saçmalık. Özellikle örnek çalışmadığı için.
 
Pzt\Pzt 12 gece yarısından itibaren uzmanlar MQ-demo ve Alpari-demo üzerinde çalıştı. Her zaman, orada veya orada 128 hatası yoktu, Alpari'de bir hata 6 (ping hatası) ve her ikisinde de - birkaç eski kene vardı. Siparişler sorunsuz bir şekilde işlendi. 05.10'dan itibaren 1.8.3'ü oluşturun. Belki başka bir şeydir? Örneğin, farklı İnternet sağlayıcılarından 443. bağlantı noktası üzerinden bağlanma özelliklerinde? Ne de olsa MT3'ün hataları vardı ama bunlar o kadar çok değildi.


Ne yazık ki. "Gece 12'den başlamak" bir istatistik değildir. Bilinmeyen nedenlerle, sorunlar dalgalar halinde gelir, bazen değil, bazen birden fazla...
 

Quark, vicdan sahibi, forumda bu tür günlükleri yayınlamayın =)))))


Düşündüm - kimin umurunda (Kindzadz'dan Kemancının tonunda) :))


Kapatma / açma gerçeği pahasına - Tüm işlevlerde kontrollerim var ve hatalar görünüyor, ancak bunlar YANLIŞ hatalar. Kayıtları ve sipariş geçmişini kontrol ettim, tüm pozisyonlar kapatıldı. Sadece siparişin tarihe geçmek için zamanı yok. Kontrol etmeden önce 1 saniyelik bir gecikme yaptım - ama bu yeterli değil ... Sorduğumda - cevap vermediler.


Düşünce güzel. Ancak bir saat sonra bile siparişin kaybolmadığı, yani bazen yanlış olmadıkları durumlar oldu.
Ayrıca 10 saniyelik bir gecikmem var.
 
Düşünce güzel. Ancak bir saat sonra bile siparişin kaybolmadığı, yani bazen yanlış olmadıkları durumlar oldu.
Ayrıca 10 saniyelik bir gecikmem var.

tüm hatalarım, ortaya çıktığı gibi, koddaydı =) yani. Orderclose işleminden sonra yanlış bir kontrol yaptım.
Düzelttikten sonra yok. Doğru, uzun zaman oldu, beklememiz gerekecek...
 

tüm hatalarım, ortaya çıktığı gibi, koddaydı =) yani. Orderclose işleminden sonra yanlış bir kontrol yaptım.
Düzelttikten sonra yok. Doğru, uzun zaman oldu, beklememiz gerekecek...


Düzeltilmiş kod neye benziyor?
 
Düzeltilmiş kod neye benziyor?

sipariş kapatmak için:
 //---- pozisyonun gerçekten kapalı olup olmadığını kontrol edin ve değilse, bilgileri görüntüleyin ve çıkın, -5'e dönün
	for ( int x = 0; x < 5; x++ )
	{
		uyku(1000);
		if ( OrderSelect( Close_OrderTicket, SELECT_BY_TICKET ) )
		{
			if ( OrderCloseTime() <= 0 )
			{
				Processing_Error( 0, "SiparişKapat");
				_Return_ ( 3, "Hata", 0, "Pozisyon kapatılmadı", "OrderClose(...)", "Pozisyon kapatılmadı");
				dönüş(-5);
			}
			başka
			{ kırmak; }
		}
		Close_GetLastError = GetLastError();
		_Print_ ( 3, "OrderSelect( " + Close_OrderTicket + ", SELECT_BY_TICKET )", "Hata #" + Close_GetLastError + " ( " + ErrorDescription( Close_GetLastError ) + " )" );
	}


bir sipariş göndermek için - ikinci bir duraklama ile bir sipariş seçmek için yalnızca 5 kat deneme,
değiştirmek için - eski değerleri mevcut olanlarla karşılaştırın