Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1188

 
Ivan_Invanov:
En general, a juzgar por su respuesta, no entiende realmente cómo funciona el programa. Así que parece una pregunta estúpida. Al igual que el comentarista anterior piensa que se detiene. Sólo por experiencia en programación en otros lenguajes creo que ejecuta su cuerpo en un bucle, y cuando llega un evento, se sumerge en él. Si el programa ejecuta su cuerpo en un bucle, eso explica por qué el programa está escrito de esa manera.

Cuando se produce un nuevo tick, el programa se inicia en el manejador OnTick(), se ejecuta hasta su finalización y se detiene. Con la llegada de una nueva garrapata todo se repite desde el principio. Si durante la ejecución del programa llega un nuevo tick, y el programa no ha terminado de procesar el tick anterior (sigue en marcha), entonces este tick se salta.

Los programas en MQL no tienen bucle. Tienen tres puntos de entrada - OnInit(), OnDeinit() y OnTick().

Al inicio, se ejecuta OnInit(), luego cuando se recibe un tick - OnTick(), cuando se termina la operación - OnDeinit().

También hay otros manipuladores. Pero es mejor que abras la ayuda en lugar de pedir a alguien que lo duplique aquí.

Документация по MQL5: Программы MQL5
Документация по MQL5: Программы MQL5
  • www.mql5.com
Для того чтобы mql5-программа могла работать, она должна быть скомпилирована (кнопка "Компилировать" или клавиша F7). Компиляция должна пройти без ошибок (допускаются предупреждения, которые необходимо проанализировать). При этом в соответствующей директории Эксперты, пользовательские индикаторы и скрипты прикрепляются к одному из открытых...
 

Hola. Mientras trabajaba en mi indicador encontré un error al reiniciar el terminal. Sobre la base de este error hice un pequeño código fuente para su prueba:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

class Loader {
private:
  string symbol;
  ENUM_TIMEFRAMES timeframe;

public:  
  Loader(): symbol(Symbol()), timeframe(Period()) 
  {
    Print(__FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString(timeframe));
    ResetLastError();
    Print(__FUNCTION__ + " bars: " + (string)iBars(symbol, timeframe)); // Данный вызов iBars() даёт 0 при перезапуске терминала
    Print(__FUNCTION__ + " Error: " + (string)GetLastError());
    Print(__FUNCTION__ + " bars (2): " + (string)iBars(Symbol(), Period())); // Этот же вызов iBars() работает нормально
  }
};

Loader * loader;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
  loader = new Loader();
//---
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
  delete loader;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]
) {
  return(rates_total);
}

Si este ejemplo se lanza sobre un gráfico (o es el primer arranque del terminal tras el inicio del sistema) todo funciona bien. En el registro dice lo siguiente:

2020.06.24 21:05:50.773 Loader::Loader symbol: EURUSD timeframe: PERIOD_H1

2020.06.24 21:05:50.773 Loader::Loader bars: 140433

2020.06.24 21:05:50.773 Loader::Loader Error: 0

2020.06.24 21:05:50.773 Loader::Barras de carga (2): 140433


Pero si reinicio el terminal con este indicador me da error:

2020.06.24 21:07:34.963 Loader::Loader símbolo: EURUSD timeframe: PERIOD_H1

2020.06.24 21:07:34.963 Loader::Barras de carga: 0

2020.06.24 21:07:34.963 Loader::Loader Error: 4401

2020.06.24 21:07:34.964 Loader::Barras de carga (2): 140433

Símbolo y marco temporal inicializados ok

2020.06.24 21:07:34.963 Loader::Loader símbolo: EURUSD timeframe: PERIOD_H1

Pero iBars(symbol, timeframe) da 0 por alguna razón

2020.06.24 21:07:34.963 Loader::Barras de carga: 0

En este caso aparece el error 4401.

Pero iBars(Symbol(), Period()) funciona bien.

2020.06.24 21:07:34.964 Loader::Barras de carga (2): 140433

Al menos symbol = Symbol() y timeframe = Period() según los mensajes de registro (incluso durante el lag, cuando el terminal se reinicia). ¿Cómo es posible que iBars(symbol, timeframe), con símbolo y timeframe absolutamente correctos, dé cero, mientras que iBars(Symbol(), Period()) funciona bien, si los parámetros de las funciones son los mismos, según el registro?

Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
  • www.metatrader5.com
По завершении установки в меню "Пуск" создается группа программ торговой платформы, а на рабочем столе дополнительно помещается ярлык программы. Используйте их для запуска. Нельзя запускать одновременно две копии платформы из одной директории. Чтобы одновременно запустить несколько копий, установите соответствующее количество программ в разные...
Archivos adjuntos:
Test.mq5  7 kb
 
¿Quién conoce al moderador de este hilo?
 

¿Cómo abro una cuenta demo de MT4 en MetaQuotes Demo? Antes funcionaba sin problemas, ahora en la última página del diálogo dice: Registro, Espere un poco, por favor, y en este estado permanece inactivo indefinidamente, los campos con el login y la contraseña permanecen vacíos. No hay mensajes en el registro. He probado tanto la "demo" como la "real" y diferentes tipos de cuentas.

UPD Probé con un broker demo - lo mismo.

 
Artyom Trishkin:

Cuando se produce un evento de "nuevo tick", el programa se inicia en el manejador OnTick(), se ejecuta hasta su finalización y se detiene. Con la llegada de una nueva garrapata todo se repite desde el principio. Si durante la ejecución del programa llega un nuevo tick, y el programa no ha terminado de procesar el tick anterior (sigue en marcha), entonces este tick se salta.

Los programas en MQL no tienen bucle. Tienen tres puntos de entrada - OnInit(), OnDeinit() y OnTick().

Al inicio, se ejecuta OnInit(), luego cuando se recibe un tick - OnTick(), cuando se termina la operación - OnDeinit().

También hay otros manipuladores. Pero es mejor que abras la ayuda en lugar de pedir a alguien que lo duplique aquí.

Gracias. Sí lo entiendo, es que la función está escrita en el cuerpo del programa. Tal vez no me di cuenta de que se llamaba en alguna parte.
 
Ivan_Invanov:
Gracias. Sí lo entiendo, es que la función está escrita en el cuerpo del programa. Tal vez no me di cuenta de que se llamaba en alguna parte.

¿Cómo podemos ver de qué está hablando? Danos un ejemplo.

 
Artyom Trishkin:

¿Cómo podemos ver de qué está hablando? Danos un ejemplo.

Gracias de nuevo, sí, no me fijé en la llamada, lo he buscado ahora , y la llama la función que abre las operaciones.
 
Ivan_Invanov:
Gracias. Sí, lo entiendo, es que la función está escrita en el cuerpo del programa. Tal vez se me haya escapado una convocatoria en alguna parte.

En mql4 las funciones se escriben en cualquier orden, arriba abajo no importa, puede parecer que funciona antes o después. No hay tal cosa en C++ donde todas las funciones pueden trabajar sólo en orden de escritura y si quieres llamarlo, debe ser definido antes del lugar de la llamada de lo contrario el programa se bloquea. El hombre me mostró cómo escribir funciones en diferente orden pero no recuerdo cómo hacerlo en C++.

 
Ivan_Invanov:

Saludos. Por favor, ayúdenme. Tengo esta pregunta. ¿Lo he entendido bien? El programa se ejecuta desde el principio hasta el final, pero se detiene cuando se produce un evento, por ejemplo, un tick, la función ontick comienza a ejecutarse, luego termina su ejecución y el programa se vuelve a ejecutar desde el principio? Esta pregunta está relacionada con lo siguiente, ¿dónde escribo, por ejemplo, el tamaño del lote de negociación, en el cuerpo del programa o en la función ontick?

Miro el bot oficial, que es un ejemplo en el terminal, hay mucho cálculo se realiza en el cuerpo del programa, y no entiendo por qué así.

Mi lote se calcula así

#property link      "http://www.mql5.com"
input double CheckLots = 0.01;
input int    Persent   = 5;
   double Lots=NormalizeDouble(AccountBalance()*CheckLots/1000-0.005,2);  

está al principio del Asesor Experto... y lo pongo al final del código

Cuando la función OnTick llama a la variable Lots, entonces EA la encuentra y la recalcula.

 

@Artyom Trishkin

¿Eres moderador en este hilo?