Der Wechsel der TF ist ein Problem - Seite 3

 
Vasyl Nosal:

Ich habe eine Idee. Ich schreibe später.

die Idee ist tot.

Ich werde die Entwickler bitten, so etwas wie ein HistoryUpdated()-System zu entwickeln, das prüft, ob der gesamte Verlauf aktualisiert wurde oder nicht.

Eine optimale Variante. Um die Historie für alle Zeiträume auf dem neuesten Stand zu halten. Vor kurzem ist ein ähnlicher Indikator in CodeBase erschienen
 
Slawa:

Die Entwickler werden Ihnen nicht helfen, weil sie es nicht wollen.

Wie gesagt: wenn die Differenz zwischen rates_total und prev_calculated größer als 1 ist, dann ist es historyUpdated

größer als 0 ist, nicht 1.

И? Ist damit das Problem gelöst?

Oder ist es für Sie kein Problem, die ganze Geschichte bei jedem neuen Takt neu zu berechnen?

 
Vasyl Nosal:

größer als 0 ist, nicht 1.

И? Ist damit das Problem gelöst?

Oder ist es für Sie kein Problem, die ganze Geschichte bei jedem neuen Takt neu zu berechnen?

Sie wurden richtig informiert. Größer als 1. Wenn ein neuer Balken erscheint, ist die Differenz 1.

Und damit ist das Problem vollständig gelöst.

Ein normaler Indikator benötigt nur sehr wenig Zeit für eine vollständige Neuberechnung. Weniger als eine Sekunde.

 
Victor Nikolaev:

Sie wurden richtig informiert. Mehr als 1. Wenn ein neuer Balken erscheint, ist die Differenz 1.

Und damit ist das Problem vollständig gelöst.

Ein normaler Indikator braucht nur sehr wenig Zeit, um sich vollständig neu zu berechnen. Weniger als eine Sekunde.

Funktioniert nur, wenn die Puffer auf Null gesetzt sind.

//history update
  int all=rates_total;
  int counted=prev_calculated;
  if(all-counted>1)
  { 
  ArrayInitialize(up_arr,EMPTY_VALUE);
  ArrayInitialize(down_arr,EMPTY_VALUE);
  counted=0;
  }
   
   //main
 for(int i=all-counted;i>=0;i--)
{
 
Vasyl Nosal:

Es funktioniert nur, wenn Sie die Puffer auf Null zurücksetzen.

//history update
  int all=rates_total;
  int counted=prev_calculated;
  if(all-counted>1)
  { 
  ArrayInitialize(up_arr,EMPTY_VALUE);
  ArrayInitialize(down_arr,EMPTY_VALUE);
  counted=0;
  }
   
   //main
 for(int i=all-counted;i>=0;i--)
{

Tut mir leid, aber ich muss fragen:

  • Warum müssen Sie rates_total und prev_calculated separaten Variablen zuweisen, die bei jedem Häkchen erstellt werden?
  • Müssen Sie in der bedingten if()-Anweisung und in der for()-Schleife die Differenz dieser Variablen neu berechnen?
  • warum nicht einfach eine Variable für die Differenz zwischen rates_total und prev_calculated einführen, z. B. limit?
Die Umsetzung kann je nach Aufgabe unterschiedlich ausfallen. Die Nuancen können unterschiedlich sein. Schauen Sie sich doch einmal an, was andere je nach den unterschiedlichen Bedingungen umgesetzt haben. Einschließlich, und mit Hilfe von Priming zu verstehen, zu entscheiden, bilden akzeptable Varianten für sich selbst, je nach den Aufgaben?
 
Vasyl Nosal:

P.S. Ich werde dem noch mehr hinzufügen:

Ihre Idee der Nullsetzung (counted=0) im Block des bedingten Operators if(){} scheint mir klar zu sein.

Nur für den Fall, dass es Ihnen klarer wird, was ich oben kurz meinte, hier ein Auszug aus der Dokumentation, aus dem Abschnitt ... Grundlagen der Sprache / Funktionen / Funktionen zur Ereignisbehandlung:

... Wenn seit dem letzten Aufruf von OnCalculate() Preisdaten geändert wurden (eine tiefere Historie wurde gepumpt oder Historienlücken wurden gefüllt), dann wird der Wert des Eingabeparameters prev_calculated vom Terminal selbst auf Null gesetzt.

 
Vasyl Nosal:

Es funktioniert nur, wenn Sie die Puffer auf Null zurücksetzen.

Sie müssen nichts zurücksetzen.

int OnCalculate(...)
{
   // индекс последнего посчитанного на прошлом вызове бара
   // с которого начинаем расчёт
   int nStartBar = rates_total - MathMax(prev_calculated, 1);

   for(int i = nStartBar; i >= 0; i--)
   {
       // рассчитываем индикатор на всех непосчитанных барах
   }
}

Wenn Sie prev_caclulated auf Null setzen, wird der Indikator vollständig neu berechnet. Und das ist richtig - Sie wissen nicht, was genau sich in der Geschichte verändert hat. Vielleicht wurde ein Loch geladen, vielleicht wurden die Stollen irgendwo gereinigt. Eine vollständige Neuberechnung ist obligatorisch. In allen anderen Fällen wird nur ein letzter Balken neu berechnet (wennein neuer Balken erscheint, die letzten beiden).

 
Dina Paches:

Tut mir leid, aber ich muss fragen:

  • Warum müssen Sie die Werte von rates_total und prev_calculated bei jedem Tick separaten Variablen zuweisen?
  • Berechnen Sie in der bedingten if()-Anweisung und in der for()-Schleife die Differenz dieser Variablen neu?
  • warum nicht einfach eine Variable für die Differenz zwischen rates_total und prev_calculated eingeben, z.B. limit?
Die Umsetzung kann je nach Aufgabe unterschiedlich sein. Die Nuancen können unterschiedlich sein. Warum sehen Sie nicht, wie sie von anderen umgesetzt wird, je nach den unterschiedlichen Bedingungen? Inklusive, und mit Hilfe von Priming zu verstehen, entscheiden, bilden akzeptable Varianten für sich selbst, je nach Aufgabenstellung?

Ich danke Ihnen. Gutes Argument.

Das ist es nicht. So können Sie den gesamten Verlauf neu berechnen, wenn es eine Lücke gibt.

 
Dina Paches:

P.S. Ich werde dem noch mehr hinzufügen:

Ihre Idee der Nullsetzung (counted=0) im Block des bedingten Operators if(){} scheint mir klar zu sein.

Nur für den Fall, dass es Ihnen klarer wird, was ich oben kurz meinte, hier ein Auszug aus der Dokumentation, aus dem Abschnitt ... Grundlagen der Sprache / Funktionen / Funktionen zur Ereignisbehandlung:

... Wenn seit dem letzten Aufruf von OnCalculate() Preisdaten geändert wurden (eine tiefere Historie wurde gepumpt oder Historienlücken wurden gefüllt), dann wird der Wert des Eingabeparameters prev_calculated vom Terminal selbst auf Null gesetzt.

Das wird es nicht. Es ist 0, dann nicht 0 und dann wieder 0 (wenn die Historie ein paar Mal geladen wird).
 
Sergei Vladimirov:

Es ist nicht nötig, etwas zurückzusetzen.

Wenn Sie prev_caclulated auf Null setzen, wird der Indikator vollständig neu berechnet. Und das ist richtig - Sie wissen nicht, was genau sich in der Geschichte verändert hat. Vielleicht wurde ein Loch geladen, vielleicht wurden die Stollen irgendwo gereinigt. Eine vollständige Neuberechnung ist obligatorisch. In allen anderen Fällen wird nur ein letzter Balken neu berechnet (wennein neuer Balken erscheint, die letzten beiden).

Nein. Ohne Nullstellung wird das sein, was die Screenshots zeigen.