Erreur numéro 6 - page 10

 
[citation
Votre exemple est meilleur.
[/quote]

Cet exemple ne fonctionne pas. Il donne des erreurs. Pourriez-vous, en tant que développeur plus expérimenté, nous aider à le faire fonctionner ?
Respectueusement,
Quark
 
<br/ translate="no"> Question : comment while(!IsStopped()) ? Ce n'est pas très clair dans l'aide, je pensais qu'il s'agissait d'une vérification de l'option Autoriser le commerce en direct.

c'est une vérification pour voir s'ils veulent fermer le conseiller expert en externe

Question : ces temps de repos et de sommeil ne ralentiront pas le système ?

Le système ne sera pas ralenti. Seul le conseiller expert unique
.

Question : le Sleep et le sémaphore seront-ils traités correctement en mode test ?

le glissement n'est pas géré dans les tests, il est simplement ignoré. c'est plus compliqué dans les tests. de vrais EA actifs peuvent se disputer ce sémaphore. nous n'avons pas du tout besoin de sémaphores dans les tests, puisqu'un seul EA est testé - nous ne pouvons pas organiser des tests simultanés d'Experts en interaction. pour exclure la gestion des sémaphores dans les tests, utilisez la fonction IsTesting

Aussi concernant la logique. Entre la mise en place et le retrait du sémaphore, nous avons deux possibilités (maximum) de traiter les commandes. D'abord Buy() ou Sell() et ensuite, en dessous, CloseOrder(). Ces deux "activités" ne vont-elles pas se faire concurrence, bien qu'à l'intérieur de l'EA, comme s'il y avait deux Expert Advisors ? Ou le processus est garanti linéaire et il n'arrivera pas à CloseOrder() avant le retour de Buy() ?

Ces activités ne se feront pas concurrence puisque les opérations commerciales sont désormais synchrones, c'est-à-dire que l'expert attend que l'opération commerciale soit terminée. "le processus est garanti comme étant linéaire"
 
Cet exemple ne fonctionne pas. Il donne des erreurs. Pourriez-vous, en tant que développeur plus expérimenté, nous aider à le faire fonctionner ? <br/ translate="no">

Je ne le forcerai pas. Attendez quelques jours pour la fonction GlobalVariableSetOnCondition, et tous les problèmes de contrôle d'accès seront résolus.
 
Этот пример не работает. Дает ошибки. Не могли бы Вы, как более опытный разработчик, помочь заставить его работать?

Je ne le forcerai pas. Attendez quelques jours pour la fonction GlobalVariableSetOnCondition, et tous les problèmes de délimitation d'accès seront résolus.


Si vous voulez dire que vous prévoyez d'introduire la fonction GlobalVariableSetOnCondition dans MT, pourriez-vous en dire quelques mots au préalable ?

Y compris comment vous proposez de l'utiliser dans cette situation ?

Quelques jours - en comptant les week-ends ?
 
Slava, en plus des conseils utiles, pour lesquels je vous remercie beaucoup, j'ai eu une idée :) Ou plutôt, une suggestion. Je l'ai déjà mentionné.

Pourquoi ne pas faire une file d'attente des commandes dans MT. En d'autres termes, vous pouvez écrire de manière asynchrone une demande de travail sur un poste à cet endroit, et MT, dans un thread séparé, traitera cette demande lorsqu'il en aura le temps, avec la garantie que personne d'autre n'y entrera.

Quark
 
Si vous voulez dire que vous prévoyez d'introduire la fonction GlobalVariableSetOnCondition dans MT, pourriez-vous en dire quelque chose au préalable ? <br/ translate="no">
Y compris comment vous proposez de l'utiliser dans cette situation ?

Quelques jours - en comptant les week-ends ?

J'ai déjà montré un exemple
if(GlobalVariableSetOnCondition(SemaphoreName, 1.0, 0.0)==true) { bSemaphored=true ; break ; }


si une variable globale a une valeur de 0.0, alors définissez la valeur à 1.0 et retournez true. sinon, ne définissez rien. vérifiez et changez la valeur en un seul appel de fonction.

"quelques jours" - j'ai dit ça juste au cas où. Avec un peu de chance, nous le publierons aujourd'hui.

 
Voulez-vous avoir une file d'attente de commandes dans MT. En d'autres termes, vous pouvez rédiger de manière asynchrone une demande de travail sur un poste, et MT traitera cette demande dans un fil distinct lorsqu'il en aura le temps, avec la garantie que personne d'autre n'y entrera. <br / translate="no">.

Nous ne ferons pas la queue pour les commandes
 
<br / translate="no">J'ai déjà montré un exemple


Je n'ai juste pas dit ce que c'était :) Je pensais que la fonction était suggérée pour m'écrire.


J'ai dit "quelques jours" juste au cas où. Avec un peu de chance, nous le posterons aujourd'hui.


Merci.
 
En option.

1. Dans ces 100 postes, il y avait plusieurs bogues trouvés en travaillant sur le conseiller expert, et non directement liés à celui-ci. Par exemple, j'ai remarqué que les conseillers experts continuent de négocier même après avoir supprimé la case à cocher Autoriser la négociation en direct. J'espère que vous ne les oublierez pas.

2. Voici à nouveau le code de mon Expert Advisor. Il génère les erreurs 1, 129, 138. Pourriez-vous a) me dire ce qu'est le 138(requote), pourquoi il se produit, s'il est lié aux sémaphores, et comment le corriger ? b) Pourquoi le 129 ? Les prix sont imprimés avec l'erreur, ils semblent être corrects. c) Environ 1, aussi.

Je vous rappelle la méthode de test : des fenêtres de 12 minutes pour 12 devises.

Respectueusement,
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);
}
 
l'erreur 138 requote peut facilement se produire. potentiellement avec 10 EAs en fonctionnement, le temps d'attente pour la libération du sémaphore peut être de 30 secondes ou plus. pendant ce temps, le prix peut facilement changer. dans ce cas, utilisez la fonction RefreshRates et prenez une nouvelle valeur d'offre ou de demande. ou demandez à MarketInfo un nouveau prix. 129 est la même erreur, le mauvais prix - le prix est allé trop loin et il y a eu plusieurs changements de prix pendant le temps d'attente. 1 - il ne s'agit pas du tout d'une erreur. elle apparaît lorsque vous essayez de modifier un ordre avec les mêmes valeurs qui ont déjà été définies. il est étrange que cela se produise lorsque vous confirmez manuellement une transaction sur le rejet.