Erro número 6 - página 9

 
Slava, eu coloquei sua versão especializada, para 12 janelas (12 moedas). Há menos erros, mas eles estão lá. Desculpe. Consegui obter 138 e 1. Experimente você mesmo.

Esperança de mais orientação.

Quark
 
A propósito, codifique
while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) { GlobalVariableSet(strTradeSemaphore, 1.0); bSemaphored = true; break; } Sleep(1000); }



admite que entre(GlobalVariableGet(strTradeSemaphore) == 0,0) e GlobalVariableSet(strTradeSemaphore, 1,0); outra EA entrará em cena. Precisamos de uma função que capture e iniba o fio de execução (ou seja, esperar pelo recurso) e depois retornar o controle para o Expert Advisor. Algo como WaitForExclusive()

. Embora, talvez não seja essa a questão. Mas os erros continuam aparecendo, infelizmente.

 
Assim é melhor. Mas apareceram erros que não existiam antes, como o erro 1.
Espero conseguir ajuda.

A propósito, agora que esta conversa começou, como posso determinar automaticamente quantos dígitos deixar por preço com NormalizeDouble, ou seja, 4 para EURUSD, 2 para EURJPY... ?

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 5;

double dLotSize = 0.1;

int nMagic = 0;
int nDigits = 4;

string strTradeSemaphore = "TradeSemaphore";

//////////////////
int init ()
{
	if(!GlobalVariableCheck(strTradeSemaphore)) 
		GlobalVariableSet(strTradeSemaphore, 0.0);
	
	dStopLoss = 110 * Point;
	nHoursToHold = 1;
	
	if(Symbol() == "EURUSD")
		nMagic = 1;
	else if(Symbol() == "EURJPY")
	{
		nMagic = 2;
		nDigits = 2;
	}
	else if(Symbol() == "USDCHF")
		nMagic = 3;
	else if(Symbol() == "GBPUSD")
		nMagic = 4;
	else if(Symbol() == "GBPJPY")
	{
		nMagic = 5;
		nDigits = 2;
	}
	else if(Symbol() == "GBPCHF")
		nMagic = 6;
	else if(Symbol() == "USDJPY")
	{
		nMagic = 7;
		nDigits = 2;
	}
	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;
	
	if(!bIsBarEnd)
		return(0);

	// ------
	
	int nSignal = GetSignal();

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

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

	GlobalVariableSet(strTradeSemaphore, 0.0);	

	return(0);
}
// ------

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

	dLotSize = GetLotSize();

	int nResult = OrderSend(Symbol(), OP_SELL, dLotSize, NormalizeDouble(Bid, nDigits), 
		nSlip, NormalizeDouble(Bid + dStopLoss, nDigits), 0, "Friday", nMagic, 0, OrangeRed);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", sell: " + NormalizeDouble(Bid, nDigits) + ", Stop: " + 
			NormalizeDouble(Bid + dStopLoss, nDigits) + ", error: " + nError);
	}
}

// ------

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

	dLotSize = GetLotSize();

	int nResult = OrderSend(Symbol(), OP_BUY, dLotSize, NormalizeDouble(Ask, nDigits), 
		nSlip, NormalizeDouble(Ask - dStopLoss, nDigits), 0, "Friday", nMagic, 0, Aqua);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", buy: " + NormalizeDouble(Ask, nDigits) + 
			", Stop: " + NormalizeDouble(Ask - dStopLoss, nDigits) + ", 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);
}

 
Oerro 138 às vezes aparece (corro 12 pares em minutos, portanto não demora muito para obter um erro), e também o erro 129 a um preço perfeitamente normal.
 
Portanto. Erro 1. Traduzido vagamente do helpdesk, "algo está errado". 12 pares de moedas em minutos, erro aproximadamente uma vez a cada 5-10 minutos.

Erro 138. Várias vezes por minuto (ou seja, vários dos 12 Expert Advisors o geram).

Erro 129. Estava racionando preços e fazendo muitas outras coisas...
 
Na verdade, agora que estamos falando sobre isso, como você determina automaticamente quantos dígitos sair pelo preço com o NormalizeDouble, ou seja, 4 para EURUSD, 2 para EURJPY...? ?
	int _Digits = MarketInfo( Symbol(), MODE_DIGITS );




e seu consultor especializado com meus 5 me deu um erro - 6.
meu consultor especializado não funciona na minha correção - eles fizeram asneira nesta construção =)
oh, sim... meus 5 também não funcionam =)))) aqui vamos nós...

 
стати, раз уж этот разговор возник, как автоматически определить, сколько знаков оставлять для цены при помощи NormalizeDouble, то есть, 4 для EURUSD, 2 для EURJPY... ?
	int _Digits = MarketInfo( Symbol(), MODE_DIGITS );




