Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Hintergrund zwischen 2 Zeitpunkten ändern, zB der Bereich EMA10>EMA20 auf M15 (http://www.expert-advisor.com/forum/showthread.php?t=6107)

Angel 02.05.18 18:42

Hintergrund zwischen 2 Zeitpunkten ändern, zB der Bereich EMA10>EMA20 auf M15
 
Hallo!
So, nun zu meinem neuen (alten) Projekt, in welchem ich den Hintergrund zwischen zwei Zeitpunkten ändern und darstellen will, hier ist angedacht z.B. bei Schnitt / Überschreiten der EMA10 der EMA20 (M15) bis zum Unterschreiten farbig darzustellen. Die y-Werte können durchaus sehr weit gegriffen sein, also never-reached-Konstanten. Das Ganze wandert natürlich im Chart mit fortlaufender Zeit nach links, also so leicht finde ich das gar nicht! Hat jemand eine Idee?

Raul0 03.05.18 10:01

Hallo,

den Codeschnipsel nutze ich für die Anzeige an Trendstellen, evt. kannst Du Dir damit etwas zurechtbauen.

PHP-Code:

//optische Ausgabe - Punkte
string name2 "Auf_"+(string)Time[0]; ObjectCreate(name2OBJ_TEXT,0,0,0); ObjectSetText(name2"."15); ObjectSet(name2OBJPROP_COLORBlue); ObjectSet(name2OBJPROP_TIME1Time[0]); ObjectSet(name2OBJPROP_PRICE1, ( iHigh(NULL,0,0) + iLow(NULL,0,0) ) / );
string name1 "Ab_"+(string)Time[0];  ObjectCreate(name1OBJ_TEXT,0,0,0); ObjectSetText(name1"."15); ObjectSet(name1OBJPROP_COLORRed);  ObjectSet(name1OBJPROP_TIME1Time[0]); ObjectSet(name1OBJPROP_PRICE1, ( iHigh(NULL,0,0) + iLow(NULL,0,0) ) / ); 


RetepM 03.05.18 10:49

Hi,

schnell und einfach:

wenn MA10>MA20
dann
ChartSetInteger(0,CHART_COLOR_BACKGROUND,clrYellow );
sonst
ChartSetInteger(0,CHART_COLOR_BACKGROUND,clrGreen) ;

Grüße

traderdoc 03.05.18 12:55

Eww
 
Es gibt schon gute Möglichkeiten mit dem MQL.

traderdoc

RetepM 03.05.18 13:52

Entschuldigung, ich hatte diesen Link vergessen:
https://www.forexfactory.com/showthread.php?t=329313
Gruß

Angel 03.05.18 15:09

Wow - Danke ! Ich muss es mir heute Abend ansehen, aber es sieht schon mal vielversprechend aus.. :-) :rolleyes:

traderdoc 03.05.18 19:42

Wenn nur die Fläche zwischen zwei Zeitpunkten farblich hervorgehoben werden soll, dann geht das rel. einfach über

ObjectCreate(chart_ID,name,OBJ_RECTANGLE,sub_windo w,time1,price1,time2,price2)

Wenn das Chart eine Kerze weiterrückt, dann wird das Rechteck über ObjectMove() komplett verschoben oder gelöscht und neu gezeichnet, wenn sich das Rechteck nach rechts verbreitert.

Eine echte Herausforderung wäre jedoch, die Integralfläche! zwischen zwei EMAs
zwischen zwei Zeitpunkten vollständig!! farblich zu zeichnen.
D.h. es würde eine farbliche Fläche vom Über- bzw. Unterschreiten der EMAs bis zur aktuellen Kerze, max. bis zum nächsten Unter- bzw. Überschreiten der EMAs benötigt.
Das ist in der Tat nicht einfach, aber lösbar.

Das eigentliche Problem hier besteht in der Grenze des Machbaren mit MQL. Es existiert keine Funktion, die diese Integralfläche am Stück darstellen kann. Hier müssen wir uns iterativ mit einzelnen aneinanderliegenden Rechtecken und Dreiecken behelfen, die in Summe eine grafische Fläche ergeben.

Prinzipielles Vorgehen:
1. Zwischen der oberen EMA und der unteren EMA und dem Zeitintervall zwischen zwei Kerzen, werden jeweils maximal 3 farbige Objekte gezeichnet.
Entweder nur 1 Rechteck oder 1 Rechteck und 1 oder 2 Dreiecke.
2. Man nimmt also die Zeiten von der ersten geschlossenen Kerze und der zweiten geschlossenen Kerze nach der Kreuzung.
3. Danach ermittelt man die dazugehörigen Preise der beiden EMAs. Daraus ergeben sich also immer Wertepaare aus einer Zeit und den beiden EMA-Werten.
4. Sollten die zu einem Zeitintervall gehörenden jeweiligen zwei oberen und zwei unteren EMA-Werte identisch sein, dann kann im einfachsten Fall ein farbiges Rechteck gezeichnet werden.
5. Sollten die jeweiligen beiden EMA-Werte des Zeitintervalls unterschiedlich sein, dann müssen wir zusätzlich auf ein oder ggf. zwei Dreiecke zurückgreifen, wobei die Hypothenuse der Dreiecke immer die Linie des EMA darstellt.
6. Vertikal gesehen zwischen den beiden Dreiecken wird dann letztendlich das verbleibende Rechteck gezeichnet.
7. Damit nun bei jedem Periodenwechsel die Objekte mitwandern, müssen sie per ObjectMove() um jeweils eine Periode nach links verschoben werden.
8. In dem neuen Zeitintervall werden die Objekte wie oben beschrieben dann gezeichnet.

