[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 501

 
Roman.:

"Quiero hacerlo para no obtener los mismos datos en diferentes funciones f. Calcular las mismas máscaras en 2 o más funciones f no es razonable en mi opinión. Es más fácil calcular una vez y ya está. ¿Por qué gastar recursos adicionales en esto?

Haz lo que dice la documentación y no reinventes la rueda.

¿Qué tiene que ver este ciclo?

 for(int i=1;i<=Bars;i++)
   {
      double i_maFast1 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i);      // Вычисляем быстрые скользящие..
      double i_maFast2 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i+1);    //..средние
      double i_maSlow1 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i);      // Вычисляем медленные скользящие..
      double i_maSlow2 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i+1);    //..средние
      double stochD1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i);     // Вычисляем значения сигнальной линии..
      double stochD2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i+1);   //..стохастика
      double stochK1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i);     // Вычисляем значения главной линии..
      double stochK2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i+1);   //..стохастика
   }

Repasa tú mismo los pasos, lo que ocurre al salir y lo que haces después, es un sinsentido.

Lo haces como en el tutorial - todas las señales de comercio en esta definición de los criterios de comercio - en serie (se puede envolver en diferentes funciones y luego trabajar con ellos al comprobar si estos criterios de comercio de trabajo), entonces las condiciones para su trabajo.

En cuanto al ciclo, es porque voy a comprobar la intersección de los parámetros del indicador. Todo es elemental aquí. Lo he leído y está escrito como yo creo.

En el libro de texto en todo https://book.mql4.com/ru/build/conditions todo está agrupado. Tengo el MACD y el estocástico en una función, no lo necesito.

De hecho, todos los valores de los indicadores en el enlace deben ser transferidos a las funciones apropiadas. ¿Por qué no? Esto es lógico.

 
TarasBY:
Lo que se cuenta y lo que se "dibuja" - ¡¡¡DOS GRANDES DIFERENCIAS!!! :))

Ya me estoy confundiendo un poco. Aquí hay 3 funciones, cada una de las cuales recibe una señal específica para un indicador concreto.

//+---------------------------------------------------------------------------------------+
//| Проверка пересечения скользящих средних                                               |
//+---------------------------------------------------------------------------------------+
int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)
{
      if ((i_maFast2<i_maSlow2) && (i_maFast1>i_maSlow1))             // Если быстрая скользящая пересекла медленную снизу вверх..
      return(CROSSINGTOUP);                                           //.. значит, - пересечение вверх
                                                 
      if ((i_maFast2>i_maSlow2) && (i_maFast1<i_maSlow1))             // Если быстрая скользящая средняя пересекла медленную сверху вниз..
      return(CROSSINGTODOWN);                                         //..значит, - пересечение вниз
 
   return(CROSSINGWAIT);                                              // Ожидаем пересечения
}

//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Стохастика                                                       |
//+---------------------------------------------------------------------------------------+
int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)
{
      if((stochD2<stochK2) && (stochD1>stochK1))                     // Если сигнальная линия пересекла главную снизу вверх..
      return(CROSSINGTOUP);                                          //..значит, - пересечение вверх
      if((stochD2>stochK2) && (stochD1<stochK1))                     // Если сигнальная линия пересекла главную сверху вниз..
      return(CROSSINGTODOWN);                                        // ..значит, - пересечение вниз
   return(CROSSINGWAIT);                                             // Ожидаем пересечения
}

//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Моментума                                                        |
//+---------------------------------------------------------------------------------------+
void GetMomentumSignal()
{
   double momentum = iMomentum(Symbol(),i_TF,i_momPeriod,0,0);
}

Esta función recibe la señal general de todos los índices y toma la decisión de COMPRA o VENTA.

//+---------------------------------------------------------------------------------------+
//| Получение общего сигнала для входа в рынок                                            |
//+---------------------------------------------------------------------------------------+
int GetSignal()
{
   for(int i=1;i<=Bars;i++)
   {
      double i_maFast1 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i);      // Вычисляем быстрые скользящие..
      double i_maFast2 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i+1);    //..средние
      double i_maSlow1 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i);      // Вычисляем медленные скользящие..
      double i_maSlow2 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i+1);    //..средние
      double stochD1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i);     // Вычисляем значения сигнальной линии..
      double stochD2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i+1);   //..стохастика
      double stochK1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i);     // Вычисляем значения главной линии..
      double stochK2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i+1);   //..стохастика
   }
      if( GetCrossingMa(i_maFast1, i_maFast2, i_maSlow1, i_maSlow2)==CROSSINGTOUP || i_maFast1>i_maSlow1 )
      return(SIGNAL_BUY);
}

Esta es la función principal que recibe la señal general; aquí obtenemos los valores de los índices a través del bucle para recorrer todas las barras, por supuesto. Y luego los valores obtenidos se pasan por referencia a las funciones apropiadas donde se necesitan estos valores, es decir, a las funciones:

int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)

int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)

void GetMomentumSignal() , en principio, también se puede poner ahí.

Así, todos los cálculos de los índices estarán en una función principal de obtención de la señal. Todo aquí es lógico.

 

Inmediatamente después de adjuntar el gráfico, el programa inicia la función init(). La función init() del Asesor o indicador personalizado adjunto se inicia inmediatamente después del inicio del terminal del cliente y la carga (se refiere sólo a los asesores y no a los indicadores) de los datos históricos, después de un cambio de símbolo y / o período del gráfico, después de recompilar el programa en el MetaEditor, después de un cambio de los parámetros de entrada de la ventana de configuración del EA o del indicador personalizado. El Asesor Experto también se inicializa después de un cambio de cuenta.

¿Puede explicar cómo funciona? ¿En el fondo, o puede ser rastreado de alguna manera? ¿O la función init en el indicador, cuando inicio el terminal después de un largo tiempo de inactividad no se iniciará en absoluto?

 
fore-x:

Inmediatamente después de adjuntar el gráfico, el programa inicia la función init(). La función init() del Asesor o indicador personalizado adjunto se inicia inmediatamente después del inicio del terminal del cliente y la carga (se refiere sólo a los asesores y no a los indicadores) de los datos históricos, después de un cambio de símbolo y / o período del gráfico, después de recompilar el programa en el MetaEditor, después de un cambio de los parámetros de entrada de la ventana de configuración del EA o del indicador personalizado. El Asesor Experto también se inicializa después de un cambio de cuenta.

¿Puede explicar cómo funciona? ¿En el fondo, o puede ser rastreado de alguna manera? ¿O la función init en el indicador al inicio del terminal después de un largo tiempo de inactividad no se iniciará en absoluto?

La función init está pensada para almacenar datos que no se modificarán durante toda la ejecución del EA. Puede tratarse de algunos datos que se calcularán una sola vez después de cargar el programa y no será necesario volver a calcularlos. Así es como yo lo entiendo.

Y si los valores de las variables deben ser recalculados, por ejemplo, con cada llegada de una nueva barra, entonces en la función init, dichas variables no deben ser declaradas, porque no serán recalculadas allí.

Para que sea más fácil de entender, esto es lo que puede y debe declararse en init:

   Tick = MarketInfo(Symbol(), MODE_TICKSIZE);                         // минимальный тик    
   Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point);                 // текущий спрэд
   StopLevel = ND(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point);  // текущий уровень стопов
   MinLot = MarketInfo(Symbol(), MODE_MINLOT);    // минимальный разрешенный объем сделки
   MaxLot = MarketInfo(Symbol(), MODE_MAXLOT);   // максимальный разрешенный объем сделки
   LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);          // шаг приращения объема сделки

Se trata de la recogida de datos del mercado, y estos datos no se modifican. Aunque es una cuestión con la variable Spread... si el spread no es fijo, es mejor ponerlo en funciones separadas.

 
hoz:

La función init se utiliza para almacenar datos que no se alterarán durante la vida del EA...

Estás respondiendo fuera de tema, una vez más - la función init()se inicia después decargar losdatos históricos (esto sólo se aplica a los Asesores Expertos, no a los indicadores) - ¿cómo entiendes eso (quiero sentirlo)?


Tomar un peón en un pase - Sé que existe esa regla, pero no sé cómo aplicarla (está más claro)...

 
He contestado más arriba como yo lo entiendo. No entendí bien su punto de vista. Tal vez alguien más lo haga.
 

Buenos días a todos. Por favor, ayuda, tengo una combinación de velas y me gustaría que trabajaran en diferentes escalas de tiempo. A modo de ejemplo

if(iHigh("EURUSD",PERIOD_M5,1)>iLow("EURUSD",PERIOD_M5,1)+8*kio*Point)

{

go_s=true;

}

Pensé que podría vincular mi combinación usando iHigh, iLow, iOpen, etc. Pero cuando se prueba en M5 muestra un resultado pero en otros plazos otro. Por favor, ayúdenme a saber qué estoy haciendo mal. Gracias.

 
hoz:

...

El libro de texto https://book.mql4.com/ru/build/conditions está lleno de gente. Tiene el MACD y el estocástico en una sola función, y no lo necesito así.

Y de hecho, todos los valores de los indicadores por el enlace deben ser pasados a las funciones apropiadas. ¿Por qué no? Esto es lógico.

Así, resulta que todos los cálculos de índices estarán en una función f principal de obtención de la señal. Todo tiene sentido.

Lo siento, pero parece que todavía estás en el principio de la cadena alimentaria, que es exactamente donde "todo es lógico". :-)

Hazlo como un LIBRO DE ESTUDIOS y DOCI, y luego envuélvelo en funciones separadas y obtén un criterio de negociación en el resultado.

En el tutorial - todo se registra de una vez en la resultante, usted puede registrar sus f-i-ciones - por separado, ¡y la resultante se dibuja como en el tutorial! Aquí no se necesita ningún bucle ni transferencia de valores de parámetros por referencia.

P.D. Y en general, antes de nada, desmonta los códigos de las exposiciones - todos en el tutorial y unos pocos en kodobase - todo cae en su sitio.

 
fore-x:

Inmediatamente después de adjuntar el gráfico, el programa inicia la función init(). La función init() del Asesor o indicador personalizado adjuntose inicia inmediatamente después del inicio del terminal del cliente y lacarga (se refiere sólo a los asesores y no a los indicadores)de los datos históricos, después de un cambio de símbolo y / o período del gráfico, después de recompilar el programa en el MetaEditor, después de un cambio de los parámetros de entrada de la ventana de configuración del EA o del indicador personalizado. El Asesor Experto también se inicializa después de un cambio de cuenta.

¿Puede explicar cómo funciona? ¿En el fondo, o puede ser rastreado de alguna manera? O la función init en el indicador, cuando se inicia el terminal después de un largo tiempo de inactividad, no se iniciará en absoluto?

No estoy seguro de lo que quieres. En tu descripción de init() hay algunos "puntos" no del todo correctos resaltados en rojo. Por ejemplo, el inicio del terminal cliente va acompañado de la carga de datos históricos y es incorrecto destacar la palabra "carga" - no es el proceso que inicia la inicialización.

Y no todo en la vida se puede tocar: como mucho, contemplar. :)))) Quiere fijar el proceso de inicialización, es decir, iniciar la función init() - imprimir una línea de notificación dentro de esta función.

 
hoz:

Ahora me estoy confundiendo un poco. Aquí hay 3 funciones, cada una de las cuales recibe una señal específica para un indicador concreto.

Esta función recibe la señal general de todos los índices y toma la decisión de COMPRA o VENTA.

Esta es la función principal que recibe la señal general; aquí obtenemos los valores de los índices a través del bucle para recorrer todas las barras, por supuesto. Y luego los valores obtenidos se pasan por referencia a las funciones apropiadas donde se necesitan estos valores, es decir, a las funciones:

int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)

int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)

void GetMomentumSignal() , en principio, también se puede poner ahí.

Así, todos los cálculos de los índices estarán en una función principal de obtención de la señal. Todo es lógico en este caso...

¡Victor! Tienes lógica, pero no suficiente conocimiento. El primero, si no lo abandonas, te ayudará a llegar más lejos que un libro de texto, y para "ganar" el segundo - deberías empezar con el mismo (de un libro de texto) todavía. No está preparado (todavía) para construir su propia estructura lógica de código, vuelva a la versión alfabética.
P.D. Lo que "llama la atención" en su código:

En la función GetSignal() para la búsqueda del cruce de dos líneas se puede utilizar el bucle for, pero es mejor utilizar el bucle while, aunque esto es una preferencia personal. Para empezar, necesitas mover un paréntesis como en "Ejecutar no puede tener piedad" para que tu código ejecute lo que acabas de decir. Por alguna razón, esta función (resultado) carece de resultados de dos funciones: GetStochSignal() y GetMomentumSignal(), - esto es ligeramente intrascendente.

en las funciones GetCrossingMa() y GetStochSignal() NO tiene sentido pasar parámetros por referencias, porque tendría sentido, si estas variables dentro de la función CAMBIAN sus valores.

La función void GetMomentumSignal() no devuelve nada.

Aunque admito que es "peor de ver" desde fuera... :)))

Razón de la queja: