Fehler Nummer 6 - Seite 9

 
Slava, ich habe Ihre Expertenversion für 12 Fenster (12 Währungen) eingestellt. Es sind weniger Fehler, aber sie sind da. Entschuldigung. Ich habe es geschafft, 138 und 1 zu bekommen. Versuchen Sie es selbst.

Ich hoffe auf weitere Hinweise.

Quark
 
Übrigens, Code
while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) { GlobalVariableSet(strTradeSemaphore, 1.0); bSemaphored = true; break; } Sleep(1000); }



gibt zu, dass zwischen (GlobalVariableGet(strTradeSemaphore) == 0.0) und GlobalVariableSet(strTradeSemaphore, 1.0); ein anderer EA einspringen wird. Wir benötigen eine Funktion, die den Ausführungsthread erfasst und sperrt (d. h. auf die Ressource wartet) und dann die Kontrolle an den Expert Advisor zurückgibt. So etwas wie WaitForExclusive()

. Aber das ist vielleicht nicht der Punkt. Aber die Fehler tauchen leider immer wieder auf.

 
Das ist schon besser. Aber es sind Fehler aufgetreten, die vorher nicht da waren, wie Fehler 1.
Ich hoffe, dass ich Hilfe bekomme.

By the way, jetzt, dass dieses Gespräch begonnen hat, wie kann ich automatisch bestimmen, wie viele Ziffern für Preis mit NormalizeDouble zu verlassen, d.h. 4 für EURUSD, 2 für EURJPY... ?

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);
}

 
Manchmal tritt derFehler 138 auf (ich habe 12 Paare im Minutentakt laufen, so dass es nicht lange dauert, bis ein Fehler auftritt), und auch der Fehler 129 zu einem ganz normalen Preis.
 
Also. Fehler 1. Frei übersetzt aus dem Helpdesk heißt das: "Etwas ist falsch". 12 Währungspaare auf Minuten, Fehler etwa alle 5-10 Minuten.

Fehler 138. Mehrmals pro Minute (d.h. mehrere von 12 Expert Advisors erzeugen ihn).

Fehler 129. Ich habe die Preise rationiert und eine Menge anderer Dinge getan...
 
In der Tat, jetzt, wo wir darüber reden, wie Sie automatisch bestimmen, wie viele Stellen für den Preis mit NormalizeDouble zu verlassen, dh 4 für EURUSD, 2 für EURJPY ...? ?
	int _Digits = MarketInfo( Symbol(), MODE_DIGITS );




und Ihr Expert Advisor mit meinem 5 gab mir einen Fehler - 6.
mein Expert Advisor funktioniert nicht in meiner Korrektur - sie haben es in diesem Build vermasselt =)
Ach ja... mein 5er funktioniert auch nicht =)))) oh man...

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




und Ihr Expert Advisor mit meinen 5 gab einen Fehler - 6.
mein Expert Advisor funktioniert nicht in meiner Korrektur - sie haben es in diesem Build vermasselt =)
Ach ja... mein 5er funktioniert auch nicht =)))) oh man...



Danke für den Code, ich hätte lange gebraucht, um ihn selbst zu finden.
Der von Slava vorgeschlagene und von mir verbesserte :) Experte ist unten angegeben. Sie können es wie ich machen - in 12 Fenstern, mit 12 Währungen. Es funktioniert für jeden Zeitrahmen, aber bei Minuten geht es schneller). Ich erhalte ständig Fehler, verdammt noch mal. Ich wünschte, ich wüsste warum.

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);
}


 
Übrigens, der Code [skipped]<br/ translate="no"> erlaubt es einem anderen EA, zwischen if(GlobalVariableGet(strTradeSemaphore) == 0.0) und GlobalVariableSet(strTradeSemaphore, 1.0); einzuschneiden. Wir benötigen eine Funktion, die den Ausführungsthread erfasst und sperrt (d. h. auf die Ressource wartet) und dann die Kontrolle an den Expert Advisor zurückgibt. So etwas wie WaitForExclusive()

. Aber das ist vielleicht nicht der Punkt. Aber leider tauchen die Fehler immer wieder auf.

das ist genau das, was ich über die hypothetische Funktion GlobalVariableSetOnCondition meinte, die eine globale Variable als ersten Parameter setzen könnte, vorausgesetzt, ihr Wert ist gleich dem Wert des zweiten Parameters. da der Zugriff auf globale Variablen blockiert ist, gibt es "Atomizität"

jetzt über die Funktion IsStopped. sie prüft das Stop-Flag, so dass der EA normalerweise anhalten könnte (er hat 2,5 Sekunden dafür). es wird empfohlen, diese Funktion als eine der Schleifenbedingungen zu verwenden, insbesondere für Endlosschleifen
 
<br / translate="no"> Deshalb sprach ich von einer hypothetischen Funktion GlobalVariableSetOnCondition, die eine globale Variable durch den ersten Parameter setzen könnte, vorausgesetzt, ihr Wert entspricht dem Wert des zweiten Parameters. Da der Zugriff auf globale Variablen blockiert ist, würde dies "Atomizität" ergeben.


Slawa, ich verstehe diesen Text beim besten Willen nicht. Bitte erklären Sie es mit anderen Worten oder zeigen Sie mir, was Sie meinen. Wenn Sie können.

Übrigens, was ist falsch an dem Code, den ich umgeschrieben habe? Ich meine, es ist klar, dass etwas nicht stimmt, weil es nicht funktioniert, aber ich sehe den Fehler nicht. Meiner Vermutung nach hätte dies den exklusiven Zugang ermöglichen sollen...

while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) GlobalVariableSet(strTradeSemaphore, nMagic); if(GlobalVariableGet(strTradeSemaphore) == nMagic) break; Sleep(1000); }
 

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


Slawa, ich verstehe diesen Text beim besten Willen nicht. Erklären Sie es entweder mit anderen Worten, oder zeigen Sie mir, was Sie meinen. Wenn Sie können.

Wir sprechen davon, die Möglichkeit des Einklemmens zwischen den Aufrufen der Funktionen GlobalVariableGet und GlobalVariableSet zu verhindern. Ein Einklemmen durch einen anderen Expert Advisor ist real, da Fehler immer noch beobachtet werden. Deshalb spreche ich von atomarem Zugriff. Sie und ich sprechen von der Lösung ein und desselben Problems, aber mit unterschiedlichen Worten
.

Übrigens, was ist an dem von mir überarbeiteten Code falsch? Ich meine, es ist klar, dass etwas nicht stimmt, da es nicht funktioniert, aber ich sehe den Fehler nicht. Meiner Vermutung nach hätte dies den exklusiven Zugang ermöglichen sollen...

while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) GlobalVariableSet(strTradeSemaphore, nMagic); if(GlobalVariableGet(strTradeSemaphore) == nMagic) break; Sleep(1000); }



Ihr Beispiel ist besser
Grund der Beschwerde: