You are on page 1of 3

//+------------------------------------------------------------------+

//| CloseAll-PL.mq4 |
//| |
//+------------------------------------------------------------------+

extern int Profit=30;

double myProfit=0;
int EnableClose=0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----

myProfit=CalcProfit();

ShowInit();

if (EnableClose==1 && CntOrdAll(OP_BUY)==0 && CntOrdAll(OP_SELL)==0 &&


CntOrdAll(OP_BUYSTOP)==0
&& CntOrdAll(OP_BUYLIMIT)==0 && CntOrdAll(OP_SELLSTOP)==0 &&
CntOrdAll(OP_SELLLIMIT)==0) {
EnableClose=0; // Before Debug: EnableClose=1
}

if ( (Profit>0 && myProfit>=Profit) || (Profit<0 && myProfit<=Profit)) {


EnableClose=1;
}

CloseAll();

//----
return(0);
}
//+------------------------------------------------------------------+

void CloseAll () { // #function of CloseAll


if (EnableClose==1) { // #if Close is yes
int _total=OrdersTotal(); // number of lots or trades ????
int _ordertype;// order type
if (_total==0) {return;} // if total==0
int _ticket; // ticket number
double _priceClose;// price to close orders;
for(int _i=_total-1;_i>=0;_i--)
{ //# for loop
if (OrderSelect(_i,SELECT_BY_POS))
{ //# if
_ordertype=OrderType();
_ticket=OrderTicket();
switch(_ordertype)
{ //# switch
case OP_BUYLIMIT:
OrderDelete(OrderTicket());
case OP_BUYSTOP:
OrderDelete(OrderTicket());
case OP_BUY:
// close buy
_priceClose=MarketInfo(OrderSymbol(),MODE_BID);
Print("Close on ",_i," position order with ticket ¹",_ticket);
OrderClose(_ticket,OrderLots(),_priceClose,3,Red);
break;
case OP_SELLLIMIT:
OrderDelete(OrderTicket());
case OP_SELLSTOP:
OrderDelete(OrderTicket());
case OP_SELL:
// close sell
_priceClose=MarketInfo(OrderSymbol(),MODE_ASK);
Print("Close on ",_i," position order with ticket ¹",_ticket);
OrderClose(_ticket,OrderLots(),_priceClose,3,Red);
break;
default:
// values from 1 to 5, deleting pending orders
// Print("Delete on ",_i," position order with ticket ¹",_ticket);
// OrderDelete(_ticket);
break;
} //# switch
} // # if
} // # for loop

} // #if Close yes

return;
} // #function of CloseAll

void ShowInit() {

string sComment = "";


string sp = "-----------------------------------------------------\n";
string NL = "\n";
sComment = sp;
sComment = sComment + "CloseByPL will close all trades at: " + Profit + NL;
sComment = sComment + sp;
sComment = sComment + "Current P/L="+DoubleToStr(myProfit,0)+ NL;
Comment(sComment);

return;
}

double CalcProfit() {
double _sum=0;
int _total=OrdersTotal(); // number of lots

if (_total==0) {return (0);}

_sum=AccountProfit();

return(_sum);

int CntOrdAll(int Type) {


//return number of orders with specific parameters
int _CntOrd;
_CntOrd=0;
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderType()==Type) _CntOrd++;
}
return(_CntOrd);
}

You might also like