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

 
neverness:

Te dije directamente que no deberías enseñar a los demás cuando tú mismo no tienes ni idea.

La ayuda debe ser "cualificada", no "de la calle".

Describa de nuevo el problema, lo que se necesita.

 
Vitaly Muzichenko:

Vuelva a describir la tarea, lo que se necesita exactamente.

Estoy interesado en poder transferir datos en MT4/MT5 entre diferentes módulos.

Por ejemplo:

¿Cómo transferir datos de un indicador a otro?

¿Cómo transferir los datos de un indicador a un script?

¿Cómo transferir los datos del indicador al Asesor Experto? etc. ... y así sucesivamente.

La simple adición de los datos transferidos a un archivo separado y luego la lectura de estos datos desde el archivo en otros módulos es una forma bastante obvia y común de transferirlos.

Pero en este caso hay un problema de sincronización de los datos transferidos/leídos.

Intuitivamente, supongo que el terminal MT4/MT5 debe tener una determinada zona de memoria intermedia compartida y deben existir procedimientos que regulen el intercambio de datos a través de esta zona.

Pero no encontré nada de eso en la descripción.

 
neverness:

Estoy interesado en el procedimiento de transferencia de MT4/MT5 entre diferentes módulos.

Por ejemplo:

¿Cómo transferir datos de un indicador a otro?

¿Cómo transferir datos de un indicador a un script?

¿Cómo transferir los datos del indicador al Asesor Experto? etc. ... y así sucesivamente.

La simple adición de los datos transferidos a un archivo separado y luego la lectura de estos datos desde el archivo en otros módulos es una forma bastante obvia y común de transferirlos.

Pero en este caso hay un problema de sincronización de los datos transferidos/leídos.

Intuitivamente, supongo que el terminal MT4/MT5 debe tener una determinada zona de memoria intermedia compartida y deben existir algunos procedimientos que regulen el intercambio de datos a través de esta zona.

Pero no encontré nada de ese tipo en la descripción.

Pues bien, la transferencia de datos puede realizarse a través de un archivo o de una variable global del terminal.

Si es una variable global:

// записываем значение, помещаем это всё в OnTick()
GlobalVariableSet("Sname", 123.25);

// Получаем в любой программе эти значения, так-же внутри OnTick()
GlobalVariableGet("Sname"); // получим 123.25

Esta es la forma más fácil de intercambiar entre todos los programas en un terminal

 
Vitaly Muzichenko:

Pues bien, la transferencia de datos puede ser a través de un fichero, o de una variable global del terminal, como se ha escrito antes

Si es una variable global:

Esta es la forma más fácil de intercambiar entre todos los programas en un terminal

Bien. Escribamos en el indicador una expresión:

GlobalVariableSet("Sname", 123.25); Este evento se produce, por ejemplo, onTick().

Pero los scripts no trabajan con arrays de datos, y no tienen el evento OnTick(). Cómo sabe el script que el evento OnTick() ha ocurrido y debe aplicar el procedimiento para obtener nuevos datos

GlobalVariableGet("Nombre");

Puede utilizar el evento OnTimer() en lugar de OnTick(). Pero el script tiene su propio OnTimer(), mientras que el indicador tiene el suyo propio, por lo que no están relacionados entre sí.

Este es el problema:

¿Cómo garantizar que los eventosGlobalVariableSet("Nombre", 123.25); y GlobalVariableGet("Nombre"); sean sincrónicos?

¿O hay algún procedimiento que controle el cambio del valor de "Sname"? Como OnChange.

Es decir, ¿cómo sabe el script que el indicador ha cambiado el valor de "Sname", y este valor se ha convertido en 125,35?

¿Dónde está el puente entreGlobalVariableSet("Nombre", 123.25); y GlobalVariableGet("Nombre"); ?

Están en programas diferentes.


 
neverness:

DE ACUERDO. Escribamos una expresión en el indicador:

GlobalVariableSet("Sname", 123.25); Este evento ocurre, por ejemplo, cuando OnTick().

Pero los scripts no trabajan con arrays de datos, y no tienen el evento OnTick(). Cómo sabe el script que el evento OnTick() ha ocurrido y debe aplicar el procedimiento para obtener nuevos datos

GlobalVariableGet("Nombre");

Puede utilizar el evento OnTimer() en lugar de OnTick(). Pero el script tiene su propio OnTimer(), mientras que el indicador tiene el suyo propio, por lo que no están relacionados entre sí.

Este es el problema:

¿Cómo asegurar que los eventosGlobalVariableSet("Nombre", 123.25); y GlobalVariableGet("Nombre"); sean sincrónicos?

¿O existe algún procedimiento que controle el cambio del valor de "Sname"? Como OnChange.

Es decir, ¿cómo sabe el script que el indicador ha cambiado el valor de "Sname", y este valor se ha convertido en 125,35?

¿Dónde está el puente entreGlobalVariableSet("Nombre", 123.25); y GlobalVariableGet("Nombre"); ?

Están en programas diferentes.

El enlace de conexión es un disco duro de ordenador. Record Creo que el problema no es, y se puede obtener en cualquier caso, incluso en la secuencia de comandos, no difiere de cómo se obtiene el valor actual ASK y BID


P.D. Adjunto un indicador y un script de ejemplo, en el indicador registramos los volúmenes de los ticks

Indicador

//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  ArraySetAsSeries(tick_volume,true);
  
  // записываем значение
   GlobalVariableSet("Sname", tick_volume[0]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Guión

//+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    Alert(GlobalVariableGet("Sname"));
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
Set.mq5  4 kb
Get.mq5  1 kb
 
Vitaly Muzichenko:

El nexo de unión es el disco duro del ordenador. Creo que no será un problema escribirlo, pero puedes obtenerlo de cualquier evento, incluso en un script, no es diferente de cómo obtienes los valores actuales de ASK y BID

¡Genial!

¿Y cómo hacerlo?

Dame un ejemplo.

Por ejemplo, cómo simular un caso así.

El indicador recibe los datos, calcula la varianza de los datos y prepara las coordenadas de los puntos de la elipse para el script (4 variables globales Q1,Q2,T1,T2 que se pasarán al script).

Ahora el indicador debe dar una orden al script que dibujará una elipse utilizando estas variables globales.

¿Cómo puede hacerlo el indicador?

 
Vitaly Muzichenko:

El nexo de unión es el disco duro del ordenador. Creo que no será un problema para grabar, pero se puede obtener de cualquier evento incluso en el script, no difiere de cómo se obtienen los valores actuales de ASK y BID


P.D. Adjunto un indicador y un script de ejemplo, en el indicador registramos los volúmenes de los ticks

Indicador

El guión

En tu ejemplo, el script funciona sólo una vez - al inicio, es decir, cuando se produce el evento OnStart().

¿Y luego cómo?

¿Dónde está la sincronización?

¿Cómo hacer que el script funcione de forma sincronizada con el indicador?

Por ejemplo, ¿cómo activar el script cuando los volúmenes superan un determinado valor?

 
neverness:

Por lo tanto, en su ejemplo, el script funciona sólo una vez - en el inicio, es decir, cuando se produce el evento OnStart().

¿Y luego cómo?

¿Dónde está la sincronización?

¿Cómo se hace para que el script funcione de forma sincronizada con el indicador?

Por ejemplo, ¿cómo activar el script cuando los volúmenes superan un determinado valor?

Es su tarea cómo trabajar con el script. ¿No sería más fácil crear un Asesor Experto en lugar de un script?

Un indicador que da valores:

//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   return(INIT_SUCCEEDED);

  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  ArraySetAsSeries(time,true);
  ArraySetAsSeries(tick_volume,true);

  // записываем нужные значение
   GlobalVariableSet("Q1", tick_volume[0]);
   GlobalVariableSet("Q2", tick_volume[1]);
   GlobalVariableSet("T1", time[0]);
   GlobalVariableSet("T2", time[1]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Un ejemplo sencillo de un script en bucle:

//+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   while(!IsStopped())
    {
     double Q1 = GlobalVariableGet("Q1");
     double Q2 = GlobalVariableGet("Q2");
     datetime T1 = (datetime)GlobalVariableGet("T1");
     datetime T2 = (datetime)GlobalVariableGet("T2");
     Print("Q1 = ",Q1,", Q2 = ",Q2,", T1 = ",TimeToString(T1),", T2 = ",TimeToString(T2));
     Sleep(1000); // Пауза 1 секунда
    }
  }
//+------------------------------------------------------------------+

P.D. Corregido el código.

 
Vitaly Muzichenko:

Depende de usted cómo trabajar con el guión. ¿No sería más fácil para ti crear un EA en lugar de un script?

Un indicador que da valores:


Un ejemplo sencillo de un script en bucle:

Tengo entendido que en MQL no hay posibilidad de sincronizar diferentes módulos.

Bien. Entonces, aquí hay una pregunta. ¿Qué pasa si coloco el botón en el campo y alimento el script a ese botón?

¿Existe tal posibilidad en MQL? ¿O tampoco existe tal posibilidad?

Al fin y al cabo, ¡el guión debe lanzarse de alguna manera!

 
neverness:

Tengo entendido que en MQL no hay posibilidad de sincronizar diferentes módulos.

Bien. Entonces, aquí hay una pregunta. Qué pasa si coloco el botón en el campo y alimento el script a este botón.

¿Existe tal posibilidad en MQL? ¿O tampoco existe tal posibilidad?

¡El script debe ser lanzado de alguna manera!

El tema es viejo, pero aún se puede leer, o tal vez alguien sugiera algo nuevo. No ejecuto scripts, y no trabajo con ellos en absoluto)

Как вызвать скрипт из индикатора
Как вызвать скрипт из индикатора
  • 2008.10.15
  • www.mql5.com
Подскажите можноли и как вызвать на выполнение скрипт из индикатора...
Razón de la queja: