Error número 6 - página 10

 
[cita
Su ejemplo es mejor.
[/quote]

Este ejemplo no funciona. Da errores. ¿Podría usted, como desarrollador más experimentado, ayudar a que funcione?
Respetuosamente,
Quark
 
<br/ translate="no"> Pregunta: ¿cómo hace while(!IsStopped()) ? No está del todo claro en la ayuda, pensé que era una comprobación de Permitir Comercio en Vivo.

esto es una comprobación para ver si quieren cerrar el Asesor Experto externamente

Pregunta: ¿estos while y Sleep no ralentizarán el sistema?

el sistema no se ralentizará. sólo el Asesor Experto único

Pregunta: ¿se procesarán correctamente el sueño y el semáforo en el modo de prueba?

el deslizamiento no se maneja en las pruebas, simplemente se omite. es más complicado en las pruebas. los EAs reales activos pueden competir por este semáforo. no necesitamos semáforos en las pruebas en absoluto, ya que sólo se prueba un EA - no podemos organizar pruebas simultáneas de Expertos que interactúan. para excluir el manejo de semáforos en las pruebas, utilice la función IsTesting

También con respecto a la lógica. Entre poner y quitar el semáforo tenemos dos posibilidades (como máximo) para manejar las órdenes. Primero Buy() o Sell() y luego, a continuación, CloseOrder(). ¿No competirán estas dos "actividades" entre sí, aunque dentro del EA, como si hubiera dos Asesores Expertos? ¿O se garantiza que el proceso es lineal y no llegará a CloseOrder() hasta que Buy() regrese?

Estas actividades no competirán entre sí, ya que las operaciones comerciales son ahora sincrónicas, es decir, el experto espera hasta que se complete la operación comercial. "se garantiza que el proceso sea lineal"
 
Este ejemplo no funciona. Da errores. ¿Podría usted, como desarrollador más experimentado, ayudar a que funcione? <br/ translate="no">

No lo forzaré. Espere un par de días para la función GlobalVariableSetOnCondition, entonces todos los problemas de control de acceso estarán resueltos
 
Этот пример не работает. Дает ошибки. Не могли бы Вы, как более опытный разработчик, помочь заставить его работать?

No lo forzaré. Espere un par de días para la función GlobalVariableSetOnCondition, entonces todos los problemas de delimitación de acceso estarán resueltos


Si te refieres a que planeas introducir la función GlobalVariableSetOnCondition en MT, ¿podrías decir unas palabras de antemano sobre ello?

¿Incluyendo cómo propones utilizarlo en esta situación?

Un par de días -¿contando los fines de semana?
 
Slava, además de los útiles consejos, que te agradezco mucho, se me ha ocurrido una idea :) O más bien, una sugerencia. Ya lo he mencionado.

¿Por qué no haces una cola de pedidos en MT? Es decir, puedes escribir asíncronamente una petición para trabajar en una posición allí, y MT en un hilo separado procesará esa petición cuando haya tiempo, y con la garantía de que nadie más entrará allí.

Quark
 
Si te refieres a que planeas introducir la función GlobalVariableSetOnCondition en MT, ¿podrías decir algo al respecto de antemano? <br/ translate="no">
¿Incluyendo cómo propones utilizarlo en esta situación?

Un par de días - ¿contando los fines de semana?

Ya mostré un ejemplo
if(GlobalVariableSetOnCondition(SemaphoreName, 1.0, 0.0)==true) { bSemaphored=true; break; }


si una variable global tiene un valor de 0.0, entonces establece el valor a 1.0 y devuelve true. de lo contrario, no establece nada. comprueba y cambia el valor en una sola llamada a la función.

"un par de días" - lo dije por si acaso. espero que lo publiquemos hoy

 
¿Quiere tener una cola de pedidos en MT. Es decir, puedes escribir asíncronamente una petición para trabajar en una posición allí, y MT procesará esa petición en un hilo separado cuando haya tiempo, y con la garantía de que nadie más entrará allí. <br / translate="no">.

No haremos una cola de pedidos
 
<br / translate="no"> Ya mostré un ejemplo


Sólo que no ha dicho lo que es :) Pensé que la función se sugirió para escribirme.


Dije "un par de días" por si acaso. Espero que lo publiquemos hoy.


Gracias.
 
Opcional.

1. En estos 100 puestos se han encontrado varios bugs mientras se trabajaba en el Asesor Experto, y no están directamente relacionados con él. Por ejemplo, me he dado cuenta de que los Asesores Expertos siguen negociando incluso después de quitar la casilla de Permitir Negociación en Vivo. Espero que no te olvides de ellos.

2. A continuación se muestra el código de mi Asesor Experto de nuevo. Genera errores 1, 129, 138. ¿Podría a) decirme qué es el 138(requote), por qué se produce, si está relacionado con los semáforos y cómo solucionarlo? b) ¿Por qué el 129? Los precios se imprimen junto con el error, parecen ser correctos. c) Sobre 1, también.

Le recuerdo el método de prueba: ventanas de 12 minutos para 12 monedas.

Respetuosamente,
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);
}
 
Elerror 138 requote puede ocurrir fácilmente. potencialmente con 10 EAs trabajando el tiempo de espera para la liberación del semáforo puede ser de 30 segundos o más. durante este tiempo el precio puede cambiar fácilmente. en este caso use la función RefreshRates y tome un nuevo valor de oferta o demanda. o pida a MarketInfo un nuevo precio. 129 es el mismo error, el precio es erróneo - el precio se ha pasado y hubo varios cambios de precio durante el tiempo de espera. 1 - esto no es un error en absoluto. aparece cuando usted está tratando de modificar una orden con los mismos valores que ya se han establecido. es extraño que se produce cuando se confirma manualmente un comercio en el rechazo