Code:
//|---------close profitable trades before news
void CloseProfitableTradesBeforeNews()
{
for(int cc=0;cc<OrdersTotal();cc++)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderProfit()>=0)bool ticket=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,CLR_NONE);
return;
}
}
}
//|---------close existing trades
bool CloseExistingTrades(int type)
{
if(OrdersTotal()==0)return(true);
for(int cc=0;cc<OrdersTotal();cc++)
{
OrderSelect(cc,SELECT_BY_POS);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==type)
{
bool result=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,CLR_NONE);
if(!result)
{
int err=GetLastError();
if(ShowAlerts)Alert(OrderTicket()," ",Symbol()," OrderClose failed with error(",err,"). ");
Print(OrderTicket()," ",Symbol()," OrderClose failed with error(",err,"). ");
return(false);
}
else
{
if(ShowAlerts)Alert(OrderTicket()," ",Symbol()," OrderClose");
Print(OrderTicket()," ",Symbol(), "OrderClose");
return(true);
}
}
}
return(true);
}
//|---------news impact
string Num2Impact(int impact)
{
if(impact==3)return("HIGH IMPACT");
if(impact==2)return("MED IMPACT");
if(impact==1)return("LOW IMPACT");
else return("");
}
//|---------news filter check
bool NewsFilterCheck()
{
if(!IsTesting())
{
int minutesUntilNextEvent=iCustom(NULL,0,"FFCal",true,true,false,true,true,1,1);
int minutesSincePrecEvent=iCustom(NULL,0,"FFCal",true,true,false,true,true,1,0);
int impactOfPrecEvent=iCustom(NULL,0,"FFCal",true,true,false,true,true,2,0);
datetime dTime=minutesUntilNextEvent*60;
string sTime=TimeToStr(dTime,TIME_MINUTES);
string sText;
bool TradeAllowed=true;
if(minutesUntilNextEvent>MinsUntilNews&&(impactOfPrecEvent<NewsImpact||(impactOfPrecEvent>=NewsImpact&&minutesSincePrecEvent>MinsAfterNews)))
{
sText=StringConcatenate("No News within the next ",sTime);
}
else
{
int impactOfNextEvent=iCustom(NULL,0,"FFCal",true,true,false,true,true,2,1);
string sImpact=Num2Impact(impactOfNextEvent);
if(StringLen(sImpact)>0)sImpact="["+sImpact+"] ";
sText=sImpact+"News in "+sTime;
if(impactOfNextEvent>=NewsImpact)
{
TradeAllowed=false;
if(CloseProfitableTrades && OrdersTotal()>0)CloseProfitableTradesBeforeNews();
if(CloseAllTrades && OrdersTotal()>0){CloseExistingTrades(OP_BUY);CloseExistingTrades(OP_SELL);}
}
}
return(TradeAllowed);
}
}
Put FFCal.mq4 in the indicators folder.