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)
-   -   Teilprofite raussichern und Breakeven setzen,Code fehlerfrei aber wird nicht umgesetz (http://www.expert-advisor.com/forum/showthread.php?t=6599)

chesstigran 06.02.20 20:44

Teilprofite raussichern und Breakeven setzen,Code fehlerfrei aber wird nicht umgesetz
 
Hey Leute,

ich brauche zwei Funktionen die ich schon implementiert habe allerdings funktionieren diese nicht ganz ..

Diese zwei Funktionen wären einmal Breakeven setzen, wenn der Trade aktuell 10 Pips/Punkte im Profit ist:

Code:


bool bResult = false;

    for(int i = OrdersTotal() - 1; i >= 0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { 
     
    if(OrderType() == OP_BUY && (OrderOpenPrice() > OrderStopLoss()) && (((Bid - OrderOpenPrice()) >= 10))) {
    bResult = OrderModify(OrderTicket(), OrderOpenPrice(),OrderOpenPrice(), OrderTakeProfit(), 0);
          }
                 
          if(OrderType() == OP_SELL  && (OrderOpenPrice() < OrderStopLoss()) && (((OrderOpenPrice() - Ask) >= 10))){
          bResult = OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0);
                }
      }
    }

und die zweite die ich brauche ist Teilprofite reinclosen wenn der Trade zb mehr als 50 Pips/Punkte im Profit ist.Code:

Code:

bool bClose = false;

    if(OrderType() == OP_BUY && (Bid - OrderOpenPrice()) >= 100.00) {
    bClose = OrderClose(OrderTicket(),OrderLots() / 2, OrderClosePrice(),3, Green);
    }
    if(OrderType() == OP_SELL && (OrderOpenPrice() - Ask) >= 100.00) {
    bClose = OrderClose(OrderTicket(),OrderLots() / 2, OrderClosePrice(), 3, Green);
    }

das Ganze hab ich auf einen Zeitraum vom 3.7.19 bis zum 6.2.20 getestet. Das Interessante ist das er das in den letzen Wochen beachtet aber je weiter weg der Zeitraum ist desto mehr macht er es gar nicht(bzw ab einem Punkt macht er es gar nicht).

Weiß da jemand weiter? ist mit dem Code irgendwas falsch oder so? Hat das was mit der Historiendatenbank zu tun?

traderdoc 06.02.20 22:12

Beide Funktionen würden nur korrekt funktionieren, wenn es sich nicht um Währungspaare handelt, denn die Differenz aus

Bid - OrderOpenPrice() >= 10
bzw.
Bid - OrderOpenPrice() >= 100.00

wird dann nie >=10 bzw. >=100.00 ergeben können.
Bei Währungspaaren müsste dann stehen: 10*_Point bzw. 100*_Point.
Und dann hängt es noch davon ab, es ein 4- oder 5-Digit-Broker ist. Sollten reale 10 bzw. 100 Pips gemeint sein, dann müsste beim 5-Digit-Broker nochmals mit 10 multipliziert werden.

Ansonsten liegt in der Tat der Verdacht nahe, dass die historischen Daten in die Vergangenheit nicht ausreichen.

traderdoc

MA-EA 06.02.20 22:17

So läufts bei mir ganz gut. Mit nen paar Pips Abweichung hier und da...
Code:

//-----------------------------------------------------------------------------------------------------------*/

extern int Stop_Loss=400;

//-----------------------------------------------------------------------------------------------------------*/

extern string TS="Trailing Stop";

input bool Trailing_Stop=false; // Zum Testen aus
extern int Trailing_Stop_Step=30; // Bei TSS 6 wurden gar keine Orders geöffnet.

//-----------------------------------------------------------------------------------------------------------*/

extern int Take_Profit=5000; // Zum Testen 5.000

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

Code:

//=============================================================================================================
// S T O P  L O S S
//=============================================================================================================

//SL auf 0 stellen, wenn oben <1,
//um irgendwelche Missverständnisse zu vermeiden.
if(Stop_Loss<1){
  Buy_SL=0.0;
  Sel_SL=0.0;}

  else{
    Buy_SL=NormalizeDouble(Ask-Stop_Loss*_Point,_Digits);
    Sel_SL=NormalizeDouble(Bid+Stop_Loss*_Point,_Digits);}

//SL genauso groß wie Minstoplevels machen, wenn er kleiner ist:
double MSL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(Buy_SL<MSL)Buy_SL=MSL;
if(Sel_SL<MSL)Sel_SL=MSL;

//=============================================================================================================
// T A K E  P R O F I T
//=============================================================================================================

//TP auf 0 stellen, wenn oben <1,
//um irgendwelche Missverständnisse zu vermeiden.
if(Take_Profit<1){
  Buy_TP=0.0;
  Sel_TP=0.0;}

  else{
    Buy_TP=NormalizeDouble(Ask+Take_Profit*_Point,_Digits);
    Sel_TP=NormalizeDouble(Bid-Take_Profit*_Point,_Digits);}

Code:

//=============================================================================================================
// M O D I F Y  O R D E R S
//=============================================================================================================

if(Trailing_Stop==true){

  for(i=OrdersTotal()-1;i>=0;i--){
    if(OrderSelect(i,SELECT_BY_POS)){
///////////////////////////////////////////////////////////////////////////////////////////////////////////////

      //Neuer BUY-"SL" (B_TS) Funktionen/Berechnungen
      if(OrderType()==OP_BUY&&OrderMagicNumber()==Buy_MN&&OrderSymbol()==Symbol()){

        //BUY-Öffnungskurs - gesendeten BUY-SL, um Wert zu ermitteln, der vom Ask abgezogen wurde:
        double BOOP_BOSL = OrderOpenPrice() - OrderStopLoss();
       
        //ASK - BUY_SL double-Wert = neuer BUY-"SL", der bei OrderModify gesendet werden soll:
        double Buy_TS = Ask - BOOP_BOSL;

        //neuer BUY_"SL" - Trailing_Stop_Step.
        //Damit soll geprüft werden, ob BUY_"SL" (B_TS) nach gezogen werden muss.
        double BuyTS_TSS = NormalizeDouble( Buy_TS - Trailing_Stop_Step *_Point,_Digits);
       
        //Wenn aktueller/zuletzt gesendeter BUY_SL kleiner als
        //neuer BUY_SL - TSS ist, soll neuer BUY_"SL" (BUY_TS) gesendet werden:
        if( OrderStopLoss() < BuyTS_TSS ){
         
          if(IsTradeAllowed()==true)OM=OrderModify(OrderTicket(),OrderOpenPrice(),Buy_TS,OrderTakeProfit(),0,CLR_NONE);}}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////


      //Neuer SELL-"SL" (S_TS) Funktionen/Berechnungen
      if(OrderType()==OP_SELL&&OrderMagicNumber()==Sell_MN&&OrderSymbol()==Symbol()){

        //gesendeter SELL_SL - Öffnungskurs, um double-Wert ermitteln, der zum BID dazu gerechnet wurde:
        double SOSL_SOOP = OrderStopLoss() - OrderOpenPrice();

        //BID + SELL-SL double-Wert = neuer SELL-"SL", der bei OrderModify gesendet werden soll
        double Sel_TS = Bid + SOSL_SOOP;

        double SelTS_TSS=NormalizeDouble(Sel_TS + Trailing_Stop_Step *_Point,_Digits);
       
        if( OrderStopLoss() > SelTS_TSS ){
         
          if(IsTradeAllowed()==true)OM=OrderModify(OrderTicket(),OrderOpenPrice(),Sel_TS,OrderTakeProfit(),0,CLR_NONE);}} }}}



Alle Zeitangaben in WEZ +1. Es ist jetzt 17:36 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