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) > 0 &&
(ObjectGet (Trendlinie_BUY_Stop, OBJPROP_COLOR) != Farbe_Stop || ObjectGet(Trendlinie_BUY_Stop, OBJPROP_STYLE) != Linien_Stil_Stop))
{ StringInit(Trendlinie_BUY_Stop, 0, 0);
BUY_Stop = 0;
}
if (StringLen(Trendlinie_SELL_Stop) > 0 &&
(ObjectGet (Trendlinie_SELL_Stop, OBJPROP_COLOR) != Farbe_Stop || ObjectGet(Trendlinie_SELL_Stop, OBJPROP_STYLE) != Linien_Stil_Stop))
{ StringInit(Trendlinie_SELL_Stop, 0, 0);
SELL_Stop = 0;
}
short anzahl_Trendlinie_BUY_Stop = 0;
short anzahl_Trendlinie_SELL_Stop = 0;
for (int i=0; i < ObjectsTotal(); 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_Objekt, 0) > 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_Objekt, 0) < 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_Stop, 0),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_Stop, 0),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_Objekt, int i_ZR)
{
double d_Preis_Linie = 0;
double d_Preis_Schritt = 0;
datetime date_Akt_Kerze = iTime(NULL, i_ZR, 0);
if (i_ZR == 0) i_ZR = Period();
int e_objekt_typ = ObjectType(s_Akt_Objekt);
datetime date_Trendlinie_Time1 = (datetime)(ObjectGet(s_Akt_Objekt, OBJPROP_TIME1));
double d_Trendlinie_Price1 = ObjectGet(s_Akt_Objekt, OBJPROP_PRICE1);
datetime date_Trendlinie_Time2 = (datetime)(ObjectGet(s_Akt_Objekt, OBJPROP_TIME2));
double d_Trendlinie_Price2 = ObjectGet(s_Akt_Objekt, OBJPROP_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_Kerze) i_Shift_Trendlinie_Time1 = iBarShift(NULL, i_ZR, date_Trendlinie_Time1);
else i_Shift_Trendlinie_Time1 = (int)(-((date_Trendlinie_Time1 - date_Akt_Kerze) / (i_ZR * 60)));
if (date_Trendlinie_Time2 <= date_Akt_Kerze) i_Shift_Trendlinie_Time2 = iBarShift(NULL, i_ZR, date_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_Name, OBJPROP_COLOR));
double d_preis_1 = ObjectGet(s_alter_Name, OBJPROP_PRICE1);
double d_preis_2 = ObjectGet(s_alter_Name, OBJPROP_PRICE2);
datetime date_time_1 = (datetime)(ObjectGet(s_alter_Name, OBJPROP_TIME1));
datetime date_time_2 = (datetime)(ObjectGet(s_alter_Name, OBJPROP_TIME2));
short e_Linien_Stil = (short)(ObjectGet(s_alter_Name, OBJPROP_STYLE));
while (ObjectGet (s_alter_Name, OBJPROP_COLOR) == col_objekt_farbe) ObjectDelete(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.... ;-)