Einzig die Spitzen der Flächen links der linken Begrenzung der gesamten Fläche bis zur direkten Kreuzung wird nicht farbig sein, weil die Kreuzung mehr oder weniger zwischen den Kerzen liegt und dort keine auswertbare Zeit liegt. Ebenfalls die Spitze nach rechts gesehen, wenn die EMAs das zweite Mal kreuzen.

Das ist dann auch schon "alles".

Viel Spaß beim Experimentieren.

Angel 03.05.18 23:28

So, die folgenden Möglichkeiten habe ich gecheckt:

@Raul0 : Der Codeschnipsel ist zu klein, als dass ich erkennen würde, wie es sich auswirkt.

@RetepM : Deine Lösung ist interessant, nur macht es den kompletten Charthintergrund andersfarbig. Ich brauche es jedoch nur zwischen zwei definierten Punkten, d.h. EMA10>EMA20 bis zum Zeitpunkt EMA10 < EMA20.
Dieser Bereich soll farbig dargestellt werden und zwar nicht nur zwischen den EMAs, sondern durchgängig.

@traderdoc: Das mit ObjectCreate / OBJ_RECTANGLE hatten wir bereits, war auch ein sehr interessanter, wenn nicht einzig möglicher Ansatz.
Die Integralfläche benötige ich nicht, sondern wirklich nur senkrechte Begrenzungen. Wie ich bei ObjectCreate die time1 und time2 durch den Schnitt der EMA10>EMA20 definiere, ist mir schleierhaft :eek: Und das ist vermutlich, was an dem Käse so stinkt. Also nächstes das ObjectMove(), das wird sicher auch nochmal spaßig...

traderdoc 04.05.18 00:01

Also, wenn Du wirklich nur senkrechte Begrenzungen brauchst, dann ist das aber wirklich einfach. Schade, denn die Lösung mit der Integralfläche sieht natürlich viel besser aus und färbt nicht so viel des Charts ein.

Nun gut.
Die Zeiten der Schnitte werden ganz einfach ermittelt.
Im laufenden! Chart wird die Kreuzung auf der letzten und vorletzten geschlossenen Kerze ermittelt:
Code:

double EMA10_1 = iMA(NULL, 0, 10, ma_shift, ma_method, applied_price, 1);
double EMA10_2 = iMA(NULL, 0, 10, ma_shift, ma_method, applied_price, 2);
double EMA20_1 = iMA(NULL, 0, 20, ma_shift, ma_method, applied_price, 1);
double EMA20_2 = iMA(NULL, 0, 20, ma_shift, ma_method, applied_price, 2);

if (EMA10_2 > EMA20_2 && EMA10_1 < EMA20_1) datetime time1 = Time[1];
if (EMA10_2 < EMA20_2 && EMA10_1 > EMA20_1) datetime time2 = Time[1];

Für ma_shift, ma_method und applied_price dann noch die entsprechenden Werte eintragen.

traderdoc

Angel 04.05.18 10:39

Hm... ja, für meine Zwecke reichen senkrechte Begrenzungen aus. Das Integral zwischen 2 EMAs sieht zwar sehr gut aus und ist auch programmiertechnisch sehr anspruchsvoll, aber ich brauche - gerade auf kleinen Timeframes - auf einen Blick die Indikation. Bei naheliegenden EMAs könnte der Zwischenraum wie eine (dickere) EMA erscheinen. Daher die senkrechten Begrenzungen.

So, ich habe mir den Code mal angesehen und mit leuchtet nicht ein, warum man die Schnittpunkte nicht wie folgt definieren könnte?!:

PHP-Code:

if (EMA10 EMA20datetime time1 Time[1]; 
if (
EMA10 EMA20datetime time2 Time[2]; 

Dein Code
PHP-Code:

if (EMA10_1 EMA20_1datetime time1 Time[1]; 
if (
EMA10_1 EMA20_1datetime time2 Time[2]; 

ist vermutlich "resistenter" gegen einen ein Zucken des Kurses. Frage: Hast Du Dich bei der zweiten Zeile verschrieben und es gehört Time[2] statt Time[1] da hin? (Ich glaube es kaum...)

Nichtsdestotrotz: Ich habe es hier mal mit EMA 2 und 4 versucht (zum Testen sieht man es schneller):

PHP-Code:

double EMA10_1 iMA(NULL120101); // "NULL"= (Current Chart) , Timeframe , Periode ("0"=Current , "1"=M1 usw), MA_Shift , MA_Method ("0"=SMA,"1"=EMA usw) , Enum_Applied_Price ("0"=Close , "1"=Open usw) , shift)
double EMA10_2 iMA(NULL120102);
double EMA20_1 iMA(NULL140101);
double EMA20_2 iMA(NULL140102);

if (
EMA10_2 EMA20_2 && EMA10_1 EMA20_1datetime time1 Time[1]; 
if (
EMA10_2 EMA20_2 && EMA10_1 EMA20_1datetime time2 Time[2];

ObjectMove("Rechteck",1,Time[1],1.19100);

ObjectCreate(0,"Rechteck",OBJ_RECTANGLE,0,Time[1],1.19100,Time[2],1.20100);
ObjectSetInteger(0,"Rechteck",OBJPROP_COLOR,clrBlueViolet );
ObjectSetInteger(0,"Rechteck",OBJPROP_WIDTH,);
ObjectSetInteger(0,"Rechteck",OBJPROP_SELECTABLE,true);
ObjectSetInteger(0,"Rechteck",OBJPROP_BACK,true); 

Problem: Ein Balken einer Kerze mit den korrekten y-Werten erscheint für einen Tick und verschwindet wieder. Das Rechteck wird auch nicht verschoben....
Ich komme nicht weiter.. :eek::(:confused:


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:46 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum