MMA_Breakout_strategy_volume I (sin MM ni MF) - codificado por WhooDoo22 - página 4

 

Simon,

1. . . . ¿qué número de billete está seleccionando?

RE 1.: He tenido un malentendido en un uso de la función OrderSelect() en combinación con la función OrdersHistoryTotal(). Ninguna de las dos funciones tiene que ver con la otra. Entendido esto, puedo simplemente eliminar la función OrderSelect() del principio del bloque de código del primer envío de pedidos. Es innecesario (recuerde, este código fue escrito estrictamente para propósitos de prueba, no para correr en demo o en vivo. Obviamente, eventualmente debe ser corregido para que pueda ser usado en cuentas demo y reales).

Además, creo que entiendo tu punto repetitivo, "comprobar los valores de retorno con la función GetLastError()". LO PILLÉ. Ja, ja :)

2. Si entendiste OrderHistoryTotal()...

RE 2.: Entiendo el propósito de las funciones OrdersHistoryTotal(). Tenía un concepto erróneo del uso de la función OrderSelect() en combinación con la función OrdersHistoryTotal().

3. Si entendiera cómo funcionan las llaves { } ...

RE 3.: Creo que sí entiendo el uso correcto de las llaves. También entiendo que las llaves pueden ser innecesarias en este caso.

if(OrderType()==OP_BUY)  
   OrderModify(ticket,0,OrderOpenPrice()-5000*Point,0,0,Blue);

Decidí usar llaves innecesarias para asegurar que cada expresión del bloque de código aislara sus llamadas de función a cada bloque de código específico que se utilizara. Algo muy ordenado, no quiero que los bloques de código del EA se salten accidentalmente sus llamadas a funciones debido a la falta de llaves.

4. Usar la variable i como número de billete:

RE 4.: Me sorprende un poco que no entiendas mi interpretación de usar la variable i como un número de ticket ficticio, no como un número de ticket. La variable i es simplemente un dígito que se añade cada vez que se ejecuta la función OrderClose(). La variable i no está definida como un número de ticket real. Se trata de un cierre parcial del pedido. Esta es la única forma que conozco para realizar esta tarea. Estaría abierto a una solución diferente. ¿Tiene una solución mejor? :) Creo que podría haber otra manera, pero por ahora, no veo una razón para cambiar el proceso que se está utilizando. De nuevo, estoy abierto a ideas productivas.

5. . . . si el OrderSend() falla elticket será = -1:

RE 5.: Por favor, sea específico en cuanto a qué función Order Send() se refiere (ya sea el "rodillo de la bola", el primer envío de la orden O el envío de la orden dentro de las llamadas de la función de cierre de la orden) Esta aclaración guiaría nuestros pensamientos hacia la misma dirección y fortalecería la comunicación entre ambos miembros de esta discusión.

1. ¿Por qué fallaría el primer o el segundo envío de orden (corrija esto, por favor)? (¿quizás por un mal uso de la función OrderSelect() y OrdersHistory...()? Esto será corregido).

2. Si el envío de la orden falló, ¿por qué la variable del ticket representa -1? Creo que si el envío de la orden falló, la variable del ticket seguiría representando 0 y no -1. Por favor, explíquelo.

Gracias.

 
WhooDoo22:

Simon,

RE 5.: Por favor, especifica a qué función OrderSend() te refieres (ya sea el "rodillo de bolas", el primer envío de la orden O los envíos de la orden dentro de las llamadas a la función de cierre de la orden) Esta aclaración guiaría nuestros pensamientos hacia la misma dirección y reforzaría la comunicación entre ambos miembros de esta discusión.

1. ¿Por qué fallaría el envío de la primera o segunda orden (corrige esto plz)? (¿quizás por un mal uso de la función OrderSelect() y OrdersHistory...()? Esto será corregido).

2. Si el envío de la orden falló, ¿por qué la variable del ticket representa -1? Creo que si el envío de la orden falló, la variable del ticket seguiría representando 0 y no -1. Por favor, explíquelo.

Gracias.

Si OrderSend() falla, por cualquier razón... ."Devuelve el número del ticket asignado a la orden por el servidor de comercio o -1 si falla", tomado de la documentación. Usted utiliza la variable ticket para retener el valor devuelto . . así que si el OrderSend() falla ( por cualquier razón ) su número de ticket es ahora -1 . . . no comprueba, sólo espera lo mejor y usa lo que obtiene . . .


Estás usando la variablei como número de ticket . . . en este código . . .

OrderClose(i, 0.01, Ask, 30, CLR_NONE);

... de la documentación de OrderClose() la primera variable en la llamada a la función es un int...ticket - Número único del ticket del pedido. Así que supongamos que usted acaba de cerrar el ticket número34282694 ¿qué le hace pensar que hacer i++; a continuación le va a ayudar de alguna manera? Tal vez podría responder a este punto en particular y explicar cómo funciona?



"No quiero que los bloques de código del EA se salten accidentalmente sus llamadas a funciones por falta de llaves." . . . accidentalmente se saltean ? ¿cómo crees que podría ocurrir ? la CPU tiene un ataque de tos o se resfría ?


OK, así que usted está diciendo que usted entiende completamente todas las cuestiones, sin embargo, en lugar de escribir el código que podría trabajar en el probador de la estrategia y también en un entorno de Live / demo que eligió específicamente para paralizar su código por escribirlo de manera que sólo funcionaría en el probador de la estrategia? esto es lo que estás diciendo?

 

Simón,

1. Si OrderSend() falla, por cualquier razón... .

RE 1.: Hipotéticamente, digamos que un pedido falla... Si lo que has dicho es cierto, entonces el recuento de entradas se resta en 1 (-1 del total de entradas). Entonces, el EA envió y cerró 25 órdenes exitosas. Llega la señal para enviar la orden y la función OrderSend() falla. ¿El recuento actual de tickets es de 24? Si es así, la variable i indicaría un recuento de tickets falso porque la variable i no restaría 1 también (-1). La variable i simplemente no aumentaría y ahora hay un recuento de tickets falso. El recuento de tickets correcto es 24 y el recuento de tickets de la variable i es 25. La función OrderSelect( ) está ahora seleccionando el número de ticket incorrecto. ¿Estamos de acuerdo? :) Así que parece que la solución obvia sería restar 1 a la variable i si la función OrderSend() falla. Uf... Me estoy secando el sudor de la frente con esto :).

2. la CPU tiene un ataque de tos o se resfría...

RE 2.: Típicamente, si tengo un virus de gripe, tiendo a omitir algunos pensamientos sensatos cuando hablo. Supuse que lo mismo se aplicaba a las CPUs :) Dejando el humor a un lado, creo que cualquier posibilidad de que se salte una llamada a una función por falta de "{ }", sería un problema sencillo de solucionar. ¿Por qué no tener más cuidado? Si realmente no existe la preocupación de que se salte una llamada a una función, entonces no veo ninguna razón por la que no se deban eliminar los corchetes.

3. OK, entonces estás diciendo...

RE 3.: Creo que entiendo las cuestiones que me has presentado hasta ahora.

4. usted eligió específicamente paralizar su código escribiéndolo de manera que sólo funcionara en el Probador de Estrategias...

RE 4.: Elegí sacrificar lo que creía que tenía menos prioridad y mantener lo que creía que tenía más prioridad. Esta fue una elección hecha en base a las limitaciones de tiempo y los niveles de prioridad.

Gracias.

 
WhooDoo22:

Simón,

1. Si OrderSend() falla, por cualquier razón... .

RE 1.: Hipotéticamente, digamos que un pedido falla... Si lo que has dicho es cierto, entonces el recuento de entradas se resta en 1 (-1 del total de entradas). Entonces, el EA envió y cerró 25 órdenes exitosas. Llega la señal para enviar la orden y la función OrderSend() falla. ¿El recuento actual de tickets es de 24? Si es así, la variable i indicaría un recuento de tickets falso porque la variable i no restaría 1 también (-1). La variable i simplemente no aumentaría y ahora hay un recuento de tickets falso. El recuento de tickets correcto es 24 y el recuento de tickets de la variable i es 25. La función OrderSelect() está ahora seleccionando el número de ticket incorrecto. ¿Estamos de acuerdo? :) Así que parece que la solución obvia sería restar 1 a la variable i si la función OrderSend() falla. Uf... Me estoy secando el sudor de la frente con esto :).

Si lo que he dicho es cierto... lee la documentación por ti mismo, te he dado un enlace, haz clic en él y lee...

Usted está totalmente malinterpretando cómo funciona... lo siento pero es así. Los números de ticket sólo se ejecutan secuencialmente en el Probador de Estrategias... el conteo de tickets no se resta... la variable que está utilizando para mantener el número de ticket = -1 nunca se resta la variable ticket de nada en su código... . .

"Llega la señal para enviar el pedido y la función OrderSend() falla.¿Es el número actual de tickets 24?" No, la variableticket contiene el número -1, no 25 ni 24, contiene -1 por lo que cualquier llamada OrderSelect(ticket, . . .) que le siga fallará porque no hay ningún pedido con el número de ticket -1, es un número de ticket inválido. . . luego cualquier llamada a OrderType() también fallará porque OrderSelect() falló. . . . y luego OrderModify(ticket, . . .) también falla. . .

Como usted ha dicho que entiende todos estos problemas, pero decidió ignorarlos y enviar este código a la base de código . . . supongo que no necesito perder más tiempo tratando de explicar nada de esto, ya que usted ya tiene un buen manejo en él. Lo siento por las molestias, no voy a tomar más de su tiempo tratando de ayudar.

 

Simón,

Voy a leer la documentación como usted pidió.

1. la variable que estás usando para mantener el número de ticket = -1

RE 1.: ¿Qué variable estás señalando? ¿Variable i O variable ticket?

2. la variable que está utilizando para mantener el número de ticket = -1

RE 2: ¿Se puede decir también que "cuando un envío de pedido falla, el número de ticket es menos uno (-1)?"

si este es el caso, si el EA envió y cerró 24 órdenes con éxito y falló en el envío de la 25ª orden, el número de ticket actual es menos uno (-1). ¿Correcto? :)

Obviamente cualquier bloque de código que contenga la función OrderSelect() fallará debido al error "número de ticket inválido". Creo que el número de error es el 4108, tal y como has escrito anteriormente, y la documentación también lo indica.

No escribí "entiendo todos estos problemas". Escribí: "Creo que entiendo las cuestiones que me has presentado hasta ahora".

3. "Como has dicho que entiendes todas estas cuestiones pero has elegido ignorarlas y presentar este código al codebasee... supongo que no necesito perder más tiempo tratando de explicar nada de esto ya que ya lo tienes bien controlado. Perdona las molestias, no te quitaré más tiempo tratando de ayudar".

RE 3: No estoy ignorando estas cuestiones actualmente. Mi discusión con usted lo demuestra. Me interesan todos los puntos que has planteado y sigues planteando. Además, respeto tu conocimiento de la documentación de MQL4 y aprecio tu deseo de ayudar. No ha pasado desapercibido y le agradezco por esto.

Gracias.

 

Hola a todos,

En este código me doy cuenta de que no puedo cambiar ninguno de los precios de los lotes....por qué es eso...

todo el tiempo que estuve tratando de hacer esto me dio un error....

Gracias...y esperando tu respuesta....

Muy buen trabajo WhooDoo22!!!! ;)