Error número 6 - página 9

 
Slava, he puesto tu versión experta, para 12 ventanas (12 monedas). Hay menos errores, pero están ahí. Lo siento. Me las arreglé para conseguir 138 y 1. Pruébalo tú mismo.

Espero que se le oriente más.

Quark
 
Por cierto, código
while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) { GlobalVariableSet(strTradeSemaphore, 1.0); bSemaphored = true; break; } Sleep(1000); }



admite que entre(GlobalVariableGet(strTradeSemaphore) == 0.0) y GlobalVariableSet(strTradeSemaphore, 1.0); otro EA entrará. Necesitamos una función que capture e inhiba el hilo de ejecución (es decir, que espere el recurso) y luego devuelva el control al Asesor Experto. Algo así como WaitForExclusive()

. Aunque, tal vez, no sea la cuestión. Pero los errores siguen apareciendo, por desgracia.

 
Así está mejor. Pero han aparecido errores que antes no estaban, como el error 1.
Espero recibir ayuda.

Por cierto, ahora que se ha iniciado esta conversación, ¿cómo puedo determinar automáticamente cuántos dígitos dejar para el precio utilizando NormalizeDouble, es decir, 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);
}

 
A veces apareceel error 138 (yo ejecuto 12 pares en minutos, así que no tarda en aparecer un error), y también el error 129 a un precio perfectamente normal.
 
Así que. Error 1. Traducido libremente del servicio de asistencia, "algo va mal". 12 pares de divisas en minutos, error aproximadamente cada 5-10 minutos.

Error 138. Varias veces por minuto (es decir, varios de los 12 Asesores Expertos lo generan).

Error 129. Estaba racionando los precios y haciendo muchas otras cosas...
 
De hecho, ahora que estamos hablando de ello, ¿cómo se determina automáticamente cuántos dígitos hay que dejar para el precio con NormalizeDouble, es decir, 4 para el EURUSD, 2 para el EURJPY...? ?
	int _Digits = MarketInfo( Symbol(), MODE_DIGITS );




y su Asesor Experto con mi 5 me dio un error - 6.
mi Asesor de Expertos no funciona en mi corrección - que se echó a perder en esta construcción =)
oh sí... mi 5 tampoco funciona =)))) aquí vamos...

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




y su Asesor Experto con mi 5 dio un error - 6.
mi Asesor de Expertos no funciona en mi corrección - que se echó a perder en esta construcción =)
oh sí... mi 5 tampoco funciona =)))) oh man...



Gracias por el código, me habría llevado mucho tiempo encontrarlo yo mismo.
El experto sugerido por Slava y mejorado :) por mí se da a continuación. Puedes hacerlo como yo: en 12 ventanas, con 12 monedas. Funciona para cualquier plazo, pero es más rápido en los minutos). Sigo recibiendo errores, maldita sea. Me gustaría 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);
}


 
Por cierto, el código [skipped]<br/ translate="no"> admite que entre if(GlobalVariableGet(strTradeSemaphore) == 0,0) y GlobalVariableSet(strTradeSemaphore, 1,0); se cuele otro EA. Necesitamos una función que capture e inhiba el hilo de ejecución (es decir, que espere el recurso) y luego devuelva el control al Asesor Experto. Algo así como WaitForExclusive()

. Aunque, tal vez, no sea la cuestión. Pero, por desgracia, los errores siguen apareciendo.

esto es exactamente lo que quería decir sobre la hipotética función GlobalVariableSetOnCondition, que podría establecer la variable global como primer parámetro, siempre que su valor sea igual al valor del segundo parámetro. como el acceso a las variables globales está bloqueado, dará "atomicidad"

ahora sobre la función IsStopped. comprueba la bandera de parada, por lo que el EA podría parar normalmente (tiene 2,5 segundos para ello). se recomienda utilizar esta función como una de las condiciones de bucle, especialmente infinito
 
<br / translate="no"> por eso hablaba de una hipotética función GlobalVariableSetOnCondition, que podría fijar una variable global por el primer parámetro, siempre que su valor sea igual al valor del segundo parámetro. como el acceso a las variables globales está bloqueado, esto daría "atomicidad"


Slava, por mi vida, no entiendo este texto. Por favor, explíquelo con otras palabras, o muéstreme lo que quiere decir. Si puedes.

Por cierto, ¿qué hay de malo en el código que he reescrito? Es decir, está claro que algo falla porque no funciona, pero no veo el error. Según mi corazonada, esto es lo que debería haber proporcionado el acceso exclusivo...

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

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


Slava, por mi vida, no entiendo este texto. O lo explicas con otras palabras, o me muestras lo que quieres decir. Si puedes.

Estamos hablando de prevenir la posibilidad de calce entre las llamadas de las funciones GlobalVariableGet y GlobalVariableSet. el calce por parte de otro Asesor Experto es real ya que se siguen observando errores. por eso hablo de acceso atómico. usted y yo estamos hablando de resolver un mismo problema pero con palabras diferentes
.

Por cierto, ¿qué es lo que falla en el trozo de código que he rehecho? Es decir, está claro que algo falla ya que no funciona, pero no veo el error. Según mi corazonada, esto es lo que debería haber proporcionado el acceso exclusivo...

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



Su ejemplo es mejor