Errores, fallos, preguntas - página 2997

 
Alexey Viktorov:

¿Quizás los esquís están mal?


Y luego está el RTS-6.21.


Esto es otra cosa. Qué broker tienes y qué versión de MT5.

 
Alexey Viktorov:

¿Quizás los esquís están mal?


Y también RTS-6.21.


Gracias por la ayuda. Lo he descubierto. Conectar diferentes versiones de indicadores de diferentes carpetas.

 
Francuz:

Sí, lo hice. El resultado no ha cambiado.

No me lo creo.
inténtalo de nuevo

datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{

   if(prev_calculated>0 && handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}
 
Nikolai Semko:

No me lo creo.
inténtalo de nuevo.

Me lo imaginé. El problema era que se conectaban dos archivos ATR diferentes de carpetas distintas. Por eso había una discrepancia en los valores.

Gracias por su ayuda.
 
Nikolai Semko:

No me lo creo.
inténtalo de nuevo

Nikolai, tenía un problema diferente. Yo tampoco entendí inmediatamente la cuestión, pensé que tenía que obtener los valores de una TF diferente. Lubricé los esquís y todo salió bien.
 
Alexey Viktorov:
Nikolay, tenía un problema diferente. Yo tampoco entendí la pregunta al principio, pensé que tenía que obtener los valores de otra TF. He engrasado los esquís y todo ha ido bien.

Extraño, no entendí nada.
Reproduje su problema en el mío exactamente como lo describió.
Sucedió exactamente porque la única ejecución de CopyBuffer tuvo lugar en la primera ejecución en OnCalculate, cuando prev_calculated == 0 y no había ninguna garantía de que las barras ya estuvieran generadas.
La solución fue ignorar esta primera ejecución y ejecutar el único CopyBuffer sólo cuando prev_calculated>0.
No entiendo lode "dos archivos ATR diferentes de carpetas diferentes ".

 
Nikolai Semko:

Extraño, no entendí nada.
Reproduje su problema en el mío exactamente como lo describió.
Sucedió exactamente porque la única ejecución de CopyBuffer tuvo lugar en la primera ejecución en OnCalculate, cuando prev_calculated == 0 y no había ninguna garantía de que las barras ya estuvieran generadas.
La solución fue ignorar esta primera llamada y ejecutar un solo CopyBuffer sólo cuando prev_calculated>0.
No entiendo por qué había"dos archivos ATR diferentes de carpetas diferentes ".

Bueno, si se abre el gráfico y se crea el indicador para el TF actual, los datos ya deberían estar listos cuando se abra el gráfico. ¿No es así?

 
Alexey Viktorov:

Bueno, si se abre un gráfico y se crea un indicador para el TF actual, los datos ya deberían estar listos cuando se abra el gráfico. ¿No es así?

Oh, cuántos descubrimientos maravillosos nos esperan... más

 
Alexey Viktorov:

Bueno, si se abre un gráfico y se crea un indicador para el TF actual, los datos ya deberían estar listos cuando se abra el gráfico. ¿No es así?

No lo he expresado correctamente. Las barras son sí - lo más probable es que estén listas. Pero no hay garantía de que el indicador haya sido recalculado para todas estas barras en la primera llamada de OnCalculate, cuando prev_calculated == 0.
Se puede ejecutar un indicador de este tipo para asegurarse de ello.
Pero debe hacerse cuando se negocian las cotizaciones. Si el mercado está cerrado, no verá el desajuste.
Así que es mejor probarlo en la criptomoneda, que está en movimiento, en el fin de semana.
Si el tamaño de la matriz del Buffer = -1, significa que el buffer del indicador no se ha recalculado todavía y el valor de la BS no será correcto.

   datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{

   if(handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      int total_bars = iBars(NULL,PERIOD_CURRENT);
      int size = CopyBuffer(handle, 0, 0, total_bars, Buffer);
      Print("Total Bars = " + string(total_bars) + ", Size of Buffer array = " + string(size));
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}


Si lo hace en la siguiente llamada de OnCalculate (cuando prev_calculated>0) entonces no habrá tal problema.

SOM hubo un error en el código - lo arreglé

 
Artyom Trishkin:

Oh, qué maravillosos descubrimientos nos esperan... más

Me refiero a los datos para calcular el indicador. No seas sarcástico))))

Razón de la queja: