Object Delete

Einloggen oder registrieren, um einen Kommentar zu schreiben
amando
2260
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

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

Chris70
647
Chris70  

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);
amando
2260
amando  
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

Carl Schreiber
Moderator
8851
Carl Schreiber  
Beiträge, die zu diesem Thema nicht gehören, wurden zu "Indikator läuft nach System-Reinstallation nicht mehr." hinzugefügt.
Alain Verleyen
38696
Alain Verleyen  
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--)
amando
2260
amando  
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

Christian
2895
Christian  
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.

Christian
2895
Christian  

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.

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

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.

Christian
2895
Christian  
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 ?

12
Einloggen oder registrieren, um einen Kommentar zu schreiben