6 numaralı hata - sayfa 9

 
Teşekkürler, 12 pencere (12 para birimi) için Expert Advisor sürümünüzü yükledim. Daha az hata var, ama varlar. Sor. 138 ve 1 almayı başardım. Kendiniz deneyin.

Daha fazla rehberlik için umut.

kuark
 
Bu arada, kod
while(!Stopped())
{
	if(GlobalVariableGet(strTradeSemaphore) == 0.0)
	{
		GlobalVariableSet(strTradeSemaphore, 1.0);
		bSemaforlu = doğru;
         
		kırmak;
	}
		
	uyku(1000);
}



if(GlobalVariableGet(strTradeSemaphore) == 0.0) ve GlobalVariableSet (strTradeSemaphore, 1.0); başka bir uzman gelir. Yürütme iş parçacığını yakalayacak ve engelleyecek (yani kaynağı bekleyecek) ve ardından denetimi uzmana geri döndürecek bir işleve ihtiyacımız var. WaitForExclusive() gibi bir şey

Gerçi, belki de mesele bu değil. Ama hatalar yağmaya devam ediyor.

 
Bu daha iyi. Ancak daha önce olmayan hatalar vardı, örneğin 1. hata.
Yardım için umut.

Bu arada, bu konuşma zaten ortaya çıktığı için, NormalizeDouble kullanarak fiyat için kaç işaret bırakılacağını, yani EURUSD için 4, EURJPY için 2 otomatik olarak nasıl belirlenir...?

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 5;

double dLotSize = 0.1;

int nMagic = 0;
int nDigits = 4;

string strTradeSemaphore = "TradeSemaphore";

//////////////////
int init ()
{
	if(!GlobalVariableCheck(strTradeSemaphore)) 
		GlobalVariableSet(strTradeSemaphore, 0.0);
	
	dStopLoss = 110 * Point;
	nHoursToHold = 1;
	
	if(Symbol() == "EURUSD")
		nMagic = 1;
	else if(Symbol() == "EURJPY")
	{
		nMagic = 2;
		nDigits = 2;
	}
	else if(Symbol() == "USDCHF")
		nMagic = 3;
	else if(Symbol() == "GBPUSD")
		nMagic = 4;
	else if(Symbol() == "GBPJPY")
	{
		nMagic = 5;
		nDigits = 2;
	}
	else if(Symbol() == "GBPCHF")
		nMagic = 6;
	else if(Symbol() == "USDJPY")
	{
		nMagic = 7;
		nDigits = 2;
	}
	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] + nMagic) 
		bIsBarEnd = true;
	timePrev = Time[0] + nMagic;
	
	if(!bIsBarEnd)
		return(0);

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

	while(!IsStopped())
	{
		if(GlobalVariableGet(strTradeSemaphore) == 0.0)
			GlobalVariableSet(strTradeSemaphore, nMagic);

		if(GlobalVariableGet(strTradeSemaphore) == nMagic)
			break;
		
		Sleep(1000);
	}

	for(int nCnt = OrdersTotal() - 1; nCnt >= 0; 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);
			}
		}
	}

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

	GlobalVariableSet(strTradeSemaphore, 0.0);	

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

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

	dLotSize = GetLotSize();

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

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", sell: " + NormalizeDouble(Bid, nDigits) + ", Stop: " + 
			NormalizeDouble(Bid + dStopLoss, nDigits) + ", error: " + nError);
	}
}

// ------

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

	dLotSize = GetLotSize();

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

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", buy: " + NormalizeDouble(Ask, nDigits) + 
			", Stop: " + NormalizeDouble(Ask - dStopLoss, nDigits) + ", error: " + 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);
}

 
Hata 138 ara sıra ortaya çıkıyor (dakikada 12 çift çalıştırıyorum, bu nedenle bir hata almam uzun sürmüyor) ve ayrıca 129 hatası tamamen normal bir fiyata.
 
Böyle. Hata 1. "Bir şeyler yanlış" yardımından ücretsiz bir çeviride. Dakikada 12 döviz çifti, yaklaşık 5-10 dakikada bir hata.

Hata 138 . Dakikada birkaç kez (yani, 12 uzmanın birkaçı bunu üretir).

Hata 129. Fiyatı zaten normalleştirdim ve her şeyi yaptım ...
 
Bu arada, bu konuşma zaten ortaya çıktığı için, NormalizeDouble kullanarak fiyat için kaç işaret bırakılacağını, yani EURUSD için 4, EURJPY için 2 otomatik olarak nasıl belirlenir... ?
 int _Digits = MarketInfo( Symbol(), MODE_DIGITS );




ve Uzman Danışmanlarınızdan biri 5'im tüm bu süre boyunca bir hata verdi - 6.
düzeltmemde uzman çalışmıyor - bu yapıda yanlış anladılar =)
oh evet... benim 5'im de çalışmıyor =)))) kahretsin...

 
стати, раз уж этот разговор возник, как автоматически определить, сколько знаков оставлять для цены при помощи NormalizeDouble, то есть, 4 для EURUSD, 2 для EURJPY... ?
 int _Digits = MarketInfo( Symbol(), MODE_DIGITS );




ve Uzman Danışmanlarınızdan biri 5'im tüm bu süre boyunca bir hata verdi - 6.
düzeltmemde uzman çalışmıyor - bu yapıda yanlış anladılar =)
oh evet... benim 5'im de çalışmıyor =)))) kahretsin...



Kod için teşekkürler, uzun zamandır arardım.
Slava tarafından önerilen ve benim tarafımdan geliştirilmiş :) Uzman Danışman aşağıda verilmiştir. Benim gibi çalıştırabilirsiniz - 12 pencerede, 12 para birimiyle. Herhangi bir zaman diliminde çalışır, ancak dakikalar üzerinde daha hızlıdır :) Hatalar yağmaya devam ediyor, kahretsin ... Nedenini anlayabiliyordum.

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 50;

double dLotSize = 0.1;

int nMagic = 0;
int nDigits;

string strTradeSemaphore = "TradeSemaphore";

//////////////////
int init ()
{
	if(!GlobalVariableCheck(strTradeSemaphore)) 
		GlobalVariableSet(strTradeSemaphore, 0.0);
	
	dStopLoss = 110 * Point;
	nHoursToHold = 1;

	nDigits = MarketInfo( Symbol(), MODE_DIGITS );
	
	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] + nMagic) 
		bIsBarEnd = true;
	timePrev = Time[0] + nMagic;
	
	if(!bIsBarEnd)
		return(0);

	// ------
	
	while(!IsStopped())
	{
		if(GlobalVariableGet(strTradeSemaphore) == 0.0)
			GlobalVariableSet(strTradeSemaphore, nMagic);

		if(GlobalVariableGet(strTradeSemaphore) == nMagic)
			break;
		
		Sleep(1000);
	}

	for(int nCnt = OrdersTotal() - 1; nCnt >= 0; 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);
			}
		}
	}

	Sleep(500);

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

	Sleep(500);
	
	GlobalVariableSet(strTradeSemaphore, 0.0);	
	
	return(0);
}
// ------

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

	dLotSize = GetLotSize();

	double dNormalizer = MathPow(10, nDigits);
	double dBid = MathFloor(Bid * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = MathFloor((Bid + dStopLoss) * dNormalizer) / dNormalizer; //NormalizeDouble(Bid + dStopLoss, nDigits);

	int nResult = OrderSend(Symbol(), OP_SELL, dLotSize, dBid, 
		nSlip, dStop, 0, "Friday", nMagic, 0, OrangeRed);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", sell: " + dBid + ", Stop: " + dStop + ", error: " + nError);
	}
}

// ------

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

	dLotSize = GetLotSize();

	double dNormalizer = MathPow(10, nDigits);
	double dAsk = MathFloor(Ask * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = MathFloor((Ask - dStopLoss) * dNormalizer) / dNormalizer; //NormalizeDouble(Bid + dStopLoss, nDigits);

	int nResult = OrderSend(Symbol(), OP_BUY, dLotSize, dAsk, 
		nSlip, dStop, 0, "Friday", nMagic, 0, Aqua);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", buy: " + dAsk + 
			", Stop: " + dStop + ", error: " + 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);
}


 
Bu arada, kod [atlandı]
if(GlobalVariableGet(strTradeSemaphore) == 0.0) ve GlobalVariableSet(strTradeSemaphore, 1.0); başka bir uzman gelir. Yürütme iş parçacığını yakalayacak ve engelleyecek (yani kaynağı bekleyecek) ve ardından denetimi uzmana geri döndürecek bir işleve ihtiyacımız var. WaitForExclusive() gibi bir şey

Gerçi, belki de mesele bu değil. Ama hatalar yağmaya devam ediyor.

kesinlikle. Bu yüzden GlobalVariableSetOnCondition , değerinin ikinci parametrenin değerine eşit olması koşuluyla ilk parametre olarak global bir değişken ayarlayabilen varsayımsal işlevinden bahsediyordum. global değişkenlere erişim engellendiğinden, bu "atomiklik" verecektir

Şimdi IsStopped işlevi hakkında. EA'nın normal şekilde bitirebilmesi için EA'nın durma bayrağını kontrol eder (bunun için 2,5 saniyesi vardır). bu işlevi döngü koşullarından biri olarak, özellikle de sonsuz
 

kesinlikle. Bu yüzden, değerinin ikinci parametrenin değerine eşit olması koşuluyla, global bir değişkeni birinci parametre olarak ayarlayabilen varsayımsal GlobalVariableSetOnCondition işlevinden bahsediyordum. global değişkenlere erişim engellendiğinden, bu "atomiklik" verecektir


Hayatım için teşekkür ederim, bu metni anlamıyorum. Veya başka bir deyişle, ne demek istediğinizi bir şekilde açıklayın veya gösterin. Müsaadenizle.

Bu arada, değiştirdiğim kod parçasının nesi var? Yani, çalışmadığı için bir şeylerin yanlış olduğu açık, ancak bir hata görmüyorum. Hesaplarıma göre, bu özel erişim sağlamalıydı ...

while(!Stopped())
{
	if(GlobalVariableGet(strTradeSemaphore) == 0.0)
		GlobalVariableSet(strTradeSemaphore, nMagic);

	if(GlobalVariableGet(strTradeSemaphore) == nMagic)
		kırmak;
		
	uyku(1000);
}
 

именно так. я поэтому и говорил про гипотетическую функцию GlobalVariableSetOnCondition, которая могла бы устанавливать глобальную переменную первым параметром при условии, что значение её равно значению второго параметра. так как доступ к глобальным переменным блокируется, то это даст "атомарность"


Hayatım için teşekkür ederim, bu metni anlamıyorum. Veya başka bir deyişle, ne demek istediğinizi bir şekilde açıklayın veya gösterin. Müsaadenizle.

GlobalVariableGet ve GlobalVariableSet işlevlerine yapılan çağrılar arasında sıkışma olasılığını önlemekten bahsediyoruz. hatalar hala gözlemlendiğinden, başka bir uzman tarafından kama gerçektir. Bu yüzden atomik erişimden bahsediyorum. aynı sorunu sadece farklı kelimelerle çözmekten bahsediyoruz

Bu arada, değiştirdiğim kod parçasının nesi var? Yani bir şeylerin yanlış olduğu açık çünkü çalışmıyor ama ben bir hata görmüyorum. Tahminlerime göre, bu özel erişim sağlamalıydı ...

while(!Stopped())
{
	if(GlobalVariableGet(strTradeSemaphore) == 0.0)
		GlobalVariableSet(strTradeSemaphore, nMagic);

	if(GlobalVariableGet(strTradeSemaphore) == nMagic)
		kırmak;
		
	uyku(1000);
}



senin örneğin daha iyi olurdu