prev_calculado - página 4

 
Alexey Viktorov:

¿Tal vez los desarrolladores deberían prestar atención al problema de la inicialización de los búferes de los indicadores? ¿Por qué no existe este problema en MT4? ¿Tal vez no es la comprensión completa? El problema es que incluso después de la inicialización obligatoria de los búferes tras sacar un indicador de un gráfico en CADA uno de ellos, no todos los búferes contienen basura y no puedes sacarla de ahí...

Personalmente no me importan las muletas, pero sólo si estas muletas no son demasiado complicadas y con efecto positivo. Pero escribir en un archivo y luego leerlo es una muletilla de mala muerte.

¿Cómo lo imaginas: "...después de quitar el indicador del gráfico en algunos, no en todos los buffers..."? ¿De qué manera, después de la eliminación del indicador del gráfico, tiene acceso a sus búferes de indicadores?

Intentemos encontrar el problema en detalle. Necesitas un conjunto estándar: código + lo que hiciste + lo que obtuviste...

 
Karputov Vladimir:

¿Cómo lo imaginas: "...después de quitar el indicador del gráfico en algunos, no en todos los buffers..."? ¿De qué manera, después de la eliminación del indicador del gráfico, tiene acceso a sus búferes de indicadores?

Intentemos encontrar el problema en detalle. Necesitas un conjunto estándar: código + lo que hiciste + lo que obtuviste...

Pura suposición: puede estar entrando en la misma zona de memoria durante el acceso al búfer actual, que estaba ocupada por los búferes anteriores.

No me he metido en la conversación, no patees, ¿Alexey quiere que los datos en los buffers permanezcan al reiniciar (encendido/apagado de la terminal) o sólo cuando prev_calculado = 0 (en caso de que prev_calculado > 0 antes)?

 
Karputov Vladimir:

¿Cómo lo imaginas: "...después de eliminar el indicador del gráfico en algunos, no en todos los buffers..."? ¿De qué manera, después de la eliminación del indicador del gráfico, tiene acceso a sus búferes de indicadores?

Intentemos encontrar el problema en detalle. Necesitas un conjunto estándar: código + lo que hiciste + lo que obtuviste...

Este es el código del indicador

/********************************************************************\
|                                               BalansEquityTest.mq5 |
|                                                           Viktorov |
|                                                  v4forex@yandex.ru |
\********************************************************************/

#property copyright "Viktorov"
#property link      "v4forex@yandex.ru"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers   6
#property indicator_plots     3
#property indicator_type1     DRAW_COLOR_LINE
#property indicator_color1    clrGold, clrGreen, clrRed
#property indicator_width1    2
#property indicator_label1    "Balance"
#property indicator_type2     DRAW_HISTOGRAM2
#property indicator_color2    clrCrimson
#property indicator_width2    2
#property indicator_label2    "EquityMin"
#property indicator_type3     DRAW_HISTOGRAM2
#property indicator_color3    clrDarkViolet
#property indicator_width3    2
#property indicator_label3    "EquityMax"

double balance[];
double clrBalance[];
double equityMaxB[];
double equityMinB[];
double equityMax[];
double equityMin[];

double maxEquity, minEquity;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, balance, INDICATOR_DATA);
   SetIndexBuffer(1, clrBalance, INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2, equityMin, INDICATOR_DATA);
   SetIndexBuffer(3, equityMinB, INDICATOR_DATA);
   SetIndexBuffer(4, equityMax, INDICATOR_DATA);
   SetIndexBuffer(5, equityMaxB, INDICATOR_DATA);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, 0.0);
   ArrayInitialize(balance, 0.0);    // принудительная
   ArrayInitialize(equityMax, 0.0);  // инициализация
   ArrayInitialize(equityMaxB, 0.0); // всех
   ArrayInitialize(equityMin, 0.0);  // буферов
   ArrayInitialize(equityMinB, 0.0); // индикатора
   ArraySetAsSeries(balance, true);    // все
   ArraySetAsSeries(clrBalance, true); // буферы
   ArraySetAsSeries(equityMax, true);  // индикатора
   ArraySetAsSeries(equityMaxB, true); // имеют
   ArraySetAsSeries(equityMin, true);  // флаг
   ArraySetAsSeries(equityMinB, true); // AS_SERIES
   IndicatorSetInteger(INDICATOR_DIGITS, 2);
   IndicatorSetString(INDICATOR_SHORTNAME, "Show Money");
//---
   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)
  return(rates_total);

  double bal = AccountInfoDouble(ACCOUNT_BALANCE);
  double equity = AccountInfoDouble(ACCOUNT_EQUITY);
  if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = fmin((minEquity == 0 ? AccountInfoDouble(ACCOUNT_BALANCE) : minEquity), equity);
    maxEquity = fmax(maxEquity, equity);
    balance[0] = AccountInfoDouble(ACCOUNT_BALANCE);
    clrBalance[0] = 0.0;
    equityMinB[0] = balance[0];
    equityMin[0] = minEquity;
    equityMaxB[0] = balance[0];
    equityMax[0] = maxEquity;
    if(balance[0] > balance[1])
     clrBalance[0] = 1.0;
    if(balance[0] < balance[1])
     clrBalance[0] = 2.0;
    Comment(PositionsTotal());
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Publicaré un vídeo un poco más tarde, entonces estará claro. No puedo explicarlo más claramente en mis dedos que antes.


Espero que no te importe descargar y descomprimir el vídeo.

Desgraciadamente, no se ha registrado el hecho de su retirada del gráfico y su fijación, pero sí el hecho de que el indicador está ahí, luego desaparece y luego vuelve a estar ahí. Sólo se trata de borrar y volver a adjuntarlo.

Preste atención a la ventana de datos después de reinstalar el indicador. Incluso después de la inicialización forzada de los búferes, todavía hay restos de espacio allí.

Archivos adjuntos:
00.zip  2614 kb
 
Alexey Viktorov:

Este es el código del indicador

Es necesario hacer este experimento: dejar sólo un gráfico abierto y poner y quitar el indicador en él. Y necesitas información sobre el terminal y el sistema operativo (pestaña de registro del terminal).
 
Karputov Vladimir:
Me gustaría hacer un experimento: dejar sólo un gráfico abierto y aplicar o quitar el indicador en él. Y necesitas información sobre el terminal y el sistema operativo (pestaña "Log" del terminal).

¿Qué tiene que ver un gráfico con esto? ¿El hecho de que el indicador esté sólo en un gráfico no es suficiente?


añadido:

Aunque no creo que el sistema operativo pueda afectar al comportamiento del indicador, aquí hay información sobre el sistema y el terminal

2016.10.16 20:56:34.904 Terminal        D:\MetaTrader 5\MetaTrader 5
2016.10.16 20:56:34.904 Terminal        Windows 7 Home Premium (x64 based PC), IE 11.00, UAC, AMD FX-4170 Quad-Core Processor , RAM: 10531 / 12255 Mb, HDD: 55167 / 244198 Mb, GMT+03:00
2016.10.16 20:56:34.904 Terminal        MetaTrader 5 build 1455 started (MetaQuotes Software Corp.)
 
Alexey Viktorov:
¿Qué tiene que ver un gráfico con esto? ¿No es suficiente con que el indicador esté en un solo gráfico?
  1. Estoy tratando de reducir el problema.
  2. No tengo ese problema. Mi configuración:
    2016.10.18 19:09:34.239 Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
    2016.10.18 19:09:34.266 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M  @ 2.50 GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+02:00
    2016.10.18 19:09:34.266 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038 C9E8FAFF9EA373522ECC6D5159962

 

Así que... La situación empieza a tomar forma. Añade este código:

  {
//---
   if(prev_calculated==0)
     {
      Print("prev_calculated==0");

      return(rates_total);
     }

   double bal=AccountInfoDouble(ACCOUNT_BALANCE);
 
Karputov Vladimir:
  1. Estoy tratando de reducir el problema.
  2. Yo no tengo este problema. Mi configuración:
    2016.10.18 19:09:34.239 Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
    2016.10.18 19:09:34.266 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M  @ 2.50 GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+02:00
    2016.10.18 19:09:34.266 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038 C9E8FAFF9EA373522ECC6D5159962

Comenzó a ejecutarse, pero cuando inicio el indicador hay números de plaga en un buffer casi todo el historial.

Después de quitar el indicador y volver a ponerlo al cabo de un rato los tampones están vacíos.

Repetiré el desmontaje y la colocación más tarde.

 

Conclusiones preliminares:

1. Los indicadores no pueden confiar en la inicialización de las matrices de indicadores en OnInit():

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
...
   ArrayInitialize(balance, 0.0);    // принудительная
   ArrayInitialize(equityMax, 0.0);  // инициализация
   ArrayInitialize(equityMaxB, 0.0); // всех
   ArrayInitialize(equityMin, 0.0);  // буферов
   ArrayInitialize(equityMinB, 0.0); // индикатора

...
//---
   return(INIT_SUCCEEDED);
  }

2. En los indicadores es obligatorio pasar por todo el array o sólo los elementos modificados en OnCalculate().

 
Karputov Vladimir:

Así que... La situación empieza a tomar forma. Añade un código como este:

  {
//---
   if(prev_calculated==0)
     {
      Print("prev_calculated==0");

      return(rates_total);
     }

   double bal=AccountInfoDouble(ACCOUNT_BALANCE);

Añadido así

Print("prev_calculated = ", prev_calculated);