Error número 6 - página 5

 
Ahora miré a través de la terminal - tengo algunos problemas ayer. <br / translate="no">.
2005.08.11 11:15:00 ****l EURUSD,H1: OrderSend falló con el error #139
2005.08.11 11:07:12 TradeDispatcher: todo el contexto comercial está ocupado

He desconectado este EA y veré lo que pasa después.


Aquí está. Esto es todo. Aquí está. El 139 está bloqueado. Por quién, por qué - no está claro. Luego habrá 2, 6, y así sucesivamente.

Lo más decepcionante es que no hay nada en este EA que lo diferencie de los demás. Así que, o bien yo no puedo ver ese "algo", o bien cualquier Asesor Experto puede tener un fallo, simplemente no se activa cada hora y, por tanto, no todo el mundo lo ha notado.

En consecuencia, mi pregunta para todos: ¿tienen esas entradas en sus registros?

Rosh, ¿usas Alpari? Si es así, una pregunta para Alpari: ¿funciona bien su servidor?

Lo que he descubierto esta noche :(

1. El Asesor Experto funciona por sí mismo, UNO, y no da errores o los da tan raramente que de la noche a la mañana no es suficiente para eso.

2. En combinación con varios otros Asesores Expertos (más precisamente, con uno, para seis divisas), el error se reprodujo, aunque no en una hora, sino en 4 horas.

¿Qué se desprende de esto?
1. Hay algún error en MT (o en mi Asesor Experto, pero es tan simple que es poco probable), que a veces no me permite abrir operaciones. Y cerrarlos también, por cierto.
Por supuesto, puedes evitarlo:

while(nResult == -1) { nResult = OrderSend(...); }



No hace falta que te diga que es un estilo de programación MUY malo y que puede ofender al corredor...

2. Ahora he reescrito el Asesor Experto para que sea más sencillo, pero al mismo tiempo provoca un error. Lo publicaré en las próximas horas. Si parece que el error requerirá dos Asesores Expertos, que puedo hacer, voy a publicar dos :)






 
2. Actualmente estoy reescribiendo el Asesor Experto para hacerlo más sencillo, y al mismo tiempo para provocar un error. Lo publicaré en las próximas horas. Si resulta que el error requiere dos Asesores Expertos, qué se le va a hacer, voy a publicar dos :)<br / translate="no">

y comprobaremos
 
Quark, he hecho un diagnóstico, es culpa de tu EA. Tan pronto como la alerta sale de su EA (no los uso en absoluto) - inmediatamente obtengo
2005.08.11 13:01:19 TradeDispatcher: todo el contexto comercial está ocupado


Los tiempos de alerta y bloqueo son los mismos . No he mirado el código de EA en absoluto.

 
Bueno. Aquí está el nuevo superexperto, que está produciendo errores por sí solo. De momento no he pasado del error 139, así que seguiré probando.

Cómo utilizarlo: para cada divisa (EURUSD, EURJPY, USDCHF, GBPUSD, GBPJPY,
GBPCHF, USDJPY, AUDUSD, EURGBP, USDCAD, EURCHF, EURAUD) abra un gráfico de una hora.
Cada gráfico tiene un Asesor Experto. No interactúan, ya que todos tienen cartas diferentes.

Las posiciones se abrirán de inmediato, una por gráfico. Al comienzo de la siguiente hora, habrá que invertir las posiciones, y así sucesivamente.

A mí me han aparecido 2 errores a la vez, así que en principio es posible que haya que esperar 2 horas.

Si tiene una relación especial con el servidor de comercio, probablemente sea mejor utilizar una cuenta normal para la prueba. Yo uso Alpari.

También hay que tener en cuenta (supongo que es un fallo independiente) la posición de las flechas de apertura de posición. En teoría, como la posición se abre en una nueva barra, la flecha debería estar en la misma barra.

Por último, si no quiere esperar una hora, abra los gráficos de minutos. El error es reproducible.

Una vez más, estamos hablando del error 139. Al mismo tiempo, todavía no he conseguido obtener el error 2 y 6 con este método. Y la mayoría lo han sido antes. Así que supongo que habrá más posts.

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;

	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 = 0; nCnt < OrdersTotal(); 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);
			}
		}
	}

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

// ------
 
Quark, he hecho un diagnóstico, es culpa de tu EA. Tan pronto como la alerta sale de su EA (yo no los uso en absoluto) - me <br/ translate="no">
2005.08.11 13:01:19 TradeDispatcher: todo el contexto de comercio está ocupado


Los tiempos de alerta y bloqueo son los mismos . No he mirado el código de EA en absoluto.



Eso estaría bien, pero introduje las alertas después de notar que las operaciones no se ejecutan. Además, la alerta está en el código justo después de OrderSend.

Ahora voy a intentar cambiar a Print, pero lo dudo...
 
Por cierto, esto es interesante. Al recompilar un EA, la variable que utilizo para calcular bIsBarEnd se reinicia. En consecuencia, si presiono F5 en el editor, todos los EAs deberían cerrar las posiciones antiguas y abrir las nuevas. He pulsado F5. Hay 12 divisas (y Asesores Expertos). Hay 3 actualizados. ¿Eh?

Poner Print en lugar de Alert para comprobar la suposición de Rosh. Por desgracia, toda la diferencia es que ahora el mensaje de error 139 aparece en el registro y no en la pantalla.
 
No lo sé, he mirado el código; no hay nada que encontrar en el fallo. Yo usaría Bares para decidir este lugar, no la hora de apertura.
	El bool bIsBarEnd = false; if(timePrev != Time[0]) bIsBarEnd = true; timePrev = Time[0];



Y la cosa no está clara:
2005.08.11 13:08:12 '18708' : cerrar orden #680413 comprar 0.10 EURUSD a 1.2385 sl: 0.0000 tp: 0.0000 al precio 1.2408
y luego

2005.08.11 13:08:13 '18708': orden #680413 comprar 0.10 EURUSD a 1.2385 sl: 1.2275 tp: 0.0000 cerrado al precio 1.2408

Es decir, al principio la orden va sin stops ni takeprofit, y de repente aparece un stop loss en la orden

 
No lo sé, he mirado el código; no hay nada que encontrar en el fallo. Yo decidiría sobre este lugar a través de Bares, no por tiempo de apertura<br / translate="no">
bool bIsBarEnd = false; if(timePrev != Time[0]) bIsBarEnd = true; timePrev = Time[0]
;



Y la cosa no está clara:
2005.08.11 13:08:12 '18708' : cerrar orden #680413 comprar 0.10 EURUSD a 1.2385 sl: 0.0000 tp: 0.0000 al precio 1.2408
y luego

2005.08.11 13:08:13 '18708': orden #680413 comprar 0.10 EURUSD a 1.2385 sl: 1.2275 tp: 0.0000 cerrado al precio 1.2408

Es decir, al principio la orden va sin stops ni takeprofit, y de repente aparece un stop loss en la orden



Si tienes un trozo de código probado, me encantaría ver "vía Bares" :)

En cuanto al tope cero - lo he asignado en init, y no lo cambio en ningún otro sitio. Bicho, supongo. Hombre, desde que abandoné el C++ no pensé que tendría que volver a hacer entomología.

De hecho, bueno un experto, de acuerdo. Pero es tan sencillo, que surge una pregunta: ¿no existe el peligro de que otros EA se comporten de la misma manera? Teniendo en cuenta que el error sólo aparece cuando hay muchos Asesores Expertos, y produce diferentes errores.

Por ejemplo, tengo un Asesor Experto que utiliza MACD + ADX + Estocástico. Cuando lo haya probado en el probador (donde no hay errores del servidor por definición), ¿se sentará el programador a comprobar la pregunta "aquí se cumplen todas las condiciones pero la operación no está cerrada"? Probablemente no... Bicho peligroso.
 
<br / translate="no">
Si tienes un trozo de código probado, me encantaría ver "vía Bares" :)



Por ejemplo, así:
int start() { int total,ticket,totalExpert; //---- SetTrace(); if (Bars>b) { b=Bars;
 
No está mal, pero en esencia es lo mismo :)
¿Qué es SetTrace?