prev_calcolato - pagina 4

 
Alexey Viktorov:

Forse gli sviluppatori dovrebbero prestare attenzione al problema dell'inizializzazione dei buffer degli indicatori? Perché non c'è questo problema in MT4? Forse non è la piena comprensione? Il problema è che anche dopo l'inizializzazione obbligatoria dei buffer dopo aver tolto un indicatore da un grafico in CIASCUNO di essi, non tutti i buffer contengono spazzatura e non è possibile tirarla fuori da lì...

Personalmente non mi dispiacciono le stampelle, ma solo se queste stampelle non sono troppo complicate e con effetti positivi. Ma scrivere su un file e poi leggerlo è una stampella scadente.

Come ve lo immaginate: "...dopo aver rimosso l'indicatore dal grafico in alcuni buffer, non in tutti..."? In che modo, dopo la rimozione dell'indicatore dal grafico, avete accesso ai suoi buffer di indicatori?

Cerchiamo di trovare il problema nei dettagli. Hai bisogno di un set standard: codice + cosa hai fatto + cosa hai ottenuto...

 
Karputov Vladimir:

Come ve lo immaginate: "...dopo aver rimosso l'indicatore dal grafico in alcuni buffer, non in tutti..."? In che modo, dopo la rimozione dell'indicatore dal grafico, avete accesso ai suoi buffer di indicatori?

Cerchiamo di trovare il problema nei dettagli. Hai bisogno di un set standard: codice + cosa hai fatto + cosa hai ottenuto...

Pura supposizione: potrebbe entrare nella stessa area di memoria durante l'accesso al buffer attuale, che era occupata dai buffer precedenti.

Non sono entrato nella conversazione, non calciare, Alexey vuole che i dati nei buffer rimangano al riavvio (interruttore on/off del terminale) o solo quando prev_calculato = 0 (nel caso in cui prev_calculato > 0 prima)?

 
Karputov Vladimir:

Come ve lo immaginate: "...dopo aver rimosso l'indicatore dal grafico in alcuni buffer, non in tutti..."? In che modo, dopo la rimozione dell'indicatore dal grafico, avete accesso ai suoi buffer di indicatori?

Cerchiamo di trovare il problema nei dettagli. Hai bisogno di un set standard: codice + cosa hai fatto + cosa hai ottenuto...

Ecco il codice dell'indicatore

/********************************************************************\
|                                               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);
  }
//+------------------------------------------------------------------+

Posterò un video un po' più tardi, allora sarà chiaro. Non riesco a spiegarlo più chiaramente sulle mie dita di prima.


Spero che non vi dispiaccia scaricare e decomprimere il video.

Sfortunatamente, il fatto della sua rimozione dal grafico e l'attaccamento ad esso non è stato registrato, ma ha il fatto che l'indicatore è lì, poi è sparito e poi è di nuovo lì. Sta solo cancellando e riattaccando.

Fate attenzione alla finestra dei dati dopo aver reinstallato l'indicatore. Anche dopo l'inizializzazione forzata dei buffer, ci sono ancora detriti di spazio.

File:
00.zip  2614 kb
 
Alexey Viktorov:

Ecco il codice dell'indicatore

Devi fare questo esperimento: lascia aperto un solo grafico e metti e togli l'indicatore su di esso. E avete bisogno di informazioni sul terminale e sul sistema operativo (scheda log del terminale).
 
Karputov Vladimir:
Vorrei fare un esperimento: lasciare aperto un solo grafico e applicare o rimuovere l'indicatore su di esso. E avete bisogno di informazioni sul terminale e sul sistema operativo (scheda "Log" del terminale).

Cosa c'entra un grafico? Il fatto che l'indicatore sia solo su un grafico non è sufficiente?


aggiunto:

Anche se non credo che il sistema operativo possa influenzare il comportamento dell'indicatore, ecco le informazioni sul sistema e sul terminale

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:
Cosa c'entra un grafico? Il fatto che l'indicatore sia solo su un grafico non è sufficiente?
  1. Sto cercando di restringere il problema.
  2. Non ho questo problema. La mia configurazione:
    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

 

Quindi... La situazione comincia a prendere forma. Aggiungere questo codice:

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

      return(rates_total);
     }

   double bal=AccountInfoDouble(ACCOUNT_BALANCE);
 
Karputov Vladimir:
  1. Sto cercando di restringere il problema.
  2. Io non ho questo problema. La mia configurazione:
    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

Iniziato l'esecuzione, ma quando avvio l'indicatore ci sono numeri di peste in un buffer quasi in tutta la storia.

Dopo aver tolto l'indicatore e averlo rimesso dopo un po' i buffer sono vuoti.

Ripeterò la rimozione e la rimessa dentro più tardi.

 

Conclusioni preliminari:

1. Gli indicatori non possono fare affidamento sull'inizializzazione degli array di indicatori in 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. Negli indicatori è obbligatorio passare l'intero array o solo gli elementi modificati in OnCalculate().

 
Karputov Vladimir:

Quindi... La situazione comincia a prendere forma. Aggiungete del codice come questo:

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

      return(rates_total);
     }

   double bal=AccountInfoDouble(ACCOUNT_BALANCE);

Aggiunto come questo

Print("prev_calculated = ", prev_calculated);
Motivazione: