Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.


Portalsuche


Werbung

Login
Benutzername:
Kennwort:


Statistik
Themen: 3745
Beiträge: 36590
Benutzer: 5.902
Aktive Benutzer: 519
Links: 80
Wir begrüßen unseren neuesten Benutzer: Polytrade
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 2 Stunden
- Polytrade
vor 8 Stunden
- exspas432
vor 19 Stunden
- elgaza
vor einem Tag
- DeSaint
vor einem Tag
- DeSaint123...

Onlineuser
'Wer ist online' anzeigen Benutzer: 4
Gäste: 98
Gesamt: 102
Team: 0
Team:  
Benutzer:  Breakout25, ForexMax, Lena, Polytrade
Freunde anzeigen

Empfehlungen

Werbung

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: Feb 2016
Beiträge: 91
Lena befindet sich auf einem aufstrebenden Ast
Standard 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);
   }
}
Kurz und Knapp, die Funktion soll zwischen dem höchsten Punkt von vorgestern und gestern eine Linie zeichnen. Ebenso zwischen den beiden tiefsten Punkten. Dafür sollen/werden in den ersten beiden Abschnitten die entsprechenden Werte ermittelt.
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.
Mit Zitat antworten
  #2 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: May 2015
Beiträge: 225
next user befindet sich auf einem aufstrebenden Ast
Standard

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]));
Du willst eine Trendlinie an den höchsten bzw. tiefsten Punkten im H1-Chart zeichnen, ermittelst die Zeitkoordinate aber nur bis zum Tag.
Dein Code muss von
Code:
... (string)TimeDay(Time[Pos1])
zu
Code:
... (string)TimeDay(Time[0])+" "+(string)TimeHour(Time[Pos1])
geändert werden. Für den Vortag nimmste dann z.B TimeDay(Time[24]). Für die anderen drei natürlich genau so.

Außerdem gehen deine Bedingungen
Code:
if(Price2<Price1)
...
if(Price4>Price3)
nur bei "aufwärts gerichtet" (High) und "abwärts gerichtet" (Low) auf. Auf umgekehrter Reihenfolge nicht. Hoffe das ist so gewollt.

Beim Vortag müsste folgender Code
Code:
(NULL,PERIOD_H1,MODE_LOW,48,25);
(NULL,PERIOD_H1,MODE_HIGH,48,25);
so heißen
Code:
(NULL,PERIOD_H1,MODE_LOW,24,25);
(NULL,PERIOD_H1,MODE_HIGH,24,25);
denn der vorletzte Parameter gibt die Anzahl zu überprüfender Kerzen an, beginnend vom letzten Parameter.
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)
folgendes schreiben
Code:
ObjectCreate(0,"High_Trendline",OBJ_TREND,0,Time[Pos1],Price1,Time[Pos2],Price2)
So sparst du dir 4 Variablen und 16 (bzw. mit der Korrektur 20) Funktionsaufrufe.

Geändert von next user (vor 2 Wochen um 05:36 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: Feb 2016
Beiträge: 91
Lena befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #4 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: Feb 2016
Beiträge: 91
Lena befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #5 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: May 2015
Beiträge: 225
next user befindet sich auf einem aufstrebenden Ast
Standard

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);
Und nein, ObjectGetDouble(...) liefert den Preis zurück. Zum Setzen musst du ObjectSetDouble(...) verwenden.
Mit Zitat antworten
  #6 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: Feb 2016
Beiträge: 91
Lena befindet sich auf einem aufstrebenden Ast
Standard

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);
   }
}
Mit Zitat antworten
  #7 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: May 2015
Beiträge: 225
next user befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #8 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: Feb 2016
Beiträge: 91
Lena befindet sich auf einem aufstrebenden Ast
Standard

Ich denke die Funktionsweise lässt sich besser anhand von erklären.




Angehängte Grafiken
Dateityp: jpg Erklärung Teil1.jpg (157,0 KB, 16x aufgerufen)
Dateityp: jpg Erklärung Teil2.jpg (187,9 KB, 14x aufgerufen)
Mit Zitat antworten
  #9 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: May 2015
Beiträge: 225
next user befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #10 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: Feb 2016
Beiträge: 91
Lena befindet sich auf einem aufstrebenden Ast
Standard

Mir ging es hier einfach nur darum, wie ich eine "Trendlinie" automatisch erstelle und an diverse Faktoren anpassen kann.
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
mql4, programmierung, programmierung metatrader, programmierung mql4, trendlinie, trendlinien


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 17:43 Uhr.



-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2017 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------