Schließen Sie nur gewinnbringende Trades mit Gewinnziel - Seite 3

 
af1:

Hi GumRai, thanks for your time. I've already tried with your changes, but orders keep closing at 1. In other words, profitable orders are not waiting to reach 25.

Auch mit der Codezeile, die zuvor von DeVries und Raptor bereitgestellt wurde?

if(CloseAllNow) CloseAll();
    
    if(CloseProfitableTradesOnly && ProfitTarget == 0.0) CloseAllinProfit();
    
    if(BuyProfit+SellProfit >= ProfitTarget && !CloseProfitableTradesOnly) CloseAll(); 

    if(CloseProfitableTradesOnly && BuyProfit+SellProfit >= ProfitTarget) CloseAllinProfit();

    if(ClosePendingOnly) ClosePendingOrdersOnly();

Hoffentlich haben Sie diese Zeile nicht geändert, Sie haben sie nur in Betracht gezogen.

if(CloseProfitableTradesOnly && ProfitTarget == 0.0) CloseAllinProfit();

Wenn Sie es auf 25,00 geändert haben, dann haben Sie alle profitablen Trades von $1+ geschlossen

 
GumRai:

Auch mit der Codezeile, die zuvor von DeVries und Raptor bereitgestellt wurde?

Hoffentlich haben Sie diese Zeile nicht geändert, Sie haben sie nur in Betracht gezogen.

Wenn Sie es auf 25,00 geändert haben, dann haben Sie alle profitablen Trades von $1+ geschlossen


Ich habe alle Vorschläge ausprobiert, aber sie schließen immer noch nicht richtig.

 
af1:


Ich habe alle Vorschläge ausprobiert, aber sie lassen sich immer noch nicht richtig schließen.


Vielleicht können Sie den vollständigen Code zeigen, den Sie im Moment verwenden
 
GumRai:

Vielleicht können Sie den vollständigen Code zeigen, den Sie im Moment verwenden

//|$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//|              Close 
//|   Last Updated 12-12-2006 10:00pm
//|$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
#define     NL    "\n" 

extern int    ProfitTarget     = 25;             // closes all orders once Float hits this $ amount
extern bool   CloseAllNow      = false;          // closes all orders now
extern bool   CloseProfitableTradesOnly = true; // closes only profitable trades
extern double ProftableTradeAmount      = 1;     // Only trades above this amount close out
extern bool   ClosePendingOnly = false;          // closes pending orders only
extern bool   UseAlerts        = false;

//+-------------+
//| Custom init |
//|-------------+
int init()
  {

  }

//+----------------+
//| Custom DE-init |
//+----------------+
int deinit()
  {

  }

//+------------------------------------------------------------------------+
//| Closes everything
//+------------------------------------------------------------------------+
void CloseAll()
{
   int i;
   bool result = false;

   while(OrdersTotal()>0)
   {
      // Close open positions first to lock in profit/loss
      for(i=OrdersTotal()-1;i>=0;i--)
      {
         if(OrderSelect(i, SELECT_BY_POS)==false) continue;

         result = false;
         if ( OrderType() == OP_BUY)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 15, Red );
         if ( OrderType() == OP_SELL)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 15, Red );
         if (UseAlerts) PlaySound("alert.wav");
      }
      for(i=OrdersTotal()-1;i>=0;i--)
      {
         if(OrderSelect(i, SELECT_BY_POS)==false) continue;

         result = false;
         if ( OrderType()== OP_BUYSTOP)  result = OrderDelete( OrderTicket() );
         if ( OrderType()== OP_SELLSTOP)  result = OrderDelete( OrderTicket() );
         if ( OrderType()== OP_BUYLIMIT)  result = OrderDelete( OrderTicket() );
         if ( OrderType()== OP_SELLLIMIT)  result = OrderDelete( OrderTicket() );
         if (UseAlerts) PlaySound("alert.wav");
      }
      Sleep(1000);
   }
}
   
//+------------------------------------------------------------------------+
//| cancels all orders that are in profit
//+------------------------------------------------------------------------+
void CloseAllinProfit()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
 {
    OrderSelect(i, SELECT_BY_POS);
    bool result = false;
        if ( OrderType() == OP_BUY && OrderProfit()+OrderSwap()>ProftableTradeAmount)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
        if ( OrderType() == OP_SELL && OrderProfit()+OrderSwap()>ProftableTradeAmount)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
        if (UseAlerts) PlaySound("alert.wav");
 }
  return; 
}

//+------------------------------------------------------------------------+
//| cancels all pending orders 
//+------------------------------------------------------------------------+
void ClosePendingOrdersOnly()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
 {
    OrderSelect(i, SELECT_BY_POS);
    bool result = false;
        if ( OrderType()== OP_BUYSTOP)   result = OrderDelete( OrderTicket() );
        if ( OrderType()== OP_SELLSTOP)  result = OrderDelete( OrderTicket() );
  }
  return; 
  }

//+-----------+
//| Main      |
//+-----------+
int start()
  {
   int      OrdersBUY;
   int      OrdersSELL;
   double   BuyLots, SellLots, BuyProfit, SellProfit;

//+------------------------------------------------------------------+
//  Determine last order price                                       |
//-------------------------------------------------------------------+
      for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
         if(OrderType()==OP_BUY)  
         {
            OrdersBUY++;
            BuyLots += OrderLots();
            BuyProfit += OrderProfit() + OrderCommission() + OrderSwap();
         }
         if(OrderType()==OP_SELL) 
         {
            OrdersSELL++;
            SellLots += OrderLots();
            SellProfit += OrderProfit() + OrderCommission() + OrderSwap();
         }
      }               
   
    if(CloseAllNow) CloseAll();
    
    if(CloseProfitableTradesOnly && ProfitTarget == 0.0) CloseAllinProfit();
    
    if(BuyProfit+SellProfit >= ProfitTarget && !CloseProfitableTradesOnly) CloseAll();
    
    if(CloseProfitableTradesOnly && BuyProfit+SellProfit >= ProfitTarget) CloseAllinProfit(); 

    if(ClosePendingOnly) ClosePendingOrdersOnly();
       
   
   Comment("                            Comments Last Update 12-12-2006 10:00pm", NL,
           "                            Buys    ", OrdersBUY, NL,
           "                            BuyLots        ", BuyLots, NL,
           "                            Sells    ", OrdersSELL, NL,
           "                            SellLots        ", SellLots, NL,
           "                            Balance ", AccountBalance(), NL,
           "                            Equity        ", AccountEquity(), NL,
           "                            Margin              ", AccountMargin(), NL,
           "                            MarginPercent        ", MathRound((AccountEquity()/AccountMargin())*100), NL,
           "                            Current Time is  ",TimeHour(CurTime()),":",TimeMinute(CurTime()),".",TimeSeconds(CurTime()));
 } // start()

 


 

Bitte gehen Sie zurück zu meinem Beitrag

https://forum.mql4.com/56959/page2#822980

Sie addieren nicht nur die profitablen Geschäfte. Sie berechnen den Nettogewinn oder -verlust

 
GumRai:

Bitte gehen Sie zurück zu meinem Beitrag

https://forum.mql4.com/56959/page2#822980

Sie addieren nicht nur die profitablen Geschäfte. Sie berechnen den Nettogewinn oder -verlust.



GumRai, ich habe die von Raptor und von Ihnen vorgeschlagenen Codeänderungen vorgenommen:

https://www.mql5.com/en/forum/146091
https://www.mql5.com/en/forum/146091/page2#822980

Und jetzt scheint es richtig zu schließen. Vielen Dank dafür!


Nur noch eine Sache. Wenn ich nur die profitablen Käufe oder nur die profitablen Verkäufe berechnen möchte, anstatt alle profitablen Geschäfte zu berechnen, was muss ich dann ändern?

