Indikator soll sich selbst entfernen, ähnlich ExpertRemove().

 

Hallo die Spezialisten,

ich möchte nach zB. einer Lizenzabfrage den Indikator überhaupt nicht laden.

Leider ist mir das bisher nicht gelungen, er bleibt leider in der Indikatorliste.

Ich frage mich nur wofür es return(INIT_FAILED); gibt. Es wird zu OnDeinit() gesprungen und der Indi lebt tot weiter.

Besonders lästig ist das, wenn er ein Subwindow aufmacht.

#property indicator_separate_window
#property indicator_plots 0

bool Valid()
{
   return(false);
}

int OnInit()
{
   if(!Valid())
      {
         Alert("Fehlermeldung und Indi sollte nicht geladen werden");
         return(INIT_FAILED);
      }
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   Print("OnDeinit ausgeführt");
}

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
{
   return(rates_total);
}

Gibts da einen Workaround ?

Grüße Otto

 

Möchte schon gerne helfen Otto, nur leider arbeite ich nicht mit Indikatoren.

 

Aber ...ist das was für dich ?

bool  ChartIndicatorDelete(
   long           chart_id,              // chart id
   int            sub_window             // number of the subwindow
   const string   indicator_shortname    // short name of the indicator
   );

 https://www.mql5.com/en/docs/chart_operations/chartindicatordelete

 

Gruß 

Documentation on MQL5: Chart Operations / ChartIndicatorDelete
Documentation on MQL5: Chart Operations / ChartIndicatorDelete
  • www.mql5.com
Chart Operations / ChartIndicatorDelete - Reference on algorithmic/automated trading language for MetaTrader 5
 

Danke für die Antwort,

habe ich bereits ausprobiert, funktioniert nicht.

Ich werde das in der DeInit() versuchen, in Verbindung mit einer boolschen Variable.

LG Otto

 

Das müsste aber funktionieren da es genau das ist was du suchst.

 Du hast sicher einen Fehler in der Umsetzung gemacht

Siehe die Zeile im Artikel über dem Code:

Example of deleting an indicator after initialization has failed:

Gruß 

 

Otto,

auch wenn ich (noch) nicht mit mt5 arbeite, ich glaube da läuft etwas durcheinander.

  1. Einen gekauften Indikator kannst Du entweder in Deinen EA laden mit iCustom(..), der erscheint nirgendwo auf dem Chart,
  2. oder Du lädst so einen Indikator auf den Chart (manuell denke ich), was spricht dagegen ihn wieder händisch zu entfernen?
  3. ChartIndicatorDelete() entfernt nur den Indikator, niemals das (Sub-) Window! Was wenn ein weitere im selben Fenster ist, was wenn es das Main-Chart wäre? Such in den Docs! Für das 'Fensterputzen' gibt es sicher auch eine Funktion, so was wie WindowDelete oder ChartClose...
 
Danke für die Hinweise, werde ich alles nachprüfen und berichten.


Heute war wieder Zwangsupdate und es gab POSITIVE Änderung. Unglaublich!
Ein Punkt der mich schon lange störte waren boolsche Werte in den Eingabemasken.
Früher erschien eine sinnlose Dropdownliste, jetzt springt der Wert, wie erwartet, einfach um.

LG Otto

 

@Christian: Danke ich hab das Beispiel nicht gesehen obwohl es so groß ist - Stress

Das 'Demo_ChartIndicatorDelete.mq5' funktioniert wie gewünscht - fertig kompiliert.

Im Debugger auch bei gesetztem Haltepunkt in der OnInit() schießt es sich durch Sonn und Mond - sprich es beendet sich sofort.

DAS KANN JA ALLES NICHT WAHR SEIN !

 

Mit dem heutigen Update hat sich mit INIT_FAILED irgendwas geändert.

   if(AccountInfoInteger(ACCOUNT_LOGIN)!=StringToInteger(LizenzNr))
      {
         PlaySound("Alert");
         MessageBox("\nIndikator Lizenz ist für Account Nr. "+LizenzNr, "Ungültige Lizenz", MB_ICONSTOP);
         return(INIT_FAILED);
      }

Gestern wurde dieser Code ordnungsgemäß ausgeführt.

Heute Fährt der Debugger drüber und beendet das Programm sofort!

METAQUOTES ihr seit WÜRSCHTELN und QUALITÄTSKONTROLLE ist FREMDWORT
UND BUGREPORT GIBTS JA NICHT

 

Ähem - was erwartest Du?

Wenn die Initialisierung fehlschlägt, soll dann doch der EA oder der Indikator ausgeführt werden? Das wäre doch viel absurder!!

Und wenn sich der EA oder Indikator sich verabschiedet beendet sich natürlich auch der Debugger!!

Eine entsprechende Meldung sollte im Journal-Tab sein.

Was vermisst Du dann noch?

 
Carl Schreiber:

Ähem - was erwartest Du?

Wenn die Initialisierung fehlschlägt, soll dann doch der EA oder der Indikator ausgeführt werden? Das wäre doch viel absurder!!

Und wenn sich der EA oder Indikator sich verabschiedet beendet sich natürlich auch der Debugger!!

Eine entsprechende Meldung sollte im Journal-Tab sein.

Was vermisst Du dann noch?

Der Debugger hat den Code auszuführen bis zu dem Punkt

return(INIT_FAILED);

Vorher werden Fehlermeldungen ausgegeben.

Bis gestern hat er das auch ordnungsgemäß getan.

Es wird dann direkt in die OnDeinit() gesprungen, was vollkommen Ok ist.

Ab heute ist das Verhalten vollkommen anders, das programm wird sofort beendet. Könnt es ja ausprobieren.

Anscheinend wird der Code 'Precompiliert' und macht dort Blödsinn

 

Jetzt läufts im Compiler aber nicht fertig compiliert. Habe blos Zeile 33/34 eingefügt

//+------------------------------------------------------------------+
//|                                    Demo_ChartIndicatorDelete.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, 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
//--- plot Histogram
#property indicator_label1  "Histogram"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      first_param=1;
input int      second_param=2;
input int      third_param=3;
input bool     wrong_init=true;
//--- indicator buffers
double         HistogramBuffer[];
string         shortname;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   int res=INIT_SUCCEEDED;
  
   if(wrong_init)
      MessageBox("\nWrong INIT", "* ERROR *", MB_ICONSTOP);

//--- Link the HistogramBuffer array to the indicator buffer
   SetIndexBuffer(0,HistogramBuffer,INDICATOR_DATA);
//--- Construct a short indicator name based on input parameters
   shortname=StringFormat("Demo_ChartIndicatorDelete(%d,%d,%d)",
                          first_param,second_param,third_param);
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- If forced completion of an indicator is set, return a non-zero value
   if(wrong_init) res=INIT_FAILED;
   return(res);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- Starting position for working in a loop
   int start=prev_calculated-1;
   if(start<0) start=0;
//--- Fill in the indicator buffer with values
   for(int i=start;i<rates_total;i++)
     {
      HistogramBuffer[i]=close[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| A handler of the Deinit event                                    |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   PrintFormat("%s: Deinitialization reason code=%d",__FUNCTION__,reason);
   if(reason==REASON_INITFAILED)
     {
      PrintFormat("An indicator with a short name %s (file %s) deletes itself from the chart",shortname,__FILE__);
      int window=ChartWindowFind();
      bool res=ChartIndicatorDelete(0,window,shortname);
      //--- Analyse the result of call of ChartIndicatorDelete()
      if(!res)
        {
         PrintFormat("Failed to delete indicator %s from window #%d. Error code %d",
                     shortname,window,GetLastError());
        }
     }
  }

Kann mir bitte das jemand erklären? Bin schon sehr verzweifelt!

Das kann nur ein Bug im Compiler sein.

Grund der Beschwerde: