Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 926

 
Seric29:
¿Qué operador se puede utilizar para obtener 2 resultados? Utilizo la sentencia if para encontrar esta condición, pero no puede devolver múltiples resultados en cuyo caso tengo que escribir la misma condición 2 veces, por eso escribo con esta pregunta.

No está muy claro qué condiciones se comprueban, pero quizá el cambio te sirva. Y en TRUE asigna los valores que necesites.

 
¿Existe una función para intercambiar los valores de dos variables?
 
pivomoe:
¿Existe una función para intercambiar los valores de dos variables?

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

Características del lenguaje mql5, sutilezas y trucos

fxsaber, 2018.08.26 19:02

La parte inglesa del foro mostró
// Обмен значениями между двумя числовыми переменными
#define  SWAP(A, B) { A += B; B = A - B; A -= B; }

 
Artyom Trishkin:

Gracias. Tendré que ponerme al día con estas definiciones.

 
Hola! ¿Por qué la función Bars() tiene valores diferentes cuando se llama desde el indicador y el experto y CÓMO HACER LA COINCIDENCIA?
 
Tango_X:
Hola! ¿Por qué la función Bars() tiene valores diferentes cuando se llama desde el indicador y el Asesor Experto y CÓMO HACER LA COINCIDENCIA?

Mostrar el código del EA y del indicador.

 
Alexey Viktorov:

Mostrar el código del EA y del indicador.

Simplemente llame a la función Bars(_Símbolo,_Periodo)

 
Tango_X:

Simplemente llame a la función Bars(_Símbolo,_Periodo)

¿Tengo que pedir una impresión del resultado por separado?

No entiendo la diferencia. Aunque en el probador no se excluye esta variante debido a la disponibilidad de la historia sobre la que sé poco, sólo vagos recuerdos de lo que leí hace tiempo. Después de todo, resulta el número total de barras disponibles. Pero si preguntas de vez en cuando, no puede haber ninguna diferencia.

 
Alexey Viktorov:
La sentencia if no devuelve ningún valor.

Existen dos opciones para asignar valores a determinadas variables en una función independiente:

1. Las variables deben ser visibles en todas las partes del programa. Es decir, deben declararse a nivel de variable global (al principio del código).

2. Para pasar variables declaradas localmente a la función del usuario por referencia. Es decir, poner & antes del nombre de la variable

Significa que si una condición es verdadera, deben realizarse dos acciones idénticas, por ejemplo

        if
        (Bar_Op[qt+2]>=Bar_Lo[qt+1]&&Bar_Cl[qt+2]<=Bar_Hi[qt+1]&& 
        Bar_Cl[qt+2]>=Bar_Lo[qt+1]&&Bar_Op[qt+2]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+3]>=Bar_Lo[qt+1]&&Bar_Cl[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+3]>=Bar_Lo[qt+1]&&Bar_Op[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+4]>=Bar_Lo[qt+1]&&Bar_Cl[qt+4]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+4]>=Bar_Lo[qt+1]&&Bar_Op[qt+4]<=Bar_Hi[qt+1])
         {
          int iHgCL=iHighest(_Symbol,PERIOD_D1,MODE_CLOSE,4,qt+1); int iHgOP=iHighest(_Symbol,PERIOD_D1,MODE_OPEN,4,qt+1);
         Price_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ? Bar_Cl[iHgCL]:Bar_Op[iHgOP];//провести нижний уровень
         int iLwCL=iLowest(_Symbol,PERIOD_D1,MODE_CLOSE,3,qt+1); int iLwOP=iLowest(_Symbol,PERIOD_D1,MODE_OPEN,3,qt+1);
         Price_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ? Bar_Cl[iLwCL]:Bar_Op[iLwOP];//провести верхний уровень я перепутал записи местами и условие перевёрнуто задом на перёд но для примера вопроса пойдёт

         string Line_TR="Ln_TRUr"+DoubleToString(qt,0);
         vs_Line_TR( Line_TR, iTime(_Symbol,PERIOD_D1,qt+2),  Price_UrNij, iTime(_Symbol,PERIOD_D1,qt), Price_UrNij, clrGreen, DRAW_LINE, 2, false, false);
}

Las variables las he declarado y no se hace nada excepto esta acciónPrecio_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ? Bar_Cl[iHgCL]:Bar_Op[iHgOP]; o esta acciónPrecio_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ? Bar_Cl[iLwCL]:Bar_Op[iLwOP]; cómo hacer que realice 2 acciones idénticas con los niveles superior e inferior por condición. ¿Puede alguien decirme cómo escribirlo más corto?

 
Konstantin Nikitin:

No está muy claro qué condiciones se comprueban, pero quizá el cambio te sirva. Y en TRUE asigna los valores que quieras.

 if
        (Bar_Op[qt+2]>=Bar_Lo[qt+1]&&Bar_Cl[qt+2]<=Bar_Hi[qt+1]&& 
        Bar_Cl[qt+2]>=Bar_Lo[qt+1]&&Bar_Op[qt+2]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+3]>=Bar_Lo[qt+1]&&Bar_Cl[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+3]>=Bar_Lo[qt+1]&&Bar_Op[qt+3]<=Bar_Hi[qt+1]&&
        Bar_Op[qt+4]>=Bar_Lo[qt+1]&&Bar_Cl[qt+4]<=Bar_Hi[qt+1]&&
        Bar_Cl[qt+4]>=Bar_Lo[qt+1]&&Bar_Op[qt+4]<=Bar_Hi[qt+1])
         {
          int iHgCL=iHighest(_Symbol,PERIOD_D1,MODE_CLOSE,4,qt+1); int iHgOP=iHighest(_Symbol,PERIOD_D1,MODE_OPEN,4,qt+1);
         Price_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ? Bar_Cl[iHgCL]:Bar_Op[iHgOP];//провести нижний уровень
         int iLwCL=iLowest(_Symbol,PERIOD_D1,MODE_CLOSE,3,qt+1); int iLwOP=iLowest(_Symbol,PERIOD_D1,MODE_OPEN,3,qt+1);
         Price_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ? Bar_Cl[iLwCL]:Bar_Op[iLwOP];//провести верхний уровень я перепутал записи местами и условие перевёрнуто задом на перёд но для примера вопроса пойдёт

         string Line_TR="Ln_TRUr"+DoubleToString(qt,0);
         vs_Line_TR( Line_TR, iTime(_Symbol,PERIOD_D1,qt+2),  Price_UrNij, iTime(_Symbol,PERIOD_D1,qt), Price_UrNij, clrGreen, DRAW_LINE, 2, false, false);

Debe ejecutarPrice_UrNij = Bar_Cl[iHgCL]>Bar_Op[iHgOP] ? Bar_Cl[iHgCL]:Bar_Op[iHgOP]; yPrice_UrVerh = Bar_Cl[iLwCL]<Bar_Op[iLwOP] ? Bar_Cl[iLwCL]:Bar_Op[iLwOP];.