Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 843

 
artmedia70:
Para cerrar una posición con un ticket, primero hay que saber el número exacto del ticket de la posición a cerrar. A continuación, debe seleccionar el pedido mediante la función OrderSelect(ticket,SELECT_BY_TICKET), con la verificación de la selección correcta. A continuación, debemos comprobar la hora de cierre de la orden seleccionada con éxito. ¿Por qué? Porque cuando seleccionamos por ticket, el parámetro pool de la función OrderSelect(..., ..., pool) se ignora (sólo se utiliza cuando seleccionamos por índice). Y esto significa que aunque hayamos seleccionado con éxito una orden, todavía tenemos que saber en qué lista la hemos elegido: la lista de posiciones cerradas o abiertas. Es la comprobación de la hora de cierre la que nos permite saber "si la orden sigue en el mercado". Si la hora de cierre es igual a cero, la orden sigue en el mercado. Si la hora es diferente de cero, la orden ya se ha cerrado antes. Y después de todo este procedimiento, podemos enviar una orden para cerrar esa orden.

Tengo un gráfico delante. Veo que hay una orden abierta en él. Decido cerrarla. eso es todo. no se necesita nada más.

(Lo pregunto porque. Puedo cerrar con una cruz "one-click trade", pero me siento muy cómodo con las teclas de acceso rápido)

 
evillive:

int OrdersTotal(); - devuelve un número, no verdadero-falso, eso es lo que está mal. Si no hay órdenes, significa 0, y si hay órdenes, no es sólo 1.

Y no hay órdenes cerradas sólo en una cuenta recién abierta en la que aún no hemos operado. De nuevo, este es un uso incorrecto de la función.

¿Y por qué RefreshRates(); DESPUÉS de que la orden haya sido enviada al servidor? Es como pagar algo primero y luego preguntar "¿cuánto cuesta?

Gracias, lo tengo.
 
evillive:

int OrdersTotal(); - devuelve un número, no verdadero-falso, eso es lo que está mal. Si no hay órdenes, significa 0, y si hay órdenes, no es sólo 1.

Y no hay órdenes cerradas sólo en una cuenta recién abierta en la que aún no hemos operado. De nuevo, esto es una aplicación errónea de la función.

Pero, ¿por qué debería RefreshRates(); DESPUÉS de que la orden haya sido enviada al servidor? Es como pagar algo y luego preguntar "¿cuánto cuesta?

Una vez escuché la expresión "El nombre de la capital rusa comete dos errores" y me quedé sorprendido. ¿Dónde podrían encontrarse allí? Entonces me di cuenta de que se pueden cometer dos errores.

Lo que quiero decir es que también hay más de un error en la línea de código que estamos discutiendo.

if (!OrdersTotal()==true)

if(negación -> expresión == verdadero) Por supuesto podemos entender, como explica Artem, si 0 entonces falso todo lo demás es verdadero Entonces resulta que si negamos que hay órdenes abiertas entonces... oops... es más fácil escribir Moscú con dos errores.

 
Escapee:

Tengo un gráfico delante. Veo que hay una orden abierta en él. Decido cerrarla. eso es todo. no se necesita nada más.

(Lo pregunto porque. Puedo cerrarlo con una cruz de "comercio de un solo clic", pero me resulta muy cómodo utilizar las teclas de acceso rápido)

Aquí te cuento cómo hacerlo programáticamente bien.

1. Tienes un gráfico delante de ti con una orden. Puedes ver su número de billete, y el programa? El programa necesita conocer este número.

2. Quieres cerrarlo. Por lo tanto, puede ver que el pedido con dicho billete está abierto. ¿Y el programa? El programa no lo sabe. Por lo tanto, el programa necesita saber si el pedido con dicho ticket está abierto o no.

3. Puedes hacer clic en la cruz, y eso es todo. Y el programa tiene que dar una orden.

Por lo tanto, la conclusión es la siguiente:

1. Averiguamos si hay un puesto vacante

2. Si es así, buscamos el billete de la orden requerida

3. Seleccionamos el orden en función del billete encontrado. Si lo hemos seleccionado con éxito, entonces...

4. Compruebe la hora de cierre de la orden seleccionada por el ticket. Si el tiempo de cierre es igual a cero, entonces...

5. Lo cerramos.

 

Yo corregiría su respuesta así.

artmedia70:


1. Delante de ti hay un gráfico con una orden. Puede ver su número de billete

2. Quieres cerrarlo.

3. Puedes hacer clic en la cruz y el punto...

5. Cierra eso.

 
AlexeyVik:

Yo corregiría su respuesta así.

¿Sigues bromeando?
 
artmedia70:
¿Sigues bromeando?

Sí. Es el día libre.


 
artmedia70:


es decir, ¿no es posible hacer un script de cierre similar al de apertura? Porque es tan simple...Estaba pensando...
 
Escapee:
Entonces, ¿no podemos hacer un script de cierre similar al de la orden de apertura? Porque es tan simple... estaba pensando...

La apertura de una orden tampoco es tan sencilla, no con un solo comando de envío de órdenes comerciales. Todos estos comandos necesitan ser "envueltos" en una función completa con la comprobación de los códigos de retorno del servidor de comercio y la reacción a esas respuestas. Comprobación de niveles válidos, recálculo de los mismos si se da un nivel calculado incorrecto en la orden, etc., etc.

Y el cierre - lo mismo: una función separada de búsqueda de la orden correcta, que llama a una función completa de cierre, en lugar de sólo una línea de código con el envío de una orden al servidor.

 
artmedia70:

La apertura de una orden tampoco es tan sencilla, no con un solo comando de envío de órdenes comerciales. Todos estos comandos necesitan ser "envueltos" en una función completa con la comprobación de los códigos de retorno del servidor de comercio y la reacción a esas respuestas. Comprobar los niveles válidos, recalcularlos si se da un nivel calculado incorrecto en la orden, etc, etc.

Espera... por fin entiendo lo que necesito...

Aquí está la apertura de la orden que necesitaba - OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0); . Y este guión funciona.

Ahora necesito cerrar......