Erro número 6 - página 5

 
Agora eu olhei através do terminal - ontem tive alguns problemas. <br / translate="no">.
2005.08.11 11:15:00 ****l EURUSD,H1: PedidoEnviado falhou com erro #139
2005.08.11 11:07:12 TradeDispatcher: todo o contexto comercial está ocupado

Desliguei esta EA e verei o que acontece a seguir.


Aqui está. É isso mesmo. Aqui vamos nós. 139 está trancada. Por quem, por quê - não está claro. Depois haverá 2, 6, e assim por diante.

O que é mais decepcionante, não há nada neste EA que o diferencie dos outros. Portanto, ou eu não consigo ver esse "algo", ou qualquer consultor especializado pode estar com problemas, ele pode simplesmente não disparar a cada hora e, portanto, nem todos notaram isso.

Conseqüentemente, minha pergunta a todos - você tem tais entradas em seus registros?

Rosh, você usa Alpari? Se sim, uma pergunta para a Alpari - seu servidor está funcionando corretamente?

O que eu descobri esta noite :(

1. O Expert Advisor trabalha por si só, UM, e ou não dá erros ou os dá tão raramente que de um dia para o outro não é suficiente para isso.

2. Em combinação com vários outros Expert Advisors (mais precisamente, com um, para seis moedas), o erro foi reproduzido, embora não em uma hora, mas em 4 horas.

O que se segue?
1. Há algum bug na MT (ou no meu Expert Advisor, mas é tão simples que é improvável), o que às vezes não me permite abrir negócios. E feche-os também, a propósito.
É claro, você pode contorná-lo:

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



Não preciso lhe dizer que este é um estilo de programação MUITO ruim e pode ofender o corretor...

2. Agora reescrevi o Expert Advisor para torná-lo mais simples, ao mesmo tempo em que causava um erro. Publicá-lo-ei nas próximas horas. Se parecer que o erro exigirá dois Expert Advisors, o que posso fazer, postarei dois:)






 
2. Atualmente estou reescrevendo o Expert Advisor para torná-lo mais simples e, ao mesmo tempo, para causar um erro. Publicá-lo-ei nas próximas horas. Se se verificar que o erro requer dois Expert Advisors, o que você pode fazer, eu colocarei dois :)<br / translate="no">

e vamos verificar
 
Quark, eu fiz um diagnóstico, a culpa é da sua EA. Assim que o Alert sair de seu EA (eu não os uso de forma alguma) - eu recebo imediatamente
2005.08.11 13:01:19 TradeDispatcher: todo o contexto comercial está ocupado


Os tempos de alerta e bloqueio são os mesmos. Eu não olhei para o código EA em absoluto.

 
Bem. Aqui está o novo super-perito, que está produzindo erros por si só. Até agora eu não progredi além do erro 139, então continuarei testando.

Como utilizá-lo: para cada moeda (EURUSD, EURJPY, USDCHF, GBPUSD, GBPJPY,
GBPCHF, USDJPY, AUDUSD, EURGBP, USDCAD, EURCHF, EURAUD) abrir o gráfico de uma hora.
Cada tabela tem um consultor especializado. Eles não interagem, pois todos eles têm gráficos diferentes.

As posições serão abertas de imediato, uma por tabela. No início da próxima hora, as posições terão que ser invertidas, e assim por diante.

Tive dois erros de cada vez, portanto, em princípio, é possível ter que esperar por duas horas.

Se você tiver um relacionamento especial com o servidor comercial, é provavelmente melhor usar uma conta normal para o teste. Eu uso Alpari.

Observe também (presumo que este seja um bug independente) a posição das setas de abertura de posição. Em teoria, como a posição se abre em uma nova barra, a seta deve estar sobre a mesma barra.

Finalmente, se você não quiser esperar uma hora, abra os gráficos de minutos. O erro é reprodutível.

Mais uma vez, estamos falando de erro 139. Ao mesmo tempo, eu ainda não consegui obter erros 2 e 6 com este método. E eles já estiveram em sua maioria antes. Portanto, acho que haverá mais postagens.

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, eu fiz um diagnóstico, a culpa é da sua EA. Assim que o Alert sai de seu EA (eu não os uso) - eu recebo <br/ translate="no">
2005.08.11 13:01:19 TradeDispatcher: todo o contexto comercial está ocupado


Os tempos de alerta e bloqueio são os mesmos. Eu não olhei para o código EA em absoluto.



Isso seria bom, mas eu introduzi alertas depois de perceber que as negociações não estão sendo executadas. Além disso, o alerta está no código logo após o OrderSend.

Agora vou tentar mudar para Print, mas duvido...
 
A propósito, isto é interessante. Ao recompilar uma EA, a variável que eu uso para calcular o bIsBarEnd é reinicializada. Assim, se eu pressionar F5 no editor, todos os EAs devem fechar as posições antigas e abrir novas posições. Eu pressionei F5. Existem 12 moedas (e Consultores Especialistas). Há 3 atualizações. Hm?

Coloque Print em vez de Alert para verificar a suposição de Rosh. Infelizmente, toda a diferença é que a mensagem de erro 139 agora aparece no registro e não na tela.
 
Não sei, olhei para o código; não há nada com que se possa encontrar falha. Eu usaria bares para decidir este lugar, não a hora da abertura.
	The bool bIsBarEnd = false; if(timePrev != Time[0]) bIsBarEnd = true; timePrev = Time[0];



E a coisa não está clara:
2005.08.11 13:08:12 '18708' : fechar pedido #680413 comprar 0.10 EURUSD a 1.2385 sl: 0.0000 tp: 0.0000 ao preço 1.2408
e então

2005.08.11 13:08:13 '18708': ordem #680413 comprar 0.10 EURUSD a 1.2385 sl: 1.2275 tp: 0.0000 fechado ao preço 1.2408

Em outras palavras, no início a ordem passa sem paradas e sem lucros, e depois de repente uma parada de perda aparece na ordem

 
Não sei, olhei para o código; não há nada com que se possa encontrar falha. Eu decidiria sobre este lugar através de Bars, não pelo tempo de abertura<br / translate="no">
bool bIsBarEnd = falso; if(timePrev != Time[0]) bIsBarEnd = verdadeiro; timePrev = Time[0]
;



E a coisa não está clara:
2005.08.11 13:08:12 '18708' : fechar pedido #680413 comprar 0.10 EURUSD a 1.2385 sl: 0.0000 tp: 0.0000 ao preço 1.2408
e então

2005.08.11 13:08:13 '18708': ordem #680413 comprar 0.10 EURUSD a 1.2385 sl: 1.2275 tp: 0.0000 fechado ao preço 1.2408

Em outras palavras, no início a ordem passa sem paradas e sem lucros, e depois de repente uma parada de perda aparece na ordem



Se você tem um código testado, eu adoraria ver "via Bars" :)

Quanto à parada zero - eu a atribuí no init, e não a mudo em nenhum outro lugar. Bug, acho eu. Cara, desde que eu abandonei C++ não pensei que teria que fazer entomologia novamente.

Na verdade, bem, um especialista, tudo bem. Mas é tão simples, que surge uma pergunta: não existe o perigo de outros EAs se comportarem da mesma maneira? Considerando que o bug só aparece quando há muitos Expert Advisors, e além disso, ele produz erros diferentes.

Por exemplo, tenho um Expert Advisor usando MACD + ADX + Stochastic. Quando tiver testado no testador (onde não há erros de servidor por definição), o programador irá apenas sentar e verificar a pergunta "todas as condições estão preenchidas aqui, mas o comércio não está fechado"? Provavelmente não vai... Insecto perigoso.
 
<br / translate="no">
Se você tem um código testado, eu adoraria ver "via Bars" :)



Por exemplo, assim:
int start() { int total,ticket,totalExpert; //---- SetTrace(); if (Bars>b) { b=Bars;
 
Nada mal, mas essencialmente a mesma coisa :)
O que é SetTrace?