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)
-   -   Problem bei TP (http://www.expert-advisor.com/forum/showthread.php?t=6159)

Tullermore 24.07.18 08:40

Problem bei TP
 
Guten Morgen,

ich versuche mir das Programmieren gerade selbst bei zu bringen und der Übungs EA läuft zumindest schon mal.
Wenn ich den TP mt festen Größen laufen lasse, dann wird er auch so gesetzt wie es sein soll aber ich versuche im Moment den TP so einzustellen dass er als CRV gesetzt wird.
Zum Beispiel SL unter bestimmte Kerze und TP als CRV 3 setzten.

double entry=NormalizeDouble(Ask,_Digits);
double sl = KerzeStopp1;
double tp = KerzeStopp1 * Profit;
orderTicket=OrderSend(_Symbol,OP_BUY,Lots,entry,Sl ippage,sl,tp,Commentary,Magic);

Der SL wird da gesetzt wo er hin soll aber beim TP kommt wirres Zeug raus...
Woran kann das liegen?

Leopold 24.07.18 08:53

Hallo,

du must wenn du SL oder TP berechnest NormalizeDouble() verwenden, weil es sonst sein kann, dass die Zahl zu viele Kommastellen hat.

---Leopold---

Tullermore 24.07.18 09:58

double entry=NormalizeDouble(Ask,_Digits);
double sl =NormalizeDouble(entry - KerzeStopp1 * Point,_Digits);
double tp =NormalizeDouble(entry + KerzeStopp1 * Point,_Digits) * Profit;
orderTicket=OrderSend(_Symbol,OP_BUY,Lots,entry,Sl ippage,sl,tp,Commentary,Magic);

Jetzt bekomme ich nur noch die Fehlermeldung Order Send Error 130.

Leopold 24.07.18 10:08

Code:

double entry=NormalizeDouble(Ask,_Digits);
double sl =NormalizeDouble((entry - KerzeStopp1) * Point,_Digits);
double tp =NormalizeDouble((entry + (KerzeStopp1 * Profit)) * Point,_Digits) ;
orderTicket=OrderSend(_Symbol,OP_BUY,Lots,entry,Sl ippage,sl,tp,Commentary,Magic);

Probiers mal so.


---Leopold---

Tullermore 24.07.18 11:17

if(checkGD()=="sell" && checkKerzen() == "sell" && checkADX() == "sell" && checkOBV() == "sell")
{
double entry=NormalizeDouble(Bid,_Digits);
double sl =NormalizeDouble((entry + KerzeStopp2) * Point,_Digits);
double tp =NormalizeDouble((entry - (KerzeStopp2 * Profit)) * Point,_Digits);
orderTicket=OrderSend(_Symbol,OP_SELL,Lots,entry,S lippage,sl,tp,Commentary,Magic);
}
else if(checkGD()=="buy" && checkKerzen() == "buy" && checkADX() == "buy" && checkOBV() == "buy")
{
double entry=NormalizeDouble(Ask,_Digits);
double sl =NormalizeDouble((entry - KerzeStopp1) * Point,_Digits);
double tp =NormalizeDouble((entry + (KerzeStopp1 * Profit)) * Point,_Digits);
orderTicket=OrderSend(_Symbol,OP_BUY,Lots,entry,Sl ippage,sl,tp,Commentary,Magic);



Wenn ich es so schreibe, dann bekomme ich bei Short Positionen Error 130 // TP hae ich bei 2
und bei Long Positionen Error 4107 // Invalid TakeProfit for OrderSend funktion

Ich bin mit dem wenigen Latein wo ich habe am Ende

Leopold 24.07.18 11:21

Welchen Wert haben die Variablen KerzeStopp1 und Profit?

---Leopold---

Tullermore 24.07.18 11:25

KerzeStopp1 = iLow(_Symbol,0,StoppKerze); // StoppKerze drittletzte Kerze

input double Profit=2.0; // Profit als CRV

Tullermore 24.07.18 11:27

Wenn ich s so schreibe, dann läuft es ohne Probleme aber ich möchte halt nicht immer einen feste Größe als SL und TP.

if(checkGD()=="sell" && checkKerzen() == "sell" && checkADX() == "sell" && checkOBV() == "sell")
{
double entry=NormalizeDouble(Bid,_Digits);
double sl = NormalizeDouble(entry + Stop * _Point,_Digits);
double tp = NormalizeDouble(entry - Profit * _Point,_Digits);
orderTicket=OrderSend(_Symbol,OP_SELL,Lots,entry,S lippage,sl,tp,Commentary,Magic);
}
else if(checkGD()=="buy" && checkKerzen() == "buy" && checkADX() == "buy" && checkOBV() == "buy")
{
double entry=NormalizeDouble(Ask,_Digits);
double sl = NormalizeDouble(entry - Stop * _Point,_Digits);
double tp = NormalizeDouble(entry + Profit * _Point,_Digits);
orderTicket=OrderSend(_Symbol,OP_BUY,Lots,entry,Sl ippage,sl,tp,Commentary,Magic);

Leopold 24.07.18 11:29

KerzeStopp2 ist wahrscheinlich iHigh(...) oder?

Leopold 24.07.18 11:40

Da hast du das Problem, überleg dir mal was du da ausrechnest!
Rechne es mal im kopf durch, das kann nicht gehn.

---Leopold---

Tullermore 24.07.18 11:53

Zitat:

Zitat von Leopold (Beitrag 41281)
KerzeStopp2 ist wahrscheinlich iHigh(...) oder?

Ja, das ist er

Leopold 24.07.18 12:33

OK und jetzt rechnest du das mal nach!


---Leopold---

Tullermore 24.07.18 13:15

Ich steh im Augenblick total auf dem Schlauch:confused:

Leopold 24.07.18 13:19

dann gehn wir das mal durch:

double tp =NormalizeDouble((entry - (KerzeStopp2 * Profit)) * Point,_Digits);

beispielwerte:
entry = 12000
KerzeStopp2 = 12500
Profit = 2

dein Take Profit wäre dann:
12000 - (12500 * 2) = -13000

---Leopold---

Bobs 25.07.18 07:39

Hi Tull,

dein Fehler liegt hier:
TP soll immer höher als entry sein (wenn Buy).
tp=entry+iLow*Multiplikator*Point;
1. Fehler: iLow erfordert nicht "*Point", weil es ist nicht Punkten.
2. Fehler: iLow von einige Kerze kann niedriger als entry sein.

Gruß
Bobs

Leopold 25.07.18 07:56

Hallo,

mein Beispiel war aber von der Sell Order. Außerdem ist es mir darum gegengen, dass er darüber nachdenkt was genau er da ausrechnet.

---Leopold---

Tullermore 26.07.18 09:23

Guten Morgen,

also soweit ist es mir das jetzt klar aber wenn ich einen TP gröer als 1 eingebe, dann macht er keine Short und wenn TP kleiner als 1, dann macht er keine Longs.

Wenn ich TP von 2 eingebe, dann verdoppelt er mir als TP nur das Low der der Kerze.

Zum Beispiel
Entry 12.000
Low 11.500
TP 23.000
???
und dass passiert immer, egal wie ich es schreibe.

Ich vermute dass ich irgendwo anders einen Fehler eingebaut haben muss

MA-EA 26.07.18 09:31

// Stop Loss
extern int Stoploss=100;//

//Take Profit
extern int Takeprofit=0;//


//Stop Loss
double B_SL=NormalizeDouble(M_CB-Stoploss*_Point,_Digits);//einfacher Buy SL, der bei Open Buy gesendet werden soll.
double S_SL=NormalizeDouble(M_CA+Stoploss*_Point,_Digits) ;//einfacher Sell SL, der bei Open Sell gesendet werden soll.

if(Stoploss==0){//SL auf 0 stellen, um irgendwelche Missverständnisse zu vermeiden
B_SL=0;
S_SL=0;}

//-------------------------------------------------------------------------------------------------------------

//SLs genauso groß wie Minstoplevels machen, wenn sie kleiner sind:
double MSL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(B_SL<MSL)B_SL=MSL;
if(S_SL<MSL)S_SL=MSL;

//-------------------------------------------------------------------------------------------------------------

//Take Profit
double B_TP=NormalizeDouble(M_CB+Takeprofit*_Point,_Digit s);//einfacher Buy TP, der bei Open Buy gesendet werden soll.
double S_TP=NormalizeDouble(M_CA-Takeprofit*_Point,_Digits);//einfacher Sell TP, der bei Open Sell gesendet werden soll.

if(Takeprofit==0){//TP auf 0 stellen, um irgendwelche Missverständnisse zu vermeiden
B_TP=0;
S_TP=0;}

Leopold 26.07.18 09:38

Was genau soll mit "Profit" multipliziert werden??
Ich denke mal nicht der StopLoss Kurs, sondern das Risiko.

---Leopold---

Leopold 26.07.18 09:42

@MA-EA: Das aktuelle Problem liegt da wo anders denke ich.

---Leopold---

traderdoc 26.07.18 13:26

Ja, das ist wieder das Ergebnis der ungenauen Beschreibung, was der EA machen soll und was er bereits macht.

Also, besser wäre es, das o.g. nochmals klar zu definieren.

traderdoc


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