Características del lenguaje mql5, sutilezas y técnicas

 
En este tema se hablará de formas no documentadas de trabajar con el lenguaje mql5, ejemplos de solución de ciertos problemas. Me gustaría que el contenido de esta rama estuviera más cerca de las FAQ que de la discusión. Invito a todos los programadores experimentados a compartir sus soluciones y técnicas de programación. Se agradece especialmente la cobertura de funciones no descritas en la ayuda.
 
fxsaber:

cuandose abre unaposición con éxito mediante una orden de mercado, se obtiene siempre un resultado cero.

Del BOD
No se garantiza que se llene el billete de la oferta de resultados. Que se llene o no depende del modo de ejecución del instrumento y de la configuración de un servidor concreto.
Que ha reservado un resultado no nulo.acuerdo - tomar medidas.
 
Una vez que se ha ejecutado un OrderSend, el direccionamiento de la orden, la posición o la operación correspondiente no siempre tiene éxito. Hay situaciones en las que es necesario esperar varias decenas de milisegundos para que la información comercial histórica o actual sea correcta.
 
fxsaber:
Una vez que se ha ejecutado el OrderSend, el direccionamiento de la orden, posición u operación correspondiente no siempre tiene éxito. Hay situaciones en las que es necesario esperar unas decenas de milisegundos para que la información comercial histórica o actual sea correcta.
esto también ocurre en MT4, depende del servidor específico
 
No siempre es posible conocer el precio de la orden que generó la operación
 
No siempre es posible conocer los niveles de SL/TP de una posición cerrada.

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

TakeProfit (y StopLoss) de una posición cerrada

fxsaber, 2016.07.17 20:19

Antes de la introducción de hedge TakeProfit las posiciones abiertas no se almacenaban en la bolsa en forma de órdenes limitadas, sino en el servidor de negociación de MT5. En el momento de la aceptación se enviaron a la bolsa no como órdenes limitadas al precio indicado, sino como órdenes de mercado al precio indicado.

Esta característica es muy visible en el probador cuando se activa el TP: aparece la orden de mercado apropiada (en lugar de la limitada). Dado que la toma de beneficios es un tipo de intercambio de órdenes inexistente (sólo hay órdenes de mercado y limitadas), este estado de cosas estaba bien dentro de la "comerciabilidad".

Con la aparición de la cobertura, la situación no cambió: el beneficio siguió siendo virtual. La situación es diferente en MT4: a lo largo de los años de puentes de MT4 se ha convertido en un estándar que las órdenes de toma de beneficios de MT4 sean órdenes limitadas.

Es por esta virtualidad que algunas de las características de MT5 se arrastran como un rastro. No sólo es mejor no colocar el takeprofit en MT5, sino que si quieres una contraparte limitada, no hay manera de que a través de MQL5 puedas conocer sus valores de takeprofit y stoploss después de cerrar la posición.

Esto no es una acusación indiscriminada, sino el resultado de horas tratando de averiguar (no ayuda HistorySelectByPosition y otras cosas) cómo funciona todo. Y no tengo inconveniente en disculparme si me equivoco. Para no ser infundado, estoy mostrando un Asesor Experto para el probador (es más fácil de entender) en el servidor RoboForexEU-MetaTrader 5, que abre una posición, y luego pone los niveles SL y TP.

void OnTick()
{
  static bool Flag = true;

  if (Flag)
  {
    // Открываем SELL-позицию
    MqlTradeRequest Request = {0};

    Request.action = TRADE_ACTION_DEAL;

    Request.symbol = Symbol();
    Request.volume = 1;
    Request.price = SymbolInfoDouble(Symbol(), SYMBOL_BID);

    Request.type = ORDER_TYPE_SELL;

    MqlTradeResult Result;

    if (OrderSend(Request, Result))
    {
      // Устанавливаем SL и TP
      Request.position = Result.deal;

      Request.action = TRADE_ACTION_SLTP;

      Request.tp = Result.ask - 10 * _Point;
      Request.sl = Result.ask + 10 * _Point;

      if (OrderSend(Request, Result))
        Print("Сделка в тестере закроется либо по SL, TP, либо по окончании бэктеста")    ;

      Flag = false;
    }
  }
}

En este EA, no se puede definir el SL y el TP de una sola posición cerrada (en OnDeinit). ¿Se supone que debe hacer eso?


De la cita también se deduce que el TP de una posición en MT5 es siempre una orden de mercado. No marque la contraparte del límite - ver arriba.
 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

Slawa, 2017.02.14 13:46

¿Por qué? Una sola acción es suficiente.

Mientras el símbolo sea seleccionado en la revisión del mercado y el historial del símbolo sea mantenido por el Asesor Experto, se mantendrá sincronizado. El mantenimiento por parte del Asesor Experto significa que accederá a este historial al menos una vez cada 2 minutos, por ejemplo, copiando una barra. Si el historial está sincronizado, no se gasta tiempo en copiar una barra: sólo unos pocos ciclos del procesador. O, como se acaba de decir aquí, pedir el número de barras, también algunos ciclos de reloj

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

Alexey Kozitsyn, 2017.02.14 13:47

¿Los indicadores incluyen un intervalo de 2 minutos?

Sí, y al comprobar el hecho de la sincronización, ¿también se mantendrá la sincronización?

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

Slawa, 2017.02.14 13:50

Esto también se aplica a los indicadores. Cree un temporizador de 1 minuto y pida el número de barras de todas las series temporales de interés.

La comprobación del hecho de la sincronización no mantiene la sincronización.

 
fxsaber:
Una vez que se ejecuta el OrderSend, la referencia a la orden, posición u operación correspondiente no siempre tiene éxito. Hay situaciones en las que es necesario esperar unas decenas de milisegundos para que la información comercial histórica o actual sea correcta.

No hay que esperar unos milisegundos.

El mensaje llegará en OnTradeTransaction

ver código

Archivos adjuntos:
 
prostotrader:

No hay que esperar unos milisegundos.

El mensaje llegará en OnTradeTransaction

ver código.

Los guiones no lo tienen. Es una estupidez utilizar EA+ExpertRemove en lugar del script.

Además, OrderSend se bloquea por tiempo de espera si no hay respuesta del servidor durante 180 segundos. Esto sugiere que el OnTradeTransaction puede acumularse para siempre a la espera de entradas. Y la opción de un solo order_ticket para OnTradeTransaction, como en tu script, es mala. Tras el envío asíncrono se trabaja con listas de pedidos. Por eso es asíncrono, para trabajar con lotes. Y si no hay trabajo con lotes, entonces async nunca es necesario.

 
El truco de MT4-OrderClosePrice también funciona en MT5 -PositionGetDouble(POSITION_PRICE_CURRENT).