Erreur numéro 6 - page 6

 
Pas mal, mais essentiellement la même chose :)<br / translate="no">Qu'est-ce que SetTrace ?


Oopsie :) Je vais faire une publicité maintenant, faites attention - http://forexsystems.ru/phpBB/viewtopic.php?t=694&start=45
 
хэндлов не хватает.


Puis-je modifier le nombre de poignées dans les paramètres du système (W'XP) et comment ?
 
Une autre question aux développeurs.

Quelle est la bonne façon de faire :

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



2.

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



3. indifférent.
4. Nous devrions définir le retour et traiter la prochaine commande dans le prochain tick.
5. Cela devrait être fait d'une autre manière.

Laissez-moi vous expliquer. Supposons que nous ayons deux ordres ouverts et qu'ils doivent tous deux être fermés. La boucle

for(int nCnt = 0 ; nCnt < OrdersTotal() ; nCnt++)



Il clôturera l'ordre zéro, après quoi le premier ordre deviendra zéro. Ensuite, il essaiera de fermer la première commande, et il y aura une erreur. N'est-ce pas ?

Je ne pense pas que toutes les erreurs de l'EA discutées dans ce fil soient liées à ce problème, par exemple, l'erreur commune n'a rien à voir avec cela. Mais si j'ai raison, cela explique peut-être a) les ordres bloqués et les ordres similaires et b) le fait qu'il faut plus d'un conseiller expert pour que des erreurs apparaissent.



 
хэндлов не хватает.


Можно ли изменить число хэндлов в системных установках (W'XP) и как?

Si un programme manque de poignées, il est écrit avec des erreurs. Sinon, il y a beaucoup de poignées en réserve.
 
Bien sûr, la deuxième option est correcte, mais au lieu de return, vous devriez mettre Sleep() pendant 30 secondes et c'est tout.
 
Je dois ajouter qu'en substituant
for(int nCnt = 0 ; nCnt < OrdersTotal() ; nCnt++)
par
for(int nCnt = OrdersTotal() - 1 ; nCnt >= 0 ; nCnt--)
Je suis passé de l'erreur 139 à 138 et 4109.
(requote, chaîne non initialisée dans le tableau)
Le dernier n'a aucun commentaire...
 
Bien sûr, la deuxième variante est correcte, mais au lieu de return, vous devriez mettre Sleep() pendant 30 secondes et c'est tout.


A 10 Expert Advisors dans un intervalle d'une minute, 30 secondes pour chaque... Faux, il est impossible de vivre de cette façon.
 
Tu crois que c'est ça ? J'avais 12 fenêtres, chacune avec une devise différente et un Expert Advisor différent. J'ai interdit (Allow live trading) le trading dans 11 d'entre eux. Toutes mes erreurs viennent encore d'eux. Un autre bug.
 
Конечно, второй вариант правилен, только вместо return надо ставить Sleep() секунд на 30 и усе.


Avec 10 experts sur un intervalle d'une minute, 30 secondes pour chaque... C'est faux, ce n'est pas une façon de vivre.



C'est ainsi qu'il faut vivre, et ce que vous faites est un test de la force du fer.
 
Une nouvelle version d'EA à tester. Ce qui a changé :
1. Cycles corrigés.
2. Le numéro de Magik est privatisé à l'heure de début du bar. Cela donne, si je ne me trompe pas, un retard à l'ouverture. C'est-à-dire que l'EA avec mn 7 s'ouvrira 7 secondes après le début de la barre. Cela évitera la surcharge du serveur, le CPU de l'ordinateur et le conflit avec le maximum de 2,5 secondes, s'il existe encore quelque part...

Mais hélas, des erreurs subsistent.

Les règles sont les mêmes : ouvrez plusieurs fenêtres, sur n'importe quelle période de temps (minutes, par exemple) et attendez.

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;
		
	timePrev += nMagic;	// Open nMagic seconds after the new bar

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

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

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

	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(Symbol() + ", " + 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(Symbol() + ", " + 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);
}

// ------