prev_calculé - page 4

 
Alexey Viktorov:

Peut-être les développeurs devraient-ils prêter attention au problème de l'initialisation des tampons indicateurs ? Pourquoi ce problème n'existe-t-il pas dans MT4 ? Peut-être que ce n'est pas la compréhension totale ? Le problème est que, même après l'initialisation obligatoire des tampons après avoir retiré un indicateur d'un graphique dans CHACUN d'entre eux, tous les tampons contiennent des déchets et vous ne pouvez pas les sortir de là...

Personnellement, je n'ai rien contre les béquilles, mais seulement si ces béquilles ne sont pas trop compliquées et si elles ont un effet positif. Mais écrire dans un fichier et le lire ensuite est une béquille minable.

Comment l'imaginez-vous : "...après avoir retiré l'indicateur du graphique dans certains tampons, mais pas tous..."? De quelle manière, après la suppression de l'indicateur du graphique, avez-vous accès à ses tampons d'indicateurs?

Essayons de trouver le problème en détail. Vous avez besoin d'un ensemble standard : code + ce que vous avez fait + ce que vous avez obtenu...

 
Karputov Vladimir:

Comment l'imaginez-vous : "...après avoir retiré l'indicateur du graphique dans certains tampons, mais pas tous..."? De quelle manière, après la suppression de l'indicateur du graphique, avez-vous accès à ses tampons d'indicateurs?

Essayons de trouver le problème en détail. Vous avez besoin d'un ensemble standard : code + ce que vous avez fait + ce que vous avez obtenu...

Pure supposition : il se peut qu'il entre dans la même zone de mémoire pendant l'accès au tampon actuel, qui était occupée par les tampons précédents.

Je ne suis pas entré dans la conversation, ne kickez pas, Alexey veut que les données dans les buffers restent au redémarrage (interrupteur on/off du terminal) ou seulement quand prev_calculated = 0 (dans le cas où prev_calculated > 0 plus tôt) ?

 
Karputov Vladimir:

Comment l'imaginez-vous : "...après avoir retiré l'indicateur du graphique dans certains tampons, mais pas tous..."? De quelle manière, après avoir supprimé l'indicateur du graphique, avez-vous accès à ses tampons d'indicateur?

Essayons de trouver le problème en détail. Vous avez besoin d'un ensemble standard : code + ce que vous avez fait + ce que vous avez obtenu...

Voici le code de l'indicateur

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

Je posterai une vidéo un peu plus tard, ce sera plus clair alors. Je ne peux pas l'expliquer plus clairement sur mes doigts qu'avant.


J'espère que cela ne vous dérangera pas de télécharger et de décompresser la vidéo.

Malheureusement, le fait de le retirer du graphique et de l'y attacher n'a pas été enregistré, mais il y a le fait que l'indicateur est là, puis il disparaît et ensuite il est de nouveau là. Il suffit de l'effacer et de le rattacher.

Faites attention à la fenêtre de données après avoir réinstallé l'indicateur. Même après une initialisation forcée des tampons, il y a encore des débris d'espace.

Dossiers :
00.zip  2614 kb
 
Alexey Viktorov:

Voici le code de l'indicateur

Vous devez faire cette expérience : laissez un seul graphique ouvert et mettez et enlevez l'indicateur sur celui-ci. Et vous avez besoin d'informations sur le terminal et le système d'exploitation (onglet "log" du terminal).
 
Karputov Vladimir:
J'aimerais faire une expérience : laisser un seul graphique ouvert et appliquer ou supprimer un indicateur sur celui-ci. Et vous avez besoin d'informations sur le terminal et le système d'exploitation (onglet "Log" du terminal).

Qu'est-ce qu'une carte a à voir avec ça ? Le fait que l'indicateur ne figure que sur un seul graphique n'est pas suffisant ?


ajouté :

Bien que je ne pense pas que le système d'exploitation puisse affecter le comportement de l'indicateur, voici des informations sur le système et le 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'est-ce qu'une carte a à voir avec ça ? Le fait que l'indicateur ne figure que sur un seul graphique n'est-il pas suffisant ?
  1. J'essaie de circonscrire le problème.
  2. Je n'ai pas ce genre de problème. Ma configuration :
    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

 

Alors... La situation commence à prendre forme. Ajoutez ce code :

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

      return(rates_total);
     }

   double bal=AccountInfoDouble(ACCOUNT_BALANCE);
 
Karputov Vladimir:
  1. J'essaie de circonscrire le problème.
  2. Je n'ai pas ce problème. Ma configuration :
    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

J'ai commencé à exécuter, mais quand je lance l'indicateur, il y a des numéros de peste dans un tampon presque partout dans l'histoire.

Après avoir retiré l'indicateur et l'avoir remis en place après un certain temps, les tampons sont vides.

Je répéterai l'opération de retrait et de remise en place plus tard.

 

Conclusions préliminaires :

1. Les indicateurs ne peuvent pas compter sur l'initialisation des tableaux d'indicateurs dans 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. Dans les indicateurs, il est obligatoire de passer par le tableau entier ou seulement les éléments modifiés dans OnCalculate().

 
Karputov Vladimir:

Alors... La situation commence à prendre forme. Ajoutez un code comme celui-ci :

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

      return(rates_total);
     }

   double bal=AccountInfoDouble(ACCOUNT_BALANCE);

Ajouté comme ceci

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