Object Delete

 

Hallo,


ich versuche gerade alle Vertikalen Linien im Chart über eine Schleife zu löschen

nachdem eine Vertikale Linie ja immer den Namen "TF Vertical Line #####" bekommt, dachte ich, ich lasse die Objekte durch eine schleife laufen und schau ob im SubString das Wort "Vertical" enthalten ist

int total = ObjectsTotal(0, -1, -1);
      for(int i = 0; i<total; i++)
        {
         string name = ObjectName(0, i, -1, -1);
         if(   StringSubstr(name, 3, 8) == "Vertical"
            || StringSubstr(name, 4, 8) == "Vertical"
            )
           {
            ObjectDelete(0, name);
            Print("Object: ", name, " deleted");
           }
        }
      int subwinod = ChartWindowFind(0, "ObjectsDelete");
      ChartIndicatorDelete(0, subwinod, "ObjectsDelete");
      OnDeinit(5);
      OnInit();

      ObjectSetInteger(0, "Objects", OBJPROP_STATE, false);
     }

jetzt funktioniert das auch, aber eben nur zu 80%

zuerst dachte ich noch, das liegt an den Timeframes, da ja manche 2 und manche 3 stellig angegeben werden. Z.B H4, M30, M15, M1

das ist zwar so, aber dafür hab ich ja die 2 verschiedenen Substring mit dem unterschiedlichen beginn.

Jetzt geht die schleife einfach her, und löscht aber willkürlich.

Mal 3 aus dem H4 und 2 aus M30

mal nur die H4 oder H1

hab ich da einen Fehler drin? Wie macht Ihr das?


lg

Amando

 

Wenn Du wirklich ALLE vertikalen Linien löschen möchtest, kannst Du nicht den Objektnamen ignorieren und das über den Objekttyp lösen?

ObjectsDeleteAll(0,0,OBJ_VLINE);
 
Chris70:

Wenn Du wirklich ALLE vertikalen Linien löschen möchtest, kannst Du nicht den Objektnamen ignorieren und das über den Objekttyp lösen?

Danke, wusste nicht das ich hier gleich den Typ reinschreiben kann

 
Beiträge, die zu diesem Thema nicht gehören, wurden zu "Indikator läuft nach System-Reinstallation nicht mehr." hinzugefügt.
 
amando :

Hallo,


ich versuche gerade alle Vertikalen Linien im Chart über eine Schleife zu löschen

nachdem eine Vertikale Linie ja immer den Namen "TF Vertical Line #####" bekommt, dachte ich, ich lasse die Objekte durch eine schleife laufen und schau ob im SubString das Wort "Vertical" enthalten ist

jetzt funktioniert das auch, aber eben nur zu 80%

zuerst dachte ich noch, das liegt an den Timeframes, da ja manche 2 und manche 3 stellig angegeben werden. Z.B H4, M30, M15, M1

das ist zwar so, aber dafür hab ich ja die 2 verschiedenen Substring mit dem unterschiedlichen beginn.

Jetzt geht die schleife einfach her, und löscht aber willkürlich.

Mal 3 aus dem H4 und 2 aus M30

mal nur die H4 oder H1

hab ich da einen Fehler drin? Wie macht Ihr das?


lg

Amando

Was den Fehler in Ihrem Code betrifft, müssen Sie in Ihrer Schleife abwärts zählen.

 for ( int i = total-1 ; i>=0; i--)
 
Alain Verleyen:

Was den Fehler in Ihrem Code betrifft, müssen Sie in Ihrer Schleife abwärts zählen.

Es ist eigentlich eher bedenklich, das metaquotes es nicht schafft, schleifen in beide richtungen durchlaufen zu lassen

 
amando:

Es ist eigentlich eher bedenklich, das metaquotes es nicht schafft, schleifen in beide richtungen durchlaufen zu lassen

Schaffen sie , nur DU musst es auch programmieren.

Schleifen kannst du nur in eine Richtung programmieren.

Entweder hoch oder runter.

Aber du kannst kombinieren. Ob das Sinn macht hat steht woanders.

 

Um zu erklären, warum du runterzählen musst:


Du hohlst die am Anfang die Anzahl der Objekte.

int total = ObjectsTotal(0, -1, -1);

Jedes hat dann einen Index. 0 bis total

Sobald ein Objekt gelöscht wird, sortiert MT die liste neu und schon stimmt der Index nicht mehr.

total-1 wäre dann der letzte.

 
dazu mal eine Frage, ist das üblich, das mit jedem rauslöschen neu sortiert wird oder ist das ein spezifikum von MQL5?
 

Ich denke, dass beim Löschen eines Listenelements ..8,7,6,5,4,3,... der Zeiger von 5 auf 6 wechselt (denn 6 ist jetzt das 5. Element) und dann per Inkrement (noch einmal) erhöht wird und jetzt bei 7 steht. So kommt es dass a) 6 ausgelassen wird und am Ende der Zeiger b) auf die Liste auf das letzte Element+1 zeigt. Beim Abwärtsschreiten durch die Liste passiert das eben nicht.

Ich habe mir deswegen angewöhnt immer mit while(i-->0) durch Listen zu gehen.

 
amando:
dazu mal eine Frage, ist das üblich, das mit jedem rauslöschen neu sortiert wird oder ist das ein spezifikum von MQL5?

Das machen eigentlich alle Sprachen, wenn sie Objekte verwalten.

Speicher sparen steht da im Vordergrund.

Ich erkläre es noch mal am Beispiel Autoräder

Auto mit 4 Rädern.

Schematisch:

int total = GetAllRäder()

// total = 4
// Rad1 = Index 0
// Rad2 = Index 1
// Rad3 = Index 2
// Rad4 = Index 3


DeleteRad(Index 1)


int total = GetAllRäder()

// total = 3
// Rad1 = Index 0
// 
// Rad3 = Index 1
// Rad4 = Index 2


Wenn du jetz Rad4 löschen willst geht das nur mit Index 2 statt wie in deinem Fall mit 3

Da dein Index in der Schleife nun eins tiefer ist kannst die Rad4 löschen.

Deswegen abwäherts zählen.

Soweit verständlich ?

Grund der Beschwerde: