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)
-   -   EA setzt den SL und TP falsch (http://www.expert-advisor.com/forum/showthread.php?t=3736)

gluema 30.06.14 11:02

EA setzt den SL und TP falsch
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

habe mich am Wochenende mal hingesetzt und versucht einen EA yu programmieren. Leider werden die TP und Sl falsch gesetzt.Anstatt vom Eröffnungskurs soundsoviel Pips entfernt wird der SL und TP bei der Eingabe gesetzt.Als Beispiel Einstieg Dax bei 9000 mit SL von 50 Pips wird der Sl dann bei Kurs 50 gesetzt und nicht bei 9005. Wo ist mein Fehler?

ich habe die Buy und Sell Bedingung bewusst aus dem Beispiel raus gelöscht weil die hierfür keine Rolle spielen.


MfG
Chris

fxdaytrader 30.06.14 11:15

so könnte man es machen:

Erstmal die ordersend-routine ändern sodaß sl/tp erst nach der erfolgreichen Orderaufgabe gesetzt werden. Weiter sollte man die pips/point-Anpassung nicht vergessen.

im header (bei den externen inputs):

extern int Slippage=3;
int slippagepips;

im init(): slippagepips=Slippage;

hier für BUY:
Code:

BrokerDigitAdjust(Symbol());
double sl = Ask-SLpips*pips2dbl;
double tp = Ask+TPpips*pips2dbl;
bool result=OrderSend2Stage(symb,OP_BUY,lt,ask,Slippage,sl,tp,com,magic,0,Lime);

Code:

bool OrderSend2Stage(string symbol,int type,double lots,double price,int slippage,double sl,double tp,string ocomment,int magic,datetime expiry,color col) {
 bool result=true;
 int ticket;
 RefreshRates();
  while (IsTradeContextBusy()) Sleep(100);
  ticket=OrderSend(symbol,type,lots,price,slippage,0,0,ocomment,magic,expiry,col);
  while (IsTradeContextBusy()) Sleep(100);
  if (!OrderSelect(ticket, SELECT_BY_TICKET)) return(false);
    if (sl!=0.00000 && tp!=0.00000) result = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizePrice(OrderSymbol(),sl),NormalizePrice(OrderSymbol(),tp),OrderExpiration(),CLR_NONE);
    if (sl!=0.00000 && tp==0.00000) result = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizePrice(OrderSymbol(),sl),OrderTakeProfit(),OrderExpiration(),CLR_NONE);
    if (sl==0.00000 && tp!=0.00000) result = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),NormalizePrice(OrderSymbol(),tp),OrderExpiration(),CLR_NONE); 
 return(result);
}

void BrokerDigitAdjust(string symbol) {
 int Multiplier = 1;
 int digits=MarketInfo(symbol,MODE_DIGITS);
 if (digits==3 || digits==5) Multiplier = 10;
 if (digits==6) Multiplier = 100; 
 if (digits==7) Multiplier = 1000;
 pips2dbl = Multiplier*MarketInfo(symbol,MODE_POINT);
 Slippage=slippagepips*Multiplier;
}

it build 509 syntax, mögliich daß für die neuesten versionen etwas geändert werden muß. Man könnte sich jetzt auch eine Funktion schreiben welche den sl und tp zurückgibt, bspw. sl = GetSL(Symbol(),Ask,OP_BUY); usw.

gluema 30.06.14 11:41

Habe im Mt4 ja auch die Build 646. Kann ich den Code einfach so übernehmen durch copy paste? Doch sehr unfangreich die Änderung. Habe versucht mich an dem Buch Expert Advisor voranzuhangeln, da ich noch sehr neu bin in MQL4.

Kannst Du deine Code etwas beschreiben, damit ich ihn besser verstehe was konkret dahinter steht?
Danke erstmal für die tolle Hilfe.

Beste Grüße

Christoph

fxdaytrader 30.06.14 11:45

Zitat:

Zitat von gluema (Beitrag 26618)
Habe im Mt4 ja auch die Build 646. Kann ich den Code einfach so übernehmen durch copy paste?

Weiß ich nicht da ich noch nicht wirklich fit mit der neuen syntax bin. Da ich meist an alten mql4-Dateien arbeite genügt (noch) der build 509 editor für mich.

