Jump to content
Tom Next - Daytrading Community

Horizontale Bereiche in Indikatorfenster einfärben


HechTrader

Recommended Posts

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

Link to comment
Share on other sites

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))
Link to comment
Share on other sites

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ß!

Link to comment
Share on other sites

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.

Edited by whipsaw
Link to comment
Share on other sites

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);
  }
//+------------------------------------------------------------------+

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

  • Upvote 1
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...