e seu consultor especializado com meus 5 deu um erro - 6.
meu consultor especializado não funciona na minha correção - eles fizeram asneira nesta construção =)
oh, sim... meus 5 também não funcionam =)))) oh cara...



Obrigado pelo código, teria levado muito tempo para que eu mesmo o encontrasse.
O especialista sugerido por Slava e melhorado :) por mim é dado abaixo. Você pode executá-lo como eu - em 12 janelas, com 12 moedas. Funciona por qualquer período de tempo, mas é mais rápido em minutos). Estou sempre com erros, caramba. Gostaria de saber por quê.

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 50;

double dLotSize = 0.1;

int nMagic = 0;
int nDigits;

string strTradeSemaphore = "TradeSemaphore";

//////////////////
int init ()
{
	if(!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;
	
	if(!bIsBarEnd)
		return(0);

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

	Sleep(500);

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

	Sleep(500);
	
	GlobalVariableSet(strTradeSemaphore, 0.0);	
	
	return(0);
}
// ------

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

	dLotSize = GetLotSize();

	double dNormalizer = MathPow(10, nDigits);
	double dBid = MathFloor(Bid * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = 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 = MathFloor(Ask * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = 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);
}


 
A propósito, o código [pulado]<br/ translate="no"> permite que outra EA corte entre if(GlobalVariableGet(strTradeSemaphore) == 0.0) e GlobalVariableSet(strTradeSemaphore, 1.0);. Precisamos de uma função que capture e iniba o fio de execução (ou seja, esperar pelo recurso) e depois retornar o controle para o Expert Advisor. Algo como WaitForExclusive()

. Embora, talvez não seja essa a questão. Mas, infelizmente, os erros continuam aparecendo.

isto é exatamente o que eu quis dizer sobre a função hipotética GlobalVariableSetOnCondition, que poderia definir variável global como primeiro parâmetro, desde que seu valor seja igual ao valor do segundo parâmetro. como o acesso às variáveis globais está bloqueado, ele dará "atomicidade"

agora sobre a função IsStopped. ele verifica a bandeira Stop, para que a EA possa normalmente parar (tem 2,5 segundos para isso). é recomendado usar esta função como uma das condições de loop, especialmente para loop infinito
 
<br / translate="no"> é por isso que eu estava falando de uma função hipotética GlobalVariableSetOnCondition, que poderia definir uma variável global pelo primeiro parâmetro, desde que seu valor fosse igual ao valor do segundo parâmetro. uma vez que o acesso às variáveis globais está bloqueado, isso daria "atomicidade".


Slava, pela minha vida, eu não entendo este texto. Por favor, explique em outras palavras, ou mostre-me o que você quer dizer. Se você puder.

A propósito, o que há de errado no código que eu reescrevi? É claro que algo está errado porque não funciona, mas eu não vejo o erro. De acordo com meu palpite, isto é o que deveria ter proporcionado acesso exclusivo.

while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) GlobalVariableSet(stradeSemaphore, nMagic); if(GlobalVariableGet(strTradeSemaphore) == nMagic) break; Sleep(1000); }
 

именно так. я поэтому и говорил про гипотетическую функцию GlobalVariableSetOnCondition, которая могла бы устанавливать глобальную переменную первым параметром при условии, что значение её равно значению второго параметра. так как доступ к глобальным переменным блокируется, то это даст "атомарность"


Slava, pela minha vida, eu não entendo este texto. Ou explicar em outras palavras, ou me mostrar o que você quer dizer. Se você puder.

Estamos falando em evitar a possibilidade de encadeamento entre as chamadas das funções GlobalVariableGet e GlobalVariableSet. o encadeamento por outro Expert Advisor é real, uma vez que os erros ainda são observados. é por isso que estou falando de acesso atômico. você e eu estamos falando em resolver um e o mesmo problema, mas em palavras diferentes
.

A propósito, o que há de errado no pedaço de código que eu retrabalhei? É claro que algo está errado, pois não funciona, mas não vejo o erro. De acordo com meu palpite, isto é o que deveria ter proporcionado acesso exclusivo.

while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) GlobalVariableSet(stradeSemaphore, nMagic); if(GlobalVariableGet(strTradeSemaphore) == nMagic) break; Sleep(1000); }



Seu exemplo é melhor