Fragen Sie! - Seite 21

 
billworld2:
Gibt es eine Möglichkeit, Objekte auf der Grundlage einer ausgewählten Textzeichenfolge innerhalb des Objektnamens zu löschen?

Hier ist das Beispiel:

datetime currentDay = StrToTime(Year()+". "+Month()+". "+Day()+" 00.00");

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i);

if( ObjectGet(name,OBJPROP_TIME1) < currentDay && ObjectGet(name,OBJPROP_TIME2) < currentDay && ObjectGet(name,OBJPROP_TIME3) < currentDay)

{

ObjectDelete(ObjectName(i));

return (false);

}

}

return(true);

 
billworld2:
Eines meiner Lernprojekte ist über die Anpassung der tester.tpl, die die Chart-Anzeige-Option für die Strategie-Tester regelt gehen. Ich finde den Standard-Diagrammstil sehr schwierig zu visualisieren. Also habe ich eine neue Vorlage erstellt und dann ein Skript entwickelt, das alle Pfeile durch attraktivere Pfeile ersetzt.

Ich möchte jedoch auch Informationen in den Pfeilnamen erfassen und diese als Text im Diagramm anzeigen. Die Pfeilnamen enthalten Informationen wie "#62 buy" oder "73 sell close". Auf diese Weise kann man sich den Chart ansehen und genau erkennen, wann ein bestimmter Trade # eingegeben/verlassen wurde. Ich weiß nicht, warum dies nicht standardmäßig im Strategy Tester enthalten ist, wie es bei anderen Plattformen (z. B. TradeStation) der Fall ist.

Wie auch immer, ich möchte den fraglichen Text erfassen und neue Textobjekte direkt unter den vorhandenen Pfeilen im Diagramm einfügen. Aber ich finde nicht heraus, wie ich das erreichen kann.

Wie kann ich dies tun?

Danke

Bill

Nun, Sie können ein Skript oder eine Funktion schreiben, die die Pfeilinformationen liest und eine Textbeschriftung darunter erstellt. Dann führen Sie das Skript jedes Mal, wenn ein neuer Pfeil gezeichnet wird. Oder platzieren Sie einfach die Funktion am Ende der Hauptfunktion des ea. Ich weiß nicht, warum diese Info ist nicht Standard in Metatrader, aber es ist einfach, diese Art von Funktionalität Code.

 
Kalenzo:
Sie sollten sich über die Datums- und Zeitfunktionen informieren und die Funktion iBarShift verwenden, um die Verschiebung des ersten Balkens des angegebenen Monats im angegebenen Zeitrahmen zu ermitteln.

Ich weiß, dass es für Sie trivial sein muss. Ich verstehe es nur noch nicht, wenn ich der begrenzten Dokumentation folge (es gibt nicht viele Beispiele). Könnten Sie mir bitte ein Beispiel geben, wie man das macht?

Vielen Dank

Bill

 
Kalenzo:
Nun, Sie können ein Skript oder eine Funktion schreiben, die die Pfeilinformationen liest und ein Textetikett darunter anlegt. Dann führen Sie das Skript jedes Mal aus, wenn ein neuer Pfeil gezeichnet wird. Oder platzieren Sie einfach die Funktion am Ende der Hauptfunktion des ea. Ich weiß nicht, warum diese Info ist nicht Standard in Metatrader, aber es ist einfach, diese Art von Funktionalität Code.

Danke, aber ich weiß nicht genau, wie ich das Skript codieren soll. Wenn Sie Zeit haben, ein kurzes Beispiel zu geben, wäre ich Ihnen sehr dankbar.

Nochmals vielen Dank.

Bill

 

Nicht sicher, dass ich folgen. Um klar zu sein, ich bin auf der Suche nach einer Möglichkeit, eine Sub-String-Match auf der Grundlage eines Objektnamens zu tun. Nehmen wir an, ich habe eine Gruppe von Objekten mit der Zeichenfolge "-206" (zusammen mit anderem Text). Ich möchte alle Objekte finden und löschen, die "-206" in ihrem Namen enthalten.

Was mich im folgenden Beispiel verwirrt, ist die Verknüpfung mit OBJPROP_TIME1, OBJPROP_TIME2 und OBJPROP_TIME3. Ich weiß, dass Objekte bis zu drei Zeitkoordinaten haben können. Ich verstehe nicht, wie das zu dem passt, was ich zu tun versuche.

Kalenzo:
Hier ist das Beispiel:

datetime currentDay = StrToTime(Jahr()+". "+Monat()+". "+Tag()+" 00.00");

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i);

if( ObjectGet(name,OBJPROP_TIME1) < currentDay && ObjectGet(name,OBJPROP_TIME2) < currentDay && ObjectGet(name,OBJPROP_TIME3) < currentDay)

{

ObjectDelete(ObjectName(i));

return (false);

}

}

return(true);
 
billworld2:
Ich bin nicht sicher, ob ich folgen kann. Um das klarzustellen, suche ich nach einer Möglichkeit, einen Sub-String-Abgleich auf der Grundlage eines Objektnamens durchzuführen. Nehmen wir an, ich habe eine Gruppe von Objekten mit der Zeichenfolge "-206" (zusammen mit anderem Text). Ich möchte alle Objekte finden und löschen, die "-206" in ihrem Namen enthalten. Was mich im folgenden Beispiel verwirrt, ist die Verknüpfung mit OBJPROP_TIME1, OBJPROP_TIME2 und OBJPROP_TIME3. Ich weiß, dass Objekte bis zu drei Zeitkoordinaten haben können. Ich verstehe nicht, wie das zu dem passt, was ich zu tun versuche.

Ok, versuchen Sie dies:

for(int i=0;i<ObjectsTotal();i++)

{

string name = Objektname(i);

if(StringSubstr( name, 0, 3)==206)

{

ObjectDelete(ObjectName(i));

}

}

Wenn die ersten 3 Buchstaben des Objektnamens 206 sind, wird das Objekt gelöscht.

 
billworld2:
Danke, aber ich weiß nicht genau, wie ich das Skript programmieren soll. Wenn Sie Zeit haben, ein kurzes Beispiel zu geben, wäre ich Ihnen sehr dankbar.

Nochmals vielen Dank.

Bill

zuerst deklarieren globale Variable (global für das Skript) int objectCount;

dann am Ende der ea alle Objekte verarbeiten (man kann sie z.B. nach Namen suchen)

for(int i=0;i>=ObjectsTotal(OBJ_ARROW) ;i++)

{

//dann, wenn die Objektbezeichnung nicht existiert, zeichne sie, sagen wir, wir nehmen den

//Name des existierenden Pfeils und fügen ihm ein L-Label hinzu, um ihn zu identifizieren

if(ObjectFind(ObjectName(i)+"L")== -1)

{

ObjectCreate(ObjectName(i)+"L",OBJ_ARROW,0,ObjectGet(ObjectName(i), OBJPROP_TIME1),ObjectGet(ObjectName(i),(OBJPROP_PRICE1+3*Point)));

// und das war's

}

}

Das ist nur ein Beispiel, ich habe keine Zeit, es auf mögliche Bugs zu prüfen aber das sollte funktionieren, und Sie wissen jetzt den richtigen Weg.

 

Ja, gut. Ich hab's. Ich musste eigentlich StringFind() verwenden. Danke für die Hinweise!

#property show_inputs

extern string stringname="blah";

//+------------------------------------------------------------------+

//| Skript Programmstartfunktion |

//+------------------------------------------------------------------+

int start()

{

//----

for(int i=0;i<ObjectsTotal();i++)

if(StringFind(ObjectName(i),stringname,0)>0)

{

ObjectDelete(ObjectName(i));

}

Kalenzo:
Ok, versuchen Sie dies:

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i);

if(StringSubstr( Name, 0, 3)==206)

{

ObjectDelete(ObjectName(i));

}

}

Wenn die ersten 3 Buchstaben des Objektnamens 206 sind, wird das Objekt gelöscht
 

Danke, aber das funktioniert nicht. Zuerst habe ich "i>=ObjectsTotal" in "i<=ObjectsTotal" geändert (Tippfehler). Dann habe ich bemerkt, dass Sie ein weiteres Pfeilobjekt erstellen, wo wir ein neues Textobjekt erstellen wollen, das den Namen des Pfeilobjekts enthält. Jedenfalls erzeugt der folgende Code eine Reihe von Pfeilen (etwa 50), die sich alle auf denselben Koordinaten überschneiden.

Ich weiß immer noch nicht, was ich tun soll. Wenn Sie eine Chance haben, einen anderen Blick zu nehmen, wäre das sehr zu schätzen. Um klar zu sein, möchte ich ein neues Textobjekt erstellen, das unter jedem vorhandenen Pfeilobjekt positioniert wird, wobei die Textbeschreibung des Textobjekts mit dem Namen des Pfeilobjekts übereinstimmt.

Rechnung

Kalenzo:
zuerst globale Variable deklarieren (global für das Skript) int objectCount;

dann am Ende der ea alle Objekte verarbeiten (man kann sie z.B. nach Namen suchen)

for(int i=0;i>=ObjectsTotal(OBJ_ARROW) ;i++)

{

//dann, wenn die Objektbezeichnung nicht existiert, zeichne sie, sagen wir, wir nehmen den

//Name des existierenden Pfeils und fügen ihm ein L-Label hinzu, um ihn zu identifizieren

if(ObjectFind(ObjectName(i)+"L")== -1)

{

ObjectCreate(ObjectName(i)+"L",OBJ_ARROW,0,ObjectGet(ObjectName(i), OBJPROP_TIME1),ObjectGet(ObjectName(i),(OBJPROP_PRICE1+3*Point)));

// und das war's

}

}

Das ist nur ein Beispiel, ich habe keine Zeit, es auf mögliche Fehler zu überprüfen aber das sollte funktionieren, und Sie wissen jetzt den richtigen Weg.
 

Löschen von Objekten auf der Basis von Inhalten

Gibt es eine Möglichkeit, Objekte auf der Grundlage einer ausgewählten Textzeichenfolge innerhalb des Objektnamens zu löschen?

Edit: Ich habe es mit Hilfe eines Hinweises von Kalenzo herausgefunden. Die Antwort ist in Beitrag #212.

Grund der Beschwerde: