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

 
En este tema se discutirán formas no documentadas de trabajar con el lenguaje mql4, ejemplos de solución de ciertos problemas. Sería deseable que esta rama estuviera más cerca en su contenido de las FAQ, que de la discusión. Sugiero que todos los programadores experimentados compartan sus soluciones y técnicas de programación, especialmente la cobertura de las características no descritas en la ayuda.
 
Bueno, déjame empezar primero.

Para cerrar una orden, no es necesario definir el tipo de orden y el precio correspondiente a ese tipo. Es suficiente con escribir OrderClosePrice()

/********************Script program start function********************/
void OnStart()
{
   int i, total = OrdersTotal()-1;
    for(i = total; i >= 0; i--)
     {
      if(OrderType() < OP_SELLSTOP)
       {
        if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100))
        printf("***********");
       }
     }
}/********************************************************************/
 

Hay muchas más inexactitudes en la ayuda. Por ejemplo,SetIndexBuffer(). ¿Qué es lo que falla en la ayuda?

"Parámetros

índice

[in] Número de la memoria intermedia del indicador. La numeración empieza por 0. El número debe ser menor que el valor declarado en la #propiedad indicator_buffers". (esta afirmación no es cierta)

La #propiedad indicator_buffers especifica el número de buffers a mostrar. Quizás lo que la ayuda quiere decir, aunque no lo he comprobado, es que, los buffers utilizados para el cálculo no necesitan que se les dé un número con SetIndexBuffer(). Pero lo que he comprobado es que si al buffer utilizado para el cálculo se le da un número con SetIndexBuffer(), su valor puede ser recuperado mediante iCustom().

 
No lo entiendo.
 

Ya que los desarrolladores están visitando el hilo - hay una pregunta sobre "sutilezas y trucos":

Ejemplo de impresión con formato: PrintFormat("Oferta=%.5f", Oferta)

Pregunta: ¿hay alguna manera, en lugar de una precisión fija (aquí5), de especificar una condición en la descripción del formato para que la precisión dependa de _Digits? Para prescindir de un "preprocesamiento" como PrintFormat("Oferta=%s", DoubleToString(Oferta, _Digits))

 

En MQL4 el mismo código puede dar diferentes resultados dependiendo del estado de #property strict. Y esto es cuando la compilación tiene éxito en ambos casos. Así que si la ejecución es "ramplona", se puede buscar la causa en el lugar equivocado (estricto) durante mucho tiempo.

 
Alexander Puzanov:

Pregunta: en lugar de una precisión fija (aquí5), ¿es posible especificar una condición en la descripción del formato para que la precisión dependa de _Digits?

No, los ejemplos están disponibles en https://www.mql5.com/ru/docs/common/printformat
Документация по MQL5: Общие функции / PrintFormat
Документация по MQL5: Общие функции / PrintFormat
  • www.mql5.com
Общие функции / PrintFormat - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Описание проблемы

Estoy escribiendo un indicador en MQL4. Me enfrenté a una característica no documentada del estilo DRAW_HISTOGRAM.

Para mostrar los valores en el gráfico, necesito dos buffers: para el valor superior del histograma y para el inferior. Al mapear los buffers de la matriz de indicadores, si los buffers del estilo tendrán los valores 0 y 1, 2 y 3, 4 y 5, etc. todo se muestra normalmente. Sin embargo, si a los buffers de estilo se les asignan valores que empiezan por OTROS, es decir, 1 y 2, 3 y 4, 5 y 6, las líneas del histograma no se mostrarán correctamente en el gráfico, aunque los valores en la ventana de datos serán correctos.

Por favor, añada una mención a esta peculiaridad en la documentación, o corríjala, ya que no siempre se da el caso de que la descripción del estilo DRAW_HISTOGRAM comience con un buffer par.

De la SD.
 

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

Bichos, errores, preguntas

-Aleks-, 2017.02.07 18:21

Puede usted aconsejarme por favor, si en MT4 Expert Advisor, si el indicador de usuario con más de un búfer gráfico se llama constantemente, entonces el recálculo ocurre en cada llamada o todos los búferes se calculan a la vez y se puede hacer referencia al indicador en el código muchas veces y no esperar que haya un desperdicio de recursos. También me interesa saber qué pasará si el código no se completa (se ejecuta más de un tick), pero el valor del indicador cambia.


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

Bichos, errores, preguntas

Slawa, 2017.02.08 08:20

Todos los topes se calculan a la vez. Interrogar tranquilamente los valores del indicador - no habrá recálculo

En MT4 el indicador llamado desde el Asesor Experto trabaja en el flujo de este EA y sobre una copia de sus datos históricos. Puede hacer un bucle con el Asesor Experto, pero al mismo tiempo recibirá los datos del indicador calculados en el momento de la llamada OnTick. Hasta que llame a RefreshRates. RefreshRates actualiza los datos históricos del Asesor Experto, después todos sus datos serán recalculados en la primera llamada del indicador

 
Alexey Viktorov:
Para cerrar una orden, no es necesario especificar el tipo de orden y el precio correspondiente a este tipo. Basta con escribir cerrar al precio OrderClosePrice()

El OrderClosePrice sólo puede utilizarse inmediatamente después del OrderSelect correspondiente. Porque OrderSelect copia los datos de las funciones Order(const)-una vez, y el mismo RefreshRates no es capaz de actualizarlos.

Es decir, si, por ejemplo, OrderClosePrice falla en el cierre, entonces el OrderSelect debe hacerse de nuevo antes del siguiente intento (RefreshRates no es necesario).

ZS ¡Este hilo es de 2005! Aquí están los argumentos detallados de los desarrolladores.

 
Rashid Umarov:
No, hay ejemplos en https://www.mql5.com/ru/docs/common/printformat

Es una pena...

---

Para que el puesto no sea inútil:

en lugar de StringGetCharacter("a", 0) se puede escribir sólo 'a'- a menudo se necesita cuando se analizan las cadenas en partes con StringSplit