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.

Horizontale Bereiche in Indikatorfenster einfärben

Geschrieben

Hallo Community,

 

kann mir jemand sagen, ob / wie es möglich ist, in einem selbst geschriebenen Indikator im "separate window" horizontale Bereiche zwischen definierten Werten farblich zu hinterlegen? Ich stelle mir das so vor (natürlich in weniger aggressiven Farben) wie im Anhang dargestellt.

 

Danke und Grüße.

post-4863-0-10783300-1453716127_thumb.jpg

Featured Replies

Geschrieben

Hi , "ObjectCreate (spezifikationen)" zeichne das Rechteck und gebe dabei das Fenster an ( auswendig : Der Preischart ist die Nummer Null, das 1. seperate Fenster dann die Nummer 1, bitte prüfen) . Das Rechteck muss im Hintergrund gezeichnet sein, anderenfalls verdeckt es Deine anderen Zeichnungen . Hoffe hilft . KB

 

http://docs.mql4.com/constants/objectconstants/enum_object/obj_rectangle

 

if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE,sub_window,time1,price1,time2,price2))
Geschrieben
  • Autor

Stelle mich doof an und komme nicht weiter. Habe mein Code-Schnippsel im Indikator in OnCalculate am Ende eingebaut:

 

 

         if(!ObjectCreate("Strong Bull",OBJ_RECTANGLE,1,Time[rates_total-1],0.5,Time[0],1))
            {
            Print("Cannot create: StrongBull");
            }
 

 

 

Der soll mir im Indifenster also ein Rechteck createn vom letzten Bar bis zum aktuellen Bar. Linker Anchor Point soll 0,5 sein, rechter soll 1 sein. WTF? Kriege immre die "Cannot Create"-Meldung.

 

Habt Ihr eine Idee?

 

Danke und Gruß!

Geschrieben
  • Autor

There are two variants of the function:

 

The function creates an object with the specified name, type, and the initial coordinates in the specified chart subwindow:

 

bool  ObjectCreate(
   string        object_name,   // object name
   ENUM_OBJECT   object_type,   // object type
   int           sub_window,    // window index
   datetime      time1,         // time of the first anchor point
   double        price1,        // price of the first anchor point
   datetime      time2=0,       // time of the second anchor point
   double        price2=0,      // price of the second anchor point
   datetime      time3=0,       // time of the third anchor point
   double        price3=0       // price of the third anchor point
   );
 

 

 

 

Auch mit Deiner Variante funktioniert es nicht, die hatte ich anfänglich schon probiert.

Bearbeitet von whipsaw

Geschrieben

Wenn Du Skype hast, versuche ich Dir mal live zu helfen.

Meine Kontaktdaten findest Du unter dem Link in meiner Signatur wink.gif.

Geschrieben
  • Autor

Hi Conglom-o,

 

das wird schwierig, weil ich immer erst spät von der Arbeit komme. Skype habe ich auch nicht und während der Arbeit geht es nicht.....

 

Würdest Du mir auch hier helfen? Ich habe mal einen einfachen Indikator angehängt, in dem ich testweise auf der Horizontalen die Bereiche haben möchte. Ein Bereich wäre zB zwischen Time[rates_total-1], 0 und Time[0], 1 grün einzufärben. Background, Transparenz etc erstmal alles egal, es geht nur um das Erstellen des Rechtecks, was bei mir immer scheitert.

 

//+------------------------------------------------------------------+
//|                                                    Rectangle.mq4 |
//|                                                                  |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot RelativeChange
#property indicator_label1  "RelativeChange"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         RelativeChange[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,RelativeChange);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(time,true);
   
   int bars = rates_total-1;
   if(prev_calculated>0) bars=rates_total-prev_calculated+1;
   
   for(int i=bars-1;i>0;i--)
   {
   RelativeChange[i] = ((Close[i]/Close[i+1])-1)*100;
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Geschrieben

Hi Conglom-o,

 

das wird schwierig, weil ich immer erst spät von der Arbeit komme. Skype habe ich auch nicht und während der Arbeit geht es nicht.....

 

Der Code den Du dann beifügst und um den sich dann Conglom-o kümmern möge, enhält 0,0 von einem Rechteck .

 

Darf ich Dich darauf hinweisen, dass dem Link in meinem Post #2 ein kompletter Code zur Arbeit mit Rechtecken angefügt ist ? Wenn Du Dir diesen Code selber erarbeitest,

erwirbst Du Dir das Grundverständnis ohne das es nicht möglich sein wird .

 

Der Schlüssel ist der Befehl Objectcreate() zu dem es unglaublich viele Anwendungsmöglichkeiten gibt . Eine davon ist das Rechteck .

 

Viel Erfolg .

 

Bei konkreten Codebeispielen an denen Du selber arbeitest , da werde ich Dir sehr gerne helfen ( auch am Abend oder am WE, mir und vielen hier geht es wie Dir ) .

 

KB

Geschrieben

Der Code den Du dann beifügst und um den sich dann Conglom-o kümmern möge, enhält 0,0 von einem Rechteck .

 

Ich bin jetzt einfach mal davon ausgegangen, dass dies nur ein Teil des Quelltextes ist und das Ding nicht nach der Initialisierung aufhört.

Geschrieben
  • Autor

Hallo zusammen, danke für eure Unterstützung! Ich habe es geschafft, in dem ich in der OnInit die Objekte create und per ObjectMove die Ankerpunkte anhand von T[0] aktualisiere. Hab's jetzt durchblickt.

Eine Frage noch: wenn ich das ObjectCreate in der OnCalculate einbauen würde, würde er ja mit jedem Tick bzw Aktualisierung versuchen, die selben Objekte erneut zu bauen oder? Dann würde er Errors ausgeben?!

Schönes WE und Thx again

 

 

Gesendet von iPhone mit Tapatalk

Geschrieben

Hi,

 

ObjectCreate ist hier nicht zielführend. Du musst das Rechteck in OnCalculate mit der ObjectSet-Funktion anpassen, d.h. das rechte Ende auf die Zeit des aktuellen Bars bringen und oberes und unteres Ende auf deinen gewünschten Bereich setzen.

Geschrieben
  • Autor

Hab ich doch geschrieben, mache ich mit ObjectMove. Und ObjectCreate in OnInit, irgendwo muss ich die ja erstellen.

 

 

Gesendet von iPhone mit Tapatalk

Geschrieben

Ich weiß nicht, ob es eine Fehlermeldung gibt, wenn Du das Objekt mehrfach bauen willst. Glaube nicht. Sauberer ist es natürlich, den Quelltext so zu gestalten, dass es nur 1x gezeichnet wird. Am besten mit einer ObjectFind Abfrage.

Geschrieben
  • Autor

Aber das Prinzip, die in der Init zu bauen und in Calculate nur noch die Ankerpunkte zu aktualisieren ist ok oder?

 

 

Gesendet von iPhone mit Tapatalk

Geschrieben

Hab ich doch geschrieben...

Nö, hast du nicht! wwink.gif

 

Wenn du Objekte in einem Indikator verwendest, dann erstellst du diese mit ObjectCreate. Wo du das machst ist abhängig vom Anwendungsfall.

In deinem Fall, wo das selbe Rechteck immer im Indikatorfenster sein soll, kannst du das durchaus in der OnInit() machen.

Die Anpassung der Eckpunkt des Rechtecks machst du aber nicht mit ObjectMove sondern mit ObjectSet.

ObjectMove verschiebt dir dein Rechteck ja nur, d.h. wenn dein Indikator verglichen zum Ursprungsstatus stark ausschlägt, deckst du den kompletten Bereich nicht mehr ab.

Probier es einfach mal aus, was der Unterschied der einzelnen Funktionen ist! So findest du auch am einfachsten heraus, wie welche Funktion deinen Anwendungsfall beeinflußt.

Geschrieben

Man könnte es auch so ausdrücken: ObjectMove macht das, was der Name sagt: ein Objekt verschieben aber NICHT seine Größe ändern.

Es wäre sicherlich von großem Vorteil gewesen, wenn Du eventuell Deinen erweiterten Quelltext gepostet hättest - in dem von Dir bisher gezeigten Part werden nämlich weder Objekte gezeichnet noch verändert.

Geschrieben
  • Autor

Danke für die Antworten. ObjectMove verschiebt nicht das ganze Objekt sondern einen der Ankerpunkte. Und wenn ich nur den rechten Ankerpunkt auf T[0] bewege und den linken unverändert lasse, dann verschiebe ich es nicht, sondern ich vergrößere es. Funktioniert ganz wunderbar. Naechstes Mal gibt's auch wieder Quelltext :-)

 

 

Gesendet von iPhone mit Tapatalk

Geschrieben

Danke für die Antworten. ObjectMove verschiebt nicht das ganze Objekt sondern einen der Ankerpunkte. Und wenn ich nur den rechten Ankerpunkt auf T[0] bewege und den linken unverändert lasse, dann verschiebe ich es nicht, sondern ich vergrößere es. Funktioniert ganz wunderbar. Naechstes Mal gibt's auch wieder Quelltext :-)

 

Also tut es nicht das, was es uns sagen will. Danke für die Aufklärung. Nachteil am ObjectMove scheint aber zu sein, dass man nur EINEN Ankerpunkt auf einmal verschieben kann (daher wohl der Name). Mit ObjectSet kann man alle gleichzeitig neu definieren. Wenn es für Dich aber reicht, nur einen anzupassen und es nun funktioniert, ist das doch super good.gif.

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.