Close all open trades at once

 

Hi Guys,

I want to code an Ea that could close all open trades at once, with closing conditions as soon as the Sum of profits and losses is positive. There are many articles in the web that offers codes, scripts or EA in order to close trades at profit. But these codes are to close opened trades that are in profit and they leave the losses trades to be open.

I hope that you understand what i am seeking for. For example i want to close all opened orders by Hedging as soon as the closing conditions are meeting and the sum of profit and losses is positive.

I made the below code for my ea but it closes trades that they meet the closing conditions and are in profit and the losses trades will be stay opened.

can anyone help me by this problem?

I thought that by closing profitable trades, the sum of profit and losses is not positive any more then the losses trades will be stay opened. therefor i wrote the closing code by each situation so that the losses trades must be closed first and after that the profitable trades closing code, but it does not work again!

Sorry for my English knowledge.

   
   for (int y=OrdersTotal()-1;y>=0;y--)
   {
     double Sellprofit;
     double Buyprofit ;
     double Totalprofit ;

   
         OrderSelect(y,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            
            { 
            if(OrderType()==OP_BUY )
            {
            Buyprofit+=OrderProfit()+OrderSwap()+OrderCommission();
            }
            if(OrderType()==OP_SELL)
            {  
            Sellprofit+=OrderProfit()+OrderSwap()+OrderCommission();
            }   
            Totalprofit=Buyprofit+Sellprofit;

            
            if (Close[0]>Close[1] && Totalprofit>0 && Sellprofit>Buyprofit) { 
 
             if(OrderType()==OP_BUY )
            {
            OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,CLR_NONE);
            }
             if(OrderType()==OP_SELL)
            {  
           OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,CLR_NONE);
            }
            
            }
            
              if (Close[0]<Close[1] && Totalprofit >0 && Sellprofit<Buyprofit) { 
                
             if(OrderType()==OP_SELL)
            {  
           OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,CLR_NONE);
            }   
             
             if(OrderType()==OP_BUY )
            {
            OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,CLR_NONE);
            }

            
            }
            
            
            
   Comment("                            Comments Last Update 12-12-2006 10:00pm", NL,
           "                            Buyprofit    ", Buyprofit, NL,
           "                            Sellprofit        ", Sellprofit, NL,
           "                            Totalprofit        ", Totalprofit, NL,
           "                            Current Time is  ",TimeHour(CurTime()),":",TimeMinute(CurTime()),".",TimeSeconds(CurTime()));
          
            
         }
    }
//----
   return(0);
  }
 

You are making decisions about closing orders before you know if . . . "the Sum of profits and losses is positive. " . . . you only know if the " Sum of profits and losses is positive. " only after you have summed all the losing trades and all the winning trades, and that will be after the loop is complete . . .

For example, take the first trade seen in the loop, if it is a Buy and a loss then Sellprofit (0) will be greater than Buyprofit (a loss) and if Bid > Close[1] the order will be closed.

 
RaptorUK:

You are making decisions about closing orders before you know if . . . "the Sum of profits and losses is positive. " . . . you only know if the " Sum of profits and losses is positive. " only after you have summed all the losing trades and all the winning trades, and that will be after the loop is complete . . .

For example, take the first trade seen in the loop, if it is a Buy and a loss then Sellprofit (0) will be greater than Buyprofit (a loss) and if Bid > Close[1] the order will be closed.


the sum of profits and sum of losses by sell or Buy position will be calculated on the above code separately :

            if(OrderType()==OP_BUY )
            {
            Buyprofit+=OrderProfit()+OrderSwap()+OrderCommission();
            }
            if(OrderType()==OP_SELL)
            {  
            Sellprofit+=OrderProfit()+OrderSwap()+OrderCommission(); }

Buyprofit will sums all profit and losses when the OrderType()==OP_BUY and the Sellprofit will sums all profit and losses when the OrderType()==OP_SELL.

so if the Totalprofit=Buyprofit+Sellprofit is greater than 0 then the sum of profits and losses is more than 0.

if you take look at the above code you see that i made two closing conditions and by each one Totalprofit>0 is needed.

 
hmrt135:


the sum of profits and sum of losses by sell or Buy position will be calculated on the above code separately :

Buyprofit will sums all profit and losses when the OrderType()==OP_BUY and the Sellprofit will sums all profit and losses when the OrderType()==OP_SELL.

so if the Totalprofit=Buyprofit+Sellprofit is greater than 0 then the sum of profits and losses is more than 0.

if you take look at the above code you see that i made two closing conditions and by each one Totalprofit>0 is needed.

Yep, OK, I see what you mean about Totalprofit . . . I just don't get the logic of doing this as you go through the loop, order by order . . . if the first order you see is in profit then you close it ? this doesn't make sense in light of what you said . . . . " I want to code an Ea that could close all open trades at once "
 

Second.... its confusing what you're looking for. Given what I understand, you'll want to check for total profit first before closing anything. Something like below, I didn't test it.

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void start(){
    int My_Magic=7;
    double Buy_Profit=Profit_Total_Magic_Symbol_Type(My_Magic,Symbol(),OP_BUY);
    double Sel_Profit=Profit_Total_Magic_Symbol_Type(My_Magic,Symbol(),OP_SELL);
    double Total_Profit=Buy_Profit+Sel_Profit;
    if(Total_Profit>0){Close_Order_Of_Largest_Size_Recommended();}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
double Profit_Total_Magic_Symbol_Type(
/*  
    Function Returns the Total Profit After Swaps and 
    Commissions for Particular Magic-Number, Symbol, Order-Type.
    Only works on Active Orders and Not-Upon Historical Orders
    Example of Call:
    Profit_Total_Magic_Symbol_Type(7,"GBPUSD",1);
*/
    int     Magic=0,
    string  Symb="",
    int     Type=0 //Example OP_BUY
){
    double Res; if(Symb==""){Symb=Symbol();}
    for(int i=OrdersTotal()-1; i>=0; i--){
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(OrderMagicNumber()==Magic
            && OrderSymbol()==Symb
            && OrderType()==Type
            ){
                Res+=OrderProfit()+OrderSwap()+OrderCommission();
        }   }
    }return(Res);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

Trades will be closed one by one you can't change that

If there are also pendingtrades that has to be deleted then a little change will be needed inside this

//+------------------------------------------------------------------------------+
//|                                                     NEW close all trades.mq4 |
//+------------------------------------------------------------------------------+
#property copyright "T. de Vries"
#property link      ""


extern int    Slippage = 3;
extern double MaxLoss = 420.0;
extern double MinProfit = 40.0;
extern int    Magic1 = 1234;

// Globals
int TradesSlippage;
double Poin,profitnow;
bool CloseOrdersNow=false;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

//calculating total profit
double MyProfitsTotal(int Magic1)         //(int Magic1)
{
double profit=0;
for (int cnt = OrdersTotal()-1 ; cnt >= 0 ; cnt--)
  {
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    if (OrderMagicNumber() == Magic1 && OrderSymbol()==Symbol())
    {
//      if(OrderType() == OP_BUY || OrderType() == OP_SELL)
      profit+= OrderProfit() + OrderCommission() + OrderSwap();
    } //if
  } //for
  return(profit);
} 


int init()
{
  if (Digits == 4 || Digits == 2) 
     {
       TradesSlippage = Slippage;
       Poin = Point;
     }  
  if (Digits == 5 || Digits == 3) 
     {     
       TradesSlippage = Slippage*10;
       Poin = Point*10;
     }  
  return(0);
}

int deinit(){return(0);}


void ScreenMsg() {

   string profitstr = DoubleToStr(profitnow,2);
   string ls_80 = "\n" 
      + "\n" 
      + "\n";
   string ls_64 = "---------------------------\n";
   string ls_88 = " Account Number:  " + AccountNumber() 
      + "\n" 
      + " Server Time:        " + TimeToStr(TimeCurrent(), TIME_SECONDS) 
      + "\n"
      + " TradingResult =  " + profitstr + "\n";
   Comment(ls_80 + ls_64 + ls_88);
}



int start()
{ 
profitnow = MyProfitsTotal(Magic1);
if((CloseOrdersNow) && (profitnow == 0)){CloseOrdersNow = false;}
if(profitnow > MinProfit ||profitnow < (-1*MaxLoss)){CloseOrdersNow = true;}
ScreenMsg();

  
if (CloseOrdersNow)
  {
   for (int cnt = OrdersTotal()-1 ; cnt >= 0 ; cnt--)
     {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if (OrderMagicNumber() == Magic1 && OrderSymbol()==Symbol() && OrderType()<2)
        {
         OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),TradesSlippage,Blue);
        } //if
     } //for
  }           
return(0);
}
// the end


 
RaptorUK:
Yep, OK, I see what you mean about Totalprofit . . . I just don't get the logic of doing this as you go through the loop, order by order . . . if the first order you see is in profit then you close it ? this doesn't make sense in light of what you said . . . . " I want to code an Ea that could close all open trades at once "


No i do not want to close order if i see the first order is in profit. this is exactly my problem. if you copy the below code in some ea, you can see with your eyes the amount of totalprofit. the below code is 100% right. but the problem is what you said me. I dont know how to close all orders simultanusly as soon as totalprofit > 0 and the other closing conditions are met.

when i run my ea, it closes only orders, which has met closing condition and is in profit and the ea leave other orders to be stay open.

Exactly i need a closing code that close all opened orders simultanusly as soon as totalprofit > 0 and the other custom closing conditions are met.

For example:

I made a hedge with 3 orders. 2 Buy orders and 1 sell order. if the sum of Buy profits is greater than Sell losses (Totalprofit=Buyprofit+Sellprofit >0) and the closing condition for example ( Close[0] < Low [1]) is meetd then Ea must close all 3 orders simultanusly in order to have profit.

I think you got what i am looking for. on the above code i thought that when the Ea closed the profitable orders then Totalprofit is not positive any more so the lossing trades stays open. Therefor i wrote the closing code for losses trades first and after that the profitable one. But it does not work again and the Ea closed only profitable orders and the the non profitable orders stays open.

#define     NL    "\n" 

//------  

 for (int y=OrdersTotal()-1;y>=0;y--)
   {
     double Sellprofit;
     double Buyprofit ;
     double Totalprofit ;

   
         OrderSelect(y,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            
            { 

            if(OrderType()==OP_BUY )
            {
            Buyprofit+=OrderProfit()+OrderSwap()+OrderCommission();
            }

            if(OrderType()==OP_SELL)
            {  
            Sellprofit+=OrderProfit()+OrderSwap()+OrderCommission();
            }  
 
            Totalprofit=Buyprofit+Sellprofit;

            
   Comment("                            Comments Last Update 12-12-2006 10:00pm", NL,
           "                            Buyprofit    ", Buyprofit, NL,
           "                            Sellprofit        ", Sellprofit, NL,
           "                            Totalprofit        ", Totalprofit, NL,
           "                            Current Time is  ",TimeHour(CurTime()),":",TimeMinute(CurTime()),".",TimeSeconds(CurTime()));
          
            
         }
    }
//----
   return(0);
  }
 

Your hedging is that with one currency ?

if (Close[0]>Close[1] && Totalprofit>0 && Sellprofit>Buyprofit) Are those conditions checked every tick ??

But your basic error might be this

for (int y=OrdersTotal()-1;y>=0;y--)
   {
     double Sellprofit;
     double Buyprofit ;
     double Totalprofit ;

With every next order in the loop you change those 3 conditions back to empty

Place it above the loop

and after finishing the loop you can calculate Totalprofit not inside the loop

 
deVries:

Your hedging is that with one currency ?

if (Close[0]>Close[1] && Totalprofit>0 && Sellprofit>Buyprofit) Are those conditions checked every tick ??

But your basic error might be this

With every next order in the loop you change those 3 conditions back to empty

Place it above the loop

and after finishing the loop you can calculate Totalprofit not inside the loop


Yes you have exactly got it what i mean. But i did not understand which one must be place above the loop. should i place closing conditions and closing codes outside and the above of totalprofit calculation loop?

so how could it close orders when the profit calculation loop is after closing loop?

 
hmrt135:


Yes you have exactly got it what i mean. But i did not understand which one must be place above the loop. should i place closing conditions and closing codes outside and the above of totalprofit calculation loop?

so how could it close orders when the profit calculation loop is after closing loop?


Make a loop for counting profit and a second one for closing trades running if condition for closing is true

Take your time to read the topic again and then make it with two loops like I advice you to do....

Then show your new code...

 
RaptorUK:

You are making decisions about closing orders before you know if . . . "the Sum of profits and losses is positive. " . . . you only know if the " Sum of profits and losses is positive. " only after you have summed all the losing trades and all the winning trades, and that will be after the loop is complete . . .

Exactly what I was saying above . .
Reason: