Bonfada EA 1.0 - MQ4 file (expert advisor)
Topic: Bonfada EA 1.0 - MQ4 file (expert advisor)
Bonfada EA will use a series of estrategies for better profit.
//+------------------------------------------------------------------+
// DO NOT DELETE THIS HEADER
// DELETING THIS HEADER IS COPYRIGHT INFRIGMENT
//
// Copyright ©2017, https://mt4talk.com
// MT4talk Expert Advisor Generator
// https://mt4talk.com/eagenerator/
//
// THIS EXPERT ADVISOR (EA) HAS BEEN GENERATED USING MT4talk EA GENERATOR.
//
// Disclaimer: This EA is provided to you "AS-IS", and MT4talk disclaims any warranty
// or liability obligations to you of any kind.
//
// FREE EA LICENSE
// This EA is provided to you for free of charge! You can share this EA on any website or any forums.
//
// CFTC RULE 4.41
// HYPOTHETICAL OR SIMULATED PERFORMANCE RESULTS HAVE CERTAIN LIMITATIONS. UNLIKE AN ACTUAL PERFORMANCE RECORD, SIMULATED
// RESULTS DO NOT REPRESENT ACTUAL TRADING. ALSO, SINCE THE TRADES HAVE NOT BEEN EXECUTED, THE RESULTS MAY HAVE UNDER-OR-
// OVER COMPENSATED FOR THE IMPACT, IF ANY, OF CERTAIN MARKET FACTORS, SUCH AS LACK OF LIQUIDITY. SIMULATED TRADING PROGRAMS,
// IN GENERAL, ARE ALSO SUBJECT TO THE FACT THAT THEY ARE DESIGNED WITH THE BENEFIT OF HINDSIGHT. NO REPRESENTATION IS BEING
// MADE THAT ANY ACCOUNT WILL OR IS LIKELY TO ACHIEVE PROFIT OR LOSSES SIMILAR TO THOSE SHOWN.
//
// U.S. Government Required Disclaimer.
// Commodity Futures Trading Commission Futures and Options trading has large potential rewards, but also large potential risk.
// You must be aware the risks and be willing to accept them in order to invest in the futures and options markets.
// Don't trade with money you can't afford to lose. This is neither a solicitation nor an offer to Buy/Sell futures or options.
// No representation is being made that any account will or is likely to achieve profits or losses similar
// to those discussed on this website. The past performance of any trading system or methodology is not necessarily
// indicative of future results.
//
// USE THIS EA AT YOUR OWN RISK.
//
// DO NOT DELETE THIS HEADER
// DELETING THIS HEADER IS COPYRIGHT INFRIGMENT
//+------------------------------------------------------------------+
#property copyright "Copyright 2017"
#property link "https://mt4talk.com"
#property version "1.00"
#property strict
extern double Risk=1;
extern double Break_Even=5;
extern double Take_Profit=100;
extern double Trailing_Stop=25;
extern int Magic_Number=28051933;
extern int Max_Nr_Of_Sell_Trades=3;
extern int Max_Nr_Of_Buy_Trades=3;
extern bool Hidden=false;
extern double Martingale_Value=1.45;
extern bool Close_opposit_signal=true;
extern double Stop_Loss=0;
extern int Max_Nr_Of_Trades=0;
extern bool DayFilter=false;
extern bool TimeFilter=false;
double Lotsize;
bool FixSL=1;
int Money_Management=2;
int cntmartin=0;
double ts=0;
double be=0;
double sl,tp;
int mp;
datetime lasttrade;
int OnInit()
{
mp=1;
if (Digits==5 || Digits==3) mp=10;
lasttrade=TimeCurrent();
cntmartin=0;
if (Money_Management==1)
{
Stop_Loss=Stop_Loss/MarketInfo(Symbol(),MODE_TICKVALUE)/mp/Lotsize;
Take_Profit=Take_Profit/MarketInfo(Symbol(),MODE_TICKVALUE)/mp/Lotsize;
Break_Even=Break_Even/MarketInfo(Symbol(),MODE_TICKVALUE)/mp/Lotsize;
Trailing_Stop=Trailing_Stop/MarketInfo(Symbol(),MODE_TICKVALUE)/mp/Lotsize;
}
//---
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{}
void OnTick()
{
bool TradeAllow=false;
bool buy_signal=false;
bool sell_signal=false;
double sl;
double tp;
double lotsize;
buy_signal=GetSignal(OP_BUY);
sell_signal=GetSignal(OP_SELL);
//---
if((CloseSignal(OP_BUY)) ||
(sell_signal && Close_opposit_signal))
{
CloseOrders(OP_BUY);
}
if((CloseSignal(OP_SELL)) ||
(buy_signal && Close_opposit_signal))
{
CloseOrders(OP_SELL);
}
if(buy_signal)
{
if (Money_Management==2)
{
double entry;
entry=MarketInfo(Symbol(),MODE_ASK);
if(FixSL)
{
sl=NormalizeDouble(entry-Stop_Loss*mp*Point(),(int)MarketInfo(Symbol(),MODE_DIGITS));
Lotsize=NormalizeDouble(CalcLotsize(Symbol(),entry,sl,Risk),2);
tp=NormalizeDouble(entry+CalcDistance(Take_Profit,Lotsize)*mp*Point(),(int)MarketInfo(Symbol(),MODE_DIGITS));
}
else
{
sl=NormalizeDouble(entry-CalcDistance(Stop_Loss,Lotsize)*mp*Point(),(int)MarketInfo(Symbol(),MODE_DIGITS));
tp=NormalizeDouble(entry+CalcDistance(Take_Profit,Lotsize)*mp*Point(),(int)MarketInfo(Symbol(),MODE_DIGITS));
}
}
if (GetLastProfit(lotsize)<0 && Martingale_Type>0)
{
Lotsize=lotsize;
cntmartin++;
}
else
{
cntmartin=0;
}
if (Martingale_Type==1)//Increment
{
Lotsize+=Martingale_Value;
}
if (Martingale_Type==2)//Multipli
{
Lotsize*=Martingale_Value;
}
OpenOrder(OP_BUY);
}
if(sell_signal)
{
if (Money_Management==2)
{
double entry;
entry=MarketInfo(Symbol(),MODE_BID);
if(FixSL)
{
sl=NormalizeDouble(entry+Stop_Loss*mp*Point(),(int)MarketInfo(Symbol(),MODE_DIGITS));
Lotsize=NormalizeDouble(CalcLotsize(Symbol(),entry,sl,Risk),2);
tp=NormalizeDouble(entry-CalcDistance(Take_Profit,Lotsize)*mp*Point(),(int)MarketInfo(Symbol(),MODE_DIGITS));
}
else
{
sl=NormalizeDouble(entry+CalcDistance(Stop_Loss,Lotsize)*mp*Point(),(int)MarketInfo(Symbol(),MODE_DIGITS));
tp=NormalizeDouble(entry-CalcDistance(Take_Profit,Lotsize)*mp*Point(),(int)MarketInfo(Symbol(),MODE_DIGITS));
}
}
if (GetLastProfit(lotsize)<0 && Martingale_Type>0)
{
Lotsize=lotsize;
cntmartin++;
}
else
{
cntmartin=0;
}
if (Martingale_Type==1)//Increment
{
Lotsize+=Martingale_Value;
}
if (Martingale_Type==2)//Multipli
{
Lotsize*=Martingale_Value;
}
OpenOrder(OP_SELL);
}
}
bool GetSignal(int type)
{
bool b=false;
if(type==OP_BUY)
{
if((iMA(Symbol(),0,20,1,0,0,0)>iMA(Symbol(),0,200,1,0,0,0)) ||() )
{
b=true;
}
}
if(type==OP_SELL)
{
if(iMA(Symbol(),0,0,0,0,0,0)<iMA(Symbol(),0,0,0,0,0,0))
{
b=true;
}
}
return(b);
}
bool CloseSignal(int type)
{
bool b=false;
if(type==OP_BUY)
{
if(iMA(Symbol(),0,20,0,1,0,0)>iMA(Symbol(),0,200,0,1,0,0))
{
b=true;
}
}
if(type==OP_SELL)
{
if(iMA(Symbol(),0,20,0,1,0,0)<iMA(Symbol(),0,200,0,1,0,0))
{
b=true;
}
}
return(b);
}
void OpenOrder(int type)
{
int ticket=-1;
int err=0;
if(type==OP_BUY)
{
ticket = OrderSend(Symbol(), OP_BUY, Lotsize, MarketInfo(Symbol(), MODE_ASK), 10, 0, 0,"", Magic_Number);
if(ticket<0)
{
err=GetLastError();
//Print ('Error!. Cannot Open BUY, failed with error : ',err);
}
else
{
if(Money_Management<2)
{
sl=NormalizeDouble(MarketInfo(Symbol(), MODE_ASK)-Stop_Loss*mp*MarketInfo(Symbol(),MODE_POINT), MarketInfo(Symbol(),MODE_DIGITS));
tp=NormalizeDouble(MarketInfo(Symbol(), MODE_ASK)+Take_Profit*mp*MarketInfo(Symbol(),MODE_POINT), MarketInfo(Symbol(),MODE_DIGITS));
}
OrderModify(ticket, MarketInfo(Symbol(), MODE_ASK), sl, tp,0);//open price=MarketInfo(Symbol(), MODE_ASK)
}
}
if(type==OP_SELL)
{
ticket = OrderSend(Symbol(), OP_BUY, Lotsize, MarketInfo(Symbol(), MODE_BID), 10, 0, 0,"", Magic_Number);
if(ticket<0)
{
err=GetLastError();
//Print ('Error!. Cannot Open BUY, failed with error : ',err);
}
else
{
if(Money_Management<2)
{
sl=NormalizeDouble(MarketInfo(Symbol(), MODE_BID)+Stop_Loss*mp*MarketInfo(Symbol(),MODE_POINT), MarketInfo(Symbol(),MODE_DIGITS));
tp=NormalizeDouble(MarketInfo(Symbol(), MODE_BID)-Take_Profit*mp*MarketInfo(Symbol(),MODE_POINT), MarketInfo(Symbol(),MODE_DIGITS));
}
OrderModify(ticket, MarketInfo(Symbol(), MODE_BID), sl, tp,0);//open price=MarketInfo(Symbol(), MODE_ASK)
}
}
}
void CloseOrders(int type)
{
int total = OrdersTotal();
for (int i = total-1 ; i >=0 ; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) &&
OrderMagicNumber() == Magic_Number &&
OrderSymbol() == Symbol() &&
type==OrderType())
{
switch(OrderType())
{
case OP_BUY:
{
OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),10);
break;
}
case OP_SELL:
{
OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),10);
break;
}
}
}
}
}
bool IsNewBar()
{
if (lasttrade<iTime(Symbol(),0,0))
{
lasttrade=iTime(Symbol(),0,0);
return (true);
}
return (false);
}
int GetNrOfTrades(int type)
{
int t=0;
int total = OrdersTotal();
int count;
if(type==OP_BUY || type==OP_SELL)
{
for(count = total - 1; count >= 0; count--)
{
if(!OrderSelect(count, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_Number && OrderType()==type)
{
t++;
}
}
return (t);
}
else if(type==6)
{
for(count = total - 1; count >= 0; count--)
{
if(!OrderSelect(count, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_Number)
{
t++;
}
}
return (t);
}
return(t);
}
double CalcLotsize(string symbol,double entry, double sl,double risk)
{
double qty,riskm,dist;
dist=MathAbs(entry-sl)/MarketInfo(symbol,MODE_POINT);
riskm=AccountBalance()*risk/100;
qty=riskm/(dist*MarketInfo(symbol,MODE_TICKVALUE));
return( NormalizeDouble(qty,2) );
}
void Trailing(double Trailing_Stop)
{
int err;
double sl = 0;
bool result;
//
sl = OrderStopLoss();
if(OrderType() == OP_BUY)
{
if((MarketInfo(Symbol(),MODE_BID) > (OrderOpenPrice() + Trailing_Stop*mp*MarketInfo(Symbol(),MODE_POINT))) )
{
if(OrderStopLoss() == 0) sl = MarketInfo(Symbol(),MODE_BID) - Trailing_Stop*mp*MarketInfo(Symbol(),MODE_POINT);
if(OrderStopLoss() != 0 && MarketInfo(Symbol(),MODE_BID) >= OrderStopLoss() + Trailing_Stop*mp*MarketInfo(Symbol(),MODE_POINT)) sl = MarketInfo(Symbol(),MODE_BID) - Trailing_Stop*mp*MarketInfo(Symbol(),MODE_POINT);
while(IsTradeContextBusy()) Sleep(100);
if(sl > OrderStopLoss())
{
ResetLastError();
result = OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(sl, MarketInfo(Symbol(),MODE_DIGITS)), OrderTakeProfit(), 0, CLR_NONE);
//
if (result)
{
Print("Trailing Stop updated: #", OrderTicket(), "; SL = ", DoubleToStr(OrderStopLoss(), MarketInfo(Symbol(),MODE_DIGITS)), "; Bid = ", DoubleToStr(MarketInfo(Symbol(),MODE_BID), MarketInfo(Symbol(),MODE_DIGITS)));
}
else
{
err = GetLastError();
Print("Error!. Trailing Stop #", OrderTicket(), " order modify failed with error(",err,")");
}
}
}
}//if(OrderType() == OP_BUY)
//
if(OrderType() == OP_SELL)
{
if((MarketInfo(Symbol(),MODE_ASK) < (OrderOpenPrice() - Trailing_Stop*mp*MarketInfo(Symbol(),MODE_POINT))))
{
if(OrderStopLoss() == 0) sl = MarketInfo(Symbol(),MODE_ASK) + (Trailing_Stop*mp)*MarketInfo(Symbol(),MODE_POINT);
if(OrderStopLoss() != 0 && MarketInfo(Symbol(),MODE_ASK) <= OrderStopLoss() - Trailing_Stop*mp*MarketInfo(Symbol(),MODE_POINT)) sl = MarketInfo(Symbol(),MODE_ASK) + (Trailing_Stop*mp)*MarketInfo(Symbol(),MODE_POINT);
while(IsTradeContextBusy()) Sleep(100);
if(sl < OrderStopLoss())
{
ResetLastError();
result = OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(sl, MarketInfo(Symbol(),MODE_DIGITS)), OrderTakeProfit(), 0, CLR_NONE);
//
if (result)
{
Print("Trailing Stop updated: #", OrderTicket(), "; SL = ", DoubleToStr(sl, MarketInfo(Symbol(),MODE_DIGITS)), "; Ask = ", DoubleToStr(MarketInfo(Symbol(),MODE_ASK), MarketInfo(Symbol(),MODE_DIGITS)));
}
else
{
err = GetLastError();
Print("Error!. Trailing Stop #", OrderTicket(), " order modify failed with error(",err,")");
}
}
}
}
}
void ManageTrades()
{
int t=OrdersTotal();
for(int i=t-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_Number)
{
if (!Hidden)
{
if (Money_Management==2)
{
ts=CalcDistance(Trailing_Stop,OrderLots());//OrderLots
be=CalcDistance(Break_Even,OrderLots());
}
else
{
ts=Trailing_Stop;
be=Break_Even;
}
if (Break_Even>0)
{
BreakEven(be);
}
if (Trailing_Stop>0)
{
Trailing(ts);
}
}
}
}
}//for end
}
void BreakEven(double Break_Even)
{
bool result;
double sl;
int err;
//
ResetLastError();
if(OrderType() == OP_BUY)
{
if(OrderStopLoss() >= OrderOpenPrice()) return;
if (MarketInfo(Symbol(),MODE_BID) >= OrderOpenPrice() + Break_Even*mp*MarketInfo(Symbol(),MODE_POINT))
{
sl= OrderOpenPrice() ;
while(IsTradeContextBusy()) Sleep(100);
result = OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(sl, MarketInfo(Symbol(),MODE_DIGITS)), OrderTakeProfit(), 0, CLR_NONE);
if (result)
{
Print("Break Even stop updated: #", OrderTicket(), "; SL = ", DoubleToStr(sl, MarketInfo(Symbol(),MODE_DIGITS)), "; Bid = ", DoubleToStr(MarketInfo(Symbol(),MODE_BID), MarketInfo(Symbol(),MODE_DIGITS)));
}
else
{
err = GetLastError();
Print("Error!. Break Even #", OrderTicket(), " order modify failed with error(",err,")");
}
}
}
//
if (OrderType() == OP_SELL)
{
if (OrderStopLoss() <= OrderOpenPrice() && OrderStopLoss() != 0) return;
if (MarketInfo(Symbol(),MODE_ASK) <= OrderOpenPrice() - Break_Even*mp*MarketInfo(Symbol(),MODE_POINT))
{
sl = OrderOpenPrice() ;
while(IsTradeContextBusy()) Sleep(100);
result = OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(sl, MarketInfo(Symbol(),MODE_DIGITS)), OrderTakeProfit(), 0, CLR_NONE);
if (result)
{
Print("Break Even stop updated: # ", OrderTicket(), "; SL = ", DoubleToStr(sl, MarketInfo(Symbol(),MODE_DIGITS)), "; Ask = ", DoubleToStr(MarketInfo(Symbol(),MODE_ASK), MarketInfo(Symbol(),MODE_DIGITS)));
}
else
{
err = GetLastError();
Print("Error!. Break Even #", OrderTicket(), " order modify failed with error(",err,")");
}
}
}
}
double CalcDistance(double risk, double lotsize)
{
risk=AccountBalance()*risk/100;
return (risk/MarketInfo(Symbol(),MODE_TICKVALUE)/mp/lotsize);
}
double GetLastProfit(double& lotsize)
{
int t=OrdersTotal();
double p=0;
datetime mt=0;
for (int i=t-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_Number && OrderCloseTime()>mt)
{
mt=OrderCloseTime();
p=OrderProfit();
lotsize=OrderLots();
}
}
}
return (p);
}