Preguntas de OrderSend() - página 2

 
Yedelkin:
Debo haberme perdido un tema como este. ¿Dónde puedo ver la función de comprobación de pedidos de KimV?
Es para 4, pero puedes comprobarlo, puede ser útil. Puedes comprobarlo en su página web en: "bibliotecas gratuitas", ordenar la colocación de la biblioteca.
 
-Alexey-:
Es para la 4ª versión pero puedes echarle un vistazo, puede ser útil. Puedes consultarlo en su página web, en la sección "bibliotecas gratuitas", la biblioteca para hacer pedidos.

de un cuatro no funcionará. Yo uso

PositionSelect

Selecciona una posición abierta para su posterior manipulación. Devuelve true si la función se completa con éxito. Devuelve false si la función falla. Para obtener la información sobre el error, llame a la función GetLastError().

boolPositionSelect(
símbolo de cadena//nombre de la herramienta
);

Parámetros

símbolo

[Nombre del instrumento financiero.

Valor devuelto

Valor de tipo bool.

Nota

Para cada símbolo, sólo se puede abrir una posición en un momento dado, que es el resultado de una o varias operaciones. Las posiciones y las órdenes pendientes activas que también se muestran en la pestaña "Comercio" del panel "Caja de herramientas" del terminal del cliente no deben mezclarse.

La función PositionSelect() copia los datos sobre la posición al entorno del programa, y las llamadas posteriores PositionGetDouble(), PositionGetInteger() y PositionGetString() devuelven los datos previamente copiados. Esto significa que la posición en sí puede dejar de existir (o puede haber cambiado de volumen, dirección, etc.), pero los datos de esta posición pueden seguir siendo recuperados. Para garantizar la adquisición de datos de posición frescos, se recomienda llamar a la función PositionSelect() inmediatamente antes de solicitarlos.

 
sergey1294:

de un cuatrillizo no funcionará. Utilizo PositionSelect para definir la posición

Al utilizar la función PositionSelect(), es alarmante que "...devuelva false si la función falla". Es decir, se devuelve false si la función PositionSelect()falla , no sólo si no hay posición. En otras palabras, no se puede excluir la situación si la función OrderSend() devuelve true, la función PositionSelect() devuelve false, y la posición sigue abierta.
 
papaklass:
¿Analiza estas situaciones en las prealternancias de una garrapata o en diferentes garrapatas?

Bien, procederé de la siguiente manera:

Un tick es un cambio en el precio de un instrumento. La frecuencia de estos cambios es imprevisible: desde varios por segundo hasta varios por hora. En consecuencia, las funciones OrderSend() y PositionSelect() no deben depender de la actividad de los ticks. Y como es así, creo que deberíamos comprobar para evitar la duplicidad de órdenes (y analizar las situaciones correspondientes) sin relación con el comportamiento (frecuencia) de los ticks.

Así que me resulta difícil responder a la pregunta con precisión :/.

 
papaklass:

No me refería a eso cuando hice mi pregunta. El controlador de eventos OnTick() se activa cuando llega el siguiente tick. Debido a esto, estoy reformulando mi pregunta:

¿Analiza estas situaciones dentro de una sola llamada OnTick() o diferentes?

Si tras la llegada de un nuevo tick(evento de usuario) es necesario enviar una solicitud de operación al servidor, la comprobación de la ejecución exitosa de esta solicitud se realiza "dentro del procesamiento" del tick (evento) llegado. Es decir, según su terminología, "dentro de una sola llamada OnTick()". [e independientemente del número de ticks (eventos) que hayan llegado (deben haber llegado) durante este procesamiento].
 
papaklass:

Bueno, todavía no puedo obtener una respuesta en una garrapata ejecutar OrderSend() y PositionSelect()?

Quiero sugerirte que hagas estas consultas no en un tick (activando OnTick()), sino en dos ticks:

- en el primer tic

Es decir, si la solicitud responde con éxito, se establece la bandera de apertura de la posición a buy=true, y se interrumpe la ejecución de OnTick() hasta el siguiente tick (activación del operador OnTick()) retorno.

- En el segundo tick - PositionSelect().

En este caso no tiene duplicación de apertura de posiciones.

No se garantiza que la posición se abra ya en el siguiente tick. Mide el tiempo que tarda en abrirse una posición cuando se establece una orden manualmente,

Te aconsejo que muevas el control de la ejecución de la orden a OnTrade(), este evento se genera sólo como respuesta del servidor a una operación de comercio.

Aunque no me queda muy claro por qué hay 4 eventos OnTrade() por orden ?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - Документация по MQL5
 
papaklass:

Bueno, todavía no puedo obtener una respuesta en una garrapata ejecutar OrderSend() y PositionSelect()?

Según su terminología, resulta que mis funciones OrderSend() y PositionSelect() se ejecutan "en un tick".

papaklass:

...quiero sugerir que estas consultas se ejecuten no en un solo tick (activación de OnTick()), sino en dos ticks:

- en el primer tic

Es decir, si la solicitud responde con éxito, se establece la bandera para abrir la posición en buy=true, y se interrumpe la ejecución de OnTick() hasta el siguiente tick (activación de OnTick()) retorno del operador.

- En el segundo tick - PositionSelect().

En esta variante no se abrirán posiciones duplicadas.

Un poco antes escribí, que la ejecución de las funciones OrderSend() y PositionSelect() no tiene nada que ver con la llegada/no llegada de ticks. Y expliqué brevemente por qué. Por lo tanto, la comprobación "en el segundo tick - PositionSelect()" no debería salvarnos de la duplicación de órdenes en todos los casos posibles.

 
Urain:

Aunque no me queda muy claro por qué hay 4 eventos OnTrade() por orden ?

Hubo un artículo al respecto en el pasado sobre OnTrade().

Urain:

No hay garantía de que la posición se abra ya en el siguiente tick...

Eso es más o menos lo que estoy diciendo.
 
papaklass:

Bueno, todavía no puedo obtener una respuesta en una garrapata ejecutar OrderSend() y PositionSelect()?

Quiero sugerirte que hagas estas consultas no en un tick (activando OnTick()), sino en dos ticks:

- en el primer tic

Es decir, si la solicitud responde con éxito, se establece la bandera de apertura de la posición a buy=true, y se interrumpe la ejecución de OnTick() hasta el siguiente tick (activación del operador OnTick()) retorno.

- En el segundo tick - PositionSelect().

En este caso no tiene duplicación de apertura de posiciones.

No - no en una garrapata. En el primer segundo.

He aquí una simplificación:

por lo que - si no hay pausa se abrirán 2 órdenes seguidas. Pero lo puse en 3 segundos - y no me arrepiento )))) Aun así, es la apertura del orden.


void OnTimer()
{
  while(true)
  {
     zOrderSend (_Symbol,0.1,ORDER_TYPE_BUY);

     Sleep (1); 

   if (PositionSelect(_Symbol)==true) {break;} 
  }
}
 

Contabilizar las órdenes en MT5 es toda una ciencia:Manejar los eventos de negociación en el Asesor Experto utilizando la función OnTrade()

Ninguna pausa le salvará de la reapertura, siempre puede ocurrir una situación en la que la orden tardará 1 segundo más en ejecutarse.

ps: Y no te olvides de la magia.