Erro número 6 - página 10

 
[citar
Seu exemplo é um exemplo melhor.
[/quote]

Este exemplo não funciona. Dá erros. Você poderia, como um desenvolvedor mais experiente, ajudar a fazer funcionar?
Respeitosamente,
Quark
 
<br/ translate="no"> Pergunta: como faz enquanto(!IsStopped()) ? Não está muito claro pela ajuda, pensei que fosse um cheque em Allow Live Trading.

este é um cheque para ver se eles querem fechar o Expert Advisor externamente

Pergunta: estes enquanto e Sleep não irão retardar o sistema?

o sistema não será desacelerado. apenas o único Expert Advisor

Pergunta: o sono e o semáforo serão processados corretamente em modo de teste?

o escorregamento não é tratado em testes, ele simplesmente é pulado. é mais complicado em testes. os EAs realmente ativos podem competir por este semáforo. não precisamos de semáforos em testes, já que apenas um EA é testado - não podemos organizar testes simultâneos de Especialistas em interação. para excluir o manuseio de semáforos em testes, use a função IsTesting

Também no que diz respeito à lógica. Entre o ajuste e a remoção do semáforo, temos duas (máximas) possibilidades para tratar as ordens. Primeiro Comprar() ou Vender() e depois, abaixo, FecharOrdem(). Essas duas "atividades" não irão competir entre si, embora dentro da EA, como se houvesse dois Conselheiros Especializados? Ou o processo é garantidamente linear e não chegará ao CloseOrder() até que a Buy() retorne?

Estas atividades não competirão entre si, uma vez que as operações comerciais estão agora sincronizadas, ou seja, os especialistas esperam até que a operação comercial seja concluída. "o processo tem a garantia de ser linear"
 
Este exemplo não funciona. Dá erros. Você poderia, como um desenvolvedor mais experiente, ajudar a fazer funcionar? <br/ translate="no">

Não vou forçá-lo. Espere alguns dias para a função GlobalVariableSetOnCondition, então todos os problemas de controle de acesso serão resolvidos
 
Этот пример не работает. Дает ошибки. Не могли бы Вы, как более опытный разработчик, помочь заставить его работать?

Não vou forçá-lo. aguarde alguns dias pela função GlobalVariableSetOnCondition, então todos os problemas de delimitação de acesso serão resolvidos


Se você quer dizer que pretende introduzir a função GlobalVariableSetOnCondition na MT, poderia dizer algumas palavras antes sobre isso?

Incluindo como você se propõe a usá-lo nesta situação?

Um par de dias - contando fins de semana?
 
Slava, além dos conselhos úteis, pelos quais lhe agradeço muito, tive uma idéia :) Ou melhor, uma sugestão. Eu já mencionei isso.

Por que você não faz uma fila de pedidos em MT. Ou seja, você pode escrever assincronamente uma solicitação para trabalhar em uma posição lá, e a MT em uma linha separada processará essa solicitação quando houver tempo, e com a garantia de que ninguém mais entrará lá.

Quark
 
Se você quer dizer que pretende introduzir a função GlobalVariableSetOnCondition na MT, poderia dizer algo sobre isso com antecedência? <br/ translate="no">
Incluindo como você se propõe a usá-lo nesta situação?

Um par de dias - contando fins de semana?

Já mostrei um exemplo
if(GlobalVariableSetOnCondition(SemaporeName, 1.0, 0.0)==verdadeiro) { bSemaphored=verdadeiro; break; }


se uma variável global tem um valor 0,0, então defina o valor para 1,0 e retorne verdadeiro. caso contrário, não defina nada. verifique e altere o valor em uma chamada de função.

"um par de dias" - eu disse que, por via das dúvidas, esperamos publicá-lo hoje.

 
Você quer ter uma fila de pedidos em MT. Ou seja, você pode escrever assincronamente uma solicitação para trabalhar em uma posição lá, e a MT processará essa solicitação em uma linha separada quando houver tempo, e com a garantia de que ninguém mais entrará lá. <br / translate="no">.

Não faremos uma fila de pedidos
 
<br / translate="no"> Eu já mostrei um exemplo


Só não disse o que é :) Pensei que a função tinha sido sugerida para me escrever.


Eu disse "um par de dias" só para o caso de. Esperamos publicá-lo hoje.


Obrigado.
 
Opcional.

1. Nesses 100 posts foram encontrados vários bugs enquanto trabalhavam no Expert Advisor, e não diretamente relacionados a ele. Por exemplo, notei que os Expert Advisors continuam negociando mesmo após a remoção da caixa de seleção Allow Live Trading. Espero que você não os esqueça.

2. Abaixo está novamente o código do meu Conselheiro Especialista. Ela gera erros 1, 129, 138. Você poderia a) me dizer o que é 138(requote), por que ocorre, se está relacionado a semáforos, e como consertá-lo? b) Por que 129? Os preços são impressos junto com o erro, eles parecem estar corretos. c) Cerca de 1, também.

Deixe-me lembrá-lo do método de teste: janelas de 12 minutos para 12 moedas.

Respeitosamente,
Quark

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;
int nBars;
int nDelaySeconds = 3;

int nSlip = 50;

double dLotSize = 0.1;

int nMagic = 0;
int nDigits;

string strTradeSemaphore = "TradeSemaphore";

//////////////////
int init ()
{
	nBars = Bars;

	if(!IsTesting() && !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;
*/

	bool bIsBarEnd = false;
	if(nBars != Bars)
	{
		if(IsTesting() || (!IsTesting() && CurTime() > Time[0] + nMagic * nDelaySeconds))
		{
			bIsBarEnd = true;
			nBars = Bars;
		}
	}
	
	if(!bIsBarEnd)
		return(0);

	// ------
	
	if(!IsTesting())
	{
		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);
			}
		}
	}

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

	if(!IsTesting())
		GlobalVariableSet(strTradeSemaphore, 0.0);	
	
	return(0);
}
// ------

void Sell()
{
	if(AccountFreeMargin() < 500)
		return;

	dLotSize = GetLotSize();

	double dNormalizer = MathPow(10, nDigits);
	double dBid = Bid;//MathFloor(Bid * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = Bid + dStopLoss;//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 = Ask;//MathFloor(Ask * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = Ask - dStopLoss;//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);
}
 
erro 138 pode facilmente ocorrer. potencialmente com 10 EAs de trabalho o tempo de espera para liberação do semáforo pode ser de 30 segundos ou mais. durante este tempo o preço pode facilmente mudar. neste caso use a função RefreshRates e faça uma nova oferta ou peça um novo valor. ou peça MarketInfo por um novo preço. 129 é o mesmo erro, preço errado - o preço foi longe demais e houve várias mudanças de preço durante o tempo de espera. 1 - isto não é um erro. aparece quando você está tentando modificar uma ordem com os mesmos valores que já foram definidos. é estranho que isto ocorra quando você confirma manualmente uma negociação sobre rejeição