Erreur numéro 6 - page 9

 
Slava, j'ai mis votre version expert, pour 12 fenêtres (12 devises). Les erreurs sont moins nombreuses, mais elles sont là. Désolé. J'ai réussi à obtenir 138 et 1. Essayez vous-même.

J'espère pouvoir vous guider.

Quark
 
Au fait, code
while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) { GlobalVariableSet(strTradeSemaphore, 1.0) ; bSemaphored = true ; break ; } Sleep(1000) ; }



admet qu'entre(GlobalVariableGet(strTradeSemaphore) == 0.0) et GlobalVariableSet(strTradeSemaphore, 1.0) ; un autre EA interviendra. Nous avons besoin d'une fonction qui va capturer et inhiber le fil d'exécution (c'est-à-dire attendre la ressource) et ensuite rendre le contrôle au conseiller expert. Quelque chose comme WaitForExclusive()

. Bien que, peut-être, ce n'est pas la question. Mais les erreurs continuent d'apparaître, hélas.

 
C'est mieux. Mais des erreurs sont apparues qui n'existaient pas auparavant, comme l'erreur 1.
J'espère avoir de l'aide.

Au fait, maintenant que cette conversation a commencé, comment puis-je déterminer automatiquement le nombre de chiffres à laisser pour le prix en utilisant NormalizeDouble, c'est-à-dire 4 pour EURUSD, 2 pour 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);
}

 
L'erreur 138 apparaît parfois (j'exécute 12 paires sur minutes, donc il ne faut pas longtemps pour obtenir une erreur), et aussi l'erreur 129 à un prix parfaitement normal.
 
Donc. Erreur 1. Traduction libre du service d'assistance "quelque chose ne va pas". 12 paires de devises sur minutes, erreur environ une fois toutes les 5-10 minutes.

Erreur 138. Plusieurs fois par minute (c'est-à-dire que plusieurs des 12 Expert Advisors le génèrent).

Erreur 129. Je rationnais les prix et je faisais beaucoup d'autres choses...
 
En fait, maintenant que nous en parlons, comment déterminez-vous automatiquement le nombre de chiffres à laisser pour le prix avec NormalizeDouble, c'est-à-dire 4 pour EURUSD, 2 pour EURJPY... ? ?
	int _Digits = MarketInfo( Symbol(), MODE_DIGITS ) ;




et votre Expert Advisor avec mes 5 m'a donné une erreur - 6.
mon conseiller expert ne fonctionne pas dans ma correction - ils se sont trompés dans cette version =)
Oh oui... mon 5 ne fonctionne pas non plus =)))) oh man...

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




et votre Expert Advisor avec mes 5 a donné une erreur - 6.
mon conseiller expert ne fonctionne pas dans ma correction - ils se sont trompés dans cette version =)
Oh oui... mon 5 ne fonctionne pas non plus =)))) oh man...



Merci pour le code, il m'aurait fallu beaucoup de temps pour le trouver moi-même.
L'expert suggéré par Slava et amélioré :) par moi est donné ci-dessous. Vous pouvez le faire fonctionner comme moi - dans 12 fenêtres, avec 12 devises. Cela fonctionne pour n'importe quelle période, mais c'est plus rapide sur les minutes). Je continue à avoir des erreurs, bon sang. J'aimerais savoir pourquoi.

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


 
Au fait, le code [skipped]<br/ translate="no"> permet à un autre EA de s'intercaler entre if(GlobalVariableGet(strTradeSemaphore) == 0.0) et GlobalVariableSet(strTradeSemaphore, 1.0) ;. Nous avons besoin d'une fonction qui va capturer et inhiber le fil d'exécution (c'est-à-dire attendre la ressource) et ensuite rendre le contrôle au conseiller expert. Quelque chose comme WaitForExclusive()

. Bien que, peut-être, ce n'est pas la question. Mais hélas, les erreurs continuent d'apparaître.

c'est exactement ce que je voulais dire par la fonction hypothétique GlobalVariableSetOnCondition, qui pourrait définir une variable globale comme premier paramètre, à condition que sa valeur soit égale à la valeur du second paramètre. comme l'accès aux variables globales est bloqué, cela donnera une "atomicité"

maintenant à propos de la fonction IsStopped. elle vérifie le drapeau Stop, afin que l'EA puisse normalement s'arrêter (elle a 2,5 secondes pour cela). il est recommandé d'utiliser cette fonction comme l'une des conditions de la boucle, en particulier pour la boucle infinie
 
<br / translate="no"> c'est pourquoi je parlais d'une hypothétique fonction GlobalVariableSetOnCondition, qui pourrait fixer une variable globale par le premier paramètre, à condition que sa valeur soit égale à la valeur du second paramètre. comme l'accès aux variables globales est bloqué, cela donnerait une "atomicité".


Slava, sur ma vie, je ne comprends pas ce texte. Veuillez l'expliquer en d'autres termes, ou montrez-moi ce que vous voulez dire. Si vous le pouvez.

Au fait, qu'est-ce qui ne va pas dans le code que j'ai réécrit ? Je veux dire, il est clair que quelque chose ne va pas car ça ne fonctionne pas, mais je ne vois pas l'erreur. D'après mon intuition, c'est ce qui aurait dû donner un accès exclusif...

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

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


Slava, sur ma vie, je ne comprends pas ce texte. Soit vous l'expliquez avec d'autres mots, soit vous me montrez ce que vous voulez dire. Si vous le pouvez.

Nous parlons d'empêcher la possibilité de calage entre les appels des fonctions GlobalVariableGet et GlobalVariableSet. Le calage par un autre conseiller expert est réel puisque des erreurs sont toujours observées. c'est pourquoi je parle d'accès atomique. nous parlons de résoudre un seul et même problème mais avec des mots différents
.

Au fait, qu'est-ce qui ne va pas dans le morceau de code que j'ai retravaillé ? Je veux dire, il est clair que quelque chose ne va pas puisque ça ne fonctionne pas, mais je ne vois pas l'erreur. D'après mon intuition, c'est ce qui aurait dû donner un accès exclusif...

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



Votre exemple est meilleur