Files
2024-05-17 04:54:01 +03:30

1825 lines
39 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center XBEEA MQL5 Expert Advisor
// -------------------------------------------------
// Name: XBEEA
// Description: an Exper Advisor which used RSI and MA
// to Analyse Market ...
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////x
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm XBEEA"
#property strict
//
// TODO:
// -[] Create Some Trendial Conditions Variables ...
// -[] Comment them ...
// -[] Open 2 Position for each Signal ...
// -[] Close 2nd Position by Stop Trailing ...
// -[] implement Long conditions ...
// -[] add also Provider to Signals for Sepcied them ...
// -[] Implement Same Senario by Other Time Frames ...
//
#define ShortName "XBEEA"
//
#include "../Libraries/x-saherelm.log.lib.mq5"
#include "../Libraries/x-saherelm.draw.lib.mq5"
#include "../Libraries/x-saherelm.common.lib.mq5"
#include "../Classes/x-saherelm.xtrade.class.mq5"
//
// Inputs ...
long xBEEAMagicNumber = 78692110; // Magic Number
int xBEEASlippage = 10; // Slippgae
//
double xBEEAVolume = 0.05; // Volume Per Trade
//
ENUM_TIMEFRAMES xBEEASCPeriod = PERIOD_H4;
ENUM_TIMEFRAMES xBEEAMCPeriod = PERIOD_H12;
ENUM_TIMEFRAMES xBEEALCPeriod = PERIOD_D1;
ENUM_TIMEFRAMES xBEEAHCPeriod = PERIOD_W1;
//
bool xBEEADrawAsBox = false; // Draw Candles As Box ...
//
bool xBEEAUpdate = true; // Update Candles based On Time ...
//
bool xBEEADrawLabels = false; // Draw Line Labels ...
//
bool xBEEADrawCandle0 = false; // Draw 0 Time Candles ...
bool xBEEADrawCandle1 = true; // Draw 1 Time Candles ...
//
bool xBEEADrawBody = true; // Show Candle Bodies ...
bool xBEEADrawShadows = true; // Show Candle Shadows ...
//
// Candles ...
bool xBEEADrawCurrent = false; // Draw Current Candle ...
bool xBEEADrawSC = false; // Draw Short Candle ...
bool xBEEADrawMC = false; // Draw Medium Candle ...
bool mDrawLC = false; // Draw Long Candle ...
bool mDrawHC = true; // Draw Hind Candle ...
//
// MidLines ...
bool mDraw0MidLine = false;
bool mDraw1MidLine = false;
bool xBEEADrawSC0MidLine = false;
bool xBEEADrawSC1MidLine = false;
bool xBEEADrawMC0MidLine = false;
bool xBEEADrawMC1MidLine = false;
bool xBEEADrawLC0MidLine = false;
bool xBEEADrawLC1MidLine = false;
bool xBEEADrawHC0MidLine = true;
bool xBEEADrawHC1MidLine = true;
//
// Vars ...
string xBEEASymbol;
ENUM_TIMEFRAMES xBEEAPeriod;
//
int maxBuys = 1;
int maxSells = 1;
int buyCount = 0;
int sellCount = 0;
//
XOHCL candle0;
datetime candle0Time;
datetime nextCandle0Time;
string c0TagPrefix = "CC0";
XOHCLDrawSpecification candle0Style;
bool isCandle0Bullish;
bool isCandle0Bearish;
//
XOHCL candle1;
datetime candle1Time;
datetime nextCandle1Time;
string c1TagPrefix = "CC1";
XOHCLDrawSpecification candle1Style;
bool isCandle1Bullish;
bool isCandle1Bearish;
//
XOHCL scCandle0;
datetime scCandle0Time;
datetime nextSCCandle0Time;
string sc0TagPrefix = "SC0";
XOHCLDrawSpecification scCandle0Style;
bool isSCCandle0Bullish;
bool isSCCandle0Bearish;
//
XOHCL scCandle1;
datetime scCandle1Time;
datetime nextSCCandle1Time;
string sc1TagPrefix = "SC1";
XOHCLDrawSpecification scCandle1Style;
bool isSCCandle1Bullish;
bool isSCCandle1Bearish;
//
XOHCL mcCandle0;
datetime mcCandle0Time;
datetime nextMCCandle0Time;
string mc0TagPrefix = "MC0";
XOHCLDrawSpecification mcCandle0Style;
bool isMCCandle0Bullish;
bool isMCCandle0Bearish;
//
XOHCL mcCandle1;
datetime mcCandle1Time;
datetime nextMCCandle1Time;
string mc1TagPrefix = "MC1";
XOHCLDrawSpecification mcCandle1Style;
bool isMCCandle1Bullish;
bool isMCCandle1Bearish;
//
XOHCL lcCandle0;
datetime lcCandle0Time;
datetime nextLCCandle0Time;
string lc0TagPrefix = "L0";
XOHCLDrawSpecification lcCandle0Style;
bool isLCCandle0Bullish;
bool isLCCandle0Bearish;
//
XOHCL lcCandle1;
datetime lcCandle1Time;
datetime nextLCCandle1Time;
string lc1TagPrefix = "L1";
XOHCLDrawSpecification lcCandle1Style;
bool isLCCandle1Bullish;
bool isLCCandle1Bearish;
//
XOHCL hcCandle0;
datetime hcCandle0Time;
datetime nextHCCandle0Time;
string hc0TagPrefix = "H0";
XOHCLDrawSpecification hcCandle0Style;
bool isHCCandle0Bullish;
bool isHCCandle0Bearish;
//
XOHCL hcCandle1;
datetime hcCandle1Time;
datetime nextHCCandle1Time;
string hc1TagPrefix = "H1";
XOHCLDrawSpecification hcCandle1Style;
bool isHCCandle1Bullish;
bool isHCCandle1Bearish;
//
//
//
//
bool canBuy = false;
bool canSell = false;
//
datetime buyTime = 0;
datetime sellTime = 0;
//
datetime lastBuyTime = 0;
datetime lastSellTime = 0;
//
XSignal xSamepleEAExecutedSignals[];
//
bool isHCSignal = false;
bool hcWaitsOnNextSession = false;
//
double _tp = 0;
double _sl = 0;
double _r2r = 2;
double _entry = 0;
ENUM_POSITION_TYPE _type = NULL;
//
MqlTick xBEEATick;
XSCTrade *xBEEATrader;
//
// Event Handlers ...
//
// Initialization ...
int OnInit()
{
//
if (xBEEASymbol == NULL || StringLen(xBEEASymbol) <= 0)
{
xBEEASymbol = _Symbol;
}
//
if (xBEEAPeriod == NULL)
{
xBEEAPeriod = _Period;
}
//
// Validate Inputs ...
if (!XBEEAValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
logTag = ShortName;
drawPrefix = ShortName;
//
XBEEAConfigureCandleStyles();
//
// Initialize XTrader ...
xBEEATrader = new XSCTrade(
xBEEASlippage,
xBEEAMagicNumber);
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
//
// DeInitialization ...
void OnDeinit(const int reason)
{
//
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
// REASON_REMOVE 1 Program removed from a chart
// REASON_RECOMPILE 2 Program recompiled
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
// REASON_CHARTCLOSE 4 Chart closed
// REASON_PARAMETERS 5 Inputs changed by a user
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
// REASON_TEMPLATE 7 Another chart template applied
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
// REASON_CLOSE 9 Terminal closed
//
// De Initialize XBEEA Providers ...
delete xBEEATrader;
}
//
// On Tick Handler ...
void OnTick()
{
//
if (!IsNewCandle(
xBEEASymbol,
xBEEAPeriod))
{
return;
}
//
// Reading Tick ...
if (!SymbolInfoTick(xBEEASymbol, xBEEATick))
{
return;
}
//
// Counting Currently Open Positions ...
buyCount = xBEEATrader.CountPositions(xBEEASymbol, POSITION_TYPE_BUY);
sellCount = xBEEATrader.CountPositions(xBEEASymbol, POSITION_TYPE_SELL);
//
XBEEACalculateTick();
//
// TODO: Complete One Position in Each Section ...
//
// Do Buy Trade ...
bool canDoBuyTrade =
canBuy &&
(maxBuys <= 0 ||
(maxBuys > 0 && buyCount < maxBuys));
if (canDoBuyTrade)
{
//
XSignal signal = CreateSignal(
xBEEASymbol,
xBEEAPeriod,
_type,
X_ORDER_MODE_MARKET,
_entry,
xBEEAVolume,
_tp,
_sl);
//
string comment = "XBEEA,Lo";
//
bool canExecute =
//
(isHCSignal && !hcWaitsOnNextSession)
//
;
//
bool isExecuted =
!canExecute
? false
: xBEEATrader
.ExecuteSignal(
signal,
comment);
if (isExecuted)
{
//
Add(
signal,
xSamepleEAExecutedSignals);
//
buyTime = TimeCurrent();
//
if (isHCSignal)
{
//
isHCSignal = false;
hcWaitsOnNextSession = true;
}
//
// TODO: Log ...
string message = "Do Buy Trade ...";
}
}
//
// Do Sell Trade ...
bool canDoSellTrade =
canSell &&
(maxSells <= 0 ||
(maxSells > 0 && sellCount < maxSells));
if (canDoSellTrade)
{
//
XSignal signal = CreateSignal(
xBEEASymbol,
xBEEAPeriod,
_type,
X_ORDER_MODE_MARKET,
_entry,
xBEEAVolume,
_tp,
_sl);
//
string comment = "XBEEA,Sh";
//
bool canExecute =
//
(isHCSignal && !hcWaitsOnNextSession)
//
;
//
bool isExecuted =
!canExecute
? false
: xBEEATrader
.ExecuteSignal(
signal,
comment);
if (isExecuted)
{
//
Add(
signal,
xSamepleEAExecutedSignals);
//
sellTime = TimeCurrent();
//
if (isHCSignal)
{
//
isHCSignal = false;
hcWaitsOnNextSession = true;
}
//
// TODO: Log ...
string message = "Do Sell Trade ...";
}
}
//
// Reset Conditions ...
lastBuyTime = buyTime;
lastSellTime = sellTime;
//
buyTime = 0;
sellTime = 0;
//
canBuy = false;
canSell = false;
//
_sl = 0;
_tp = 0;
_entry = 0;
_type = NULL;
//
XBEEAProvideInfo();
}
//
// Custom Functions ...
//
// Validate Variables nd Inputs ...
bool XBEEAValidateInputs()
{
//
bool result = false;
//
result =
//
xBEEASlippage > 0 &&
xBEEAMagicNumber > 0
//
;
//
return result;
}
//
void PrepareCandleStyle(
XOHCLDrawSpecification &source,
int width = 1,
color clr = CLR_NONE,
ENUM_LINE_STYLE style = STYLE_SOLID,
bool ray = false,
bool fill = false,
bool back = false //
)
{
//
source.Default();
//
source.Width(width);
//
if (clr != CLR_NONE)
{
source.Color(clr);
}
//
source.Style(style);
source.RayRight(ray);
source.Fill(fill);
source.Back(back);
}
//
// Configure Default Styles for Candle Drawing ...
void XBEEAConfigureCandleStyles()
{
//
PrepareCandleStyle(
candle0Style,
1,
CLR_NONE,
STYLE_DOT,
false,
false,
true //
);
candle0Style.SetLabelPrefix(c0TagPrefix);
//
PrepareCandleStyle(
candle1Style,
1,
CLR_NONE,
STYLE_DOT,
false,
false,
true //
);
candle1Style.SetLabelPrefix(c1TagPrefix);
//
PrepareCandleStyle(
scCandle0Style,
1,
CLR_NONE,
STYLE_DASH,
false,
false,
true //
);
scCandle0Style.SetLabelPrefix(sc0TagPrefix);
//
PrepareCandleStyle(
scCandle1Style,
1,
CLR_NONE,
STYLE_DASH,
false,
false,
true //
);
scCandle1Style.SetLabelPrefix(sc1TagPrefix);
//
PrepareCandleStyle(
mcCandle0Style,
1,
CLR_NONE,
STYLE_DASHDOT,
false,
false,
true //
);
mcCandle0Style.SetLabelPrefix(mc0TagPrefix);
//
PrepareCandleStyle(
mcCandle1Style,
1,
CLR_NONE,
STYLE_DASHDOT,
false,
false,
true //
);
mcCandle1Style.SetLabelPrefix(mc1TagPrefix);
//
PrepareCandleStyle(
lcCandle0Style,
1,
CLR_NONE,
STYLE_DASHDOTDOT,
false,
false,
true //
);
lcCandle0Style.SetLabelPrefix(lc0TagPrefix);
//
PrepareCandleStyle(
lcCandle1Style,
1,
CLR_NONE,
STYLE_DASHDOTDOT,
false,
false,
true //
);
lcCandle1Style.SetLabelPrefix(lc1TagPrefix);
//
PrepareCandleStyle(
hcCandle0Style,
1,
CLR_NONE,
STYLE_DOT,
false,
false,
true //
);
hcCandle0Style.highStyle.clr = clrLightSkyBlue;
hcCandle0Style.openStyle.clr = clrDarkOliveGreen;
hcCandle0Style.closeStyle.clr = clrCoral;
hcCandle0Style.lowStyle.clr = clrPink;
hcCandle0Style.SetLabelPrefix(hc0TagPrefix);
//
PrepareCandleStyle(
hcCandle1Style,
2,
CLR_NONE,
STYLE_DOT,
false,
false,
true //
);
hcCandle1Style.SetLabelPrefix(hc1TagPrefix);
//
if (!xBEEADrawLabels)
{
//
candle0Style.Label("");
candle1Style.Label("");
//
scCandle0Style.Label("");
scCandle1Style.Label("");
//
mcCandle0Style.Label("");
mcCandle1Style.Label("");
//
lcCandle0Style.Label("");
lcCandle1Style.Label("");
//
hcCandle0Style.Label("");
hcCandle1Style.Label("");
}
}
//
void XBEEACalculateTick()
{
//
// Calculate Candles ...
//
XBEEACalculateCandles();
//
XBEEACheckGuards();
//
XBEEACheckConditions();
//
// Drawing Candles ...
XBEEADrawCandles();
//
XBEEACheckForSignals();
}
//
// Here we Chack all Guards ...
void XBEEACheckGuards()
{
//
// Implement All Guards here ...
}
//
void XBEEACalculateCandles()
{
//
// SC ...
scCandle0 = GetCandle(
xBEEASymbol,
xBEEASCPeriod,
0 // Current Candle
);
scCandle1 = GetCandle(
xBEEASymbol,
xBEEASCPeriod,
1 // Before Candle
);
//
scCandle0Time = GetCandleTime(
xBEEASymbol,
xBEEASCPeriod,
0);
scCandle1Time = GetCandleTime(
xBEEASymbol,
xBEEASCPeriod,
1);
//
// MC ...
mcCandle0 = GetCandle(
xBEEASymbol,
xBEEAMCPeriod,
0 // Current Candle
);
mcCandle1 = GetCandle(
xBEEASymbol,
xBEEAMCPeriod,
1 // Before Candle
);
//
mcCandle0Time = GetCandleTime(
xBEEASymbol,
xBEEAMCPeriod,
0);
mcCandle1Time = GetCandleTime(
xBEEASymbol,
xBEEAMCPeriod,
1);
//
// LC ...
lcCandle0 = GetCandle(
xBEEASymbol,
xBEEALCPeriod,
0 // Current Candle
);
lcCandle1 = GetCandle(
xBEEASymbol,
xBEEALCPeriod,
1 // Before Candle
);
//
lcCandle0Time = GetCandleTime(
xBEEASymbol,
xBEEALCPeriod,
0);
lcCandle1Time = GetCandleTime(
xBEEASymbol,
xBEEALCPeriod,
1);
//
// HC ...
hcCandle0 = GetCandle(
xBEEASymbol,
xBEEAHCPeriod,
0 // Current Candle
);
hcCandle1 = GetCandle(
xBEEASymbol,
xBEEAHCPeriod,
1 // Before Candle
);
//
hcCandle0Time = GetCandleTime(
xBEEASymbol,
xBEEAHCPeriod,
0);
hcCandle1Time = GetCandleTime(
xBEEASymbol,
xBEEAHCPeriod,
1);
//
// Now Reading Current Candle ...
candle0 = GetCandle(
xBEEASymbol,
xBEEAPeriod,
0 // Current Candle
);
candle1 = GetCandle(
xBEEASymbol,
xBEEAPeriod,
1 // Before Candle
);
//
candle0Time = GetCandleTime(
xBEEASymbol,
xBEEAPeriod,
0);
candle1Time = GetCandleTime(
xBEEASymbol,
xBEEAPeriod,
1);
//
// Find Candle Start Time ...
//
// current ..
nextCandle0Time = candle0Time + PeriodSeconds(xBEEAPeriod);
nextCandle1Time = candle1Time + PeriodSeconds(xBEEAPeriod);
//
// SC ..
nextSCCandle0Time = scCandle0Time + PeriodSeconds(xBEEASCPeriod);
nextSCCandle1Time = scCandle1Time + PeriodSeconds(xBEEASCPeriod);
//
// MC ..
nextMCCandle0Time = mcCandle0Time + PeriodSeconds(xBEEAMCPeriod);
nextMCCandle1Time = mcCandle1Time + PeriodSeconds(xBEEAMCPeriod);
//
// LC ..
nextLCCandle0Time = lcCandle0Time + PeriodSeconds(xBEEALCPeriod);
nextLCCandle1Time = lcCandle1Time + PeriodSeconds(xBEEALCPeriod);
//
// HC ..
nextHCCandle0Time = hcCandle0Time + PeriodSeconds(xBEEAHCPeriod);
nextHCCandle1Time = hcCandle1Time + PeriodSeconds(xBEEAHCPeriod);
//
isCandle0Bullish = IsBullishCandle(candle0);
isCandle0Bearish = IsBearishCandle(candle0);
isCandle1Bullish = IsBullishCandle(candle1);
isCandle1Bearish = IsBearishCandle(candle1);
//
isSCCandle0Bullish = IsBullishCandle(scCandle0);
isSCCandle0Bearish = IsBearishCandle(scCandle0);
isSCCandle1Bullish = IsBullishCandle(scCandle1);
isSCCandle1Bearish = IsBearishCandle(scCandle1);
//
isMCCandle0Bullish = IsBullishCandle(mcCandle0);
isMCCandle0Bearish = IsBearishCandle(mcCandle0);
isMCCandle1Bullish = IsBullishCandle(mcCandle1);
isMCCandle1Bearish = IsBearishCandle(mcCandle1);
//
isLCCandle0Bullish = IsBullishCandle(lcCandle0);
isLCCandle0Bearish = IsBearishCandle(lcCandle0);
isLCCandle1Bullish = IsBullishCandle(lcCandle1);
isLCCandle1Bearish = IsBearishCandle(lcCandle1);
//
isHCCandle0Bullish = IsBullishCandle(hcCandle0);
isHCCandle0Bearish = IsBearishCandle(hcCandle0);
isHCCandle1Bullish = IsBullishCandle(hcCandle1);
isHCCandle1Bearish = IsBearishCandle(hcCandle1);
}
//
void XBEEACheckConditions()
{
//
// Here we Check all Conditions states ...
// for Enable or Disable conditions ...
//
// HC based Signalling ...
//
//
double point5 = PointToPrice(
xBEEASymbol,
5 //
);
//
double hcCandle0Mid = (hcCandle0.open + hcCandle0.close) / 2;
double hcCandle1Mid = (hcCandle1.open + hcCandle1.close) / 2;
//
double hcCandle1DownPrice = MathMin(hcCandle1.open, hcCandle1.close);
//
bool hcHasBreakeout = hcCandle0Mid >= hcCandle1DownPrice + point5;
if (hcHasBreakeout && hcWaitsOnNextSession)
{
hcWaitsOnNextSession = false;
}
}
//
void XBEEACheckForSignals()
{
//
// Parse Conditions ...
//
double point5 = PointToPrice(
xBEEASymbol,
5 //
);
//
// HC Base ...
//
//
double hcCandle0Mid = (hcCandle0.open + hcCandle0.close) / 2;
double hcCandle1Mid = (hcCandle1.open + hcCandle1.close) / 2;
//
double hcCandle1UpPrice = MathMax(hcCandle1.open, hcCandle1.close);
double hcCandle1DownPrice = MathMin(hcCandle1.open, hcCandle1.close);
//
bool hcHasShortSignal = hcCandle0Mid < hcCandle1DownPrice - point5;
if (hcHasShortSignal)
{
//
_type = POSITION_TYPE_SELL;
_entry = GetEntry(
xBEEASymbol,
_type);
//
// Set TP and SL ...
//
_sl = hcCandle1Mid;
//
double risk = MathAbs(_entry - _sl);
double reward = risk * _r2r;
//
_tp = _entry - reward;
//
canSell = true;
isHCSignal = true;
//
// This id for Preventing Other Sections ...
return;
}
//
bool hcHasLongSignal = hcCandle0Mid > hcCandle1UpPrice + point5;
if (hcHasLongSignal)
{
//
_type = POSITION_TYPE_BUY;
_entry = GetEntry(
xBEEASymbol,
_type);
//
// Set TP and SL ...
//
_sl = hcCandle1Mid;
//
double risk = MathAbs(_entry - _sl);
double reward = risk * _r2r;
//
_tp = _entry + reward;
//
canBuy = true;
isHCSignal = true;
//
// This id for Preventing Other Sections ...
return;
}
}
//
// DRAW Functions ...
void XBEEADrawCandles()
{
//
int subWindow = 0;
long chartId = ChartID();
//
// Configure Styles for Draw Shadows and Bodies of Candles
// based On Configurations ...
//
candle0Style.openStyle.draw = xBEEADrawCandle0 && xBEEADrawBody;
candle0Style.closeStyle.draw = xBEEADrawCandle0 && xBEEADrawBody;
//
candle1Style.openStyle.draw = xBEEADrawCandle1 && xBEEADrawBody;
candle1Style.closeStyle.draw = xBEEADrawCandle1 && xBEEADrawBody;
//
scCandle0Style.openStyle.draw = xBEEADrawCandle0 && xBEEADrawBody;
scCandle0Style.closeStyle.draw = xBEEADrawCandle0 && xBEEADrawBody;
//
scCandle1Style.openStyle.draw = xBEEADrawCandle1 && xBEEADrawBody;
scCandle1Style.closeStyle.draw = xBEEADrawCandle1 && xBEEADrawBody;
//
mcCandle0Style.openStyle.draw = xBEEADrawCandle0 && xBEEADrawBody;
mcCandle0Style.closeStyle.draw = xBEEADrawCandle0 && xBEEADrawBody;
//
mcCandle1Style.openStyle.draw = xBEEADrawCandle1 && xBEEADrawBody;
mcCandle1Style.closeStyle.draw = xBEEADrawCandle1 && xBEEADrawBody;
//
lcCandle0Style.openStyle.draw = xBEEADrawCandle0 && xBEEADrawBody;
lcCandle0Style.closeStyle.draw = xBEEADrawCandle0 && xBEEADrawBody;
//
lcCandle1Style.openStyle.draw = xBEEADrawCandle1 && xBEEADrawBody;
lcCandle1Style.closeStyle.draw = xBEEADrawCandle1 && xBEEADrawBody;
//
hcCandle0Style.openStyle.draw = xBEEADrawCandle0 && xBEEADrawBody;
hcCandle0Style.closeStyle.draw = xBEEADrawCandle0 && xBEEADrawBody;
//
hcCandle1Style.openStyle.draw = xBEEADrawCandle1 && xBEEADrawBody;
hcCandle1Style.closeStyle.draw = xBEEADrawCandle1 && xBEEADrawBody;
//
candle0Style.highStyle.draw = xBEEADrawCandle0 && xBEEADrawShadows;
candle0Style.lowStyle.draw = xBEEADrawCandle0 && xBEEADrawShadows;
//
candle1Style.highStyle.draw = xBEEADrawCandle1 && xBEEADrawShadows;
candle1Style.lowStyle.draw = xBEEADrawCandle1 && xBEEADrawShadows;
//
scCandle0Style.highStyle.draw = xBEEADrawCandle0 && xBEEADrawShadows;
scCandle0Style.lowStyle.draw = xBEEADrawCandle0 && xBEEADrawShadows;
//
scCandle1Style.highStyle.draw = xBEEADrawCandle1 && xBEEADrawShadows;
scCandle1Style.lowStyle.draw = xBEEADrawCandle1 && xBEEADrawShadows;
//
mcCandle0Style.highStyle.draw = xBEEADrawCandle0 && xBEEADrawShadows;
mcCandle0Style.lowStyle.draw = xBEEADrawCandle0 && xBEEADrawShadows;
//
mcCandle1Style.highStyle.draw = xBEEADrawCandle1 && xBEEADrawShadows;
mcCandle1Style.lowStyle.draw = xBEEADrawCandle1 && xBEEADrawShadows;
//
lcCandle0Style.highStyle.draw = xBEEADrawCandle0 && xBEEADrawShadows;
lcCandle0Style.lowStyle.draw = xBEEADrawCandle0 && xBEEADrawShadows;
//
lcCandle1Style.highStyle.draw = xBEEADrawCandle1 && xBEEADrawShadows;
lcCandle1Style.lowStyle.draw = xBEEADrawCandle1 && xBEEADrawShadows;
//
hcCandle0Style.highStyle.draw = xBEEADrawCandle0 && xBEEADrawShadows;
hcCandle0Style.lowStyle.draw = xBEEADrawCandle0 && xBEEADrawShadows;
//
hcCandle1Style.highStyle.draw = xBEEADrawCandle1 && xBEEADrawShadows;
hcCandle1Style.lowStyle.draw = xBEEADrawCandle1 && xBEEADrawShadows;
//
// Default Mid Line Specs ...
XDrawSpecifications specs;
specs.width = 2;
specs.rayRight = false;
specs.clr = clrYellow;
specs.style = STYLE_DOT;
//
if (xBEEADrawCurrent)
{
//
if (!xBEEADrawAsBox)
{
//
if (xBEEADrawCandle0)
{
//
DrawCandleAsLine(
chartId,
subWindow,
candle0,
candle0Time,
candle0Style,
c0TagPrefix,
xBEEAUpdate //
);
}
//
if (xBEEADrawCandle1)
{
//
if (xBEEADrawCandle1)
{
//
DrawCandleAsLine(
chartId,
subWindow,
candle1,
candle1Time,
candle1Style,
c1TagPrefix,
xBEEAUpdate //
);
}
}
}
else
{
//
if (xBEEADrawCandle0)
{
//
DrawCandleAsBox(
chartId,
subWindow,
candle0,
candle0Time,
candle0Style,
c0TagPrefix,
xBEEADrawBody,
xBEEADrawShadows,
xBEEAUpdate //
);
}
//
if (xBEEADrawCandle1)
{
//
DrawCandleAsBox(
chartId,
subWindow,
candle1,
candle1Time,
candle1Style,
c1TagPrefix,
xBEEADrawBody,
xBEEADrawShadows,
xBEEAUpdate //
);
}
}
}
//
if (xBEEADrawSC)
{
//
if (!xBEEADrawAsBox)
{
//
if (xBEEADrawCandle0)
{
//
DrawCandleAsLine(
chartId,
subWindow,
scCandle0,
scCandle0Time,
scCandle0Style,
sc0TagPrefix,
xBEEAUpdate //
);
}
//
if (xBEEADrawCandle1)
{
//
DrawCandleAsLine(
chartId,
subWindow,
scCandle1,
scCandle1Time,
scCandle1Style,
sc1TagPrefix,
xBEEAUpdate //
);
}
}
else
{
//
if (xBEEADrawCandle0)
{
//
DrawCandleAsBox(
chartId,
subWindow,
scCandle0,
scCandle0Time,
scCandle0Style,
sc0TagPrefix,
xBEEADrawBody,
xBEEADrawShadows,
xBEEAUpdate //
);
}
//
if (xBEEADrawCandle1)
{
//
DrawCandleAsBox(
chartId,
subWindow,
scCandle1,
scCandle1Time,
scCandle1Style,
sc1TagPrefix,
xBEEADrawBody,
xBEEADrawShadows,
xBEEAUpdate //
);
}
}
}
//
if (xBEEADrawMC)
{
//
if (!xBEEADrawAsBox)
{
//
if (xBEEADrawCandle0)
{
//
DrawCandleAsLine(
chartId,
subWindow,
mcCandle0,
mcCandle0Time,
mcCandle0Style,
mc0TagPrefix,
xBEEAUpdate //
);
}
//
if (xBEEADrawCandle1)
{
//
DrawCandleAsLine(
chartId,
subWindow,
mcCandle1,
mcCandle1Time,
mcCandle1Style,
mc1TagPrefix,
xBEEAUpdate //
);
}
}
else
{
//
if (xBEEADrawCandle0)
{
//
DrawCandleAsBox(
chartId,
subWindow,
mcCandle0,
mcCandle0Time,
mcCandle0Style,
mc0TagPrefix,
xBEEADrawBody,
xBEEADrawShadows,
xBEEAUpdate //
);
}
//
if (xBEEADrawCandle1)
{
//
DrawCandleAsBox(
chartId,
subWindow,
mcCandle1,
mcCandle1Time,
mcCandle1Style,
mc1TagPrefix,
xBEEADrawBody,
xBEEADrawShadows,
xBEEAUpdate //
);
}
}
}
//
if (mDrawLC)
{
//
if (!xBEEADrawAsBox)
{
//
if (xBEEADrawCandle0)
{
//
DrawCandleAsLine(
chartId,
subWindow,
lcCandle0,
lcCandle0Time,
lcCandle0Style,
lc0TagPrefix,
xBEEAUpdate //
);
}
//
if (xBEEADrawCandle1)
{
//
DrawCandleAsLine(
chartId,
subWindow,
lcCandle1,
lcCandle1Time,
lcCandle1Style,
lc1TagPrefix,
xBEEAUpdate //
);
}
}
else
{
//
if (xBEEADrawCandle0)
{
//
DrawCandleAsBox(
chartId,
subWindow,
lcCandle0,
lcCandle0Time,
lcCandle0Style,
lc0TagPrefix,
xBEEADrawBody,
xBEEADrawShadows,
xBEEAUpdate //
);
}
//
if (xBEEADrawCandle1)
{
//
DrawCandleAsBox(
chartId,
subWindow,
lcCandle1,
lcCandle1Time,
lcCandle1Style,
lc1TagPrefix,
xBEEADrawBody,
xBEEADrawShadows,
xBEEAUpdate //
);
}
}
}
//
if (mDrawHC)
{
//
if (!xBEEADrawAsBox)
{
//
if (xBEEADrawCandle0)
{
//
DrawCandleAsLine(
chartId,
subWindow,
hcCandle0,
hcCandle0Time,
hcCandle0Style,
hc0TagPrefix,
xBEEAUpdate //
);
}
//
if (xBEEADrawCandle1)
{
//
DrawCandleAsLine(
chartId,
subWindow,
hcCandle1,
hcCandle1Time,
hcCandle1Style,
hc1TagPrefix,
xBEEAUpdate //
);
}
}
else
{
//
if (xBEEADrawCandle0)
{
//
DrawCandleAsBox(
chartId,
subWindow,
hcCandle0,
hcCandle0Time,
hcCandle0Style,
hc0TagPrefix,
xBEEADrawBody,
xBEEADrawShadows,
xBEEAUpdate //
);
}
//
if (xBEEADrawCandle1)
{
//
DrawCandleAsBox(
chartId,
subWindow,
hcCandle1,
hcCandle1Time,
hcCandle1Style,
hc1TagPrefix,
xBEEADrawBody,
xBEEADrawShadows,
xBEEAUpdate //
);
}
}
}
//
// Draw MidLines ...
//
string candel0MidLineTag = GenerateCandleMidLineTag(
candle0,
c0TagPrefix //
);
string candel1MidLineTag = GenerateCandleMidLineTag(
candle1,
c1TagPrefix //
);
string scCandel0MidLineTag = GenerateCandleMidLineTag(
scCandle0,
sc0TagPrefix //
);
string scCandel1MidLineTag = GenerateCandleMidLineTag(
scCandle1,
sc1TagPrefix //
);
string mcCandel0MidLineTag = GenerateCandleMidLineTag(
mcCandle0,
mc0TagPrefix //
);
string mcCandel1MidLineTag = GenerateCandleMidLineTag(
mcCandle1,
mc1TagPrefix //
);
string lcCandel0MidLineTag = GenerateCandleMidLineTag(
lcCandle0,
lc0TagPrefix //
);
string lcCandel1MidLineTag = GenerateCandleMidLineTag(
lcCandle1,
lc1TagPrefix //
);
string hcCandel0MidLineTag = GenerateCandleMidLineTag(
hcCandle0,
hc0TagPrefix //
);
string hcCandel1MidLineTag = GenerateCandleMidLineTag(
hcCandle1,
hc1TagPrefix //
);
//
// Current ...
//
// Candle 0 ...
specs.style = STYLE_DOT;
specs.clr = clrTurquoise;
DrawCandleMidLine(
candle0,
candle0Time,
specs,
candel0MidLineTag,
c0TagPrefix,
mDraw0MidLine //
);
//
// Candle 1 ...
specs.width = 2;
specs.style = STYLE_SOLID;
DrawCandleMidLine(
candle1,
candle1Time,
specs,
candel1MidLineTag,
c1TagPrefix,
mDraw1MidLine //
);
//
// Short ...
//
// Candle 0 ...
specs.width = 1;
specs.style = STYLE_DOT;
specs.clr = clrSpringGreen;
DrawCandleMidLine(
scCandle0,
scCandle0Time,
specs,
scCandel0MidLineTag,
sc0TagPrefix,
xBEEADrawSC0MidLine //
);
//
// Candle 1 ...
specs.width = 2;
specs.style = STYLE_SOLID;
DrawCandleMidLine(
scCandle1,
scCandle1Time,
specs,
scCandel1MidLineTag,
sc1TagPrefix,
xBEEADrawSC1MidLine //
);
//
// Medium ...
//
// Candle 0 ...
specs.width = 1;
specs.clr = clrCornflowerBlue;
specs.style = STYLE_DOT;
DrawCandleMidLine(
mcCandle0,
mcCandle0Time,
specs,
mcCandel0MidLineTag,
mc0TagPrefix,
xBEEADrawMC0MidLine //
);
//
// Candle 1 ...
specs.width = 2;
specs.style = STYLE_SOLID;
DrawCandleMidLine(
mcCandle1,
mcCandle1Time,
specs,
mcCandel1MidLineTag,
mc1TagPrefix,
xBEEADrawMC1MidLine //
);
//
// Long ...
//
// Candle 0 ...
specs.width = 1;
specs.style = STYLE_DOT;
specs.clr = clrYellow;
DrawCandleMidLine(
lcCandle0,
lcCandle0Time,
specs,
lcCandel0MidLineTag,
lc0TagPrefix,
xBEEADrawLC0MidLine //
);
//
// Candle 1 ...
specs.width = 2;
specs.style = STYLE_SOLID;
DrawCandleMidLine(
lcCandle1,
lcCandle1Time,
specs,
lcCandel1MidLineTag,
lc1TagPrefix,
xBEEADrawLC1MidLine //
);
//
// Hind ...
//
// Candle 0 ...
specs.clr = clrDarkOrange;
specs.width = 1;
specs.style = STYLE_DOT;
DrawCandleMidLine(
hcCandle0,
hcCandle0Time,
specs,
hcCandel0MidLineTag,
hc0TagPrefix,
xBEEADrawHC0MidLine //
);
//
// Candle 1 ...
specs.width = 2;
specs.style = STYLE_SOLID;
DrawCandleMidLine(
hcCandle1,
hcCandle1Time,
specs,
hcCandel1MidLineTag,
hc1TagPrefix,
xBEEADrawHC1MidLine //
);
}
//
// Generate States and Comment to User ...
void XBEEAProvideInfo()
{
//
string periodMsg =
//
"SC: " + ToString(xBEEASCPeriod) + "\n" +
"MC: " + ToString(xBEEAMCPeriod) + "\n" +
"LC: " + ToString(xBEEALCPeriod) + "\n" +
"HC: " + ToString(xBEEAHCPeriod)
//
;
//
string buySellMsg =
//
(buyTime > 0 && buyTime != NULL
? "Last Buy: " + ToString(buyTime) + "\n"
: "") +
(sellTime > 0 && sellTime != NULL
? "Last Sell: " + ToString(sellTime) + "\n"
: "")
//
;
//
string hcStateMsg = "HC waits for reversal Conditions: " + ToString(hcWaitsOnNextSession);
//
string hcCandlestickMsg = "HC Candle 1: " +
(isHCCandle1Bullish
? "Bullish"
: isHCCandle1Bearish
? "Bearish"
: "Neutural" //
);
//
string lcCandlestickMsg = "LC Candle 1: " +
(isLCCandle1Bullish
? "Bullish"
: isLCCandle1Bearish
? "Bearish"
: "Neutural" //
);
//
string mcCandlestickMsg = "MC Candle 1: " +
(isMCCandle1Bullish
? "Bullish"
: isMCCandle1Bearish
? "Bearish"
: "Neutural" //
);
//
string candlestickMsg =
//
lcCandlestickMsg + "\n" +
hcCandlestickMsg
//
;
//
string comment = "";
//
comment +=
//
periodMsg + "\n" +
buySellMsg + "\n" +
hcStateMsg + "\n" +
candlestickMsg
//
;
//
Comment(comment);
}
//
void DrawCandleMidLine(
XOHCL &c, // Candle ...
const datetime time, // Candle Time ...
XDrawSpecifications &specs, // Draw Specifications ...
string tag = "", // Tag ...
string label = "", // Label ...
bool draw = false // Draw MidLine ...
)
{
//
if (!draw)
{
return;
}
//
long chartId = ChartID();
int subWindow = 0;
//
double value = (c.open + c.close) / 2;
//
datetime cTime = TimeCurrent();
//
string lblTag = tag + "_lbl";
if (xBEEADrawLabels)
{
DrawText(
chartId,
lblTag,
subWindow,
cTime,
value,
label,
"Arial",
20,
specs.clr,
90,
ANCHOR_LEFT_UPPER,
specs.back,
specs.selection,
specs.hidden,
specs.zOrder //
);
}
//
// Draw ...
DrawTrendLine(
chartId,
tag,
subWindow,
time,
value,
cTime,
value,
specs.clr,
specs.style,
specs.width,
specs.back,
specs.selection,
specs.rayRight,
specs.hidden,
specs.zOrder //
);
}
//
string GenerateCandleMidLineTag(
XOHCL &c, // Candle ...
string tag = "" // Tag ...
)
{
//
double value = (c.open + c.close) / 2;
//
string result = tag + "_" + "|MID|";
//
return result;
}