Zitat:

Zitat von gluema (Beitrag 26618)
Kannst Du deine Code etwas beschreiben, damit ich ihn besser verstehe was konkret dahinter steht?

Könnte ich, werde ich aber nicht tun, aus folgendem Grund:
Dieser code ist alles andere als kompliziert. Wenn Du etwas nicht verstehst nutze google, bspw. mql4 + BEFEHL, da findet sich dann massig. Weiter liefert die Seite mql4.com detaillierte Infos zu einzelnen Befehlen.

Der Rest ist dann learning by doing ... :)

gluema 30.06.14 14:31

Ok das kann ich verstehen. Aber nochmal zurück zu meinem Code. Warum wird denn meine externe SL Variable gleich als Kurswert genommen obwohl ich den SL doch berechnen lasse durch die Funktion THESTOPLOSSS und THETAKEPROFIT auch zurückgegeben wird in Order Modify?

Also ich verstehe den Grund nicht dass er nichts berechnet sondern den Wert so einfach übernimmt.

gluema 30.06.14 18:41

Wäre über Hilfe dankbar.

MfG

Crashbulle 30.06.14 20:12

du kannst doch einfach den dir bereitgestellten Text mit copypaste in den Editor laden, dann vergleichen, welches zu deinem Code gleich wäre oder anders ist, schon müßtest du deinen Fehler entdecken.

fxdaytrader 30.06.14 20:19

Zitat:

Zitat von gluema (Beitrag 26621)
Wäre über Hilfe dankbar.

Baue nach jedem Befehl Print(-Anweisungen ein und lasse Dir die aktuellen Daten (bspw. OrderStopLoss()) anzeigen.

pako 30.06.14 22:10

Zitat:

Zitat von gluema (Beitrag 26616)
Hallo zusammen,

habe mich am Wochenende mal hingesetzt und versucht einen EA yu programmieren. Leider werden die TP und Sl falsch gesetzt.Anstatt vom Eröffnungskurs soundsoviel Pips entfernt wird der SL und TP bei der Eingabe gesetzt.Als Beispiel Einstieg Dax bei 9000 mit SL von 50 Pips wird der Sl dann bei Kurs 50 gesetzt und nicht bei 9005. Wo ist mein Fehler?

ich habe die Buy und Sell Bedingung bewusst aus dem Beispiel raus gelöscht weil die hierfür keine Rolle spielen.


MfG
Chris

Code:

//+------------------------------------------------------------------+
//    expert start function
//+------------------------------------------------------------------+
int start()
{
  double MyPoint=Point;
  if(Digits==3 || Digits==5) MyPoint=Point;
 
  double TheStopLoss=0;
  double TheTakeProfit=0;
  if( TotalOrdersCount()==0 )
  {
    int result=0;
    if(() // Eroffnung BUY  ????????????????
    {
        result=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,StopLoss,0,"EA Generator BUY",MagicNumber,0,Green);
        if(result>0)
        {
        TheStopLoss=0;
        TheTakeProfit=0;
        if(TakeProfit>0) TheTakeProfit=Ask+TakeProfit*MyPoint;
        if(StopLoss>0) TheStopLoss=Ask-StopLoss*MyPoint;
        OrderSelect(result,SELECT_BY_TICKET);
        OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
        }
        return(0);
    }
    if() // Eroffnung SELL ????????????????
    {
        result=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"EA Generator SELL",MagicNumber,0,Red);
        if(result>0)
        {
        TheStopLoss=0;
        TheTakeProfit=0;
        if(TakeProfit>0) TheTakeProfit=Bid-TakeProfit*MyPoint;
        if(StopLoss>0) TheStopLoss=Bid+StopLoss*MyPoint;
        OrderSelect(result,SELECT_BY_TICKET);
        OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
        }
        return(0);
    }
  }

:confused::eek::confused:

fxdaytrader 30.06.14 22:15

Da stand wohl die tradelogic, hat er doch herausgenommen da hier nicht wichtig ... :cool:

Ach ja, bist Du der Pago aus der fabrik oder ist das jemand anders? :)


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