Un subtaller para completar las FAQ (preguntas frecuentes). ¡Ayudemos a los compañeros! - página 5

 

Lo prometí, empezaré por la más sencilla)

Pregunta: ¿MQL realiza operaciones aritméticas de forma incorrecta? ¿Por qué al dividir un número entre otro el resultado es 0?

Respuesta:

Lo más probable es que hayas escrito una expresión como

c = a/b;  // (1)

declarando las variables a y b como enteros:

int a,b;

En ese caso el compilador MQL interpreta el signo de "barra" como una operación de "división de enteros". Así, aunque antes de que aparezca (1) en el código, se asigne a a y b cualquier valor, incluso no entero, la variable c seguirá conteniendo la respuesta " b cabe en el número a tantas veces entero". Esto significa que si antes de calcular (1) a era menor que b, el resultado será cero, independientemente del tipo de la variable c (puede ser doble en este ejemplo).

El error descrito es a menudo la razón del comportamiento "incorrecto" del programa en el terminal del cliente - mensaje de " división por cero " en los registros de los Asesores Expertos, no visualización de una o más líneas de indicadores en la ventana del terminal, etc.

La solución al problema:

Corregir el tipo de datos en la declaración de la variable al correspondiente a las operaciones a utilizar:

double a,b;
 
Pregunta: ¿Por qué 3 dividido por 2 es igual a 1 y no a 1,5?

Alert(3/2);

Respuesta: Los números 3 y 2 de esta expresión son enteros. Un número entero no es divisible sin un resto. Para obtener el resultado 1,5 hay que especificar que el divisor es un número de coma flotante:

Alert(3.0/2);

* * *

Pregunta: ¿Por qué la expresión no se calcula correctamente?

  double price=1.0; // Цена
  double point=0.0001; // Величина пункта
  double level=272.0; // Уровень в пунктах от цены
  double levelprice; // Значение цены уровня
   
  levelprice=price+point*level; // должно быть 1.0272
   
  if(levelprice==1.0272){
  Alert("Правильно");
  }
  else{
  Alert("Неправильно");
  }

R: Las variables de punto flotante tienen un número limitado de decimales. Por ello, los valores pueden estar ligeramente distorsionados en el proceso de cálculo. Después de calcular la expresión, antes de comparar los números en coma flotante, deben ser normalizados al nivel de precisión requerido:

  levelprice=NormalizeDouble(levelprice,4);

  if(levelprice==1.0272){
  Alert("Правильно");
  }
  else{
  Alert("Неправильно");
  }

* * *

Pregunta: ¿Cómo puedo obtener el valor de un indicador personalizado en mi Asesor Experto?

Respuesta: Para ello tenemos la función iCustom().

* * *

Pregunta: ¿Por dónde empiezo a aprender MQL4?

Respuesta: Hay una guía de ayuda muy detallada integradaen el MetaEditor (Abrir MetaEditor - Menú principal - Ver - Navegador - Diccionario).
El terminal viene con dos Asesores Expertos - Muestra MACD y Media Móvil, puede comenzar con el análisis de su código.
Además, en mql4.com hay un tutorial, un gran número de artículos y todo tipo de código.
 
P: ¿Por qué el valor es 0 aunque definitivamente no sea 0?

  double point=0.00001; // Величина пункта
  Print(point);

R: Print() y Alert() sólo muestran cuatro decimales. Si necesita más, debe convertir el número doble en cadena utilizando DoubleToStr().
Print(DoubleToStr(point,5));
 

P: El EA emite un gran número de mensajes con Print(), pero más de la mitad de los mensajes faltan en alguna parte del probador.

R: Durante las pruebas, si la frecuencia de salida es alta, una parte de los mensajes no se imprime en la pestaña "Log", pero todos los mensajes pueden verse en el archivo de registro del probador después de las pruebas. El archivo está en la carpeta tester/logs.

 
Gracias a todos, vuelvan a escribir.
Cuando llegue allí pondré un FAQ sólo por la noche.
 

Una sugerencia a los moderadores, y a los que estén dispuestos a prestar una mínima ayuda.

Estarás de acuerdo en que el foro no es suficiente para una presentación estructurada de la información, el procesamiento y la búsqueda. Veo que la única salida es crear el manual más completo de CHM, que luego se puede utilizar para crear toda una sección en el foro.

Para empezar, he creado una estructura de ayuda.
Está dividido en 3 grandes secciones .

1) CÓMO. Esta sección describe las respuestas proactivas a posibles preguntas. Por ejemplo, cómo obtener los datos del indicador, cómo cerrar todas las órdenes, etc. Además, esta sección contiene una gran base de datos sistematizada de funciones (análogos de funciones de Kim). Y lo más importante - ejemplos de TOR primitivos completados con una explicación detallada del código y comentarios. Este es un apartado muy complejo, ya que requiere una mayor sistematización de los conocimientos y del análisis. Se llenará en el último lugar.

2) POR QUÉ. esta sección describe las preguntas frecuentes de los novatos (sus ejemplos fueron muy bien demostrados por alsu y integer en este hilo)

3) DÓNDE. Esta sección es principalmente un enlace a dónde buscar o dónde encontrar algo. No lo describiré, véalo usted mismo.
Adjunto el archivo de la estructura chm lista (descarga al final del post)


1. Estructura manual


2. Demostraciones - vaya a "Dónde: Enlaces útiles -> Tutorial MQL4".

Archivos adjuntos:
mql4_4.zip  53 kb
 


El camino a seguir es el siguiente:

1. Senecesitan colaboradores autónomos para completar las subsecciones. Es decir, en esencia, necesitan preguntas bien pensadas y respuestas detalladas con una explicación pormenorizada, un conjunto de referencias cruzadas, etc. (la plantilla de post que se sugiere en la primera página del tema de las FAQ. (de acuerdo con la plantilla del puesto que se ofrece en la primera página del tema de las preguntas frecuentes).

2. Todas las preguntas creadas para una subsección son recogidas por el conservador de esa subsección (1-2 personas). Los manejan, los llevan a un estilo común y forman una referencia cruzada según el caso Esto tendrá cada subsección del propietario, y no desordenará la base de datos será un estilo y patrón de respuesta.
Por ejemplo, la sección Dónde está dividida en 4 subsecciones: Preguntas sobre el probador, el terminal, el foro y enlaces útiles . Bastaría con 1 persona para cada subsección. Se dedicarán de lleno a ordenar la base de conocimientos entrantes de los autónomos, que consideren necesarios, así como todas las sugerencias que puedan llegar de otros miembros de secciones vecinas. Y, por supuesto, ellos mismos deberían participar activamente en el llenado de la base de datos y en la creación de preguntas.

3. Como subsecciones de relleno - se transfieren al coleccionista (como yo). Es necesario reunirlos en un archivo chm y mantenerlos todos en un mismo estilo. Crear referencias cruzadas adicionales, indexar, añadir palabras clave para las consultas de búsqueda.

Las subsecciones pueden reordenarse o ampliarse a propuesta del conservador y de acuerdo con la nueva estructura con el montador.

Conclusión:
Participantes: Bienvenidos a nuestra cabaña. :) Si quieres ser comisario de una subsección y los que ya tienen algo que aportar, no duden en publicar las respuestas aquí.
Moderadores: Habrá mucho material. Por favor, no permita discusiones y mensajes distraídos y vacíos en este hilo. También será necesario borrar los mensajes de los participantes después de que el puesto se haya trasladado a la base común, para facilitar el trabajo de la sección.
Curadores: El archivo de ayuda está creado en WinCHM 4.17 (para los que lo necesiten, contacten conmigo). Requisitos para los nombres de los archivos y su ubicación:
- la estructura de las carpetas debe repetir exactamente la estructura de la ayuda
- todos los nombres de los archivos/carpetas deben darse sólo en inglés en frases significativas
- ejemplo de la base actual, que "compila" WinCHM en el archivo

Archivos adjuntos:
chm4_2.zip  19 kb
 

sergeev:

...


1) CÓMO. Esta sección describe las respuestas anticipadas a posibles preguntas. Por ejemplo, cómo obtener los datos de los indicadores, cómo cerrar todas las órdenes, etc. Esta sección también contiene una gran base de datos sistematizada de funciones (Kima, etc.). Y lo más importante - ejemplos de TOR primitivos ya hechos con una explicación detallada del código y comentarios. Este es un apartado muy complejo, ya que requiere una mayor sistematización de los conocimientos y del análisis. Se llenará en el último.

...

Alexey, todas las funciones de orden de Kim son muy cuestionables en términos de fiabilidad y precisión. ¿También remachan los EAs en ellos?

 
Integer:

Alexey, todas las funciones de orden de Kim son muy cuestionables en términos de fiabilidad y precisión. ¿También les remachan los EA?

No. Usaré el mío propio, probado de forma realista. :)

Para ser sincero, no he visto los Kim prácticamente en ningún sitio salvo en las recomendaciones de este foro. Sólo los he puesto en la descripción de la sección como ejemplo, para que sepas de qué estamos hablando. Y no estoy seguro de que kim's llegue al manual en su código. Sólo se tomará la idea y se trabajará en estilo general.

La sección CÓMO es la más seria. Debería ser manejado por un máximo de 2-3 personas, ya que todas las secciones de CÓMO son una introducción a la última sección - "Ejemplos de RPT y su implementación", que mostrará todas las opciones posibles y utilizará combinaciones de todas las funciones de la sección anterior.

 

Pregunta: ¿Cómo puedo comparar dos números reales de tipo "double"?


Respuesta:

double A;
double B;

if(NormalizeDouble(MathAbs(A-B),Digits)<0.1*Point)return(true);
else return(false);
Razón de la queja: