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)
-   -   Trendlinie Trendstrahl im EA MT4 definieren und als Signal verwenden (http://www.expert-advisor.com/forum/showthread.php?t=5844)

Julia 02.09.17 11:34

Trendlinie Trendstrahl im EA MT4 definieren und als Signal verwenden
 
Hallo Jungs,

ich möchte in einem EA einen Trendstrahl definieren und als Signalgeber verwenden also wenn der Kurs den Strahl unterschreitet oder berührt wieder Long gehen bzw Short. Die Richtung eines Strahls kann man ja bekanntlich durch die Festlegung zweier Punkte definieren. Diese möchte ich vor dem Start des EAs eingeben - Hier im Beispiel für den DAX:

oben im EA:
input string ___TRENDSTRAHL___="___Definiere X(Zeit) und Y(Kurs) Werte ___";
input double X_Wert1=15.10.2017 15:01;
input double Y_Wert1=12050;
input double X_Wert2=15.10.2017 17:05;
input double Y_Wert2=12085;


und unten im EA:
if(Kurs<=Trendstrahl)MAlong=true;

--------------------------------------------------------------------------

FRAGE 1:
Wie gebe ich die X Werte (Datum und Uhrzeit) so ein,dass der
EA für die definition des Trendstrahls verwenden kann? Ist das so richtig?

FRAGE 2:
Wie definiere ich überhaupt den Trendstrahl, damit dieser erkannt wird?


--------------------------------------------------------------------------

DANKE
Liebe Grüße
Julia :)

Julia 02.09.17 15:58

Frage
 
Oder kann ich einen Trendstrahl einzeichnen, und dann einfach nur die Trendlinien Nummer eingeben? Also einzeichnen, dann in ObjektEigenschaften den Namen festlegen z.B.: "Trendline 47225"
Und im EA gebe ich dann den Namen der Trendlinie ein?

Aber wie kann man das machen dass das in die Formel
if(Kurs<=Trendstrahl)MAlong=true;
passt?

ping 02.09.17 16:57

Hi Julia,

unter ForexFabrik.de kann ich dir die Antwort geben und auch gleich das fertige Tool liefern. Also wenn du nicht schon dort einen Account hast, dann melde dich dort an und stell deine Frage noch mal dort.

ciao ping

Adlerauge 03.09.17 11:31

Hallo Julia,
ich schreib Dir mal, wie ich es mache.
Dazu musst Du zunächst im MT4 unter Extras -> Optionen -> Objekte
ein Häkchen in das Kästchen "Objekt nach Hinzufügen auswählen" setzen.
Mit dem untenstehenden Code kannst Du dann Deine Trendlinie bei laufendem EA in den Chart einzeichnen. Du kannst sie in Ruhe ausrichten und korrigieren. Erst wenn Du sie deselektiert kast (Doppelklick auf die Trendlinie), wird der Code sie erkennen und den aktuellen Wert berechnen, vorausgesetzt die Trendlinie hat die von Dir vordefinierte Farbe und den von Dir vordefinierten Linienstil.
Die Trendlinie wird dann auch in "Trendlinie-BUY-Stop" bzw. "Trendlinie-SELL-Stop" umbennant.
Wenn Du eine zweite BUY-Stop-Linie oder eine zweite SELL-Stop-Linie zeichnen solltest, wird eine automatisch gelöscht.
Wenn Du eine bestehende BUY- bzw. SELL-Stop-Linie in Farbe oder Linienstil änderst, wird sie nicht mehr als solche erkannt.

PHP-Code:

 extern ENUM_LINE_STYLE Linien_Stil_Stop  STYLE_SOLID;    // BUY-Stop,  SELL-Stop
 
extern color Farbe_Stop Blue;    // BUY-Stop,  SELL-Stop
 
 
static double BUY_Stop    0;
 static 
double SELL_Stop    0;
 static 
string Trendlinie_BUY_Stop;
 static 
string Trendlinie_SELL_Stop;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   
return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void OnTick()
   {
 if (
StringLen(Trendlinie_BUY_Stop) > &&
    (
ObjectGet (Trendlinie_BUY_StopOBJPROP_COLOR)   != Farbe_Stop || ObjectGet(Trendlinie_BUY_StopOBJPROP_STYLE)   != Linien_Stil_Stop))
     { 
StringInit(Trendlinie_BUY_Stop00);
        
BUY_Stop 0;
     }
 if (
StringLen(Trendlinie_SELL_Stop) > &&
    (
ObjectGet (Trendlinie_SELL_StopOBJPROP_COLOR)   != Farbe_Stop || ObjectGet(Trendlinie_SELL_StopOBJPROP_STYLE)   != Linien_Stil_Stop))
     { 
StringInit(Trendlinie_SELL_Stop00);
        
SELL_Stop 0;
     }

 
short   anzahl_Trendlinie_BUY_Stop 0;
 
short   anzahl_Trendlinie_SELL_Stop 0;

 for (
int i=0ObjectsTotal(); i++) 
   {
    
string akt_Objekt ObjectName(i);

    if (
akt_Objekt == Trendlinie_BUY_Stop)
      { 
anzahl_Trendlinie_BUY_Stop++;   continue; }
    if (
akt_Objekt == Trendlinie_SELL_Stop)
      { 
anzahl_Trendlinie_SELL_Stop++;   continue; }

       if (
ObjectType(akt_Objekt) == OBJ_TREND   && ObjectGet(akt_Objekt,OBJPROP_SELECTED) == false && ObjectGet(akt_Objekt,OBJPROP_COLOR) == Farbe_Stop && ObjectGet(akt_Objekt,OBJPROP_STYLE) == Linien_Stil_Stop)
         { if (
ObjectGet_lineare_Interpolation(akt_Objekt0) > Ask)
            { 
anzahl_Trendlinie_BUY_Stop++;
               { if (
anzahl_Trendlinie_BUY_Stop 1)
                  { 
ObjectDelete(NULL,akt_Objekt); anzahl_Trendlinie_BUY_Stop 1; }
                 else 
Trendlinie_BUY_Stop akt_Objekt;
            } continue; }
           if (
ObjectGet_lineare_Interpolation(akt_Objekt0) < Bid)
            { 
anzahl_Trendlinie_SELL_Stop++;
               { if (
anzahl_Trendlinie_SELL_Stop 1)
                  { 
ObjectDelete(NULL,akt_Objekt); anzahl_Trendlinie_SELL_Stop 1; }
                 else 
Trendlinie_SELL_Stop akt_Objekt;
            } continue; }
         }
      }

       if (
anzahl_Trendlinie_BUY_Stop == 1)
      { 
BUY_Stop   NormalizeDouble(ObjectGet_lineare_Interpolation(Trendlinie_BUY_Stop0),Digits);
        if (
StringFind(Trendlinie_BUY_Stop,"Trendlinie-BUY-Stop",0) == -1)
         { 
Objekt_umbenennen(Trendlinie_BUY_Stop,"Trendlinie-BUY-Stop");
           
Trendlinie_BUY_Stop                 "Trendlinie-BUY-Stop";
         }
      }
    if (
anzahl_Trendlinie_SELL_Stop == 1)
      { 
SELL_Stop  NormalizeDouble(ObjectGet_lineare_Interpolation(Trendlinie_SELL_Stop0),Digits);
        if (
StringFind(Trendlinie_SELL_Stop,"Trendlinie-SELL-Stop",0) == -1)
         { 
Objekt_umbenennen(Trendlinie_SELL_Stop,"Trendlinie-SELL-Stop");
           
Trendlinie_SELL_Stop                 "Trendlinie-SELL-Stop";
         }
      }
    
Comment(
     
"aktueller Wert BUY-Stop: ",BUY_Stop,"\n"
     "aktueller Wert BUY-Stop: "
,SELL_Stop,"\n"
           
);
   }

double ObjectGet_lineare_Interpolation(string s_Akt_Objektint i_ZR)
{
 
double d_Preis_Linie 0;
 
double d_Preis_Schritt 0;
 
datetime date_Akt_Kerze iTime(NULLi_ZR0);
 if (
i_ZR == 0i_ZR Period();
 
int    e_objekt_typ ObjectType(s_Akt_Objekt);

       
datetime date_Trendlinie_Time1    = (datetime)(ObjectGet(s_Akt_ObjektOBJPROP_TIME1));
       
double      d_Trendlinie_Price1   ObjectGet(s_Akt_ObjektOBJPROP_PRICE1);
       
datetime date_Trendlinie_Time2    = (datetime)(ObjectGet(s_Akt_ObjektOBJPROP_TIME2));
       
double      d_Trendlinie_Price2   ObjectGet(s_Akt_ObjektOBJPROP_PRICE2);
   
       if (
date_Trendlinie_Time1 date_Trendlinie_Time2 && date_Trendlinie_Time1 date_Akt_Kerze)
          
d_Preis_Linie 0;
       
//       int      i_Shift_Trendlinie_Time0 = 0;
       
int      i_Shift_Trendlinie_Time1 0;
       
int      i_Shift_Trendlinie_Time2 0;
       if (
date_Trendlinie_Time1 <= date_Akt_Kerzei_Shift_Trendlinie_Time1 iBarShift(NULLi_ZRdate_Trendlinie_Time1);
        else 
i_Shift_Trendlinie_Time1 = (int)(-((date_Trendlinie_Time1 date_Akt_Kerze) / (i_ZR 60)));
       if (
date_Trendlinie_Time2 <= date_Akt_Kerzei_Shift_Trendlinie_Time2 iBarShift(NULLi_ZRdate_Trendlinie_Time2);
        else 
i_Shift_Trendlinie_Time2 = (int)(-((date_Trendlinie_Time2 date_Akt_Kerze) / (i_ZR 60)));
   
       if (
i_Shift_Trendlinie_Time1 i_Shift_Trendlinie_Time2)
         { 
d_Preis_Schritt          = (d_Trendlinie_Price2 d_Trendlinie_Price1) / (i_Shift_Trendlinie_Time1 i_Shift_Trendlinie_Time2);
           
d_Preis_Linie            NormalizeDouble ((d_Trendlinie_Price1 d_Preis_Schritt i_Shift_Trendlinie_Time1), Digits);
         }
       if (
i_Shift_Trendlinie_Time1 i_Shift_Trendlinie_Time2)
         { 
d_Preis_Schritt          = (d_Trendlinie_Price1 d_Trendlinie_Price2) / (i_Shift_Trendlinie_Time2 i_Shift_Trendlinie_Time1);
           
d_Preis_Linie            NormalizeDouble ((d_Trendlinie_Price2 d_Preis_Schritt i_Shift_Trendlinie_Time2), Digits);
         }
 return(
d_Preis_Linie);
}

string Objekt_umbenennen(string s_alter_Name,string s_neuer_Name)
{
       
int    e_objekt_typ ObjectType(s_alter_Name);
       
color           col_objekt_farbe = (color)(ObjectGet(s_alter_NameOBJPROP_COLOR));
       
double          d_preis_1        ObjectGet(s_alter_NameOBJPROP_PRICE1);
       
double          d_preis_2        ObjectGet(s_alter_NameOBJPROP_PRICE2);
       
datetime        date_time_1      = (datetime)(ObjectGet(s_alter_NameOBJPROP_TIME1));
       
datetime        date_time_2      = (datetime)(ObjectGet(s_alter_NameOBJPROP_TIME2));
       
short           e_Linien_Stil    = (short)(ObjectGet(s_alter_NameOBJPROP_STYLE));
       while (
ObjectGet (s_alter_NameOBJPROP_COLOR) == col_objekt_farbeObjectDelete(NULL,s_alter_Name);
       
ObjectCreate(NULL,s_neuer_Name,OBJ_TREND,0,date_time_1,d_preis_1,date_time_2,d_preis_2);
       
ObjectSetInteger(NULL,s_neuer_Name,OBJPROP_COLOR,col_objekt_farbe);
       
ObjectSetInteger(NULL,s_neuer_Name,OBJPROP_STYLE,e_Linien_Stil);
 return(
s_neuer_Name);


Bei Überschreitung des Wertes BUY-Stop bzw. Unterschreitung des Wertes SELL-Stop kannst Du dann eine Order öffnen (der Code dafür ist hier nicht entlhalten)
Das Ganze geht natürlich genauso für BUY-Limit und SELL-Limit. Ich benutze dafür einen anderen Linien-Stil.

...noch eine kleine Anmerkung: auf Dauer würde ich es nicht auf OnTick(), sondern auf OnTimer() (mindestens alle 60 Sekunden) und auf OnChartEvent() laufen lassen, sonst verbraucht es unnötig Ressoursen.

Gutes Gelingen.... ;-)

Julia 07.09.17 10:08

Danke
 
Danke, ich werde es ausprobieren :)

Julia 30.09.17 11:13

Trendlinien
 
Hallo,

ich habe den Code nun in meinen EA eingebaut und das läuft auch.
ABER
ich möchte dann die generierte Variable "BUY_Stop" aus dem Code von Adlerauge als Wert für einen Startbefehl nutzen und zwar:

if(MA<BUY_Stop)MAlong=true;

Der erkennt aber nicht die Variable BUY_Stop aus dem oben angezeigten Code von Adlerauge ..... wie kann ich die Variable "BUY_Stop" aktivieren ?:confused:

Liebe Grüße
Julia

Adlerauge 01.10.17 15:24

Wenn er die Variable nicht kennt, dann ist sie bei Dir als lokale Variable irgendwo zwischen 2 Schweifklammern deklariert, nicht aber als globale Variable (oben im EA, noch vor OnInit und OnTick).
Lokale Variablen "leben" nur innerhalb 2 Schweifklammern, während globale Variablen (Global variables of Client Terminal) im gesamten EA bekannt sind.

https://book.mql4.com/variables/globals

Adlerauge 02.10.17 05:54

... Ups, kleiner Fehler, den Link bitte vergessen, ich meinte nicht die global Variables of a Terminal, sondern ganz normale globabe Variablen. Die werden, wie schon geschrieben nicht zwischen 2 Schwifklammern sondern einfach oben im EA deklariert, und sind somit im ganzen EA verfügbar. Global Varibles of a Terminal wären in allen EAs im Terminal verfügbar, die brauchst Du hier aber nicht...


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:55 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