Einzelnen Beitrag anzeigen
  #4 (permalink)  
Alt 03.09.17
Adlerauge Adlerauge ist offline
Mitglied
 
Registriert seit: Nov 2015
Beiträge: 136
Adlerauge befindet sich auf einem aufstrebenden Ast
Standard

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.... ;-)