Erro número 6 - página 7

 
<br / translate="no"> Essa é a maneira de viver, e o que você está fazendo é testar a força do ferro.


Veja o post sobre a nova versão da EA. O ferro é agora dado um segundo por especialista. Não ficou melhor.
Em seguida, foi-nos prometido que os pedidos seriam feitos em fila de espera.
 
É claro que a segunda variante está correta, mas em vez de devolver deve-se usar Sleep() por 30 segundos e pronto.


Aqui está a variante proposta pela Rosh. Os erros permanecem.

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]) 
		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 = 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(10);
			}
		}
	}

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

Sleep(10);
}
// ------
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);
	}

Sleep(10);
}
// ------

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

// ------



 
Este ponto
if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); ou if(OrderType() == OP_SELLL) OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed)
;


o que é o OrderType() se fechamos a ordem de compra (a primeira condição foi atendida)
Tente deixar o cheque na segunda condição, ou seja, eu sempre escrevo assim:

if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); if(OrderType() == OP_SELLL) OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
 
Bem, como sempre, Rosh parece estar certa. Eu defino Sleep(0), dois especialistas já dão erros. Coloco Sleep(100), quatro especialistas trabalham, aparecem erros ao adicionar a quinta (cinco janelas, cinco moedas, um especialista para cada uma).

Eu programei Sleep(200) - cinco especialistas entram (quase, às vezes eles ainda dão erros). Eu não consegui obter 5 Expert Advisors sem erros usando este método).

Por enquanto, estou falando apenas dos erros 138 e 139.

Ainda à espera de algumas dicas dos desenvolvedores.

Rosh, graças a você, embora eu não goste de sua abordagem com escorregão.
 
Tal momento<br / translate="no">
if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); ou if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed)
;


O que é OrderType() se fechamos uma ordem de compra (a primeira condição foi cumprida)
Tente deixar o cheque na segunda condição, ou seja, sempre o escrevo desta maneira:

if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); if(OrderType() == OP_SELLL) OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);



Sim, eu acho que sim. Embora eu tenha feito uma pausa depois disto se, mas quem os conhece, os multitarefa.

Experimentei-o. Eu me sinto melhor, mas ainda tenho erros :)
 
<br / translate="no">
Rosh, obrigado especial a você, embora não goste de sua abordagem com o deslize.


Bem... A vida também não é a melhor que eu já vi. Há uma coisa como morrer em algum momento. Eu também não gosto, mas o Desenvolvedor não muda a versão. :)
 


Rosh, тебе отдельное спасибо, хотя твой подход со слипом мне не нравится.


Bem... A vida também não é a melhor coisa que eu já vi. Existe algo como morrer em algum momento. Eu também não gosto, mas o Desenvolvedor não muda a versão. :)


Sim, e o API não coloca para fora :)
Mas você pode sempre encontrar uma solução :)) Usando Sleep(), por exemplo :))))

Mas em geral, esta é uma observação profunda. Você deve se candidatar aos desenvolvedores com mais freqüência. Eles dizem que às vezes respondem :))))
 
Posso ter uma conversa com vocês? =)))
Porque você tem tal discussão por 4 páginas, e eu estou em silêncio (dia da bebida =))...


Sobre os erros:
Erro #6 - sem conexão com servidor comercial - pode ser devido a má conexão. Tenho uma linha alugada Data Over Voice, e quando você pega o telefone, a velocidade cai drasticamente. Portanto, é precisamente nestes momentos que este erro ocorre.

Erro #139 - a ordem está bloqueada - eu acho que é apenas uma falha: como o terminal faz algo com esta posição e a EA não pode trabalhar com ela naquele momento. Não sei, não consigo encontrar outra explicação (

Erro #138 - requote - pode ser causado também pela conexão. Veja a carga do canal durante os erros.

Tudo isso, porém, é pura especulação. Eu pedi aos desenvolvedores por muito tempo uma descrição normal dos erros e instruções sobre como reagir - eles disseram que viriam um dia ;)



Em relação ao sono() - é sempre uma bobagem usá-lo. Mas é melhor fazer uma pausa entre as negociações - use o LastTradeTime. Estou terminando (remaking) a biblioteca trade_lib&info_lib.mqh. Todas estas questões são resolvidas ali (parcialmente). Deve haver muito menos erros.


Isso é tudo o que eu penso até agora, se eu pensar em mais alguma coisa - eu direi ;)
 
<br/ translate="no"> Posso ter uma conversa com vocês? =)))
Você tem uma discussão de quatro páginas, e eu estou em silêncio (dia da bebida =))


Sim, eu fiz muito barulho... :)


Sobre os erros:
O erro nº 6 - sem conexão com o servidor comercial - pode ser devido a uma conexão ruim. Tenho uma linha alugada Data Over Voice, e quando você pega o telefone, a velocidade cai drasticamente. Portanto, é precisamente nestes momentos que este erro ocorre.


Eu tenho uma linha alugada, de boa qualidade. Mais uma vez, uma má conexão não explica porque ocorre um erro TODAS as vezes que vários EAs fazem algo simultaneamente. Com um canal megabit (em teoria)!


Erro #139 - a ordem está bloqueada - me parece que é apenas uma falha: como se o terminal fizesse algo com esta posição e o Expert Advisor não pudesse trabalhar com ele naquele momento. Não sei, não consigo encontrar nenhuma outra explicação (


De acordo. Só resta uma bagatela para descobrir ONDE ele está fazendo isso. O especialista é tão simples que simplesmente não existe tal lugar. Embora, é claro, talvez seja eu quem não consiga ver isso. (você vê um alce? não. e eu não vejo, mas ele está AGORA)


Erro #138 - a solicitação pode muito bem ser devida à conexão. Verifique a carga do link durante erros.


Eu não sei. Se você não pode negociar dois EAs ao mesmo tempo em Moscou em uma linha alugada, você não pode negociar em absoluto.

Eu estava pensando em solicitações. Por exemplo, qual é o mínimo deslize que se deve fazer para evitar que o preço fuja. 5 pontos? 10? Coloco 15 - o erro permanece.


Tudo isso, porém, é pura especulação. Eu pedi aos desenvolvedores por muito tempo uma descrição normal dos erros e instruções sobre como reagir - eles disseram que viriam um dia ;)


E eles dizem que o mercado é perfeito! Ha!


Em relação ao sono() - é sempre uma bobagem usá-lo. Mas seria melhor fazer uma pausa entre as negociações - use o LastTradeTime. Estou terminando (remaking) a biblioteca trade_lib&info_lib.mqh - vou colocá-la no wiki e dar-lhe o link. Todas estas questões são resolvidas ali (parcialmente). Deve haver muito menos erros.


Eu já escrevi que estes erros podem ser contornados "diretamente" - enviando OrderSend em loop, até que retorne um valor diferente de menos 1. Mas a questão é de princípio - o que acontece? Eu recebo erros de 5-6 tipos diferentes ao mesmo tempo. Se eu desenhar uma solução para hoje, eles aparecerão amanhã onde não são esperados. Se eu negociar em demonstração, é melhor resolver este problema. Terei perdas mais tarde.


Isso é tudo o que eu penso por enquanto, se eu pensar em mais alguma coisa, eu lhe direi ;)


Obrigado :)
Tente executar este Expert Advisor em sua EA. Talvez você tenha algumas idéias. Ou - se você comercializar em uma demonstração - coloque alertas semelhantes em seus EAs... quem sabe... E se eles não abrirem todos os acordos?
 
Eu também recebo erros assim o tempo todo. E eu também me sento em Alpari. Talvez você deva tentar outra empresa de corretagem? Talvez não seja culpa da MT?