vorher_berechnet - Seite 4

 
Alexey Viktorov:

Vielleicht sollten sich die Entwickler mit dem Problem der Initialisierung von Indikatorpuffern befassen? Warum gibt es ein solches Problem nicht in MT4? Vielleicht ist es nicht das volle Verständnis? Das Problem ist, dass selbst nach der obligatorischen Initialisierung von Puffern, nachdem ein Indikator aus einem Diagramm in JEDEM von ihnen genommen wurde, nicht alle Puffer Müll enthalten, und Sie können ihn nicht aus ihnen herausholen...

Ich persönlich habe nichts gegen Krücken, aber nur, wenn diese Krücken nicht zu kompliziert sind und eine positive Wirkung haben. Aber in eine Datei zu schreiben und sie dann zu lesen, ist eine faule Krücke.

Wie stellen Sie sich das vor: "...nach dem Entfernen des Indikators aus dem Diagramm in einigen, nicht allen Puffern..."? Auf welche Weise haben Sie nach dem Löschen des Indikators aus dem Diagramm Zugriff auf seine Indikatorpuffer?

Lassen Sie uns versuchen, das Problem im Detail zu finden. Sie brauchen einen Standardsatz: Code + was Sie getan haben + was Sie bekommen haben...

 
Karputov Vladimir:

Wie stellen Sie sich das vor: "...nach dem Entfernen des Indikators aus dem Diagramm in einigen, nicht allen Puffern..."? Auf welche Weise haben Sie nach dem Entfernen des Indikators aus dem Diagramm Zugang zu seinen Indikatorpuffern?

Lassen Sie uns versuchen, das Problem im Detail zu finden. Sie brauchen einen Standardsatz: Code + was Sie getan haben + was Sie bekommen haben...

Reine Vermutung: Es kann sein, dass er beim aktuellen Pufferzugriff in denselben Speicherbereich gelangt, der von den vorherigen Puffern belegt war.

Ich habe nicht in das Gespräch, nicht treten, Alexey will die Daten in Puffern zu bleiben bei Neustart (on / off-Schalter des Terminals) oder nur, wenn prev_calculated = 0 (im Falle, wenn prev_calculated > 0 früher)?

 
Karputov Vladimir:

Wie stellen Sie sich das vor: "...nach dem Entfernen des Indikators aus dem Diagramm in einigen, nicht allen Puffern..."? Auf welche Weise haben Sie nach dem Entfernen des Indikators aus dem Diagramm Zugang zu seinen Indikatorpuffern?

Lassen Sie uns versuchen, das Problem im Detail zu finden. Sie brauchen einen Standardsatz: Code + was Sie getan haben + was Sie bekommen haben...

Hier ist der Code des Indikators

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

Ich werde später ein Video posten, dann wird es klar sein. Ich kann es auf meinen Fingern nicht besser erklären als vorher.


Ich hoffe, es macht Ihnen nichts aus, das Video herunterzuladen und zu entpacken.

Leider wurde die Tatsache, dass der Indikator aus dem Diagramm entfernt und an das Diagramm angehängt wurde, nicht aufgezeichnet, aber es gibt die Tatsache, dass der Indikator da ist, dann ist er weg und dann ist er wieder da. Es wird einfach gelöscht und wieder angehängt.

Achten Sie nach der Neuinstallation des Indikators auf das Datenfenster. Selbst nach der erzwungenen Initialisierung von Puffern gibt es dort immer noch Platzreste.

Dateien:
00.zip  2614 kb
 
Alexey Viktorov:

Hier ist der Code für den Indikator

Machen Sie dieses Experiment: Lassen Sie nur ein Diagramm offen und setzen und entfernen Sie den Indikator darauf. Und Sie benötigen Informationen über das Terminal und das Betriebssystem (Registerkarte Log des Terminals).
 
Karputov Vladimir:
Ich möchte ein Experiment machen: Lassen Sie nur ein Diagramm offen und verwenden Sie es, um den Indikator zu setzen und zu entfernen. Und Sie benötigen Informationen über das Terminal und das Betriebssystem (Registerkarte "Log" des Terminals).

Was hat eine Karte damit zu tun? Die Tatsache, dass der Indikator nur in einem Diagramm angezeigt wird, reicht nicht aus?


hinzugefügt:

Obwohl ich nicht glaube, dass das Betriebssystem das Verhalten des Indikators beeinflussen kann, finden Sie hier Informationen über das System und das 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:
Was hat eine Karte damit zu tun? Reicht es nicht aus, dass der Indikator nur in einem Diagramm angezeigt wird?
  1. Ich versuche, das Problem einzugrenzen.
  2. Ich habe kein solches Problem. Meine Konfiguration:
    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

 

Also... Die Situation nimmt allmählich Gestalt an. Fügen Sie diesen Code hinzu:

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

      return(rates_total);
     }

   double bal=AccountInfoDouble(ACCOUNT_BALANCE);
 
Karputov Vladimir:
  1. Ich versuche, das Problem einzugrenzen.
  2. Ich habe dieses Problem nicht. Meine Konfiguration:
    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

Ich habe mit der Ausführung begonnen, aber wenn ich den Indikator starte, befinden sich in einem Puffer fast überall in der Geschichte Pestnummern.

Nach dem Herausnehmen des Indikators und dem Wiedereinsetzen nach einer Weile sind die Puffer leer.

Ich werde den Aus- und Einbau später wiederholen.

 

Vorläufige Schlussfolgerungen:

1. Indikatoren können sich nicht auf die Initialisierung von Indikator-Arrays in OnInit() verlassen:

//+------------------------------------------------------------------+
//| 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. Bei Indikatoren ist es obligatorisch, das gesamte Array oder nur geänderte Elemente in OnCalculate() zu durchlaufen.

 
Karputov Vladimir:

Also... Die Situation nimmt allmählich Gestalt an. Fügen Sie den folgenden Code hinzu:

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

      return(rates_total);
     }

   double bal=AccountInfoDouble(ACCOUNT_BALANCE);

So hinzugefügt

Print("prev_calculated = ", prev_calculated);
Grund der Beschwerde: