Erreur numéro 6 - page 5

 
Maintenant j'ai regardé dans le terminal - j'ai eu quelques problèmes hier. <br / translate="no">.
2005.08.11 11:15:00 ****l EURUSD,H1 : OrderSend a échoué avec l'erreur #139
2005.08.11 11:07:12 TradeDispatcher : tous les contextes de commerce sont occupés

J'ai débranché cette EA et je vais voir ce qui se passe ensuite.


C'est ici. C'est ici. C'est parti. 139 est verrouillé. Par qui, pourquoi - ce n'est pas clair. Ensuite, il y en aura 2, 6, et ainsi de suite.

Le plus décevant, c'est qu'il n'y a rien dans cette EA qui la distingue des autres. Donc, soit je ne peux pas voir ce "quelque chose", soit un conseiller expert peut être défectueux, il peut simplement ne pas se déclencher toutes les heures et, par conséquent, tout le monde ne l'a pas remarqué.

Par conséquent, je pose la question suivante à tout le monde : avez-vous de telles entrées dans vos journaux ?

Rosh, utilisez-vous Alpari ? Si oui, une question pour Alpari - votre serveur fonctionne-t-il correctement ?

Ce que j'ai découvert ce soir :(

1. Le conseiller expert fonctionne par lui-même, ONE, et ne donne pas d'erreurs ou les donne si rarement que la nuit ne suffit pas pour cela.

2. En combinaison avec plusieurs autres Expert Advisors (plus précisément, avec un seul, pour six devises), l'erreur a été reproduite, mais pas en une heure, mais en 4 heures.

Qu'est-ce qui en découle ?
1. Il y a un bug dans MT (ou dans mon Expert Advisor, mais c'est tellement simple que c'est peu probable), qui parfois ne me permet pas d'ouvrir des trades. Et les fermer aussi, d'ailleurs.
Bien sûr, vous pouvez le contourner :

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



Je n'ai pas besoin de vous dire que c'est un TRES mauvais style de programmation et qu'il peut offenser le courtier...

2. J'ai maintenant réécrit le conseiller expert pour le rendre plus simple, tout en provoquant une erreur. Je l'afficherai dans les prochaines heures. S'il apparaît que l'erreur nécessitera deux Expert Advisors, que puis-je faire, j'en posterai deux :)






 
2. Je suis en train de réécrire le Conseiller Expert pour le rendre plus simple, et en même temps pour provoquer une erreur. Je l'afficherai dans les prochaines heures. S'il s'avère que l'erreur nécessite deux Expert Advisors, que faire, j'en posterai deux :)<br / translate="no">.

et nous allons vérifier
 
Quark, j'ai fait un diagnostic, c'est la faute de votre EA. Dès que l'alerte sort de votre EA (je ne les utilise pas du tout) - je reçois immédiatement
2005.08.11 13:01:19 TradeDispatcher : all trade context is busy


Les temps d'alerte et de blocage sont les mêmes. Je n'ai pas du tout regardé le code EA.

 
Bien. Voici le nouveau super-expert, qui produit à lui seul des erreurs. Jusqu'à présent, je n'ai pas dépassé l'erreur 139, je vais donc continuer à tester.

Comment l'utiliser : pour chaque devise (EURUSD, EURJPY, USDCHF, GBPUSD, GBPJPY,
GBPCHF, USDJPY, AUDUSD, EURGBP, USDCAD, EURCHF, EURAUD) ouvrez un graphique d'une heure.
Chaque graphique dispose d'un conseiller expert. Ils n'interagissent pas, car ils ont tous des graphiques différents.

Les positions seront ouvertes immédiatement, une par graphique. Au début de l'heure suivante, les positions devront être inversées, et ainsi de suite.

J'ai eu deux erreurs en même temps, donc en principe il est possible de devoir attendre pendant deux heures.

Si vous avez une relation particulière avec le serveur de négociation, il est probablement préférable d'utiliser un compte ordinaire pour le test. J'utilise Alpari.

Notez également (je suppose que c'est un bug indépendant) la position des flèches d'ouverture de position. En théorie, puisque la position s'ouvre sur une nouvelle barre, la flèche devrait se trouver sur la même barre.

Enfin, si vous ne voulez pas attendre une heure, ouvrez les graphiques en minutes. L'erreur est reproductible.

Une fois encore, il s'agit de l'erreur 139. En même temps, je n'ai pas encore réussi à obtenir les erreurs 2 et 6 avec cette méthode. Et ils l'ont souvent été auparavant. Je suppose donc qu'il y aura d'autres messages.

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, j'ai fait un diagnostic, c'est la faute de votre EA. Dès qu'une alerte sort de votre EA (je ne les utilise pas du tout) - j'obtiens <br/ translate="no">
2005.08.11 13:01:19 TradeDispatcher : tous les contextes de commerce sont occupés
.


Les temps d'alerte et de blocage sont les mêmes. Je n'ai pas du tout regardé le code EA.



Ce serait bien, mais j'ai introduit des alertes après avoir remarqué que les transactions n'étaient pas exécutées. De plus, l'alerte se trouve dans le code juste après OrderSend.

Maintenant je vais essayer de passer à Print, mais j'en doute...
 
Au fait, c'est intéressant. Lorsque je recompile un EA, la variable que j'utilise pour calculer bIsBarEnd est réinitialisée. En conséquence, si j'appuie sur F5 dans l'éditeur, tous les EA doivent fermer les anciennes positions et en ouvrir de nouvelles. J'ai appuyé sur F5. Il existe 12 devises (et des conseillers experts). Il y a 3 mises à jour. Hm ?

Mettez Print au lieu d'Alert pour vérifier l'hypothèse de Rosh. Hélas, la seule différence est que maintenant le message d'erreur 139 apparaît dans le journal et non à l'écran.
 
Je ne sais pas, j'ai regardé le code ; il n'y a rien à redire. J'utiliserais les barres pour décider de cet endroit, pas l'heure d'ouverture.
	Le bool bIsBarEnd = false ; if(timePrev != Time[0]) bIsBarEnd = true ; timePrev = Time[0] ;



Et la chose n'est pas claire :
2005.08.11 13:08:12 '18708' : clôture de l'ordre #680413 acheter 0.10 EURUSD à 1.2385 sl : 0.0000 tp : 0.0000 au prix de 1.2408
et ensuite

2005.08.11 13:08:13 '18708' : ordre #680413 acheter 0.10 EURUSD à 1.2385 sl : 1.2275 tp : 0.0000 fermé au prix de 1.2408

En d'autres termes, au début, l'ordre est passé sans stop ni takeprofit, puis soudain, un stop loss apparaît dans l'ordre.

 
Je ne sais pas, j'ai regardé le code ; il n'y a rien à redire. Je déciderais de cet endroit par les barres, pas par l'heure d'ouverture<br / translate="no">
bool bIsBarEnd = false ; if(timePrev != Time[0]) bIsBarEnd = true ; timePrev = Time[0]
;



Et la chose n'est pas claire :
2005.08.11 13:08:12 '18708' : clôture de l'ordre #680413 acheter 0.10 EURUSD à 1.2385 sl : 0.0000 tp : 0.0000 au prix de 1.2408
et ensuite

2005.08.11 13:08:13 '18708' : ordre #680413 acheter 0.10 EURUSD à 1.2385 sl : 1.2275 tp : 0.0000 fermé au prix de 1.2408

En d'autres termes, au début, l'ordre est passé sans stop ni takeprofit, puis soudain, un stop loss apparaît dans l'ordre.



Si vous avez un morceau de code testé, j'aimerais voir "via Bars" :)

Quant à la butée zéro, je l'ai assignée dans init, et je ne la change pas ailleurs. Un insecte, je suppose. Mec, depuis que j'ai abandonné le C++, je ne pensais pas avoir à refaire de l'entomologie.

En fait, c'est un expert, d'accord. Mais c'est tellement simple qu'une question se pose : n'y a-t-il pas un risque que d'autres EA se comportent de la même manière ? Considérant que le bug n'apparaît que lorsqu'il y a beaucoup d'Expert Advisors, et qu'il produit différentes erreurs.

Par exemple, j'ai un conseiller expert qui utilise MACD + ADX + Stochastique. Après l'avoir testé dans le testeur (où il n'y a pas d'erreurs de serveur par définition), le programmeur va-t-il simplement s'asseoir et vérifier la question "toutes les conditions sont remplies ici mais la transaction n'est pas fermée" ? Probablement pas... Bug dangereux.
 
<br / translate="no">
Si vous avez un morceau de code testé, j'aimerais voir "via Bars" :)



Par exemple, comme ceci :
int start() { int total,ticket,totalExpert ; //---- SetTrace() ; if (Bars>b) { b=Bars ;
 
Pas mal, mais c'est essentiellement la même chose :)
Qu'est-ce que SetTrace ?