Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Labels anordnen

Geschrieben

Hallo,

 

habe folgende Anforderung:

 

ich möchte einen Satz von Text-Labeln in einen Chart schreiben. Der Nutzer soll die Möglichkeit erhalten diese Label in verschiedene Ecken zu setzten.

 

Die Label haben verschiedene Längen.

Bsp:

Lot Size    0.01
Stop Loss   40
Take Profit 70
Looking for opportunities

...

Diese Anordnung funktioniert in Corner 0 und 2 (rechte Seite)

 

... auf der linken Seite funktioniert es nicht

         Lot Size    0.01
          Stop Loss   40
          Take Profit 70
Looking for opportunities

 

Was ist der einfachste Weg das linksbündig zu machen - in Corner 1 und 3

 

 

Gruß mtbf40

Featured Replies

Geschrieben

Du hast die Anordnung vermutlich über Object Properties OBJPROP_CORNER gemacht.

 

Wenn der Text immer linksbündig sein soll, dann geht das über XDISTANCE / YDISTANCE.

Hier mal eine Funktion, die ich benutze.

void PutTextLabel(int Index, int Spalte, int Zeile, string Text, color Farbe)
{
  windex=WindowFind(Kurz_Name);
  string Label;
 Label="Label_"+Index;
 Spalte=Spalte*210+1;
 Zeile =(Zeile+1)*12;
 ObjectCreate(Label,OBJ_LABEL,windex,Spalte,Zeile);
 ObjectSetText(Label,Text,7);   
 ObjectSet(Label,OBJPROP_XDISTANCE,Spalte);
 ObjectSet(Label,OBJPROP_YDISTANCE,Zeile);
 ObjectSet(Label,OBJPROP_COLOR,Farbe);  
 return(0);
}

Du musst die X-Position für die rechte Seite aber so anpassen, dass dein längster Text noch hinpasst.

Wenn du das flexibel halten willst, dann kannst du über die Funktion StringLen() die länge deines längsten Textes herausfinden und abhängig von der Schriftgrösse die Position berechnen.

Ist ein wenig umständlich, dafür sollte es aber funktionieren.

Geschrieben
  • Autor

Du hast die Anordnung vermutlich über Object Properties OBJPROP_CORNER gemacht.

 

Wenn der Text immer linksbündig sein soll, dann geht das über XDISTANCE / YDISTANCE.

Hier mal eine Funktion, die ich benutze.

void PutTextLabel(int Index, int Spalte, int Zeile, string Text, color Farbe)
{
  windex=WindowFind(Kurz_Name);
  string Label;
 Label="Label_"+Index;
 Spalte=Spalte*210+1;
 Zeile =(Zeile+1)*12;
 ObjectCreate(Label,OBJ_LABEL,windex,Spalte,Zeile);
 ObjectSetText(Label,Text,7);   
 ObjectSet(Label,OBJPROP_XDISTANCE,Spalte);
 ObjectSet(Label,OBJPROP_YDISTANCE,Zeile);
 ObjectSet(Label,OBJPROP_COLOR,Farbe);  
 return(0);
}

Du musst die X-Position für die rechte Seite aber so anpassen, dass dein längster Text noch hinpasst.

Wenn du das flexibel halten willst, dann kannst du über die Funktion StringLen() die länge deines längsten Textes herausfinden und abhängig von der Schriftgrösse die Position berechnen.

Ist ein wenig umständlich, dafür sollte es aber funktionieren.

 

Hallo Wogo,

 

danke für die Antwort - hatte ich mir schon fast gedacht das ich das so lösen muß!! :cold:

habe insgeheim gehofft das es eine Abkürzung gibt - :LLL:

na ja - auf in den Kampf ...

Geschrieben

Also ich finde WOGO´s Funktion klasse ! Ist auf jeden Fall eine saubere Variante.

 

Viele Grüße,

Rumpel

Geschrieben
  • Autor

Also ich finde WOGO´s Funktion klasse ! Ist auf jeden Fall eine saubere Variante.

 

Viele Grüße,

Rumpel

 

ist ja die einzige sinnvolle Lösung!!

Geschrieben
  • Autor

Hallo,

 

habe noch eine Frage:

 

wie programmiere ich, welches Label ich selektiert/ausgewählt habe?? Mit ObjectGet geht das nicht?! oder??

Geschrieben

Was meinst du mit "ausgewählt"?

Du gibst jedem Objekt einen Namen und wenn du eine Eigenschaft ändern willst, dann sprichst du es einfach über diesen an.

Geschrieben
  • Autor

Was meinst du mit "ausgewählt"?

Du gibst jedem Objekt einen Namen und wenn du eine Eigenschaft ändern willst, dann sprichst du es einfach über diesen an.

 

Also ich habe mehrere Labels - Labels kann man doch auswählen/doppel klicken - nun möchte ich programmieren welches Label ich ausgewählt habe - dann soll etwas passieren

 

die Situation ist folgende:

- ich habe einen Oszillator der verschiedene Parameter annehmen kann

- diesen will ich über Labels steuern

- d.h. wähle ich Label 1, soll der Parameter 1 ausgewählt werden - Label 2 -> Parameter 2 ...

Geschrieben

Also ich habe mehrere Labels - Labels kann man doch auswählen/doppel klicken - nun möchte ich programmieren welches Label ich ausgewählt habe - dann soll etwas passieren

 

Das geht leider nicht. :undecided:

Geschrieben

:grin: :grin:

 

Was wäre denn eine Alternative?? :undecided:

2 Alternativen

Einfache: Objekte die du per Maus bewegen könntest und beim überschreiten von Werten etwas passiert.

Schwere: DLL coden

 

EDIT: Beispiel 2 Linien die du per Maus vertikal ändern kannst. Obere wäre dann dein TP (long) und untere dein SL.

EDIT2: Labels != Objekte

Geschrieben

Evt. wäre einfacher wenn du einfach kurz erklärst was du denn vor hast. Dann lässt sich bestimmt auch eine schöne Lösung finden.

 

Viele Grüße,

Rumpel

Geschrieben
  • Autor

Evt. wäre einfacher wenn du einfach kurz erklärst was du denn vor hast. Dann lässt sich bestimmt auch eine schöne Lösung finden.

 

Viele Grüße,

Rumpel

 

Also ich möchte über mehrere Labels einen Oszillator steuern - ich könnte auch über Ctrl-I gehen - würde dies aber gern über Labels oder sonst was realisieren

 

die Situation ist folgende:

- ich habe einen Oszillator der verschiedene Parameter annehmen kann

- diesen will ich über Labels ode ...? steuern

- d.h. wähle (Doppelklick) ich Label 1, soll der Parameter 1 ausgewählt werden - Label 2 -> Parameter 2 ...

Geschrieben

Genau so wie du es dir vorstellst geht es nicht. Wenn du es grafisch lösen willst, dann könntest du es so machen:

Erzeug dir 3 Text-Objekte und ein Pfeil-Objekt, wie im Bild!

Labels.jpg

Jetzt kannst du den Pfeil ja verschieben wie du willst. Schiebst du ihn vor "Wert 1", so kontrolliert dieser deinen Parameterwert. Genau so für Wert 2 und 3.

Dazu frägst du einfach die Y-Position deines Pfeiles über ObjectGet() ab. DasText-Objekt, dem er am nächsten ist lässt du den Parameter bestimmen.

Dein Pfeil ist somit ein Schalter mit (fast) beliebig vielen Stellungen.

Geschrieben

Genau so wie du es dir vorstellst geht es nicht. Wenn du es grafisch lösen willst, dann könntest du es so machen:

Erzeug dir 3 Text-Objekte und ein Pfeil-Objekt, wie im Bild!

Jetzt kannst du den Pfeil ja verschieben wie du willst. Schiebst du ihn vor "Wert 1", so kontrolliert dieser deinen Parameterwert.

Habe von der Programmierung ja keinen Plan, habe jedoch einen Indikator der deinem Beispiel ganz genau entspricht.

Dieser kontrolliert dann die Parameter eines jeden einzelnen Bars / Candle, jenach dem wohin er verschoben wird.

 

Solte dieser als Beispiel für euch nützlich sein, könnte ich ihn auf Wunsch posten.

Geschrieben
  • Autor

Genau so wie du es dir vorstellst geht es nicht. Wenn du es grafisch lösen willst, dann könntest du es so machen:

Erzeug dir 3 Text-Objekte und ein Pfeil-Objekt, wie im Bild!

post-1702-028893900 1280687024_thumb.jpg

Jetzt kannst du den Pfeil ja verschieben wie du willst. Schiebst du ihn vor "Wert 1", so kontrolliert dieser deinen Parameterwert. Genau so für Wert 2 und 3.

Dazu frägst du einfach die Y-Position deines Pfeiles über ObjectGet() ab. DasText-Objekt, dem er am nächsten ist lässt du den Parameter bestimmen.

Dein Pfeil ist somit ein Schalter mit (fast) beliebig vielen Stellungen.

 

genau diesen Ansatz würde ich verfolgen!! Dieser Ansatz wird auch im "AutoGraf" verfolgt - ist auch die einzige erfolgsführende Methode - nur weiß ich nicht wie das zu programmieren ist??

Geschrieben

...nur weiß ich nicht wie das zu programmieren ist??

Wir könnten ja einen Deal machen. Ich programmier dir deine Funktion und du setzt dich mal mit der Funktionsweise des Thanks-Button auseinander... :undecided:

Geschrieben
  • Autor

Wir könnten ja einen Deal machen. Ich programmier dir deine Funktion und du setzt dich mal mit der Funktionsweise des Thanks-Button auseinander... :undecided:

 

:grin: :grin:

Geschrieben

:grin: :argg:

:grin:

Here it is:

WG_ATR.mq4

Ich hab einfach mal den ATR als Basis genommen und die Labels auch nicht rechts, sondern links im Chart angeordnet, weil's einfacher ist. :argg:

Es gibt 2 Funktionen, die wichtig sind:

void CreateSwitchObjects(int NumberOfChoices)																// <= neue Funktion, die die Labels zeichnet

int ControlSwitchObjects(int NumberOfChoices)																	// <= neue Funktion, die die Labels updated und Paramter Wert zurück gibt

Das Ganze ist nicht ganz so einfach auf einen anderen Indi zu adaptieren, da der Indikator ja beim Ändern des Parameters neu gezeichnet werden soll.

Ich habe alle Zeilen im Code, die ich für die Funktionalität angepasst habe mit //

Schau's dir einfach mal an, wie ich das beim ATR gelöst habe und solltest du damit nicht zurecht kommen, dann weisst du ja, in welchem Forum dir geholfen wird. :undecided:

WG_ATR.jpg

Momentan sind 3 Werte eingestellt, du kannst das aber über das Define NUMBEROFCHOICES beliebig erweitern. Dann musst du die möglichen Werte nur im ArrayParameterArray[3]={14, 21, 34} eintragen.

 

Bedienung ist ganz einfach. Du ziehst das rote "X" auf die Zeile mit dem gewünschten Wert. Dieser wird dann Rot und das X hüpft an die richtige Position.

 

Natürlich funktioniert das Ganze nur solange neue Ticks reinkommen.

 

Viel Spass damit!

Wogo

Geschrieben
  • Autor

DANKE Wago,

 

funktioniert sehr gut!! :cold: :mocking: habe das ganze noch an meinen Oszillator angepaßt.

 

Kann man jetzt noch den "IndicatorShortName" anpassen??

 

Gruß mtbf40

Geschrieben

Kann man jetzt noch den "IndicatorShortName" anpassen??

Geht auch.

Musst nur folgende 4 Zeilen von Init() nach Start() kopieren.

  i=Bars-counted_bars-1;
//---- name for DataWindow and indicator subwindow label
  string short_name;         		// <=
  short_name="ATR("+ATRPeriode+")";   	// <= Parametername angepasst
  IndicatorShortName(short_name);  	// <=
  SetIndexLabel(0,short_name); 		// <=
  while(i>=0)

Dabei nicht übersehen, dass hier bei "short_name="ATR("+ATRPeriode+")"; " der Parametername geändert wurde.

DANKE Wago,

Das mit dem Namen müssen wir aber noch üben :mocking:

Gruss,

Wogo

Geschrieben
  • Autor

Geht auch.

Musst nur folgende 4 Zeilen von Init() nach Start() kopieren.

  i=Bars-counted_bars-1;
//---- name for DataWindow and indicator subwindow label
  string short_name;         		// <=
  short_name="ATR("+ATRPeriode+")";   	// <= Parametername angepasst
  IndicatorShortName(short_name);  	// <=
  SetIndexLabel(0,short_name); 		// <=
  while(i>=0)

Dabei nicht übersehen, dass hier bei "short_name="ATR("+ATRPeriode+")"; " der Parametername geändert wurde.

 

Das mit dem Namen müssen wir aber noch üben :mocking:

Gruss,

Wogo

 

tausend Dank ... :cold: - jetzt ist alles perfekt!!

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.