HechTrader Posted January 25, 2016 Report Share Posted January 25, 2016 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. Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted January 25, 2016 Report Share Posted January 25, 2016 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)) Quote Link to comment Share on other sites More sharing options...
HechTrader Posted January 26, 2016 Author Report Share Posted January 26, 2016 Sauber danke. Ich prüfe mal. Gesendet von iPhone mit Tapatalk Quote Link to comment Share on other sites More sharing options...
HechTrader Posted January 27, 2016 Author Report Share Posted January 27, 2016 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ß! Quote Link to comment Share on other sites More sharing options...
conglom-o Posted January 27, 2016 Report Share Posted January 27, 2016 Der erste Parameter ist nicht der Name sondern die Chart_ID. Vor das "Strong Bull" muss also noch was rein. Siehe auch hier: https://docs.mql4.com/objects/objectcreate Quote Link to comment Share on other sites More sharing options...
HechTrader Posted January 27, 2016 Author Report Share Posted January 27, 2016 (edited) 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 January 31, 2016 by whipsaw Quote Link to comment Share on other sites More sharing options...
conglom-o Posted January 27, 2016 Report Share Posted January 27, 2016 Wenn Du Skype hast, versuche ich Dir mal live zu helfen.Meine Kontaktdaten findest Du unter dem Link in meiner Signatur . Quote Link to comment Share on other sites More sharing options...
HechTrader Posted January 27, 2016 Author Report Share Posted January 27, 2016 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); } //+------------------------------------------------------------------+ Quote Link to comment Share on other sites More sharing options...
conglom-o Posted January 27, 2016 Report Share Posted January 27, 2016 Ich würde mal an verschiedenen Stellen Print Befehle einbauen und die wichtigen Werte überprüfen. Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted January 28, 2016 Report Share Posted January 28, 2016 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 Quote Link to comment Share on other sites More sharing options...
conglom-o Posted January 28, 2016 Report Share Posted January 28, 2016 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. Quote Link to comment Share on other sites More sharing options...
HechTrader Posted January 29, 2016 Author Report Share Posted January 29, 2016 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 1 Quote Link to comment Share on other sites More sharing options...
WOGO Posted January 29, 2016 Report Share Posted January 29, 2016 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. Quote Link to comment Share on other sites More sharing options...
HechTrader Posted January 29, 2016 Author Report Share Posted January 29, 2016 Hab ich doch geschrieben, mache ich mit ObjectMove. Und ObjectCreate in OnInit, irgendwo muss ich die ja erstellen. Gesendet von iPhone mit Tapatalk Quote Link to comment Share on other sites More sharing options...
conglom-o Posted January 29, 2016 Report Share Posted January 29, 2016 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. Quote Link to comment Share on other sites More sharing options...
HechTrader Posted January 29, 2016 Author Report Share Posted January 29, 2016 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 Quote Link to comment Share on other sites More sharing options...
WOGO Posted January 29, 2016 Report Share Posted January 29, 2016 Hab ich doch geschrieben...Nö, hast du nicht! 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. Quote Link to comment Share on other sites More sharing options...
conglom-o Posted January 29, 2016 Report Share Posted January 29, 2016 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. Quote Link to comment Share on other sites More sharing options...
HechTrader Posted January 30, 2016 Author Report Share Posted January 30, 2016 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 Quote Link to comment Share on other sites More sharing options...
conglom-o Posted January 30, 2016 Report Share Posted January 30, 2016 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 . Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.