EA mezcla órdenes de COMPRA y VENTA - página 3

 
WHRoeder:

int OrderType = OrderType() no está bien, una puede estar ocultando a la otra (las declaraciones locales ocultan a las globales sin error.) Intenta

int orderType = OrderType()

El código original es. . . .

int orderType;
   for(cnt = total-1; cnt >= 0; cnt--)
   {
      while (!OrderSelect(cnt, SELECT_BY_POS)) {Sleep(500);}
      orderType = OrderType();

. . que es efectivamente lo mismo que lo que sugieres ?

Creo que dvarrin está diciendo que su problema radica en su número de entrada.

 

No, no es así.

El tipode orden declarado fuera del bucle transferirá efectivamente el valor de orderType al siguiente ciclo e incluso si se produce un error, ese valor entrará en el siguiente condicional.

Si se declara dentro del bucle con la configuración inmediata del valor de OrderType() no habrá lugar a ese error.

(tal vez no sea el problema de los OPs, pero puede evitar que ocurran otros) ¿qué es lo que no hay que intentar?

Además medio segundo en el sleep es un poco exagerado. Mientras que el bucle debe estar bien con 10 milisegundos temporizador de sueño sin ningún golpe a su carga de cpu whatsover (bueno casi :P)

 
forexCoder:

No, no es así.

El tipo de orden declarado fuera del bucle transferirá efectivamente el valor de orderType al siguiente ciclo e incluso si se produce un error, ese valor entrará en el siguiente condicional.

Si se declara dentro del bucle con la configuración inmediata del valor de OrderType() no habrá lugar a ese error.

(tal vez no sea el problema de los OPs, pero puede evitar que ocurran otros) ¿qué es lo que no hay que intentar?

También medio segundo en el sueño es un poco exagerado. Mientras que el bucle debe estar bien con 10 milisegundos temporizador de sueño sin ningún golpe a su carga de cpu whatsover (bueno casi :P)


Sospecho que el problema es el uso de "pedir confirmación manual" al probar el EA, pero no entiendo lo que sucede exactamente.

Lo único que sé es que no hay manera de que una variable llamada OrderType interfiera con un método con el mismo nombre y además la ubicación de la declaración no tiene nada que ver con mi problema.

El problema es que OrderTicket(), OrderStoploss(), ... no están dando los datos del mismo pedido después de usar OrderSelect().

Si uso variables locales y las establezco después de la llamada a OrderSelect() funciona, pero si uso directamente OrderTicket() o OrderStoploss() da valores erróneos.


¿Por qué en mi código OrderStopLoss() devuelve el stoploss de otra orden dentro de la misma iteración del bucle "for"?

 

Aquí está el código completo del EA:

El problema está en el primer bucle "for" del método updateFbOrders().

Para probarlo, añado los indicadores alligator y fractal en un gráfico y encuentro un gráfico en el que el último fractal ascendente esté por encima de las líneas del alligator y el último fractal inferior esté por debajo de las líneas del alligator.

Entonces debería crear órdenes de compra y venta pendientes. Si hay una ruptura de uno de los fractales, abrirá una orden inmediata.

Luego modificará el stoploss de cada orden cada vez que los fractales cambien, pero establece el stoploss para la orden equivocada.

Revisa las ventanas de alerta y busca un mensaje como este Cuenta: 1 Stoploss 1.41008000 para orden de compra: 46454014 orderType: 5, y si revisas la orden 46454014, verás que en realidad es una orden de "venta".Y seguirá modificando las órdenes aunque el stoploss no cambie, esto porque toma el nivel de stoploss equivocado.
Archivos adjuntos:
 

Esto es estúpido. No estás pegando todo el código.

Tienes un

areBuyOrdersInProfitAt

que no vemos dentro, por favor pégalo. A estas alturas es muy probable que hayas cometido un error en alguna otra parte. ¿Estás utilizando la función OrderSelect en algún otro lugar?

Además, ¿dónde se establecen las variables longSL y shortSL? Por favor, pega también esa parte del código.

EDIT: lo has pegado mientras escribía, ahora estoy viendo el nuevo post.

 
forexCoder:

Esto es estúpido. No estás pegando todo el código.

Tienes un

areBuyOrdersInProfitAt

que no vemos dentro, por favor pégalo. A estas alturas es muy probable que hayas cometido un error en alguna otra parte. ¿Estás utilizando la función OrderSelect en algún otro lugar?

Además, ¿dónde se establecen las variables longSL y shortSL? Por favor, pega también esa parte del código.

EDIT: lo has pegado mientras escribía, mirando ahora el nuevo post.

Hola forexCoder

He añadido el EA al post anterior.


Pero creo que has señalado el problema: estoy utilizando OrderSelect() en el método "areBuyOrdersInProfitAt". :-)))))))))))

 

Sí, como pensaba.

El areBuyOrdersInProfitAt contiene otra función OrderSelect y sobrescribe lo que está haciendo la del snippet original. Cuando esta función areBuyOrdersInProfitAt retorna, el OrderSelect es cambiado, así como el ticket. En este caso, usted siempre debe estar recibiendo la última orden en su lista aquí.

 

Una vez que empiezas a usar OrderSelect en un bucle for, recorriendo todas las órdenes, no puedes crear otro bucle OrderSelect for dentro de él, porque cuando el segundo retorne, estarás usando la entrada de la última orden en tu pool de operaciones.

Tienes un código bastante largo ahí, así que no tengo muchas ganas de corregirlo (lo siento:P) pero ahora tienes un indicador en la dirección correcta.

 
dvarrin:

Pero creo que has señalado el problema: estoy utilizando OrderSelect() en el método "areBuyOrdersInProfitAt". :-)))))))))))

Me alegra saber que estás en camino de una solución :-)
 
RaptorUK:
Me alegra saber que estáis en camino de una solución :-)
Muchas gracias a todos. Realmente fue un error estúpido el que cometí :-((