Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 349

 
Pyro:

Todo se restablece durante la inicialización, excepto las variables globales
¿Y si se apaga el ordenador o el servidor en el que se ejecuta el Asesor Experto?
 
artmedia70:
Y aquí debemos aclarar que GV son variables terminales, no variables EA.

He empezado a leer y a estudiar. Ahora sé que las Variables Globales y las Variables Globales son cosas diferentes.

Por cierto, sobre el error 129, que tantas veces te he preguntado. El caso es que tengo un DC de cinco dígitos,

Mi Expert Advisor es un slipage 2, probablemente por eso no ha podido seguir el ritmo del precio. Ahora lo pongo a 15 pips.

 
artmedia70:
Y aquí hay que aclarar que las VG son variables terminales, no variables EA.


Bueno me refiero a que el EA puede trabajar con ellos, sólo para guardar valores durante la inicialización (entre otras cosas).
 
Forexman77:
¿Qué pasa si apago el ordenador o se bloquea el servidor en el que se ejecuta el EA?


Aquí es donde se pone interesante. Las Variables Globales se almacenan en la caché y en algunas circunstancias se escriben en un archivo. Parece que después de algún tiempo o durante la desinicialización. A veces solía perder gvariables.dat (valores de las variables globales) durante el reinicio. Esto debe tenerse en cuenta. O simplemente no han tenido tiempo de copiarlo en el disco desde la caché. Significa que no tenemos ninguna garantía de que estén ya en el disco y no en la caché. Corríjanme si me equivoco.


Forexman77:

Me puse a leer y a estudiar. Ahora sé que las variables globales y las variables globales son cosas diferentes.

Por cierto, por cierto, sobre el error 129 que tanto me preguntaron. El caso es que tengo un DC de cinco dígitos,

Mi Expert Advisor es un slipage 2, probablemente por eso no ha podido seguir el ritmo del precio. Yo lo pondría a 15 pips.


No creo que sea por eso. Tengo un 3 en mis cinco dígitos. Todo se abre normalmente. Que yo recuerde, los corredores han acordado que un punto sigue siendo un punto básico, universalmente aceptado (el cuarto dígito después del cero) y un punto fraccionario es un punto fraccionario. Para que cuando introduzcas 6,7 y 8 dígitos, no tengas que cambiar el significado de "punto" cada vez.
 
Pyro:

Aquí es donde se pone interesante. Las Variables Globales se almacenan en una caché y en algunas circunstancias se escriben en un archivo. Es como si después de un cierto período de tiempo. Hubo casos en los que durante la operación real el gvariables.dat (el archivo donde se almacenaban los valores de las Variables Globales) simplemente se perdió durante el reinicio brusco del ordenador. Esto debe tenerse en cuenta. O simplemente no han tenido tiempo de copiarlo en el disco desde la caché. Significa que no tenemos ninguna garantía de que estén ya en el disco y no en la caché. Corrígeme si me equivoco.
Tal vez podrías intentar escribirlo y luego apagar el ordenador. Y cuando lo enciendas, prueba con Alerta para ver si está ahí. Aunque no voy a mentir, hasta ahora sólo uso variables estáticas y banderas y no puedo decir nada seguro sobre las Variables Globales.
 
Forexman77:
Quizá puedas probar a grabarlo y luego apagar el ordenador. Y cuando lo enciendas, intenta llamar a Alerta para ver si está ahí. Aunque no voy a mentir, hasta ahora sólo uso variables estáticas y banderas y no puedo decir nada seguro sobre las Variables Globales.


Puedes mirar en el menú -> Herramientas -> Variables Globales. Ahí hay una lista. O utilice GlobalVariableCheck. Sin embargo, mi experiencia demuestra que es mejor guardar todo en un archivo físico.
 
¡Hola!
Por favor, encuentre errores en mi razonamiento.

Este es el segundo día que tengo problemas con la creación del indicador, concretamente con la visualización de la línea en la ventana adicional que se adjunta a la ventana principal. En mi opinión, es necesario hacer cálculos sobre las barras no calculadas y dar los valores de los resultados de los cálculos al buffer. Esta vez, utilizo un código más complejo para el ejemplo (me gusta trabajar con códigos relativamente grandes). Aquí está la "limpieza de la creatividad" :

//+--------------------------------------------+
#property indicator_separate_window
#property indicator_minimum -10
#property indicator_maximum 10
#property indicator_buffers 1
#property  indicator_color1 Blue
extern double N = 1;
//+--------------------------------------------+
//Deklaration                                  |
//+--------------------------------------------+
double A; double C;       
double M; double D;
double L; double I;
double B; double F;
double K; double Buf_0[];
double G; 
//+--------------------------------------------+
int init(){
SetIndexBuffer(0,Buf_0);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
return; }
//+--------------------------------------------+
int start() {
//Level 1
A = iRSI(Symbol(),0,10,0,0);
M = iRSI(Symbol(),0,20,0,0);
L = iRSI(Symbol(),0,15,0,0);
B = iStochastic(Symbol(),0,10,6,6,0,0,0,0);
K = iStochastic(Symbol(),0,10,6,6,0,0,1,0);
C = iADX(Symbol(),0,10,0,0,0);
D = iADX(Symbol(),0,10,0,1,0);
I = iADX(Symbol(),0,10,0,2,0);
F = iRVI(Symbol(),0,10,0,0);
  //Level 2
  Buf_0[0] = N *(((B + F) / K) - ((D + I) / C) + ((A + M) / L));
  return; } 
//+-------------------------------------------+ 

.

Se puede ver claramente que "en esta compensación" el valor del buffer es "0", es decir, este indicador dibujará la línea sólo desde el momento del inicio de la plataforma de operaciones. Y necesito datos históricos además de datos reales.

Utilicé la información descrita en este código (tomado del tutorial de MQ4):

//--------------------------------------------------------------------
// separatewindow.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
#property indicator_separate_window // Отображение в отдельном окне
#property indicator_buffers 1       // Количество буферов
#property  indicator_color1 Blue     // Цвет первой линии
#property  indicator_color2 Red      // Цвет второй линии
 
extern int History  =50;            // Колич.баров в расчётной истории
extern int Aver_Bars=5;             // Количество баров для расчёта
 
double Buf_0[];                     // Объявление индикаторного массива
//--------------------------------------------------------------------
int init()                          // Специальная функция init()
  {
   SetIndexBuffer(0,Buf_0);         // Назначение массива буферу
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Стиль линии
   return;                          // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
int start()                         // Специальная функция start()
  {
   int i,                           // Индекс бара
   n,                               // Формальный параметр
   Counted_bars;                    // Количество просчитанных баров 
   double
   Sum_H,                           // Сумма значений High за период
   Sum_L;                           // Сумма значений Low  за период
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=Bars-Counted_bars-1;           // Индекс первого непосчитанного
   if (i>History-1)                 // Если много баров то ..
      i=History-1;                  // ..рассчитывать заданное колич.
   while(i>=0)                      // Цикл по непосчитанным барам
     {
      Sum_H=0;                      // Обнуление в начале цикла
      Sum_L=0;                      // Обнуление в начале цикла
      for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений 
        {
         Sum_H=Sum_H + High[n];     // Накопление суммы макс.значений
         Sum_L=Sum_L + Low[n];      // Накопление суммы мин. значений
        }
      Buf_0[i]=(Sum_H-Sum_L)/Aver_Bars;// Знач. 0 буфера на i-ом баре
      i--;                          // Расчёт индекса следующего бара
     }
//--------------------------------------------------------------------
   return;                          // Выход из спец. ф-ии start()
  }
//--------------------------------------------------------------------
Elegiré lo que necesito y lo conseguiré...
extern int History  =50;            // Колич.баров в расчётной истории
extern int Aver_Bars=5;             // Количество баров для расчёта
double Buf_0[];                     // Объявление индикаторного массива
int start()                         // Специальная функция start()
  {
   int i,                           // Индекс бара
   n,                               // Формальный параметр
   Counted_bars;                    // Количество просчитанных баров 
   Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=Bars-Counted_bars-1;           // Индекс первого непосчитанного
   if (i>History-1)                 // Если много баров то ..
      i=History-1;                  // ..рассчитывать заданное колич.
      Buf_0[i]=(Sum_H-Sum_L)/Aver_Bars;// Знач. 0 буфера на i-ом баре
      i--;  

Luego, llevándolo a una "vista de desfile" quitando los comentarios y dividiendo lógicamente, obtengo:

//|+--------------------------------------+
//|Inputs                                 |
//|+--------------------------------------+
extern int History  =50;
//|+--------------------------------------+
//|Declaration                            |
//|+--------------------------------------+
double Buf_0[];
int i;
int n;
int Counted_bars;
//|+--------------------------------------+
//| Start?                                |
//| Yes, babe!                            |
//|+--------------------------------------+
int start(){
//+-----------+
//Level 1 
//+-----------+
Counted_bars=IndicatorCounted();
i=Bars-Counted_bars-1;
  //+-----------+
  //Level 2
  //+-----------+
  if (i>History-1) i=History-1;
    //+------------+
    //Level 3 
    //+------------+
    Buf_0[i]= 
    i--;  
//+---------------------------------------+

Aquí me quedan los objetos que hay que sintetizar con el código "principal". Después de realizar la fusión, obtengo el siguiente código:

//+--------------------------------------------+
#property indicator_separate_window
#property indicator_minimum -10
#property indicator_maximum 10
#property indicator_buffers 1
#property  indicator_color1 Blue
//|+--------------------------------------------+
//|Inputs                                       |
//|+--------------------------------------------+
extern double N = 1;
extern int History  =50;
//|+--------------------------------------------+
//|Deklaration                                  |
//|+--------------------------------------------+
double A; double C;       int i;
double M; double D;
double L; double I;       int Counted_bars;
double B; double F;
double K; double Buf_0[];
double G; 
//|+--------------------------------------------+
int init(){
SetIndexBuffer(0,Buf_0);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
return; }
//|+--------------------------------------------+
int start() {
       //|+-----------+
       //|Level 1     |
       //|+-----------+
       A = iRSI(Symbol(),0,10,0,0);
       M = iRSI(Symbol(),0,20,0,0);
       L = iRSI(Symbol(),0,15,0,0);
B = iStochastic(Symbol(),0,10,6,6,0,0,0,0);
K = iStochastic(Symbol(),0,10,6,6,0,0,1,0);
       C = iADX(Symbol(),0,10,0,0,0);
       D = iADX(Symbol(),0,10,0,1,0);
       I = iADX(Symbol(),0,10,0,2,0);
       F = iRVI(Symbol(),0,10,0,0);
   Counted_bars=IndicatorCounted();
              i=Bars-Counted_bars-1;
         //+-----------+
         //Level 2     |
         //+-----------+
         if (i>History-1) i=History-1;
         Buf_0[i] = N *(((B + F) / K) - ((D + I) / C) + ((A + M) / L));
         return; } 
//+-------------------------------------------+
Durante la programación, cambié decorativamente el código "principal" y eliminé algunos valores del código "apéndice". Una vez ejecutado el código, me di cuenta de la línea horizontal, que indicaba un error en mi razonamiento, ya que los indicadores técnicos utilizados en el indicador personalizado no pueden dar, durante un largo período de tiempo, los valores que construyen el gráfico de la función " y = x ".

Sinopsis.
Me llamo John (Eugene, pero a la americana).

Tengo 15 años, llevo 5 días operando y siento un gran progreso en el aprendizaje de los campos de la negociación de divisas, concretamente el análisis de indicadores y el análisis gráfico (en definitiva, t.a. :) ).
Siento que el "trading manual" es cada vez menos prometedor, así que decidí pasar directamente al "trading automatizado".

¡"PICAR" TODOS LOS JUICIOS INADECUADOS! Quiero saber más y sus comentarios me ayudarán.

 
Link_x:
¡Hola!
Por favor, encuentre errores en mi razonamiento.

Aquí termina el segundo día mientras lucho con la creación del indicador, es decir, la visualización de la línea en una ventana adicional que se adjunta a la principal. En mi opinión, es necesario hacer cálculos sobre las barras no calculadas y dar los resultados de los cálculos al buffer. Esta vez, utilizo un código más complejo para el ejemplo (me gusta trabajar con códigos relativamente grandes). Aquí está el "despeje de la creatividad" :

.

Puede ver claramente que "en este claro" el valor del buffer es "0", es decir, este indicador dibujará una línea sólo desde el momento en que se inicie la plataforma de negociación. Y necesito datos históricos además de datos reales.

Utilicé la información descrita en este código (tomado del tutorial de MQ4):

Aislaré lo que necesito y conseguiré...

Luego, llevándolo a una "vista de desfile" quitando los comentarios y dividiendo lógicamente, me sale:

Aquí me quedan los objetos que hay que sintetizar con el código "principal". Una vez realizada la fusión, obtengo este código:

Durante la programación, he cambiado decorativamente el código "principal" y he eliminado algunos valores del código "apéndice". Una vez iniciado el código, me di cuenta de la línea horizontal, que indicaba un error en mi razonamiento, ya que los indicadores técnicos utilizados en el indicador personalizado no pueden dar, durante mucho tiempo, los valores que construyen el gráfico de la función "y = x".

Sinopsis.
Me llamo John (Eugene, pero a la americana).

Tengo 15 años, estoy tratando con el comercio durante 5 días y siento que estoy haciendo un gran progreso en el estudio de los campos de la negociación de divisas, a saber, el análisis de los indicadores y el análisis gráfico (en resumen, t.a. :) ).
Siento que el "trading manual" es cada vez menos prometedor, así que decidí pasar directamente al "trading automatizado".

¡"PICAR" TODOS LOS JUICIOS INADECUADOS! Quiero saber más y sus comentarios me ayudarán.

El comienzo es bueno.

Presta atención a la variable Historia, intenta sustituirla por un valor diferente.

//                Джон(Евгений).mq4 

//+--------------------------------------------+
#property indicator_separate_window
//#property indicator_minimum -10
//#property indicator_maximum 10
#property indicator_buffers 1
#property  indicator_color1 Blue
//|+--------------------------------------------+
//|Inputs                                       |
//|+--------------------------------------------+
extern double N = 1;
extern int History  =50;
//|+--------------------------------------------+
//|Deklaration                                  |
//|+--------------------------------------------+
double A; double C;       int i;
double M; double D;
double L; double I;       int Counted_bars;
double B; double F;
double K; double Buf_0[];
double G; 
//|+--------------------------------------------+
int init(){
SetIndexBuffer(0,Buf_0);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
return; }
//|+--------------------------------------------+
int start()
{
       //|+-----------+
       //|Level 1     |
       //|+-----------+
 for( i=0; i<History; i++)
    {    
       A = iRSI(Symbol(),0,10,0,i);
       M = iRSI(Symbol(),0,20,0,i);
       L = iRSI(Symbol(),0,15,0,0);
       B = iStochastic(Symbol(),0,10,6,6,0,0,0,i);
       K = iStochastic(Symbol(),0,10,6,6,0,0,1,i);
       C = iADX(Symbol(),0,10,0,0,i);
       D = iADX(Symbol(),0,10,0,1,i);
       I = iADX(Symbol(),0,10,0,2,i);
       F = iRVI(Symbol(),0,10,0,i);
    Buf_0[i] = N *(((B + F) / K) - ((D + I) / C) + ((A + M) / L));
   }
 return;
} 
//+-------------------------------------------+
 
Link_x:
¡Hola!
Por favor, encuentre errores en mi razonamiento.

El segundo día de desarrollo del indicador está llegando a su fin, estoy luchando con la visualización de la línea en la ventana adicional adjunta a la principal. En mi opinión, es necesario hacer cálculos sobre las barras no calculadas y dar valores a los resultados de los cálculos al buffer. Esta vez, utilizo un código más complejo para el ejemplo (me gusta trabajar con códigos relativamente grandes). Aquí está el "despeje de la creatividad" :

.

Puede ver claramente que "en este claro" el valor del buffer es "0", es decir, este indicador dibujará una línea sólo desde el momento en que se inicie la plataforma de negociación. Y necesito datos históricos además de datos reales.

Utilicé la información descrita en este código (tomado del tutorial de MQ4):

Aislaré lo que necesito y conseguiré...

Luego, llevándolo a una "vista de desfile" quitando los comentarios y dividiendo lógicamente, me sale:

Aquí me quedan los objetos que hay que sintetizar con el código "principal". Una vez realizada la fusión, obtengo este código:

Durante la programación, he cambiado decorativamente el código "principal" y he eliminado algunos valores del código "apéndice". Una vez iniciado el código, me di cuenta de la línea horizontal, que indicaba un error en mi razonamiento, ya que los indicadores técnicos utilizados en el indicador personalizado no pueden dar, durante mucho tiempo, los valores que construyen el gráfico de la función "y = x".

Sinopsis.
Me llamo John (Eugene, pero a la americana).

Tengo 15 años, estoy tratando con el comercio durante 5 días y siento que estoy haciendo un gran progreso en el estudio de los campos de la negociación de divisas, a saber, el análisis de los indicadores y el análisis gráfico (en resumen, t.a. :) ).
Siento que el "trading manual" es cada vez menos prometedor, así que decidí pasar directamente al "trading automatizado".

¡"PICAR" TODOS LOS JUICIOS INADECUADOS! Quiero saber más y sus comentarios me ayudarán.


Comienza a indagar hacia los bucles (for, wile, while do) en cuanto a por qué lo necesitas en absoluto )))


Si necesitas valores sobre datos históricos - no puedes hacerlo sin enumerar estos mismos datos en un bucle ;)

Arriba diste un ejemplo con el Historial, que establece el número de barras del historial, que serán procesadas por el indicador, y así es como debes proceder.

 


En la imagen, he marcado con una flecha dónde debería estar la salida. No entiendo cuál es el problema. Entramos y recordamos la hora,

A continuación, salir cuando el tiempo es más largo que la entrada con una compensación por un período y el precio está por debajo de la MA de 3 días min.

El código es el siguiente:

signal =   MA_6_t - iClose(Symbol(),Period(),0);
MA_2_t=iMA(NULL,0,3,0,MODE_EMA,PRICE_LOW,0); 
static datetime t;

if  (signal > 0.006) 
          {                                          
          Opn_S=true; 
          t=Time[0];                      
          }
if  (Bid <= MA_2_t)
      {
       if (Time[1]>t)
          {                                      
          Cls_S=true;         
          }
      }
¿Qué te parece?