Möchte schon gerne helfen Otto, nur leider arbeite ich nicht mit Indikatoren.
Aber ...ist das was für dich ?
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ß
- www.mql5.com
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.
- Einen gekauften Indikator kannst Du entweder in Deinen EA laden mit iCustom(..), der erscheint nirgendwo auf dem Chart,
- oder Du lädst so einen Indikator auf den Chart (manuell denke ich), was spricht dagegen ihn wieder händisch zu entfernen?
- 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...
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.
{
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?
Ä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
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.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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_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