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

 
Sayberix:

Lo estoy leyendo. Supongo que aún no he llegado a ese punto. No creo que sea fácil pasar por una referencia en pdf de 28 MB. O, dicho de otro modo, no todos los feligreses se saben toda la Biblia, aunque sean devotos creyentes.

Tengo otra pregunta, por favor, aconséjeme - si no es difícil:

al ejecutar el código en el visualizador de estrategias:

1. El programa entra en un bucle infinito;

2. los resultados de la ejecución son diferentes:

sin puntos de interrupción:

Con el punto de interrupción en la impresión:


Todo hecho sobre datos históricos de depuración.

Usted está aumentando constantemente la variable. ¿Qué opina: cuándo se superará el tamaño de la variable?

 
Vladimir Karputov:

Usted está aumentando constantemente el tamaño de la variable. ¿Qué opina: cuándo se superará el tamaño de la variable?

Creo que 10 iteraciones de la ulong deberían haber sido suficientes. La pregunta entonces es:

1. ¿por qué no se rompe el bucle? y

2. ¿por qué no se muestran los resultados del propio contador de tiempo de iteración?


¿Se debe a que la depuración se hizo sobre datos históricos?

 
Sayberix:

Creo que para 10 iteraciones el ulong debería haber sido suficiente. La pregunta entonces es:

1. ¿por qué no se rompe el bucle? y

2. ¿por qué no se muestran los resultados del propio contador de tiempo de iteración?


¿Es por la depuración de los datos históricos?

Tienes una variable declarada a nivel global del programa - la estás incrementando constantemente.

 
Oh, ya veo... La iteración tarda menos de un milisegundo...
 
Vladimir Karputov:

Tienes una variable declarada a nivel global del programa - la estás incrementando constantemente.

Sigo sin entender qué tiene que ver la variable global con esto. El programa en sí se limita a un bucle: "for(int i=1; i<=10; i++)" ?

O tal vez no entiendo algo, por favor explíquelo.

 
Sayberix:

Sigo sin entender qué tiene que ver la variable global con esto. El programa en sí se limita a un bucle: "for(int i=1; i<=10; i++)" ?

O tal vez no entiendo algo, por favor explíquelo.

Eliminar variables

ulong count, raschet = 1;

fuera del ámbito global.


En cada tic, se incrementa repetidamente la variable raschet. Y en el siguiente tic, CONTINÚA incrementándolo varias veces. Unos pocos ticks y la variableraschet está fuera de rango. Al final se imprimen los valores de la variable, pero no se mira la impresión por alguna razón.

 
Vladimir Karputov:

Eliminar las variables

del ámbito global.


En cada tic, se incrementa la variable raschet repetidamente. Y en el siguiente tic, CONTINÚA incrementándolo repetidamente. Unos pocos ticks y la variableraschet está fuera de rango. Finalmente imprimes los valores de la variable, pero no miras la impresión por alguna razón.

Gracias, lo entiendo. Es que me confundí, pensando que return detiene el programa del todo, mientras que sólo interrumpe su ejecución en el tick actual. En lugar de "return;" he puesto"ExpertRemove();".

 

Me puede decir en este código:

//+------------------------------------------------------------------+
//|                                                          env.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property indicator_buffers 2

int envHandle;
double upperEnv[], lowerEnv[];

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   envHandle = iCustom(_Symbol,_Period,"Examples\\Envelopes",3,0,MODE_LWMA,PRICE_OPEN,0.03);
   if(envHandle<0)
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
      return(INIT_FAILED);
     }
   SetIndexBuffer(0,upperEnv,INDICATOR_DATA);
   SetIndexBuffer(1,lowerEnv,INDICATOR_DATA);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(envHandle);
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {

   ArraySetAsSeries(upperEnv, true);
   ArraySetAsSeries(lowerEnv, true);

   if((CopyBuffer(envHandle,0,0,3,upperEnv)<0) || CopyBuffer(envHandle,1,0,3,lowerEnv)<0)
      Alert("Ошибка копирования буферов индикатора Envelopes - номер ошибки:",GetLastError(),"!!");

   double   upEnv = upperEnv[0];
   double   lowEnv = lowerEnv[0];
  }
//+------------------------------------------------------------------+

¿Cómo puedo obtener los valores de precio constantemente actualizados de las líneas de Envelopes en las variables upEnv y lowEnv? Dibuja el indicador, pero los valores del indicador en las variables se actualizan 2 veces y ya está.

 
Sayberix:

Me puede decir en este código:

¿Cómo puedo obtener los valores de precio constantemente actualizados de las líneas de Envelopes en las variables upEnv y lowEnv? Dibuja el indicador, pero los valores del indicador en las variables se actualizan 2 veces y ya está.

En primer lugar, decide: ¿quieres escribir un Asesor Experto o un indicador? (Ahora tiene un código mixto - el indicador y el Asesor Experto están mezclados) - es decir, el código no funcionará.

Sugerencia: Utilice el Asistente MQL para crear una plantilla.

 
Vladimir Karputov:

Primero decídase: ¿quiere escribir un EA o un indicador? (Ahora mismo su código es un desastre - tanto el indicador como el Asesor Experto están mezclados) - es decir, el código es inviable.

Sugerencia: Utilice el Asistente MQL para crear una plantilla.

Ya lo he probado. Pero genera clases en Wizard. Me gustaría al menos entender el código de una manera sencilla - el código lo entiendo al menos un poco. ¿Podría aconsejar cómo corregir el código para obtener los valores de los indicadores en el EA?

Razón de la queja: