6 numaralı hata - sayfa 5

 
Şimdi terminale baktım - dün benimle bazı sıkıntılar başladı.
2005.08.11 11:15:00 ****l EURUSD,H1: OrderSend #139 hatasıyla başarısız oldu
2005.08.11 11:07:12 TradeDispatcher: tüm ticaret bağlamı meşgul

Bu danışmanı çözdüm, sonra ne olacağını göreceğim.


Burada. Durum bu. başlar. 139 sipariş kilitli. Kim tarafından, neden - belli değil. Sonra 2, 6 ve hatta yığın olacak.

En rahatsız edici olan şey, bu Expert Advisor'da onu diğerlerinden ayıran hiçbir şeyin olmamasıdır. Yani, ya bu “bir şeyi” yakın mesafeden görmüyorum ya da herhangi bir danışman başarısız olabilir, herkesin fark etmediği, sırasıyla herkes için her saat çalışması gerekmiyor.

Buna göre, herkese soru - günlüklerde benzer girişleriniz var mı?

Rosh, Alpari kullanıyor musun? Cevabınız evet ise, o zaman soru Alpari içindir - sunucunuz normal çalışıyor mu?

Bu gece ne öğrendim :(

1. EA kendi başına, BİR, çalışır ve ya hata vermez ya da o kadar nadiren verir ki, gece bunun için yeterli değildir.

2. Birkaç Uzman Danışmanla birlikte (daha doğrusu altı para birimi için bir tane ile), hata bir saat sonra değil, 4 saat sonra yeniden oluşturuldu.

Buradan ne çıkar?
1. MT'de (veya Uzman Danışmanımda, ancak o kadar basit ki, pek olası değildir) bir hata var ve bu bazen işlem açmaya izin vermiyor. Ve bu arada, yakın.
Tabii ki, atlayabilirsiniz:

while(nSonuç == -1)
{
    nResult = OrderSend(...);
}



Söylemeye gerek yok, bu ÇOK kötü bir programlama tarzıdır ve komisyoncu gücenebilir...

2. Şimdi Expert Advisor'ı daha basit ve aynı zamanda hataya neden olacak şekilde yeniden yazıyorum. Önümüzdeki birkaç saat içinde yayınlayacağım. Hata için iki uzmana ihtiyaç olduğu ortaya çıkarsa ne yapabilirim, iki tane yayınlayacağım :)






 
2. Şimdi Expert Advisor'ı daha basit ve aynı zamanda hataya neden olacak şekilde yeniden yazıyorum. Önümüzdeki birkaç saat içinde yayınlayacağım. Hata için iki uzmana ihtiyaç olduğu ortaya çıkarsa ne yapabilirim, iki tane yayınlayacağım :)

ve kontrol edeceğiz
 
Quark, bir teşhis koydum, suçlu senin danışmanın. Uzman Danışmanınızdan Uyarı gelir gelmez (Hiç kullanmıyorum) - Hemen
 2005.08.11 13:01:19 TradeDispatcher: tüm ticaret bağlamı meşgul


Uyarı ve engelleme süreleri aynıdır. Danışmanın kodu hiç bakmadı.

 
İyi o zaman. İşte tek başına hata üreten yeni bir süper uzman. Şimdiye kadar 139 numaralı hatanın ötesine geçmedim, bu yüzden testlere devam edeceğim.

Nasıl kullanılır: para birimlerinin her biri için (EURUSD, EURJPY, USDCHF, GBPUSD, GBPJPY,
GBPCHF, USDJPY, AUDUSD, EURGBP, USDCAD, EURCHF, EURAUD) saatlik grafiği açar.
Uzmana göre her çizelge için. Etkileşim yapmıyorlar çünkü herkesin mn'si farklı.

Pozisyonlar, grafik başına bir tane olmak üzere hemen açılacaktır . Bir sonraki saatin başında, pozisyonlar tersine çevrilmelidir, vb.

Bir seferde 2 hata aldım, bu nedenle, prensip olarak, 2 saat beklemeniz gerektiğinde seçenek mümkündür.

Ticaret sunucusuyla özel bir ilişkiniz varsa, test için normal bir hesap kullanmak muhtemelen en iyisidir. Alpari'yi kullanıyorum.

Ayrıca açılış pozisyonları için okların konumuna da dikkat edin (bence bu bağımsız bir hatadır). Teoride, yeni bir çubukta bir pozisyon açıldığında, ok da üzerinde olmalıdır.

Son olarak, bir saat beklemek istemiyorsanız, dakika çizelgelerini açın. Hata yeniden oluşturulur.

Bir kez daha tekrarlıyorum, hata 139'dan bahsediyoruz. Aynı zamanda, bu yöntemle henüz 2 ve 6 numaralı hataları alamadım ve temelde onlardan önce. Bu yüzden muhtemelen daha fazla gönderi olacak.

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 5;

double dLotSize = 0.1;

int nMagic = 0;

//////////////////
int init ()
{
	timePrev = 0;

	dStopLoss = 110 * Point;
	nHoursToHold = 1;
	
	if(Symbol() == "EURUSD")
		nMagic = 1;
	else if(Symbol() == "EURJPY")
		nMagic = 2;
	else if(Symbol() == "USDCHF")
		nMagic = 3;
	else if(Symbol() == "GBPUSD")
		nMagic = 4;
	else if(Symbol() == "GBPJPY")
		nMagic = 5;
	else if(Symbol() == "GBPCHF")
		nMagic = 6;
	else if(Symbol() == "USDJPY")
		nMagic = 7;
	else if(Symbol() == "AUDUSD")
		nMagic = 8;
	else if(Symbol() == "EURGBP")
		nMagic = 9;
	else if(Symbol() == "USDCAD")
		nMagic = 10;
	else if(Symbol() == "EURCHF")
		nMagic = 11;
	else if(Symbol() == "EURAUD")
		nMagic = 12;

	return(0);	
}

// ------

int deinit()
{
	return(0);
}
// ------
int start()
{
	if(Bars < 5)
		return(0);
	
	// The previous bar just closed
	bool bIsBarEnd = false;
	if(timePrev != Time[0]) 
		bIsBarEnd = true;
	timePrev = Time[0];
	
	if(!bIsBarEnd)
		return(0);

	// ------
	
	int nSignal = GetSignal();

	if(nSignal == OP_BUY) 
		Buy();
	else if(nSignal == OP_SELL) 
		Sell();

	for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)
	{
		OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);

		if(OrderMagicNumber() == nMagic)
		{
			if(CurTime() - OrderOpenTime() > (nHoursToHold - 1) * 60 * 60)
			{
				if(OrderType() == OP_BUY)
					OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
				else if(OrderType() == OP_SELL)
					OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
			}
		}
	}

	return(0);
}
// ------

void Sell()
{
	if(AccountFreeMargin() < 500)
		return;

	dLotSize = GetLotSize();

	int nResult = OrderSend(Symbol(), OP_SELL, dLotSize, Bid, nSlip, Bid + dStopLoss, 
		0, "Friday", nMagic, 0, OrangeRed);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(nError);
	}
}
// ------
void Buy()
{
	if(AccountFreeMargin() < 500)
		return;

	dLotSize = GetLotSize();

	int nResult = OrderSend(Symbol(), OP_BUY, dLotSize, Ask, nSlip, Ask - dStopLoss, 
		0, "Friday", nMagic, 0, Aqua);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(nError);
	}
}
// ------

double GetLotSize()
{
	double dLot = 0.1;
	
	return(dLot);
}

// ------

int GetSignal()
{
	int nSignal;
	if(MathMod(Hour(), 2) == 0)
		nSignal = OP_BUY;
	else
		nSignal = OP_SELL;
		
	return(nSignal);
}

// ------
 
Quark, bir teşhis koydum, suçlu senin danışmanın. Uzman Danışmanınızdan Uyarı gelir gelmez (Hiç kullanmıyorum) - Hemen
 2005.08.11 13:01:19 TradeDispatcher: tüm ticaret bağlamı meşgul


Uyarı ve engelleme süreleri aynıdır. Danışmanın kodu hiç bakmadı.



Her şey yoluna girecekti ama işlemlerin yapılmadığını fark ettikten sonra uyarıları devreye soktum. Ayrıca OrderSend'den hemen sonra gelen kodda uyarı var.

Şimdi Print'e geçmeye çalışacağım, ama bir şeyden şüpheliyim ...
 
Bu arada, bu ilginç. Danışmanı yeniden derlerken, bIsBarEnd'i hesaplamak için kullandığım değişken sıfırlanıyor. Buna göre editörde F5'e basarsam tüm danışmanlar eski pozisyonları kapatıp yenilerini açmalıdır. F5'e basıldı... Para birimleri (ve danışmanlar) 12. Güncellendi 3. Hm?

Rosh'un tahminini test etmek için Alert yerine Print'i koyun. Ne yazık ki, tek fark, artık ekranda değil, günlükte 139 hata mesajının görünmesidir.
 
Şeytan biliyor, koda bak, şikayet edecek bir şey yok gibi görünüyor. Burası açılış saatine göre değil, Barlar aracılığıyla karar verirdim.
 bool bisBarEnd = yanlış;
	if(timePrev != Zaman[0]) 
		bIsBarEnd = doğru;
	timePrev = Zaman[0];



Ve bu garip şey:
2005.08.11 13:08:12 '18708': 680413 numaralı siparişi kapat 1.2385 sl'den 0.10 EURUSD satın al: 0.0000 tp: 0.0000 1.2408 fiyatından
ve ötesinde

2005.08.11 13:08:13 '18708': sipariş #680413 0.10 EURUSD satın al 1.2385 sl: 1.2275 tp: 0.0000 1.2408 fiyattan kapandı

yani, ilk önce emir durmadan gider ve kar alır ve sonra aniden emirde bir zararı durdur belirir.

 
Şeytan biliyor, koda bak, şikayet edecek bir şey yok gibi görünüyor. Burası açılış saatine göre değil, Barlar aracılığıyla karar verirdim.
 bool bisBarEnd = yanlış;
	if(timePrev != Zaman[0]) 
		bIsBarEnd = doğru;
	timePrev = Zaman[0];



Ve bu garip şey:
2005.08.11 13:08:12 '18708': 680413 numaralı siparişi kapat 1.2385 sl'den 0.10 EURUSD satın al: 0.0000 tp: 0.0000 1.2408 fiyatından
ve ötesinde

2005.08.11 13:08:13 '18708': sipariş #680413 0.10 EURUSD satın al 1.2385 sl: 1.2275 tp: 0.0000 1.2408 fiyattan kapandı

yani, ilk önce emir durmadan gider ve kar alır ve sonra aniden emirde bir zararı durdur belirir.



Test edilmiş bir kod parçası varsa, "Barlar aracılığıyla" bakmaktan mutlu olurum :)

Sıfır durağına gelince, onu init'te atadım ve başka hiçbir yerde değiştirmiyorum. Böcek, muhtemelen. Kahretsin, C++'dan vazgeçtiğimden beri tekrar entomoloji yapmam gerektiğini düşünmedim.

Aslında, şey, bir uzman, tamam, tamam. Ancak o kadar basit ki şu soru ortaya çıkıyor: Diğer uzmanların da aynı şekilde davranması tehlikesi var mı? Ayrıca, hatanın yalnızca çok sayıda uzman olduğunda ortaya çıktığını ve hatta farklı hatalar verdiğini hesaba katarsak.

Örneğin MACD + ADX + Stokastik kullanan bir Uzman Danışman var. Bir test cihazı ile test ettikten sonra (tanım gereği sunucu hatası olmadığında), bir kişi oturup aptalca "burada tüm koşullar karşılandı, ancak işlem tamamlanmadı" kontrol edecek mi? Büyük olasılıkla olmayacak... Tehlikeli böcek.
 


Test edilmiş bir kod parçası varsa, "Barlar aracılığıyla" bakmaktan mutlu olurum :)



Örneğin, bunun gibi:
 int başlangıç()
  {
   int toplam,bilet,toplamUzman;
//---- 
   SetTrace();
   eğer (çubuklar>b)
      {   
      b=barlar;
 
Fena değil ama özünde aynı :)
SetTrace nedir?