|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Trendlinien
Mal wieder am basteln und an einem Hindernis angekommen. Diesmal hapert es am automatischen platzieren einer Trendlinie.
Erst einmal den Code der dafür zuständigen Funktion: Code:
void Func_Trend_Lines () { int Pos1 =iHighest (NULL,PERIOD_H1,MODE_HIGH,24,1); //Ermitteln welcher Bar den höchsten Preis aufweist double Price1=iHigh (NULL,0,Pos1); //Den höchsten Preis abfragen datetime Time1 =StringToTime ((string)TimeYear(Time[0])+"."+(string)TimeMonth(Time[0])+"."+(string)TimeDay(Time[Pos1])); //Ermitteln zu welcher Zeit der höchste Preis war int Pos2 =iHighest (NULL,PERIOD_H1,MODE_HIGH,48,25); double Price2=iHigh (NULL,0,Pos2); datetime Time2 =StringToTime ((string)TimeYear(Time[0])+"."+(string)TimeMonth(Time[0])+"."+(string)TimeDay(Time[Pos2])); int Pos3 =iLowest (NULL,PERIOD_H1,MODE_LOW,24,1); double Price3=iLow (NULL,0,Pos3); datetime Time3 =StringToTime ((string)TimeYear(Time[0])+"."+(string)TimeMonth(Time[0])+"."+(string)TimeDay(Time[Pos3])); int Pos4 =iLowest (NULL,PERIOD_H1,MODE_LOW,48,25); double Price4=iLow (NULL,0,Pos4); datetime Time4 =StringToTime ((string)TimeYear(Time[0])+"."+(string)TimeMonth(Time[0])+"."+(string)TimeDay(Time[Pos4])); if(Price2<Price1){ ObjectCreate(0,"High_Trendline",OBJ_TREND,0,Time1,Price1,Time2,Price2); ObjectSetInteger(0,"High_Trendline",OBJPROP_COLOR,clrAqua); ObjectSetInteger(0,"High_Trendline",OBJPROP_WIDTH,1); ObjectSetInteger(0,"High_Trendline",OBJPROP_STYLE,STYLE_DOT); } if(Price4>Price3){ ObjectCreate(0,"Low_Trendline",OBJ_TREND,0,Time3,Price3,Time4,Price4); ObjectSetInteger(0,"Low_Trendline",OBJPROP_COLOR,clrAqua); ObjectSetInteger(0,"Low_Trendline",OBJPROP_WIDTH,1); ObjectSetInteger(0,"Low_Trendline",OBJPROP_STYLE,STYLE_DOT); } } In den letzten beiden Absätzen werden dann die Linien gesetzt und formatiert. Ein Fehler oder Warnung wird nicht ausgegeben. Ich denke es ist ein Problem beim ermitteln der benötigten Werte. |
|
|||
Die ermittelten Werte sind soweit richtig. Dein Fehler liegt im Folgenden:
Code:
int Pos1 =iHighest (NULL,PERIOD_H1,MODE_HIGH,24,1); double Price1=iHigh (NULL,0,Pos1); datetime Time1 =StringToTime ((string)TimeYear(Time[0])+"."+(string)TimeMonth(Time[0])+"."+(string)TimeDay(Time[Pos1])); Dein Code muss von Code:
... (string)TimeDay(Time[Pos1]) Code:
... (string)TimeDay(Time[0])+" "+(string)TimeHour(Time[Pos1]) Außerdem gehen deine Bedingungen Code:
if(Price2<Price1) ... if(Price4>Price3) Beim Vortag müsste folgender Code Code:
(NULL,PERIOD_H1,MODE_LOW,48,25); (NULL,PERIOD_H1,MODE_HIGH,48,25); Code:
(NULL,PERIOD_H1,MODE_LOW,24,25); (NULL,PERIOD_H1,MODE_HIGH,24,25); Mit deiner Angabe überprüfst du die letzten BEIDEN Vortage. Noch ein kleiner Tipp. Deine Zeilen zur Ermittlung der Zeitkoordinate sind unnötig. Du kannst auch einfach bei der Objekterstellung anstatt Code:
ObjectCreate(0,"High_Trendline",OBJ_TREND,0,Time1,Price1,Time2,Price2) Code:
ObjectCreate(0,"High_Trendline",OBJ_TREND,0,Time[Pos1],Price1,Time[Pos2],Price2) Geändert von next user (05.08.17 um 05:36 Uhr) |
|
|||
Ich danke dir für deine Hilfe, besonders für den kleinen Tip am Ende. Mir war bewusst dass man den Code noch kompakter schreiben konnte. Da es das erste Mal war, dass ich eine Trendlinie erstellt habe wollte ich es aber lieber in kleinen Schritten abarbeiten. So hatte ich die Möglichkeit Zwischenkontrollen einzubauen.
Da hatten sich ja doch 1-2 Flüchtigkeitsfehler eingeschlichen. Trotzdem bin ich recht zufrieden, dass keine größeren Bugs enthalten waren. Obwohl, grobe Schnitzer lassen sich leichter finden. |
|
|||
Verdammt... gibt es eine Möglichkeit den zweiten Ankerpunkt inclusive Preis zu verschieben?
Ich vermute mal es geht mit: ObjectGetDouble(0,"Name",OBJPROP_PRICE,Variable_Pr eis) Das Problem ist aber dann doch, das Programm weiß nicht an welcher zeitlichen Stelle der Preis geändert werden muss. Dadurch ändert sich ja auch die Steigung. |
|
|||
Da nutzt du einfach
Code:
ObjectSetInteger(0,"OBJEKT",OBJPROP_TIME,0,ZEIT_ANKERPUNKT_1); ObjectSetDouble(0,"OBJECT",OBJPROP_PRICE,0,PREIS_ANKERPUNKT_1); ObjectSetInteger(0,"OBJEKT",OBJPROP_TIME,1,ZEIT_ANKERPUNKT_2); ObjectSetDouble(0,"OBJECT",OBJPROP_PRICE,1,PREIS_ANKERPUNKT_2); |
|
|||
Natürlich muss es ObjectSet... und NICHT ObjectGet... heißen. Da war ich mal wieder zu schnell auf der Tastatur. Vielen Dank für deine Hilfe. Bei den vielen Befehlen und Möglichkeiten verliere ich noch häufig den Überblick. Oftmals weiß ich auch garnicht wonach ich suchen soll.
Habe mir jetzt aber erfolgreich eine Funktion gebastelt welche eine Trendlinie zwischen dem höchsten Punkt des vorgestrigen und gestrigen Tages einzeichnet. Diese wird auch in die "Zukunft" weiter projeziert. Zudem wird die Trendlinie so verschoben, dass es keine Schneidung am Vortag gibt. Der Code ist beigefügt. Evtl kann es ja jemand gebrauchen. Die verwendeten Zeiträume ließen sich auch schnell abändern. Code:
//+------------------------------------------------------------------+ //| Funktion TRENDLINIEN | //+------------------------------------------------------------------+ void Func_Trend_Lines () { int Pos1 =iHighest (NULL,PERIOD_H1,MODE_HIGH,24,1); //Ermitteln welcher Bar den höchsten Preis im laufe des gestrigen Tages aufweist double Price1=iHigh (NULL,0,Pos1); //Den höchsten Preis abfragen int Pos2 =iHighest (NULL,PERIOD_H1,MODE_HIGH,24,25); //Vorherige beiden Anweisungen wiederholen double Price2=iHigh (NULL,0,Pos2); int Pos3 =iLowest (NULL,PERIOD_H1,MODE_LOW,24,1); double Price3=iLow (NULL,0,Pos3); int Pos4 =iLowest (NULL,PERIOD_H1,MODE_LOW,24,25); double Price4=iLow (NULL,0,Pos4); if(Price2>Price1){ //Abfrage ob das Hoch des vorgestrigen Tages größer dem Hoch des gestrigen Tages ObjectCreate (0,"High_Trendline",OBJ_TREND,0,Time[Pos2],Price2,Time[Pos1],Price1); //Erstelle Trendlinie mit entsprechenden Koordinaten und Preisen for(i=Pos1-1;i>=1;i--){ //Schleife (Zählervariable beginnt mit Position des Bars, welches Tageshoch bildet) if(iHigh(NULL,0,i)>ObjectGetValueByShift("High_Trendline",i)){ //Abfrage (Ist Bar Tageshoch größer Trendlinie an gleicher Position) ObjectSetInteger (0,"High_Trendline",OBJPROP_TIME2, 0,Time[i]); //Ankerpunkt des gestrigen Tages wird auf Position des abgefragten Bars gesetzt ObjectSetDouble (0,"High_Trendline",OBJPROP_PRICE2,0,iHigh(NULL,0,i)); //Preis an zugehörigem Punkt wird auf Tageshoch des entsprechenden Bars gesetzt } } ObjectSetInteger (0,"High_Trendline",OBJPROP_COLOR,clrAqua); //Formatierung der Trendlinie ObjectSetInteger (0,"High_Trendline",OBJPROP_WIDTH,1); ObjectSetInteger (0,"High_Trendline",OBJPROP_STYLE,STYLE_DOT); ObjectSet ( "High_Trendline",OBJPROP_RAY_RIGHT,true); } if(Price3>Price4){ //siehe Kommentare zu "High_Trendline" ObjectCreate (0,"Low_Trendline",OBJ_TREND,0,Time[Pos4],Price4,Time[Pos3],Price3); for(i=Pos3;i>=1;i--){ if(iLow(NULL,0,i)<ObjectGetValueByShift("Low_Trendline",i)){ ObjectSetInteger (0,"Low_Trendline",OBJPROP_TIME2, 0,Time[i]); ObjectSetDouble (0,"Low_Trendline",OBJPROP_PRICE2,0,iLow(NULL,0,i)); } } ObjectSetInteger(0,"Low_Trendline",OBJPROP_COLOR,clrAqua); ObjectSetInteger(0,"Low_Trendline",OBJPROP_WIDTH,1); ObjectSetInteger(0,"Low_Trendline",OBJPROP_STYLE,STYLE_DOT); ObjectSet ( "Low_Trendline",OBJPROP_RAY_RIGHT,true); } } |
|
|||
Lena, wieso nutzt du jetzt ObjectGetValueByShift() ?
Das ist in deinem Fall doch vollkommen unnötig. Du erstellst eine Trendlinie mit 2 Punkten. ObjectGetValueByShift() macht nichts anderes, als bei der angegebenen Kerze den Preis zu kalkulieren, indem die beiden Koordinaten und eine lineare Gleichung genutzt werden. Die beiden For-Schleifen sind somit sinnlos. |
|
|||
Ich denke die Funktionsweise lässt sich besser anhand von erklären.
|
|
|||
Ok, war gestern wohl doch schon Zeit schlafen zu gehen
So ist es verständlich, muss allerdings sagen, das meine Berechnungen für eine Trendlinie und deren Punkte generell anders aussehen würden. Aber es geht ja darum, was du willst, also schon ok. |
Lesezeichen |
Stichworte |
mql4, programmierung, programmierung metatrader, programmierung mql4, trendlinie, trendlinien |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|