Chiudere solo le compravendite redditizie, all'obiettivo di profitto

 

Ciao, sto testando questo ea e penso che sia molto utile per chiudere gli ordini, ma nel mio caso non voglio chiudere tutti gli ordini aperti, voglio solo chiudere solo gli ordini redditizi.

Ho cambiato il valore "CloseProfitableTradesOnly" da false a true, ma gli ordini continuano a chiudersi a 1 usd. E quello che sto cercando è di chiudere solo gli ordini redditizi quando, insieme, raggiungono i 25 usd. Tutti gli ordini chiusi sopra 1 usd di profitto.

Se avete qualche suggerimento lo apprezzo molto. Grazie in anticipo per il vostro aiuto.

Ecco l'ea e il codice:

//|$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//|              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 = false; // 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) CloseAllinProfit();
    
    if(BuyProfit+SellProfit >= ProfitTarget) CloseAll(); 

    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()

 


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

Ciao, sto testando questo ea e penso che sia molto utile per chiudere gli ordini, ma nel mio caso non voglio chiudere tutti gli ordini aperti, voglio solo chiudere solo gli ordini redditizi.

Ho cambiato il valore "CloseProfitableTradesOnly" da false a true, ma gli ordini continuano a chiudersi a 1 usd. E quello che sto cercando è di chiudere solo gli ordini redditizi quando, insieme, raggiungono i 25 usd. Tutti gli ordini chiusi sopra 1 usd di profitto.


Immagino che tu non abbia scritto questo codice . . .

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

    if(ClosePendingOnly) ClosePendingOrdersOnly();

. . . ma dovreste essere in grado di leggerlo.

Hai cambiato il valore "CloseProfitableTradesOnly" da false a true, quindi se guardi sopra CloseAllinProfit() viene chiamato . . . indipendentemente dal profitto totale.

Prova questo cambiamento:

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

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

    if(ClosePendingOnly) ClosePendingOrdersOnly();
 

Ciao Raptor, grazie per la tua risposta.

Non ho scritto questo codice, ho solo cambiato il valore dell'input "CloseProfitableTradesOnly" da false a true, così:

Sto provando con le tue modifiche ma ancora l'ea non chiude al profit target, (in questo caso 25 usd.)


Devo cambiare da 0.0 a 25.0 anche nel codice?

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

Ciao Raptor, grazie per la tua risposta.

Non ho scritto questo codice, ho solo cambiato il valore dell'input "CloseProfitableTradesOnly" da false a true, così:

Sto provando con le tue modifiche ma ancora l'ea non chiude al target di profitto, (in questo caso 25 usd.)


Devo cambiare da 0.0 a 25.0 anche nel codice?


No, questa linea dovrebbe fare quello che vuoi, sei sicuro di aver fatto tutte le modifiche?

    if(CloseProfitableTradesOnly && BuyProfit+SellProfit >= ProfitTarget) CloseAllinProfit();
 
Ho cambiato da questo
if(CloseAllNow) CloseAll();
    
if(CloseProfitableTradesOnly) CloseAllinProfit();
    
if(BuyProfit+SellProfit >= ProfitTarget) CloseAll(); 

if(ClosePendingOnly) ClosePendingOrdersOnly();

A questo:

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

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

if(ClosePendingOnly) ClosePendingOrdersOnly();


E l'input "CloseProfitableTradesOnly" da false a true.


Ma non chiudere. Cos'altro potrebbe essere?

 
af1:
Ho cambiato da questo

A questo:


E l'input "CloseProfitableTradesOnly" da false a true.


Ma non chiudere. Cos'altro potrebbe essere?

Forse il tuo profitto totale è inferiore a 25,0
 
RaptorUK:
Forse il vostro profitto totale è inferiore a 25,0


Se fosse inferiore a 25, allora dovrebbe chiudere ancora più velocemente.

 
af1:


Se fosse inferiore a 25, allora dovrebbe chiudere ancora più velocemente.

No, il profitto deve essere maggiore o uguale a 25,0 prima che si chiuda.

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

No, il profitto deve essere maggiore o uguale a 25,0 prima che si chiuda . . .


Ecco un esempio di Raptor. Ho 4 ordini con 97.9 di profitto. Quindi se il mio obiettivo di profitto è 25, e la condizione è "CloseProfitableTradesOnly" vera, allora questi 4 ordini dovrebbero chiudersi. Ma non sta chiudendo nessun ordine.

 
af1:


Ecco un esempio di Raptor. Ho 4 ordini con 97.9 di profitto. Quindi se il mio obiettivo di profitto è 25, e la condizione è "CloseProfitableTradesOnly" vera, allora questi 4 ordini dovrebbero chiudersi. Ma non sta chiudendo nessun ordine.

No, il profitto totale deve essere maggiore di 25,0, il tuo è -59,80