Ich denke, dass diese Änderung nur Käufe berechnet, aber ich bin mir nicht sicher. Ist das richtig?:

hieraus:

if(OrderType()==OP_SELL) 
         {
            OrdersSELL++;
            SellLots += OrderLots(); 
            ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            if(ThisTradeProfit>0)
            BuyProfit += ThisTradeProfit;
         }

dazu:

//if(OrderType()==OP_SELL) 
         {
            //OrdersSELL++;
            //SellLots += OrderLots(); 
            //ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            //if(ThisTradeProfit>0)
            //BuyProfit += ThisTradeProfit;
         }
 

Ich vermute, dass Sie 2 externe bool zu den Eingabeparametern hinzufügen könnten, die so etwas wie "BuyTradesOnly" und "SellTradesOnly" heißenund beide zunächst auf false gesetzt sind

dann

if(OrderType()==OP_SELL && BuyTradesOnly == false)
         {
            OrdersSELL++;
            SellLots += OrderLots(); 
            ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            if(ThisTradeProfit>0)
            BuyProfit += ThisTradeProfit;
         }
 
GumRai:

Ich schätze, dass Sie 2 externe bool zu den Eingabeparametern hinzufügen könnten, die so etwas wie "BuyTradesOnly" und "SellTradesOnly" heißenund beide zunächst auf false gesetzt sind

dann


Ich habe die 2 externen bool nicht hinzugefügt, ich ändere dies nur, um "nur Kaufaufträge" zu schließen.

for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
         if(OrderType()==OP_BUY)  
         {
            OrdersBUY++;
            BuyLots += OrderLots();
            double ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            if(ThisTradeProfit>0)
            BuyProfit += ThisTradeProfit;
         }

und dies ändern, um "nur Verkaufsaufträge" zu schließen.

for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
         if(OrderType()==OP_SELL)  
         {
            OrdersSELL++;
            SellLots += OrderLots();
            double ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            if(ThisTradeProfit>0)
            BuyProfit += ThisTradeProfit;
         }

Jetzt habe ich also zwei EA's. Einen für Close-Käufe und einen für Close-Verkäufe. Das ist für mich in Ordnung.


Ich habe auf beiden Konten, Demo und Real, getestet. Auf dem Demokonto funktioniert es gut, aber auf dem Realkonto fängt es an, Positionen zu schließen, sobald das Gewinnziel erreicht ist, aber dann hört es auf, Positionen zu schließen, wenn die verbleibenden Aufträge unter das Gewinnziel fallen. Dies geschieht, wenn sich der Preis zum Zeitpunkt der Schließung ändert. Es neigt also dazu, profitable Aufträge offen zu lassen, anstatt sie alle zu schließen (profitable Aufträge).

Ich habe diesen Beitrag von RaptorUK https://www.mql5.com/en/forum/139654 gelesen. Es ist etwas in der Art, aber ich weiß nicht wirklich, was die beste Lösung für dieses Problem sein könnte.


 
af1:


Ich habe diesen Beitrag von RaptorUK https://www.mql5.com/en/forum/139654 gelesen. Es ist so ähnlich, aber ich weiß nicht wirklich, was die beste Lösung für dieses Problem sein könnte.

Die Lösung ist in dem Thread angegeben... deshalb habe ich ihn erstellt. Abwärts zählen in der Schleife nicht aufwärts.
 
RaptorUK:
Die Lösung ist in dem Thread angegeben ... deshalb habe ich ihn erstellt. In der Schleife wird abwärts gezählt, nicht aufwärts.


Ok Raptor, ich werde versuchen, diese Schleife zu machen, aber bevor ich das tue, was ist, wenn ich einfach ändere

Von diesem:
}
      Sleep(1000);
   }
Zu diesem:
}
      Sleep(5000);
      RefreshRates();
      continue;
   }


Könnte dies die Aufgabe erfüllen?

Grund der Beschwerde: