vorher_berechnet - Seite 2

 
Alexey Kozitsyn:
Wie wäre es, den gesamten Indikator bei 0 neu zu berechnen? Das scheint mir die beste Lösung zu sein.
Für einen schweren Indikator mit vielen Grafiken - nicht das Beste. Nein, die Lösung ist einfach - verwenden Sie Ihre eigene Variable anstelle von prev_calculated, static oder global. Aber es ist eine Krücke und wir wollen etwas anderes.
 
Alexey Kozitsyn:
:) Das ist es, was ich tue...
Das habe ich auch so verstanden, ich habe nur Ihre Frage zitiert, aber eigentlich habe ichAlexander Puzanov geantwortet. :)
 
Alexander Puzanov:
Für einen schweren Indikator mit vielen Grafiken ist das nicht die beste Lösung. Die Lösung ist einfach - verwenden Sie Ihre eigene Variable anstelle von prev_calculated, static oder global. Aber es ist eine Krücke und wir wollen etwas anderes.

Eine Person, die das Wort "Krücke" benutzt:

  • entweder zu faul ist, die Dokumentation zu lesen
  • oder weiß noch nicht, wie es richtig sein soll.
Die einzig richtige Lösung: bei prev_calculate==0 den Indikator neu berechnen.

 
Alexander Puzanov:
Für einen schweren Indikator mit vielen Grafiken - nicht das Beste. Nein, die Lösung ist einfach - eigene Variable anstelle von prev_calculated, statisch oder global zu verwenden. Aber es ist eine Krücke und wir wollen etwas anderes.
Überhaupt keine Krücke. So mache ich das.
 
Karputov Vladimir:
Und wenn die Historie vertauscht wurde, kann es neue Balken geben, die übersehen oder nicht berechnet wurden, d. h. die Indikatorwerte sind bereits falsch.

Slawa:

Wenn prev_calculated=0 ist, bedeutet dies, dass eine vollständige Neuberechnung durchgeführt werden muss. Alle Standardindikatoren werden in diesem Fall vollständig neu berechnet.

Es ist alles klar, aber leider wird das alles nicht aufgehoben:

Alexander Puzanow:

Das ist alles nützlich, aber es kann nicht entsprechend seinem direkten Zweck verwendet werden - um zu zeigen, wie viele "Balken beim vorherigen Aufruf verarbeitet wurden" - prev_calculated

Einige brauchen überhaupt keine Balken für Berechnungen, andere brauchen nur Live-Ticks, wieder andere haben Einschränkungen bei der Konvertierungstiefe - ihnen ist es egal, was sich als nächstes in der Historie geändert hat, wieder andere müssen grafische Objekte verfolgen usw. Sie brauchen keine zusätzlichen Funktionen, um Änderungen in der Historie zu verfolgen, die an prev_calculated angehängt sind, sie brauchen nur dies - "verarbeitete Balken beim vorherigen Aufruf". Sie brauchen es nicht.

Wie dem auch sei, Herr Programmierer, bitte lenken Sie die Teilnehmer nicht davon ab, "das Ereignis zu erfassen".

 
Alexey Kozitsyn:
Wie wäre es, wenn ich einfach den gesamten Indikator bei 0 neu berechne? Meiner Meinung nach ist das die beste Lösung.

Ich würde nicht sagen, dass das die beste Lösung ist. Zumindest noch nicht.

Ich habe beschlossen, einen Indikator zu schreiben, der den aktuellen Drawdown auf dem Konto registriert, damit ich nichts in der Historie neu berechnen muss. Die erste Zeile sah anfangs so aus.

if(prev_calculated == 0)  return(rates_total);
Aber nach dem Start habe ich festgestellt, dass die Puffer nicht leer und nicht auf Null gesetzt sind. Es gibt einen Preis in den Puffern unbekannter Herkunft. Ich musste die Puffer auf Null setzen... Dann wurde ein weiteres Problem entdeckt. Der prev_calculate wird auf Null gesetzt und der Indikator wird neu berechnet, wobei alle Puffer bis zum letzten Takt auf Null gesetzt werden. Wie auch immer, ich habe die Idee vorerst aufgegeben.
 
Alexey Viktorov:

Ich würde nicht sagen, dass das die beste Lösung ist. Zumindest noch nicht.

Ich habe beschlossen, einen Indikator zu schreiben, der den aktuellen Drawdown auf dem Konto registriert, damit ich nichts in der Historie neu berechnen muss. Zunächst sah die erste Zeile wie folgt aus.

if(prev_calculated == 0)  return(rates_total);
Aber nach dem Start habe ich festgestellt, dass die Puffer nicht leer und nicht auf Null gesetzt sind. Es gibt einen Preis in den Puffern, von dem ich nicht weiß, woher er kommt. Ich musste die Puffer auf Null setzen... Dann wurde ein weiteres Problem entdeckt. Der prev_calculate wird auf Null gesetzt und der Indikator wird neu berechnet, wobei alle Puffer bis zum letzten Takt auf Null gesetzt werden. Wie auch immer, ich habe die Idee vorerst aufgegeben.

"... ein Preis, von dem ich nicht weiß, woher er stammt... " - das ist Unsinn von UNINITIALISIERTEN Elementen des Indikatorpuffer-Arrays. Was sollte getan werden?

  • bei prev_calculate==0 alle Elemente des Indikatorpuffers in der Schleife durchgehen und ihnen Werte zuweisen. In diesem Fall müssen Sie die Situation überwachen, wenn ein neuer Balken erscheint (rates_total minus prev_calculate wird größer als Null sein) - der Indikatorpuffer erhöht sich entsprechend und dieses neue Element sollte ebenfalls initialisiert werden.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Alexey Viktorov, 2016.10.17 09:58

Haben Sie verstanden, was Sie geschrieben haben?

Erklären Sie besser, wie man den Müll loswird ERSTER Lauf des Indikators. Woher kommt dieser Unsinn? Sollte es nicht eine Initialisierung geben, wenn der Puffer mit dem Array verknüpft wird, oder kommt während der Initialisierung der Speicherplatzmüll in das Array? Warum gibt es keinen solchen Müll in mql4?

Geben Sie mir ein Beispiel dafür, wie man den Müll von den normalen Werten trennt, ohne zusätzliche statische oder globale Variablen zu verwenden.

Jeder ist gut genug, um die Dokumentation zu zitieren.


 

Niemand ist jemandem etwas schuldig. Nach dem Binden befindet sich also Müll im Indikatorpuffer, bis Sie alle Elemente des Arrays selbst initialisiert haben.

Hinzugefügt:

Ich werde jetzt ein Beispiel erstellen...

//+------------------------------------------------------------------+
//|                                              prev_calculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGray
#property indicator_label1  "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer,INDICATOR_DATA);
//---
   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)
     {
      //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
      for(int i=0;i<rates_total;i++)
         ExtBuffer[i]=1.01;
      return(rates_total);
     }
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
   int limit=rates_total-prev_calculated+1;
   for(int i=rates_total-limit;i<rates_total;i++)
     {
      //--- визуализация пересчёта самого правого бара
      static bool drive=false;
      if(!drive)
         ExtBuffer[i]=1.03;
      else
         ExtBuffer[i]=1.02;
      drive=!drive;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Führen Sie es auf M1 aus. Sie werden sehen, dass nur der Balken ganz rechts neu berechnet wird.
Dateien:
 
Karputov Vladimir:

Niemand ist jemandem etwas schuldig. Nach dem Binden befindet sich also Müll im Indikatorpuffer, bis Sie alle Elemente des Arrays selbst initialisiert haben.

Hinzugefügt:

Ich werde jetzt ein Beispiel erstellen...

//+------------------------------------------------------------------+
//|                                              prev_calculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGray
#property indicator_label1  "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer,INDICATOR_DATA);
//---
   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)
     {
      //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
      for(int i=0;i<rates_total;i++)
         ExtBuffer[i]=1.01;
      return(rates_total);
     }
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
   int limit=rates_total-prev_calculated+1;
   for(int i=rates_total-limit;i<rates_total;i++)
     {
      //--- визуализация пересчёта самого правого бара
      static bool drive=false;
      if(!drive)
         ExtBuffer[i]=1.03;
      else
         ExtBuffer[i]=1.02;
      drive=!drive;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Führen Sie es auf M1 aus. Sie werden sehen, dass nur der Balken ganz rechts neu berechnet wird.

Erstaunliche Fähigkeit, die falsche Frage zu beantworten...

Nun erklären Sie mir, was passiert, wenn:

1. Gezählte 100 Balken, eingetragen in Puffer von 0 bis einschließlich 99 (betrachten wir die Richtung als Zeitreihe) Wert 1.03

2. Plötzlich wird der Verlauf geladen und prev_calculated wird zu 0

Ab welchem Takt wird es 1,03 sein?