Einzelnen Beitrag anzeigen
  #2 (permalink)  
Alt 09.10.22
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard

Code:
#property indicator_minimum 0
#property indicator_maximum 100
... sind nur für Indikatoren in einem Unterfenster, im Chart macht das keinen Sinn (alles Mögliche hat schließlich Werte, die weit über 100 hinaus gehen).

_HighestCandle und _LowestCandle geben Dir die Nummer der Kerze an, die den Höchst- und Tiefstwert haben.
Die Prozent willst Du aber nicht von den Kerzennummern wissen, sondern vom Abstand Höchst zu Tiefst. Also:
Code:
      ////double _Range = (_HighestCandle - _LowestCandle);
      double _Range = (bufferGanzOben[i] - bufferGanzUnten[i]);
      double _EinProz = (_Range / 100);
      double _Prozent = (_EinProz * Prozent);
      //Print(__FUNCTION__,
      //      " _Range=",DoubleToStr(_Range,_Digits),
      //      " _EinProz=",DoubleToStr(_EinProz,_Digits),
      //      " _Prozent=",DoubleToStr(_Prozent,_Digits)
      //     );
Die Höchst- und Tiefstwerte hast Du schon in Buffern gespeichert, dann kannst Du die Bufferwerte auch zum Weiterrechnen nehmen.
Diese Zeilen sind gleich, also überflüssig:
Code:
      int _HighestCandle = iHighest(Symbol(), PERIOD_CURRENT, MODE_HIGH, _CandlesOnChart, 0);
      int _HighCandle    = iHighest(Symbol(), PERIOD_CURRENT, MODE_HIGH, _CandlesOnChart, 0);

      int _LowestCandle = iLowest(Symbol(), PERIOD_CURRENT, MODE_LOW, _CandlesOnChart, 0);
      int _LowCandle    = iLowest(Symbol(), PERIOD_CURRENT, MODE_LOW, _CandlesOnChart, 0);
Also:
Code:
      ////int _HighCandle = iHighest(Symbol(), PERIOD_CURRENT, MODE_HIGH, _CandlesOnChart, 0);
      ////bufferObenMinAbstand[i] = High[_HighCandle] + _Prozent;
      ////int _LowCandle = iLowest(Symbol(), PERIOD_CURRENT, MODE_LOW, _CandlesOnChart, 0);
      ////bufferUntenPlAbstand[i] = Low[_LowCandle] - _Prozent;
      bufferObenMinAbstand[i] = bufferGanzOben[i] - _Prozent;
      bufferUntenPlAbstand[i] = bufferGanzUnten[i] + _Prozent;
Noch etwas, wenn der Indikator entfernt wird, bleibt Dein Text stehen. Aber wer den Raum verläßt, sollte kein Chaos hinterlassen. Also fehlt ein OnDeinit. Dazu mußt Du Deinen Objekten ein eindeutiges Präfix geben, damit wirklich nur die Hinterlassenschaften dieses Indikators entfernt werden und nicht in einem Rundumschlag alles, was ein Objekt ist. Also:
Code:
double bufferUntenPlAbstand[];
string PFX="MeinIndi_";        //Präfix für all unsere Objekte
//+-------------------------------------------------------------------------------   OnInit Funktion   ---+

//+-------------------------------------------------------------------------------  OnDeinit Funktion  ---+
//+-------------------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // === delete all created objects with our indicator name in it
   for(int i=0; i<ObjectsTotal(); i++)
   {
      string obj_name=ObjectName(i);
      if( StringFind(obj_name,PFX,0)==0 )        //Objekt beginnt mit PFX
         ObjectDelete(obj_name);
   }
   
}
und dann in OnCalculate alle "Display" durch PFX+"Display" ersetzen.

Und noch was: Du hast eine Benutzereingabe, die wahrscheinlich festlegen soll, über wie viele Kerzen die Höchst- und Tiefstwerte ermittelt werden. In Deiner Berechnung nimmst Du aber nur die im Chart sichtbaren Kerzen. Darüber solltest Du nachdenken.

Bei mir wird alles korrekt in Dax, EurUsd angezeigt.
Das war's erst mal. Hoffe, das hilft Dir weiter.
AVT