Error número 6 - página 29

 
registros enviados. <br / translate="no"> ¿Dónde debo poner este código?
while(!IsStopped() && !IsTradeAllowed()) Sleep(1000); GlobalVariableSet(strTradeSemaphore, 0.0);


a la salida de la función de inicio
 
Probado Sleep()
Hasta 100000 sin mejora visible

Reemplazado por
if(!IsTesting()) { Sleep(1000); GlobalVariableSet(strTradeSemaphore, 0.0); }


en

while(!IsStopped() && !IsTradeAllowed()) Sleep(1000); GlobalVariableSet(strTradeSemaphore, 0.0);



La misma pimienta.
Error 146.

 
Después de un rato, pensándolo bien resulta que hay un método exacto. Voy a intentar formularlo<br/ translate="no">
while(!IsStopped() && !IsTradeAllowed()) Sleep(1000); GlobalVariableSet(strTradeSemaphore, 0.0);


es decir, nosotros mismos estamos esperando a que se libere nuestro propio contexto comercial

y, en general, esta es una situación extremadamente extraña. después de realizar una operación comercial, el contexto se libera instantáneamente. de lo contrario, sería imposible cerrar posiciones en un bucle



Una vez más.

El código anterior hará que el Asesor Experto se cuelgue, si la bandera de comercio ha sido borrada.
Esto hará que el comercio se detenga por completo, porque nadie hará la señal del semáforo. Esta situación es, al menos, controlable de alguna manera, ya que la bandera sólo puede eliminarse manualmente.
Peor es el caso del semáforo. GlobalVariableSet puede caer sobre otro EA, cuando éste cierra el semáforo. Como resultado, varios EAs tratarán de operar al mismo tiempo.
Como vemos, los desarrolladores no entienden qué procesos asíncronos tienen lugar en el terminal. Y este malentendido se exporta al foro.
No es de extrañar que aparezcan errores fatales, como el que se comenta aquí, y que estos errores no se puedan arreglar.

¿Por qué dar consejos perjudiciales?
 
¿Por qué dar consejos a вредные?

Se supone que si el asesor ha llegado a este punto, ¡la bandera de negociación se mantiene!
 
Зачем давать вредные советы?

¡la suposición es que si el EA ha llegado a este punto, entonces la bandera de comercio está arriba!

¿En qué se basa esta suposición? Cuando los supuestos no se ajustan a la realidad, se producen errores inesperados.
La bandera no es nada.
Sincronización, mutexes, recursos compartidos: el problema es real. No tiene sentido sugerir que se solucione con variables globales a nivel de usuario. Sobre todo porque el ejemplo es inviable.
 
A partir de las 12 de la noche, los expertos trabajaron en MQ-demo y Alpari-demo. Durante todo el tiempo tampoco hubo ningún error 128, en Alpari hubo un error 6 (error de ping), y en ambos - varios ticks antiguos. Los pedidos funcionaron sin errores. Build 1.8.3 de 05.10. ¿Tal vez sea otra cosa? Por ejemplo, ¿las peculiaridades de la conexión a través del puerto 443 con diferentes proveedores de Internet? MT3 tenía errores, pero no tantos.


Ay. "Desde las 12 de la noche" no es una estadística. Por razones desconocidas, los problemas vienen en oleadas, luego ninguno, luego varios a la vez...
 
<br / translate="no"> Quark, ten conciencia, no publiques esos registros en el foro =)))))


Pensé - a quién le importa (tono de violinista de Kindzadz) :))


Sobre la realidad del cierre/apertura - Tengo comprobaciones en todas las funciones f y aparecen errores, pero son errores FALSE. He comprobado los registros y el historial de pedidos, todas las posiciones estaban cerradas. La orden no tuvo tiempo de moverse en la historia. Hice un retraso de 1 segundo antes de comprobarlo - pero no es suficiente... Cuando pregunté, no me dieron ninguna respuesta.


Buen punto. Pero he tenido casos en los que incluso una hora después el pedido no ha ido a ninguna parte, es decir, a veces no son falsos.
Yo también tengo un retraso de 10 segundos.
 
Ese es un buen punto. Pero he tenido casos en los que incluso una hora después el pedido no ha ido a ninguna parte, es decir, a veces no son falsos. <br / translate="no"> También tengo un retraso de 10 segundos cada uno.

Todos mis errores, como resultó, estaban en el código =) es decir, hice la comprobación incorrecta después del orderclose.
Después de corregirlo - no hay ninguno. Es cierto que no ha pasado mucho tiempo, tenemos que esperar...
 
<br / translate="no"> todos mis errores parecían estar en el código =) es decir, hice la comprobación incorrecta después de orderclose.
Después de corregirlo - no hay ninguno. Es cierto que no ha pasado mucho tiempo, tendremos que esperar...


¿Cómo es el código corregido?
 
¿Qué aspecto tiene el código corregido?

para los pedidos:
//---- comprueba si la posición se ha cerrado realmente y si no, emite la información y sale, devolviendo -5 for ( int x = 0; x < 5; x ++ ) { Sleep(1000);
		if ( OrderSelect( Close_OrderTicket, SELECT_BY_TICKET ) ) { if ( OrderCloseTime() <= 0 ) { Processing_Error ( 0, "OrderClose" ); _Return_ ( 3, "Error", 0, "Position was not closed", "OrderClose(...)", "La posición no se ha cerrado" ); return(-5); } else { break; } } Close_GetLastError = GetLastError(); _Print_ ( 3, "OrderSelect( " + Close_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Close_GetLastError + " ( " + ErrorDescription( Close_GetLastError ) + " )" }; }


para ordersand - sólo un 5x intento de seleccionar una orden con una segunda pausa,
para modifi - comparando los valores antiguos con los actuales