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

 
Artyom Trishkin:

¿Qué cálculos?

Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
Last_Arrow_Buy_index  = n;

Entendido, pregunta eliminada, te escuché y me di cuenta que declarar una variable en el área de OnTick() es malo, y los cálculos se pueden hacer dentro del bucle también.

Hecho, todo funciona gracias, ahora solo me falta conseguir los precios. Muchas gracias.

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = Buf_Arrow_Sell[n];
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
 
Sergey Voytsekhovsky:

Entendido, pregunta eliminada, te escuché y me di cuenta que declarar una variable en el área de OnTick() es malo, y los cálculos se pueden hacer dentro del bucle también.

Hecho, todo funciona gracias, ahora solo me falta conseguir los precios. Muchas gracias.

No son cálculos dentro del bucle, es obtener los datos necesarios, que es para lo que está diseñado este bucle.

Pero hay que evitar los cálculos dentro del bucle.

De hecho, tiene que reconsiderar su enfoque de inmediato. Se están obteniendo datos en el bucle. Se interrumpe el bucle después del primer dato encontrado. Todo esto está dentro del concepto de una función: devolver el resultado solicitado.

Convertir todo el bucle en una función y devolver el número de la barra si se encuentra o WRONG_VALUE - si no se encuentra.

entonces: n=Func();

y luego usar n para su propósito si no es igual a WRONG_VALUE. Nombra la función con un nombre "parlante". Y el código en OnTick() será más corto y la lógica será más clara - no se sobrecargará con nada innecesario.

 
Artyom Trishkin:

Formar todo el bucle en una función, y devolver el número de barra de ella si se encuentra, o WRONG_VALUE - si no se encuentra.

Entonces: n=Func();

y luego utilizar n como se pretende, si no es igual a WRONG_VALUE. Dé a la función un nombre "revelador". Y el código en OnTick() será más corto y la lógica será más clara - no se sobrecargará con cosas innecesarias.

Se vive y se aprende. Muy interesante, lo probaré por la noche. Mientras tanto, a modo de informe y con gran gratitud hacia ustedes, conseguí los precios de ..... Fue un buen día :-))

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
 

Chicos que pueden ayudar con esta pregunta https://www.mql5.com/ru/forum/160683/page845#comment_11741857 - ¿el comentario ya ha llegado lejos? También se plantea la cuestión de cómo crear un bucle que pueda funcionar en ambos sentidos, si necesita ejecutarse de forma incremental si necesita ejecutarse de forma decremental. He aquí un esquema de ejemplo de cómo funcionaría.

Si (algo sucedió) {asignación de valores a las variables} entonces el bucle será llamado y contendrá un cuerpo, cuyos cálculos dependerán de los valores del bucle

for( en función de las variables anteriores incremento o decremento)

{ cuerpo }

No hay forma de duplicar la condición, tiene que ser especificada una vez en el bucle. ¿Es posible hacer esto?

 

Buenas noches de nuevo. Todavía no lo he convertido en una función, pero tengo una nueva pregunta. En la imagen adjunta se puede ver que hay una nueva señal (Flecha), pero en los comentarios se puede ver que el EA no la acepta, sigue considerando la de hace 11 velas como la Flecha Última de Subida.

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
  • www.mql5.com
Символ: EURUSD. Период графика: H1. Брокер: Alpari International. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2019.05.20 18:00 UTC.
 
Sergey Voytsekhovsky:

Hace 11 velas.

Resulta que el indicador ya ha dado una nueva señal (se está ejecutando en paralelo al EA en el gráfico), no hay eventos en el EA más que OnTick, y el EA no ve la señal.

 
Sergey Voytsekhovsky:

Buenas noches de nuevo. Todavía no lo he convertido en una función, pero tengo una nueva pregunta. En la imagen adjunta se puede ver que hay una nueva señal (Flecha), pero en los comentarios se puede ver que el EA no la acepta, sigue considerando la de hace 11 velas como la Flecha Última de Subida.

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

Al encontrar un valor de búfer no vacío, imprime en el registro el tiempo correspondiente a la barra n. Verás qué barra encuentra. Puede ser que estés leyendo el buffer al revés.

 

Por favor, aclare por qué el EA no ve la flecha, ya está en el buffer del indicador, a juzgar por la ventana de datos, el EA consulta OnTick, ¿qué más necesita? Código completo arriba.


 
Artyom Trishkin:

Al encontrar un valor de búfer no vacío, imprime en el registro el tiempo correspondiente a la barra n. Se mostrará la barra que encuentra. Puede ser que estés leyendo el buffer al revés.

OK, hecho, la hora muestra la hora correcta, la hora de apertura de la vela en la que está puesta la flecha. Código adjunto, imagen adjunta.

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Buy_time   = iTime(_Symbol,0,n);
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Sell_time   = iTime(_Symbol,0,n);
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }


 

si no puedes ver el registro en la imagen, aquí hay algunas entradas extremas


2019.05.20 21:42:52.601 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.621 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.622 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00


Razón de la queja: