Fehler Nummer 6 - Seite 10

 
[Zitat
Ihr Beispiel ist ein besseres.
[/quote]

Dieses Beispiel funktioniert nicht. Es gibt Fehler. Könnten Sie als erfahrener Entwickler helfen, dass es funktioniert?
Hochachtungsvoll,
Quark
 
<br/ translate="no"> Frage: wie funktioniert while(!IsStopped()) ? Das geht aus der Hilfe nicht ganz klar hervor. Ich dachte, es handele sich um eine Überprüfung der Option "Live Trading zulassen".

Dies ist eine Überprüfung, ob sie den Expert Advisor extern schließen wollen

Frage: diese während und Sleep wird nicht verlangsamen das System?

wird das System nicht verlangsamt. Nur der einzelne Expert Advisor

Frage: werden Sleep und Semaphore im Testmodus korrekt verarbeitet?

Schlupf wird beim Testen nicht behandelt, er wird einfach übersprungen. beim Testen ist es komplizierter. echte aktive EAs können um diese Semaphore konkurrieren. wir brauchen Semaphore beim Testen überhaupt nicht, da nur ein EA getestet wird - wir können kein gleichzeitiges Testen von interagierenden Experten organisieren. um die Behandlung von Semaphoren beim Testen auszuschließen, verwenden Sie die Funktion IsTesting

Auch was die Logik betrifft. Zwischen dem Setzen und Entfernen des Semaphors gibt es (maximal) zwei Möglichkeiten, Aufträge zu bearbeiten. Zuerst Buy() oder Sell() und dann, darunter, CloseOrder(). Werden diese beiden "Aktivitäten" innerhalb des EA nicht miteinander konkurrieren, so als gäbe es zwei Expert Advisors? Oder ist der Prozess garantiert linear und es wird nicht zu CloseOrder() kommen, bis Buy() zurückkehrt?

Diese Aktivitäten konkurrieren nicht miteinander, da die Handelsvorgänge nun synchron ablaufen, d. h. der Experte wartet, bis der Handelsvorgang abgeschlossen ist. "Der Prozess ist garantiert linear".
 
Dieses Beispiel funktioniert nicht. Es gibt Fehler. Könnten Sie als erfahrener Entwickler helfen, dass es funktioniert? <br/ translate="no">

Ich werde es nicht erzwingen. Warten Sie ein paar Tage auf die Funktion GlobalVariableSetOnCondition, dann werden alle Probleme der Zugriffskontrolle gelöst sein
 
Этот пример не работает. Дает ошибки. Не могли бы Вы, как более опытный разработчик, помочь заставить его работать?

Ich werde es nicht erzwingen. Warten Sie ein paar Tage auf die Funktion GlobalVariableSetOnCondition, dann werden alle Probleme mit der Zugriffsabgrenzung gelöst sein


Wenn Sie meinen, dass Sie planen, die Funktion GlobalVariableSetOnCondition in MT einzuführen, könnten Sie vorher ein paar Worte dazu sagen?

Einschließlich der Frage, wie Sie es in dieser Situation einsetzen wollen?

Ein paar Tage - Wochenenden mitgezählt?
 
Slava, zusätzlich zu den nützlichen Ratschlägen, für die ich Ihnen sehr danke, habe ich eine Idee :) Oder besser gesagt, ein Vorschlag. Ich habe es bereits erwähnt.

Warum erstellen Sie nicht eine Warteschlange von Aufträgen in MT. Das heißt, Sie können asynchron eine Anfrage schreiben, um dort an einer Position zu arbeiten, und MT wird diese Anfrage in einem separaten Thread bearbeiten, wenn die Zeit dafür da ist, und mit der Garantie, dass niemand anderes dort einsteigen wird.

Quark
 
Wenn Sie meinen, dass Sie planen, die Funktion GlobalVariableSetOnCondition in MT einzuführen, könnten Sie vorher etwas dazu sagen? <br/ translate="no">
Einschließlich der Frage, wie Sie es in dieser Situation einsetzen wollen?

Ein paar Tage - Wochenenden mitgezählt?

Ich habe bereits ein Beispiel gezeigt
if(GlobalVariableSetOnCondition(SemaphoreName, 1.0, 0.0)==true) { bSemaphored=true; break; }


Wenn eine globale Variable den Wert 0.0 hat, dann setzen Sie den Wert auf 1.0 und geben Sie true zurück. Ansonsten setzen Sie nichts.

"in ein paar Tagen" - das habe ich nur für den Fall gesagt. hoffentlich werden wir es heute veröffentlichen

 
Möchten Sie eine Warteschlange von Aufträgen in MT. Das heißt, Sie können asynchron eine Anfrage schreiben, um eine Position zu bearbeiten, und MT wird diese Anfrage in einem separaten Thread bearbeiten, wenn die Zeit dafür da ist, und mit der Garantie, dass niemand anderes dort einsteigen wird. <br / translate="no">.

Wir werden keine Warteschlange von Bestellungen erstellen
 
<br / translate="no"> Ich habe bereits ein Beispiel gezeigt


Ich habe nur nicht gesagt, was es ist :) Ich dachte, die Funktion wurde vorgeschlagen, mir zu schreiben.


Ich habe vorsichtshalber "ein paar Tage" gesagt. Hoffentlich wird es heute veröffentlicht.


Danke.
 
Optional.

1. In diesen 100 Beiträgen wurden mehrere Fehler gefunden, die bei der Arbeit am Expert Advisor auftraten und nicht direkt damit zusammenhängen. Ich habe zum Beispiel festgestellt, dass Expert Advisors auch nach dem Entfernen des Kontrollkästchens Live-Handel zulassen weiter handeln. Ich hoffe, Sie werden sie nicht vergessen.

2. Nachfolgend finden Sie den Code meines Expert Advisors erneut. Er erzeugt die Fehler 1, 129 und 138. Könnten Sie mir a) sagen, was 138(requote) ist, warum es auftritt, ob es mit Semaphoren zusammenhängt und wie man es beheben kann? b) Warum 129? Die Preise sind zusammen mit dem Fehler abgedruckt, sie scheinen korrekt zu sein. c) Auch über 1.

Ich möchte Sie an die Testmethode erinnern: 12-Minuten-Fenster für 12 Währungen.

Hochachtungsvoll,
Quark

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;
int nBars;
int nDelaySeconds = 3;

int nSlip = 50;

double dLotSize = 0.1;

int nMagic = 0;
int nDigits;

string strTradeSemaphore = "TradeSemaphore";

//////////////////
int init ()
{
	nBars = Bars;

	if(!IsTesting() && !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;
*/

	bool bIsBarEnd = false;
	if(nBars != Bars)
	{
		if(IsTesting() || (!IsTesting() && CurTime() > Time[0] + nMagic * nDelaySeconds))
		{
			bIsBarEnd = true;
			nBars = Bars;
		}
	}
	
	if(!bIsBarEnd)
		return(0);

	// ------
	
	if(!IsTesting())
	{
		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);
			}
		}
	}

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

	if(!IsTesting())
		GlobalVariableSet(strTradeSemaphore, 0.0);	
	
	return(0);
}
// ------

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

	dLotSize = GetLotSize();

	double dNormalizer = MathPow(10, nDigits);
	double dBid = Bid;//MathFloor(Bid * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = Bid + dStopLoss;//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 = Ask;//MathFloor(Ask * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = Ask - dStopLoss;//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);
}
 
Fehler 138 requote kann leicht auftreten. bei 10 arbeitenden EAs kann die Wartezeit für die Semaphor-Freigabe 30 Sekunden oder mehr betragen. während dieser Zeit kann sich der Preis leicht ändern. in diesem Fall verwenden Sie die Funktion RefreshRates und nehmen einen neuen Bid- oder Ask-Wert. oder fragen Sie MarketInfo nach einem neuen Preis. 129 ist der gleiche Fehler, falscher Preis - der Preis ist zu weit gegangen und es gab mehrere Preisänderungen während der Wartezeit. 1 - es handelt sich nicht um einen Fehler. er tritt auf, wenn Sie versuchen, einen Auftrag mit denselben Werten zu ändern, die bereits festgelegt wurden. es ist seltsam, dass er auftritt, wenn Sie einen Abschluss bei Ablehnung manuell bestätigen