Orders Execution
0
Views
0
Downloads
0
Favorites
Profitability Reports
NZD/USD
Oct 2024 - Jan 2025
0.00 %
Total Trades
0
Won Trades
0
Lost trades
0
Win Rate
0.0 %
Expected payoff
0.00
Gross Profit
0.00
Gross Loss
0.00
Total Net Profit
0.00
-100%
-50%
0%
50%
100%
Bless.FifthE.TK.2.0.1-EA
//+------------------------------------------------------------------+
//| Bless.FifthE.TK.2.0.mq4 |
//| Open source at Forex-TSD forum, www.forex-tsd.com |
//| Ideas proposed by rifo.valas Bless System |
//| Coded by FiFtHeLeMeNt, fifthelement80@gmail.com |
//| Mofified by tkforextsd, tkemail@yahoo.com |
//+------------------------------------------------------------------+
//
// History of FifthE's versions:
// Verion 1.0.0: bless_FiftHeLeMent_noTG_1.0.0.mq4
// Original FifthE version without MaxTrades
// Verion 1.0.1: bless_FiftHeLeMent_noTG_1.0.1.mq4
// FifthE version with MaxTrades
// Verion 1.0.3: bless_FiftHeLeMent_1.0.3.mq4
// FifthE version with spread control and LotInc
//
// History of TK's versions:
// Based on FifthE's bless_FiftHeLeMent_noTG_1.0.1.mq4
// Version 1.0.2: bless_FiftHeLeMent_noTG_1.0.2.mq4
// Add stoploss at MaxTrades level to protect capital
// Version 1.0.3: bless_FiftHeLeMent_noTG_1.0.3.mq4
// Add EA closing features: CloseImmediately, CloseOnTime,
// CloseOnFloatingLoss, CloseOnEquityTarget
// Version 1.0.4: bless_FiftHeLeMent_noTG_1.0.4.mq4
// Add selectable multiplier progression
// Add auto restart after equity target reach
// Add email alert when margin level low
// Add email alert when trade level reach a preset level
// Add more info in chart comments
//
// History of unified versions:
// Version 2.0: Bless.FifthE.TK.2.0.mq4
// Merge TK's bless_FiFtHeLeMeNt_noTG_1.0.4.mq4 and FifthE's bless_FiftHeLeMent_1.0.3.mq4
// Unified features: Selectable Multiplier, LotInc, Spread control, MaxTrades stop loss,
// x% equity restart, closing order management, email alert
// New features:
// Breakeven bail out after BEP_Level reach
// Opposite direction hedge at MaxTrades
// Version 2.0.1: Bless.FifthE.TK.2.0.1.mq4
// Add options for buying and selling management
//
//
#property copyright "Forex-tsd open source"
#property link "http://www.forex-tsd.com"
#include <stdlib.mqh>
extern string Expert_Name = "---- Bless.FifthE.TK.2.0.mq4 ----";
extern int MinGS = 20; //pips between each level
extern int TP = 35; //pips to take profit each trade
extern double lot = 0.01; //starting lot size
extern bool BuySide=true; // Buy orders will be placed
extern bool SellSide=true; // Sell orders will be placed
extern bool AccountIsMini = true; // Set to true if trading mini account, otherwise set to false
extern int MaxTrades = 7; //max level allowed
extern int RegularSpread = 10; //max spread rejection, reject trades if spread exceed this value
extern double Multiplier = 2; //lots progressive multiplier factor
extern double LotInc = 0; //Lot increment on each level
extern int BEP_Level = 5; //breakeven bail out level
extern bool SetMaxTradesSL = False; //Set stop loss at Maxtrades level
extern bool SetMaxTradesHedge = true; //Set hedge trade at MaxTrades level
extern string Close_Management = "---- EA Closing Management ----";
extern bool CloseImmediately = false;
extern string s1 = "---- Close on time setting ----";
extern bool CloseOnTime = false;
extern int CloseHour = 23; //Time to close, Hour
extern int CloseMinute = 0; //Time to close, minutes
extern string s2 = "---- Close when floating profit/loss no more than MaxFloatPL settings ----";
extern bool CloseOnFloatPL = false;
extern double MaxFloatPL = -100.00; //Max floating profit/loss allowed when closing EA
extern string s3 = "---- Close when equity hit target settings ----";
extern bool CloseOnEquityTarget = false;
extern bool AutoRestartAfterEqTarget = True;
extern double EquityTargetPercentage = 5.0; //Percentage equity growth when closing EA
extern string s4 = "---- Comment settings ----";
extern bool DisableComments = false; //turn off comments
extern string s5 = "---- Email settings ----";
extern bool TestEmail = false; //if true send a test email every 5 minutes
extern string EmailAddress = "youremail@any.com";
extern int EmailIteration = 3; //How namy times email send when alert active
extern string s6 = "---- Alert settings ----";
extern bool AlertOnLowMargin = false; //email alert when margin low
extern double MarginPercentage = 100.0; //margin low percentage
extern bool AlertOnTradeLevel = false; //email alert when trade level reach
extern int AlertTradeLevel = 6; //trade level to alert
int magic;
double lot2; //lots to open at each level
int LotDigits;
datetime tob,tos; //Time Out Buy & Sell
double SL_Point; //stoploss price at MaxTrades level
double TP_Point; //TP price at each level
bool Halt = false;
double StartBalance, EquityTarget;
double MarginPer;
int CurrentLevel = 0;
int BuyLevel, SellLevel;
int Slippage = 1;
bool HedgeBuy = false;
bool HedgeSell = false;
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
int init()
{
if (Symbol() == "AUDCADm" || Symbol() == "AUDCAD") { magic = 211001; }
if (Symbol() == "AUDJPYm" || Symbol() == "AUDJPY") { magic = 211002; }
if (Symbol() == "AUDNZDm" || Symbol() == "AUDNZD") { magic = 211003; }
if (Symbol() == "AUDUSDm" || Symbol() == "AUDUSD") { magic = 211004; }
if (Symbol() == "CHFJPYm" || Symbol() == "CHFJPY") { magic = 211005; }
if (Symbol() == "EURAUDm" || Symbol() == "EURAUD") { magic = 211006; }
if (Symbol() == "EURCADm" || Symbol() == "EURCAD") { magic = 211007; }
if (Symbol() == "EURCHFm" || Symbol() == "EURCHF") { magic = 211008; }
if (Symbol() == "EURGBPm" || Symbol() == "EURGBP") { magic = 211009; }
if (Symbol() == "EURJPYm" || Symbol() == "EURJPY") { magic = 211010; }
if (Symbol() == "EURUSDm" || Symbol() == "EURUSD") { magic = 211011; }
if (Symbol() == "GBPCHFm" || Symbol() == "GBPCHF") { magic = 211012; }
if (Symbol() == "GBPJPYm" || Symbol() == "GBPJPY") { magic = 211013; }
if (Symbol() == "GBPUSDm" || Symbol() == "GBPUSD") { magic = 211014; }
if (Symbol() == "NZDJPYm" || Symbol() == "NZDJPY") { magic = 211015; }
if (Symbol() == "NZDUSDm" || Symbol() == "NZDUSD") { magic = 211016; }
if (Symbol() == "USDCHFm" || Symbol() == "USDCHF") { magic = 211017; }
if (Symbol() == "USDJPYm" || Symbol() == "USDJPY") { magic = 211018; }
if (Symbol() == "USDCADm" || Symbol() == "USDCAD") { magic = 211019; }
if (magic == 0) { magic = 211999; }
Halt = false;
LotDigits = 1;
if (AccountIsMini) { LotDigits = 2; }
HedgeBuy = false;
HedgeSell = false;
return(0);
}
void OpenBuy()
{
int ticket,err;
if (!GlobalVariableCheck("InTrade")) {
GlobalVariableSet("InTrade", TimeCurrent()); // set lock indicator
ticket = OrderSend(Symbol(),OP_BUY,lot2,Ask,Slippage,SL_Point,TP_Point,"EA Order",magic,0,Red);
GlobalVariableDel("InTrade"); // clear lock indicator
}
}
void OpenSell()
{
int ticket,err;
if (!GlobalVariableCheck("InTrade")) {
GlobalVariableSet("InTrade", TimeCurrent()); // set lock indicator
ticket = OrderSend(Symbol(),OP_SELL,lot2,Bid,Slippage,SL_Point,TP_Point,"EA Order",magic,0,Red);
GlobalVariableDel("InTrade"); // clear lock indicator
}
}
void ManageBuy()
{
int lasttradetime = 0;
double lastopenprice=0;
double maxlots = 0;
double lasttp=0;
double lastsl=0;
int lastordertype=-1;
int lastorderticket=0;
int y=0;
BuyLevel = 0;
for (y = 0; y < OrdersTotal(); y++)
{
OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
if ((OrderMagicNumber() != magic) || (OrderType()!=OP_BUY)) { continue; }
if (OrderOpenTime() >= lasttradetime) {
lasttradetime = OrderOpenTime();
lastopenprice = OrderOpenPrice();
lastordertype=OrderType();
lastorderticket=OrderTicket();
lasttp=OrderTakeProfit();
lastsl=OrderStopLoss();
}
if (OrderLots() > maxlots) { maxlots = OrderLots(); }
BuyLevel++;
}
lot2 = NormalizeDouble(lot*MathPow(Multiplier, BuyLevel)+LotInc, LotDigits);
SL_Point = 0;
TP_Point = Ask + TP*Point;
if ((BuyLevel==0) && (((Ask-Bid)/Point)<=RegularSpread) && !Halt ) {
OpenBuy();
BuyLevel++;
CurrentLevel=BuyLevel;
return(0);
}
if ((lastopenprice-Ask>MinGS*Point) && (BuyLevel==MaxTrades-1) && (SetMaxTradesSL || SetMaxTradesHedge) ) {
//set stoploss at the last open level
SL_Point = Ask - MinGS*Point;
}
if ((lastopenprice-Ask>MinGS*Point) && (BuyLevel<MaxTrades) && (((Ask-Bid)/Point)<=RegularSpread) && !Halt && !HedgeBuy ) {
OpenBuy();
BuyLevel++;
CurrentLevel=BuyLevel;
return(0);
}
CurrentLevel=BuyLevel;
/////////// TP
/*
double sumlots=0;
double sump=0;
double avgp=0;
for (y = 0; y < OrdersTotal(); y++)
{
OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
if ((OrderMagicNumber() != magic) || (OrderType()!=OP_BUY)) { continue; }
sumlots=sumlots+OrderLots();
sump=OrderOpenPrice()*OrderLots()+sump;
}
if (sumlots>0) {
avgp=NormalizeDouble(sump/sumlots,Digits);
double tpp=NormalizeDouble(TP/10/sumlots*Point+avgp,Digits);
for (y = 0; y < OrdersTotal(); y++)
{
OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
if ((OrderMagicNumber() != magic) || (OrderType()!=OP_BUY) || (OrderTakeProfit()==tpp)) { continue; }
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tpp,0,Red);
}
}
*/
for (y = OrdersTotal()-1; y >= 0; y--)
{
OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
if ((OrderMagicNumber() != magic) || (OrderType()!=OP_BUY) || (OrderTakeProfit()==lasttp) || (lasttp==0) || HedgeBuy ) { continue; }
OrderModify(OrderTicket(),OrderOpenPrice(),lastsl,lasttp,0,Red);
}
//reverse hedge
if (BuyLevel==MaxTrades && !HedgeSell && SetMaxTradesHedge) {
TP_Point = lastsl;
SL_Point = lasttp;
OpenSell();
HedgeSell = true;
return(0);
}
}
void ManageSell()
{
int lasttradetime = 0;
double lastopenprice=0;
double maxlots = 0;
double lasttp=0;
double lastsl=0;
int lastordertype=-1;
int lastorderticket=0;
int y=0;
SellLevel = 0;
for (y = 0; y < OrdersTotal(); y++)
{
OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
if ((OrderMagicNumber() != magic) || (OrderType()!=OP_SELL)) { continue; }
if (OrderOpenTime() >= lasttradetime) {
lasttradetime = OrderOpenTime();
lastopenprice = OrderOpenPrice();
lastordertype=OrderType();
lastorderticket=OrderTicket();
lasttp=OrderTakeProfit();
lastsl=OrderStopLoss();
}
if (OrderLots() > maxlots) { maxlots = OrderLots(); }
SellLevel++;
}
lot2 = NormalizeDouble(lot*MathPow(Multiplier, SellLevel)+LotInc, LotDigits);
SL_Point = 0;
TP_Point = Bid-TP*Point;
if ((SellLevel==0) && (((Ask-Bid)/Point)<=RegularSpread) && !Halt ) {
OpenSell();
SellLevel++;
if (SellLevel>CurrentLevel) CurrentLevel=SellLevel;
return(0);
}
if ((Bid-lastopenprice>MinGS*Point) && (SellLevel==MaxTrades-1) && (SetMaxTradesSL || SetMaxTradesHedge) ) {
//set stoploss at the last open level
SL_Point = Bid + MinGS*Point;
}
if ((Bid-lastopenprice>MinGS*Point) && (lastopenprice>0) && (SellLevel<MaxTrades) && (((Ask-Bid)/Point)<=RegularSpread) && !Halt && !HedgeSell ) {
OpenSell();
SellLevel++;
if (SellLevel>CurrentLevel) CurrentLevel=SellLevel;
return(0);
}
if (SellLevel>CurrentLevel) CurrentLevel=SellLevel;
/////////// TP
/* double sumlots=0;
double sump=0;
double avgp=0;
for (y = 0; y < OrdersTotal(); y++)
{
OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
if ((OrderMagicNumber() != magic) || (OrderType()!=OP_SELL)) { continue; }
sumlots=sumlots+OrderLots();
sump=OrderOpenPrice()*OrderLots()+sump;
}
if (sumlots>0) {
avgp=NormalizeDouble(sump/sumlots,Digits);
double tpp=NormalizeDouble(-TP/10/sumlots*Point+avgp,Digits);
for (y = 0; y < OrdersTotal(); y++)
{
OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
if ((OrderMagicNumber() != magic) || (OrderType()!=OP_SELL) || (OrderTakeProfit()==tpp)) { continue; }
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tpp,0,Red);
}
}
*/
for (y = OrdersTotal()-1; y >= 0; y--)
{
OrderSelect (y, SELECT_BY_POS, MODE_TRADES);
if ((OrderMagicNumber() != magic) || (OrderType()!=OP_SELL) || (OrderTakeProfit()==lasttp) || (lasttp==0) || HedgeSell || HedgeSell ) { continue; }
OrderModify(OrderTicket(),OrderOpenPrice(),lastsl,lasttp,0,Red);
}
//reverse hedge
if (SellLevel==MaxTrades && !HedgeBuy && SetMaxTradesHedge) {
TP_Point = lastsl;
SL_Point = lasttp;
OpenBuy();
HedgeBuy = true;
return(0);
}
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
ManageClose();
if (BuySide)
ManageBuy();
if (SellSide)
ManageSell();
if(!IsTesting()) HandleAlerts();
if(!IsTesting()) ChartComment();
//----
return(0);
}
//+------------------------------------------------------------------+
void CloseAllTrades()
{
int total = OrdersTotal();
for (int y=OrdersTotal()-1; y>=0; y--)
{
OrderSelect(y, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() == magic)
{
int type = OrderType();
bool result = false;
int TriesNum = 5;
int tries=0;
while (!result && tries < TriesNum)
{
RefreshRates();
switch(type)
{
case OP_BUY :
result = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),Slippage,Pink);
break;
case OP_SELL:
result = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),Slippage,Pink);
}
tries++;
}
if (!result) Print("Error closing order : ",ErrorDescription(GetLastError()));
}
}
}
bool LastCloseOnEquityTarget = false;
void ManageClose()
{
//Breakeven bail out after BEP_Level
if ((CurrentLevel>=BEP_Level) && (AccountProfit()>=0)) {
CloseAllTrades();
}
//Reverse hedge at Maxtrades level
if ((BuyLevel<MaxTrades) && HedgeSell) { HedgeSell = false; }
if ((SellLevel<MaxTrades) && HedgeBuy) { HedgeBuy = false; }
if (CloseOnEquityTarget && !LastCloseOnEquityTarget) {
StartBalance = AccountBalance();
}
LastCloseOnEquityTarget = CloseOnEquityTarget;
if (CloseImmediately)
{
CloseAllTrades();
Halt = true;
}
if (CloseOnTime && Hour()==CloseHour && Minute()>=CloseMinute)
{
CloseAllTrades();
Halt = true;
}
if (CloseOnFloatPL && AccountProfit()>=MaxFloatPL)
{
CloseAllTrades();
Halt = true;
}
if (CloseOnEquityTarget && !Halt)
{
EquityTarget = StartBalance*(1.0 + EquityTargetPercentage/100.0);
if (AccountEquity()>=EquityTarget )
{
CloseAllTrades();
StartBalance = AccountBalance();
if (!AutoRestartAfterEqTarget) Halt = true;
}
}
if (!CloseImmediately && !CloseOnTime && !CloseOnFloatPL && !CloseOnEquityTarget )
{
if (Halt) StartBalance = AccountBalance();
Halt = false;
}
}
void ChartComment()
{
string sComment = "";
string sp = "----------------------------------------\n";
string Activity = "-----------Trading Activity-------------\n";
string CloseManage = "-----------Closing Management-----------\n";
string AcctStatus = "-----------Account Status---------------\n";
string NL = "\n";
double spread = MarketInfo(Symbol(),MODE_SPREAD);
double SwapLong = MarketInfo(Symbol(),MODE_SWAPLONG);
double SwapShort = MarketInfo(Symbol(),MODE_SWAPSHORT);
sComment = Activity;
sComment = sComment + "Current time is " + TimeToStr(TimeCurrent()) + NL;
if (Halt)
sComment = sComment + "Trading halt!!! To resume trading set ALL closing conditions to FALSE." + NL;
else
sComment = sComment + "Trading is active at level " + CurrentLevel + NL;
if (CloseImmediately || CloseOnTime || CloseOnFloatPL || CloseOnEquityTarget)
{
sComment = sComment + CloseManage;
if (CloseImmediately)
sComment = sComment + "Close Immediately!!!!" + NL;
if (CloseOnTime)
sComment = sComment + "Close on time is active when " + CloseHour + ":" + CloseMinute + NL;
if (CloseOnFloatPL)
sComment = sComment + "Close on floating loss is active when float P/L >= " + DoubleToStr(MaxFloatPL,2) + NL;
if (CloseOnEquityTarget)
sComment = sComment + "Close on equity target is active when EquityTarget >= " + DoubleToStr(EquityTarget,2) + NL;
}
sComment = sComment + AcctStatus;
sComment = sComment + "Balance: " + DoubleToStr(AccountBalance(), 2) + ", Equity: " + DoubleToStr(AccountEquity(),2)
+ ", Leverage: " + DoubleToStr(AccountLeverage(),2) + ", Lots: " + DoubleToStr(lot2,2) + NL;
sComment = sComment + "MinGS: " + MinGS + ", TP: " + TP + ", Buy Level: " + BuyLevel + ", Sell Level: " + SellLevel + ", MaxTrades: " + MaxTrades + NL;
sComment = sComment + "Spread: " + DoubleToStr(spread,1) + ", SWAP Long: " + DoubleToStr(SwapLong,2) + ", SWAP Short: " + DoubleToStr(SwapShort,2) + NL;
sComment = sComment + "AccountMargin: " + DoubleToStr(AccountMargin(), 2) + ", Margin%: " + DoubleToStr(MarginPer,2) + "%" + NL;
sComment = sComment + sp;
if (!DisableComments) Comment(sComment);
else Comment("");
}
//Alert handling variables
bool LastTestEmail = false;
int TestEmailCnt = 0;
bool LastAlertOnLowMargin = false;
int AlertOnLowMarginCnt = 0;
bool LastAlertOnTradeLevel = false;
int AlertOnTradeLevelCnt = 0;
bool TimeToSend;
datetime LastTime;
void HandleAlerts()
{
string Message = "";
//RefreshRates();
//Switch on detection
if (TestEmail && !LastTestEmail) {
TestEmailCnt = EmailIteration;
LastTime = TimeCurrent();
}
if (AlertOnLowMargin && !LastAlertOnLowMargin) {
AlertOnLowMarginCnt = EmailIteration;
LastTime = TimeCurrent();
}
if (AlertOnTradeLevel && !LastAlertOnTradeLevel) {
AlertOnTradeLevelCnt = EmailIteration;
LastTime = TimeCurrent();
}
//Update
LastTestEmail = TestEmail;
LastAlertOnLowMargin = AlertOnLowMargin;
LastAlertOnTradeLevel = AlertOnTradeLevel;
//Handle email alert
if (TimeCurrent() - LastTime >= 300) { TimeToSend = true; }
else { TimeToSend = false; }
if (AccountMargin()==0) MarginPer = 100000;
else MarginPer = AccountEquity()/AccountMargin()*100.0;
AlertOnLowMarginCnt--;
LastTime = TimeCurrent();
}
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---