Errore numero 6 - pagina 6

 
Non male, ma essenzialmente lo stesso :)<br / translate="no"> Cos'è SetTrace?


Oopsie :) Ora farò una pubblicità, fate attenzione - http://forexsystems.ru/phpBB/viewtopic.php?t=694&start=45
 
хэндлов не хватает.


Posso cambiare il numero di maniglie nelle impostazioni di sistema (W'XP) e come?
 
Un'altra domanda agli sviluppatori.

Qual è il modo giusto per farlo:

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. indifferente.
4. Dovremmo impostare il ritorno e processare il prossimo ordine nel prossimo tick
5. Dovrebbe essere fatto in qualche altro modo.

Lasciatemi spiegare. Supponiamo di avere due ordini aperti ed entrambi devono essere chiusi. Il ciclo

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



Chiuderà l'ordine zero, dopo di che il primo ordine diventerà zero. Poi cercherà di chiudere il primo ordine, e ci sarà un errore. Giusto?

Non credo che tutti gli errori dell'EA discussi in questo thread siano legati a questo problema, ad esempio, l'errore comune non ha nulla a che fare con esso. Ma se ho ragione, forse si spiega a) l'ordine bloccato e gli ordini simili e b) il fatto che abbiamo bisogno di più di un Expert Advisor perché gli errori appaiano.



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


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

Se un programma manca di handle, viene scritto con errori, altrimenti ci sono abbastanza handle per tutti.
 
Naturalmente, la seconda opzione è corretta, ma invece di return dovreste mettere Sleep() per 30 secondi e basta.
 
Dovrei aggiungere che sostituendo
for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)
da
for(int nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--)
Sono passato dall'errore 139 al 138 e al 4109
(requote, stringa non inizializzata nell'array)
L'ultimo non ha nessun commento...
 
Naturalmente, la seconda variante è corretta, ma invece di return dovresti mettere Sleep() per 30 secondi e basta.


A 10 Expert Advisors in un intervallo di un minuto, 30 secondi per ogni... Sbagliato, è impossibile vivere così.
 
Pensi che sia tutto qui? Avevo 12 finestre, ognuna con una diversa valuta e un diverso Expert Advisor. Ho proibito (Allow live trading) il trading in 11 di essi. Tutti i miei errori provengono ancora da loro. Un altro bug.
 
Конечно, второй вариант правилен, только вместо return надо ставить Sleep() секунд на 30 и усе.


Con 10 esperti su un intervallo di un minuto, 30 secondi per ogni... Sbagliato, questo non è il modo di vivere.



Questo è il modo di vivere, e quello che state facendo è una prova della forza del ferro.
 
Una nuova versione di EA da testare. Cosa è cambiato:
1. Cicli fissati.
2. Il numero di Magik è privatizzato all'ora di inizio del bar. Questo dà, se non mi sbaglio, un ritardo nell'apertura. Cioè, EA con mn 7 si aprirà 7 secondi dopo l'inizio della barra. Eviterà il sovraccarico del server, la CPU del computer e il conflitto con 2,5 secondi massimo, se è ancora lì da qualche parte...

Ma ahimè, gli errori rimangono.

Le regole sono le stesse - aprite diverse finestre, su qualsiasi intervallo di tempo (minuti, per esempio) e aspettate.

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

// ------

Motivazione: