complete rms tools ea ...
This commit is contained in:
@@ -168,6 +168,9 @@ class XCAppDialog : public CAppDialog
|
|||||||
wndclient.ColorBackground(clr);
|
wndclient.ColorBackground(clr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Overrides ...
|
||||||
|
|
||||||
//
|
//
|
||||||
protected:
|
protected:
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -28,8 +28,8 @@
|
|||||||
#include <ChartObjects/ChartObjectsArrows.mqh>
|
#include <ChartObjects/ChartObjectsArrows.mqh>
|
||||||
#include <ChartObjects/ChartObjectsLines.mqh>
|
#include <ChartObjects/ChartObjectsLines.mqh>
|
||||||
#include <ChartObjects/ChartObjectsShapes.mqh>
|
#include <ChartObjects/ChartObjectsShapes.mqh>
|
||||||
#include <ChartObjects\ChartObjectsFibo.mqh>
|
#include <ChartObjects/ChartObjectsFibo.mqh>
|
||||||
#include <ChartObjects\ChartObjectsTxtControls.mqh>
|
#include <ChartObjects/ChartObjectsTxtControls.mqh>
|
||||||
|
|
||||||
//
|
//
|
||||||
// Definitions ...
|
// Definitions ...
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -2382,6 +2382,602 @@ if (useSenario1)
|
|||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
bool HasSenario1Conditions(
|
||||||
|
ENUM_X_CYCLES cycle,
|
||||||
|
XBoxZone &box,
|
||||||
|
XBoxZone &holderBox,
|
||||||
|
ENUM_X_DIRECTION &dir,
|
||||||
|
X121SMCStrategySignalProviderData &provider,
|
||||||
|
ENUM_X_CYCLES holderCycle = X_CYCLE_NONE,
|
||||||
|
int barIndex = 0 //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fil Selected Data ...
|
||||||
|
XPOIState cState;
|
||||||
|
X121Conditions cXConditions;
|
||||||
|
XC121SMCCycleHelper *cHelper;
|
||||||
|
X121SMCCycleConditions cConditions;
|
||||||
|
result = provider.SelectCycle(
|
||||||
|
cycle,
|
||||||
|
cState,
|
||||||
|
cXConditions,
|
||||||
|
cHelper,
|
||||||
|
cConditions //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
cState.Clean();
|
||||||
|
ZeroMemory(cHelper);
|
||||||
|
cConditions.Clean();
|
||||||
|
cXConditions.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
Parse(cXConditions);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fil Selected Data ...
|
||||||
|
XPOIState chState;
|
||||||
|
X121Conditions chXConditions;
|
||||||
|
XC121SMCCycleHelper *chHelper;
|
||||||
|
X121SMCCycleConditions chConditions;
|
||||||
|
if (holderCycle != X_CYCLE_NONE)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
result = provider.SelectCycle(
|
||||||
|
holderCycle,
|
||||||
|
chState,
|
||||||
|
chXConditions,
|
||||||
|
chHelper,
|
||||||
|
chConditions //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
chState.Clean();
|
||||||
|
ZeroMemory(chHelper);
|
||||||
|
chConditions.Clean();
|
||||||
|
chXConditions.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Parse(chXConditions);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Normalize Args ...
|
||||||
|
|
||||||
|
//
|
||||||
|
box.Clean();
|
||||||
|
holderBox.Clean();
|
||||||
|
dir = X_DIRECTION_NONE;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (barIndex < 0)
|
||||||
|
{
|
||||||
|
barIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int idx = -1;
|
||||||
|
int count = 0;
|
||||||
|
bool has = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
int zIDX = barIndex;
|
||||||
|
int cIDX = zIDX + 1;
|
||||||
|
int pIDX = cIDX + 1;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isBullish = false;
|
||||||
|
bool isBearish = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
XOHCL zBar;
|
||||||
|
XOHCL cBar;
|
||||||
|
XOHCL pBar;
|
||||||
|
XOHCL cSMHKBar;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initial Bars ...
|
||||||
|
result = zBar.Init(
|
||||||
|
cState.symbol,
|
||||||
|
cState.period,
|
||||||
|
barIndex //
|
||||||
|
);
|
||||||
|
result =
|
||||||
|
result &&
|
||||||
|
zBar.GetPreviousBar(cBar);
|
||||||
|
result =
|
||||||
|
result &&
|
||||||
|
cBar.GetPreviousBar(pBar);
|
||||||
|
result =
|
||||||
|
result &&
|
||||||
|
cHelper
|
||||||
|
.mX121Helper
|
||||||
|
.xhkHelper
|
||||||
|
.GetSMHKAsXOHCL(
|
||||||
|
cIDX,
|
||||||
|
cSMHKBar //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
zBar.Clean();
|
||||||
|
cBar.Clean();
|
||||||
|
pBar.Clean();
|
||||||
|
cState.Clean();
|
||||||
|
chState.Clean();
|
||||||
|
cSMHKBar.Clean();
|
||||||
|
ZeroMemory(cHelper);
|
||||||
|
cConditions.Clean();
|
||||||
|
cXConditions.Clean();
|
||||||
|
ZeroMemory(chHelper);
|
||||||
|
chConditions.Clean();
|
||||||
|
chXConditions.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Detecting Signal Conditions ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish Conditions ...
|
||||||
|
isBullish =
|
||||||
|
//
|
||||||
|
// Base Condition ...
|
||||||
|
cXConditions.isSMHKSwitchedToBullish &&
|
||||||
|
(
|
||||||
|
//
|
||||||
|
// Validate CBar ...
|
||||||
|
cBar.IsBullish() &&
|
||||||
|
(cBar.open == cSMHKBar.open ||
|
||||||
|
(cBar.low < cSMHKBar.open &&
|
||||||
|
cBar.GetDown() > cSMHKBar.close)) &&
|
||||||
|
//
|
||||||
|
cXConditions.isSarBullish
|
||||||
|
//
|
||||||
|
)
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish Conditions ...
|
||||||
|
isBearish =
|
||||||
|
//
|
||||||
|
// Base Condition ...
|
||||||
|
cXConditions.isSMHKSwitchedToBearish &&
|
||||||
|
(
|
||||||
|
//
|
||||||
|
// Validate CBar ...
|
||||||
|
cBar.IsBearish() &&
|
||||||
|
(cBar.open == cSMHKBar.open ||
|
||||||
|
(cBar.high > cSMHKBar.open &&
|
||||||
|
cBar.GetUp() < cSMHKBar.close)) &&
|
||||||
|
//
|
||||||
|
cXConditions.isSarBearish
|
||||||
|
//
|
||||||
|
)
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Filling Requirements ...
|
||||||
|
result =
|
||||||
|
isBullish ||
|
||||||
|
isBearish;
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
dir =
|
||||||
|
isBullish
|
||||||
|
? X_DIRECTION_BULLISH
|
||||||
|
: X_DIRECTION_BEARISH;
|
||||||
|
|
||||||
|
//
|
||||||
|
box.dir = dir;
|
||||||
|
box.to = TimeCurrent();
|
||||||
|
box.symbol = cXConditions.symbol;
|
||||||
|
box.period = cXConditions.period;
|
||||||
|
|
||||||
|
//
|
||||||
|
int fromIDX = -1;
|
||||||
|
if (isBullish)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
double vale = cXConditions.valesBuffer[cIDX];
|
||||||
|
box.lower = vale;
|
||||||
|
box.upper = cXConditions.valesGoldenBuffer[cIDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
int lowerValeIDX = -1;
|
||||||
|
double lowerVale = cHelper
|
||||||
|
.mX121Helper
|
||||||
|
.xpvHelper
|
||||||
|
.GetLowerVale(
|
||||||
|
lowerValeIDX,
|
||||||
|
vale,
|
||||||
|
cBar.Index() //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
int higherValeIDX = -1;
|
||||||
|
double higherVale = cHelper
|
||||||
|
.mX121Helper
|
||||||
|
.xpvHelper
|
||||||
|
.GetHigherVale(
|
||||||
|
higherValeIDX,
|
||||||
|
vale,
|
||||||
|
cBar.Index() //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (IsValidIndex(lowerValeIDX) &&
|
||||||
|
IsValidIndex(higherValeIDX))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
fromIDX =
|
||||||
|
lowerValeIDX < higherValeIDX
|
||||||
|
? lowerValeIDX
|
||||||
|
: higherValeIDX;
|
||||||
|
}
|
||||||
|
else if (IsValidIndex(lowerValeIDX) &&
|
||||||
|
!IsValidIndex(higherValeIDX))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
fromIDX = lowerValeIDX;
|
||||||
|
}
|
||||||
|
else if (!IsValidIndex(lowerValeIDX) &&
|
||||||
|
IsValidIndex(higherValeIDX))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
fromIDX = higherValeIDX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
double peak = cXConditions.peaksBuffer[cIDX];
|
||||||
|
box.upper = peak;
|
||||||
|
|
||||||
|
//
|
||||||
|
box.lower = cXConditions.peaksGoldenBuffer[cIDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
int lowerPeakIDX = -1;
|
||||||
|
double lowerPeak = cHelper
|
||||||
|
.mX121Helper
|
||||||
|
.xpvHelper
|
||||||
|
.GetLowerPeak(
|
||||||
|
lowerPeakIDX,
|
||||||
|
peak,
|
||||||
|
cBar.Index() //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
int higherPeakIDX = -1;
|
||||||
|
double higherPeak = cHelper
|
||||||
|
.mX121Helper
|
||||||
|
.xpvHelper
|
||||||
|
.GetHigherPeak(
|
||||||
|
higherPeakIDX,
|
||||||
|
peak,
|
||||||
|
cBar.Index() //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (IsValidIndex(lowerPeakIDX) &&
|
||||||
|
IsValidIndex(higherPeakIDX))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
fromIDX =
|
||||||
|
lowerPeakIDX < higherPeakIDX
|
||||||
|
? lowerPeakIDX
|
||||||
|
: higherPeakIDX;
|
||||||
|
}
|
||||||
|
else if (IsValidIndex(lowerPeakIDX) &&
|
||||||
|
!IsValidIndex(higherPeakIDX))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
fromIDX = lowerPeakIDX;
|
||||||
|
}
|
||||||
|
else if (!IsValidIndex(lowerPeakIDX) &&
|
||||||
|
IsValidIndex(higherPeakIDX))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
fromIDX = higherPeakIDX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (IsValidIndex(fromIDX))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
box.from = iTime(
|
||||||
|
zBar.symbol,
|
||||||
|
zBar.period,
|
||||||
|
fromIDX //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
box.from = pBar.time;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Holder Box ...
|
||||||
|
XBoxZone tmpBoxes[];
|
||||||
|
if (chState.IsValid())
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (isBullish)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Demand Zones ...
|
||||||
|
XBoxZone tmp[];
|
||||||
|
ToBox(
|
||||||
|
chState.demandZones,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Copy(
|
||||||
|
tmp,
|
||||||
|
tmpBoxes,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
Clean(tmp);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish Order Blocks ...
|
||||||
|
ToBox(
|
||||||
|
chState.bullishOrderBlocks,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Copy(
|
||||||
|
tmp,
|
||||||
|
tmpBoxes,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
Clean(tmp);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish Fair Value Gaps ...
|
||||||
|
ToBox(
|
||||||
|
chState.bullishFairValueGaps,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Copy(
|
||||||
|
tmp,
|
||||||
|
tmpBoxes,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
Clean(tmp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Supply Zones ...
|
||||||
|
XBoxZone tmp[];
|
||||||
|
ToBox(
|
||||||
|
chState.supplyZones,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Copy(
|
||||||
|
tmp,
|
||||||
|
tmpBoxes,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
Clean(tmp);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish Order Blocks ...
|
||||||
|
ToBox(
|
||||||
|
chState.bearishOrderBlocks,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Copy(
|
||||||
|
tmp,
|
||||||
|
tmpBoxes,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
Clean(tmp);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish Fair Value Gaps ...
|
||||||
|
ToBox(
|
||||||
|
chState.bearishFairValueGaps,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Copy(
|
||||||
|
tmp,
|
||||||
|
tmpBoxes,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
Clean(tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
has = HasChild(tmpBoxes);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
while (HasChild(tmpBoxes))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
idx = GetOldest(tmpBoxes);
|
||||||
|
has = IsValidIndex(idx);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone iBox = tmpBoxes[idx];
|
||||||
|
ArrayRemove(
|
||||||
|
tmpBoxes,
|
||||||
|
idx,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
has = IsBoxInside(
|
||||||
|
box,
|
||||||
|
iBox //
|
||||||
|
);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
holderBox = iBox;
|
||||||
|
holderBox.to = TimeCurrent();
|
||||||
|
iBox.Clean();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
iBox.Clean();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(tmpBoxes);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fix Box Upper and Lower based on Strategy ...
|
||||||
|
|
||||||
|
//
|
||||||
|
double points = GetPoints(box.symbol);
|
||||||
|
double minPointsDiff = points * 20;
|
||||||
|
|
||||||
|
//
|
||||||
|
double prefferSL = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// First Check Based on Prev Bar ...
|
||||||
|
// double prevDiff =
|
||||||
|
// isBullish
|
||||||
|
// ? cBar.low < zBar.open
|
||||||
|
// ? zBar.open - cBar.low
|
||||||
|
// : 0
|
||||||
|
// : isBearish
|
||||||
|
// ? cBar.high > zBar.open
|
||||||
|
// ? cBar.high - zBar.open
|
||||||
|
// : 0
|
||||||
|
// : 0;
|
||||||
|
// if (prevDiff >= minPointsDiff)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// prefferSL =
|
||||||
|
// isBullish
|
||||||
|
// ? cBar.low
|
||||||
|
// : cBar.high;
|
||||||
|
// }
|
||||||
|
|
||||||
|
//
|
||||||
|
// Other SL Conditions ...
|
||||||
|
if (prefferSL <= 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (isBullish)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (zBar.open < cXConditions.valesGoldenBuffer[cIDX])
|
||||||
|
{
|
||||||
|
prefferSL = cXConditions.valesBuffer[cIDX];
|
||||||
|
}
|
||||||
|
else if (zBar.open > cXConditions.valesGoldenBuffer[cIDX])
|
||||||
|
{
|
||||||
|
prefferSL = cXConditions.valesGoldenBuffer[cIDX];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (zBar.open > cXConditions.peaksGoldenBuffer[cIDX])
|
||||||
|
{
|
||||||
|
prefferSL = cXConditions.peaksBuffer[cIDX];
|
||||||
|
}
|
||||||
|
else if (zBar.open < cXConditions.peaksGoldenBuffer[cIDX])
|
||||||
|
{
|
||||||
|
prefferSL = cXConditions.peaksGoldenBuffer[cIDX];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (prefferSL > 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
prefferSL =
|
||||||
|
prefferSL <= minPointsDiff
|
||||||
|
? minPointsDiff
|
||||||
|
: prefferSL;
|
||||||
|
|
||||||
|
//
|
||||||
|
box.upper =
|
||||||
|
isBullish
|
||||||
|
? zBar.open
|
||||||
|
: prefferSL;
|
||||||
|
|
||||||
|
//
|
||||||
|
box.lower =
|
||||||
|
isBullish
|
||||||
|
? prefferSL
|
||||||
|
: zBar.open;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate Conditions to Force Has Holder Box ...
|
||||||
|
// result =
|
||||||
|
// result &&
|
||||||
|
// holderBox.IsValid();
|
||||||
|
result = box.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
isBullish = false;
|
||||||
|
isBearish = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check All Conditions ...
|
||||||
|
result =
|
||||||
|
box.IsValid() &&
|
||||||
|
HasDirection(dir) &&
|
||||||
|
(isBullish ||
|
||||||
|
isBearish);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cleanup Resources ...
|
||||||
|
zBar.Clean();
|
||||||
|
cBar.Clean();
|
||||||
|
pBar.Clean();
|
||||||
|
cState.Clean();
|
||||||
|
chState.Clean();
|
||||||
|
cSMHKBar.Clean();
|
||||||
|
ZeroMemory(cHelper);
|
||||||
|
cConditions.Clean();
|
||||||
|
cXConditions.Clean();
|
||||||
|
ZeroMemory(chHelper);
|
||||||
|
chConditions.Clean();
|
||||||
|
chXConditions.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,431 @@
|
|||||||
|
///////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SaherElm IT Center XTest MQL5 Expert Advisor
|
||||||
|
// -------------------------------------------------
|
||||||
|
// Name: XRRToolsEA
|
||||||
|
// Description: a Template For Exper Advisors
|
||||||
|
//
|
||||||
|
// 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 XRRToolsEA"
|
||||||
|
#property strict
|
||||||
|
|
||||||
|
//
|
||||||
|
#define ShortName "XRRTools"
|
||||||
|
|
||||||
|
//
|
||||||
|
// Imports ...
|
||||||
|
#include "../Classes/x-saherelm.x-alert.class.mq5"
|
||||||
|
#include "../Classes/x-saherelm.x-rm.panel.class.mq5"
|
||||||
|
#include "../Classes/x-saherelm.x-trade.class.mq5"
|
||||||
|
#include "../Helpers/x-saherelm.x121.xcc.helper.mq5"
|
||||||
|
#include "../Helpers/x-saherelm.x121.xct.helper.mq5"
|
||||||
|
|
||||||
|
//
|
||||||
|
// Inputs ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Common ...
|
||||||
|
input group "Common";
|
||||||
|
input long eaMagicNumber = 78692110; // Magic Number
|
||||||
|
input int eaSlippage = 10; // Slippgae
|
||||||
|
input string eaLogSuffix = ""; // Log Suffix
|
||||||
|
|
||||||
|
//
|
||||||
|
// Alert ...
|
||||||
|
// Here we Provider All Requirements for
|
||||||
|
// Configuring Alert Provider ...
|
||||||
|
input group "Alert";
|
||||||
|
input bool eAEnableAlerts = true; // Enable Alerts
|
||||||
|
input bool eALogAlerts = true; // Log Alerts
|
||||||
|
input bool eAMailAlerts = false; // Mail Alerts
|
||||||
|
input bool eAPushAlerts = false; // Push Alerts
|
||||||
|
input bool eATerminalAlerts = false; // Terminal Alerts
|
||||||
|
|
||||||
|
//
|
||||||
|
// Define Local Variables ...
|
||||||
|
|
||||||
|
//
|
||||||
|
string eaLogTag; // EA Log Prefix ...
|
||||||
|
XCAlert *eaAlert; // Alert Provider for Expert Adviser ...
|
||||||
|
XCTrade *eaTrader; // Trader of Expert Adviser ...
|
||||||
|
XCRMPanel eaMainWindow; // Main Window ...
|
||||||
|
XCX121XCTHelper *eaCTHelper; // Bar Timer Indicator Helper class ...
|
||||||
|
XCX121XCCHelper *eaCCHelper; // Chart Styler Indicator Helper Class ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Event Handlers ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialization ...
|
||||||
|
int OnInit()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Validate Inputs and Required Parameters
|
||||||
|
// for EA to Works fine ...
|
||||||
|
if (!ValidateInputs())
|
||||||
|
{
|
||||||
|
return INIT_PARAMETERS_INCORRECT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize Timer ...
|
||||||
|
if (!InitTimer())
|
||||||
|
{
|
||||||
|
return INIT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize all Requirements ...
|
||||||
|
if (!InitEA())
|
||||||
|
{
|
||||||
|
return INIT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize all GUI Objects and Classes ...
|
||||||
|
if (!InitGUI())
|
||||||
|
{
|
||||||
|
return INIT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Alert Initialization ...
|
||||||
|
string msg = "Initialized Successfully ...";
|
||||||
|
eaAlert.Alert(msg);
|
||||||
|
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
|
||||||
|
//
|
||||||
|
// Destroy Timer ...
|
||||||
|
DestroyTimer();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Destroy all GUI Requirements ...
|
||||||
|
DestroyGUI();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Alert De Initialization Succeeded ...
|
||||||
|
string msg = "De Initialized Successfully ...";
|
||||||
|
eaAlert.Alert(msg);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Destroy all EA Requirements ...
|
||||||
|
DestroyEA();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// On Tick Handler ...
|
||||||
|
void OnTick()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
UpdateGUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Handle On Trade Event ...
|
||||||
|
void OnTrade()
|
||||||
|
{
|
||||||
|
eaTrader.HandleOnTrade();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// On Timer ...
|
||||||
|
void OnTimer()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// TODO: Implement Time Based Functionalities ...
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Chart Event Handler ...
|
||||||
|
void OnChartEvent(
|
||||||
|
const int id,
|
||||||
|
const long &lparam,
|
||||||
|
const double &dparam,
|
||||||
|
const string &sparam //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Apply Chart Event on Main Window ...
|
||||||
|
eaMainWindow.ChartEvent(id, lparam, dparam, sparam);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Custom Event Handlers ...
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle StopLoss Triggered Positions ...
|
||||||
|
*
|
||||||
|
* @param deal: XDeal ...
|
||||||
|
*/
|
||||||
|
void OnStopLossTriggered(const XDeal &deal)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle Take Profit Triggered Positions ...
|
||||||
|
*
|
||||||
|
* @param deal: XDeal ...
|
||||||
|
*/
|
||||||
|
void OnTakeProfitTriggered(const XDeal &deal)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle Force Close a Position ...
|
||||||
|
*
|
||||||
|
* @param ticket: Position Ticket ...
|
||||||
|
* @param position: XPosition ...
|
||||||
|
* @param comment: Closing Comment ...
|
||||||
|
*/
|
||||||
|
void OnPositionForceClosed(
|
||||||
|
const ulong ticket,
|
||||||
|
const XPosition &position,
|
||||||
|
const string comment //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Custom Functions ...
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate all Inputs of Expert Adviser ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool ValidateInputs()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
string errMessage = "";
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isCommonValid = (
|
||||||
|
//
|
||||||
|
eaSlippage > 0 &&
|
||||||
|
eaMagicNumber > 0
|
||||||
|
//
|
||||||
|
);
|
||||||
|
if (!isCommonValid)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
errMessage += "common configurations error;" + "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
// Common ...
|
||||||
|
isCommonValid &&
|
||||||
|
//
|
||||||
|
// Otere ...
|
||||||
|
true
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Since here Logger not Initiallized, we Use Raw Print Command ...
|
||||||
|
Print(ShortName + " Errors: \n", errMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize Timer ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool InitTimer()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// TODO: Initialize Timer if necessary ...
|
||||||
|
// result = EventSetTimer(1);
|
||||||
|
// result = EventSetMillisecondTimer(100);
|
||||||
|
result = true;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy Timer ...
|
||||||
|
*/
|
||||||
|
void DestroyTimer()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// TODO: Use This ...
|
||||||
|
// EventKillTimer();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize all Requirements for Working Fine ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool InitEA()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Locally Apply Changes on Prefix ...
|
||||||
|
eaLogTag = ShortName + ">" + eaLogSuffix;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bar Timer ...
|
||||||
|
X121XCTInputs ctInputs;
|
||||||
|
ctInputs.Default(); // Default Configurations ...
|
||||||
|
eaCTHelper = new XCX121XCTHelper();
|
||||||
|
result = eaCTHelper.Init(
|
||||||
|
_Symbol,
|
||||||
|
_Period,
|
||||||
|
ctInputs //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bar Styles ...
|
||||||
|
X121XCCInputs ccInputs;
|
||||||
|
ccInputs.Default(); // Default Configurations ...
|
||||||
|
eaCCHelper = new XCX121XCCHelper();
|
||||||
|
result = eaCCHelper.Init(
|
||||||
|
_Symbol,
|
||||||
|
_Period,
|
||||||
|
ccInputs //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create Instance of Alert Class and Configure it ...
|
||||||
|
eaAlert = new XCAlert();
|
||||||
|
eaAlert.SetPrefix(eaLogTag);
|
||||||
|
eaAlert.SetLogAlerts(eALogAlerts);
|
||||||
|
eaAlert.SetMailAlerts(eAMailAlerts);
|
||||||
|
eaAlert.SetPushAlerts(eAPushAlerts);
|
||||||
|
eaAlert.SetEnableAlerts(eAEnableAlerts);
|
||||||
|
eaAlert.SetTerminalAlerts(eATerminalAlerts);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create Trader Instance and Configure it ...
|
||||||
|
eaTrader = new XCTrade(
|
||||||
|
eaSlippage,
|
||||||
|
eaMagicNumber //
|
||||||
|
);
|
||||||
|
eaTrader.AddOnStopLossEventHandler(OnStopLossTriggered);
|
||||||
|
eaTrader.AddOnTakeProfitEventHandler(OnTakeProfitTriggered);
|
||||||
|
eaTrader.AddOnForceClosePositionEventHandler(OnPositionForceClosed);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy all Initialized EA Requirements ...
|
||||||
|
*/
|
||||||
|
void DestroyEA()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
delete eaCTHelper;
|
||||||
|
delete eaCCHelper;
|
||||||
|
|
||||||
|
//
|
||||||
|
delete eaAlert;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize all GUI Requirements for EA ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool InitGUI()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize Application Main Window ...
|
||||||
|
result = eaMainWindow.Create(
|
||||||
|
ChartID(),
|
||||||
|
ShortName, // Dialog Name ...
|
||||||
|
0, // SubWindow ...
|
||||||
|
10, // X1 ...
|
||||||
|
35, // Y1 ...
|
||||||
|
300, // X2 ...
|
||||||
|
200 // Y2 ...
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Try To Run Main Window ...
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
eaMainWindow.Run();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update GUI based on Each Ticks ...
|
||||||
|
*/
|
||||||
|
void UpdateGUI()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
eaMainWindow.UpdateState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy all Initialized GUi Requirements ...
|
||||||
|
*/
|
||||||
|
void DestroyGUI()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
eaMainWindow.Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
@@ -4531,6 +4531,22 @@ int GetDigits(
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get Digits of Specified Double Value ...
|
||||||
|
int GetDigits(double num)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int d = 0;
|
||||||
|
double p = 1;
|
||||||
|
while (MathRound(num * p) / p != num)
|
||||||
|
{
|
||||||
|
p = MathPow(10, ++d);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Retrieve Entry Price ...
|
// Retrieve Entry Price ...
|
||||||
double GetEntry(
|
double GetEntry(
|
||||||
|
|||||||
@@ -1441,7 +1441,15 @@ struct X121SMCStrategySignalProviderData
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
if (cycle == X_CYCLE_DECISION)
|
if (cycle == X_CYCLE_TRIGGER)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
cState = triggerState;
|
||||||
|
cHelper = triggerCycleHelper;
|
||||||
|
cConditions = triggerConditions;
|
||||||
|
cXConditions = triggerXConditions;
|
||||||
|
}
|
||||||
|
else if (cycle == X_CYCLE_DECISION)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
cState = decisionState;
|
cState = decisionState;
|
||||||
@@ -1457,6 +1465,14 @@ struct X121SMCStrategySignalProviderData
|
|||||||
cConditions = analyseConditions;
|
cConditions = analyseConditions;
|
||||||
cXConditions = analyseXConditions;
|
cXConditions = analyseXConditions;
|
||||||
}
|
}
|
||||||
|
else if (cycle == X_CYCLE_VERIFICATION)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
cState = verificationState;
|
||||||
|
cHelper = verificationCycleHelper;
|
||||||
|
cConditions = verificationConditions;
|
||||||
|
cXConditions = verificationXConditions;
|
||||||
|
}
|
||||||
else if (cycle == X_CYCLE_CONSOLIDATION)
|
else if (cycle == X_CYCLE_CONSOLIDATION)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -2577,6 +2593,586 @@ struct X121SMCStrategyConditionParser
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Detecting Signal Conditions ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish Conditions ...
|
||||||
|
isBullish =
|
||||||
|
//
|
||||||
|
// Base Condition ...
|
||||||
|
cXConditions.isSMHKSwitchedToBullish &&
|
||||||
|
(
|
||||||
|
//
|
||||||
|
// Validate CBar ...
|
||||||
|
cBar.IsBullish() &&
|
||||||
|
cBar.open >= cSMHKBar.open &&
|
||||||
|
//
|
||||||
|
cXConditions.isSarBullish
|
||||||
|
//
|
||||||
|
)
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish Conditions ...
|
||||||
|
isBearish =
|
||||||
|
//
|
||||||
|
// Base Condition ...
|
||||||
|
cXConditions.isSMHKSwitchedToBearish &&
|
||||||
|
(
|
||||||
|
//
|
||||||
|
// Validate CBar ...
|
||||||
|
cBar.IsBearish() &&
|
||||||
|
cBar.open <= cSMHKBar.open &&
|
||||||
|
//
|
||||||
|
cXConditions.isSarBearish
|
||||||
|
//
|
||||||
|
)
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Filling Requirements ...
|
||||||
|
result =
|
||||||
|
isBullish ||
|
||||||
|
isBearish;
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
dir =
|
||||||
|
isBullish
|
||||||
|
? X_DIRECTION_BULLISH
|
||||||
|
: X_DIRECTION_BEARISH;
|
||||||
|
|
||||||
|
//
|
||||||
|
box.dir = dir;
|
||||||
|
box.to = TimeCurrent();
|
||||||
|
box.symbol = cXConditions.symbol;
|
||||||
|
box.period = cXConditions.period;
|
||||||
|
|
||||||
|
//
|
||||||
|
int fromIDX = -1;
|
||||||
|
if (isBullish)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
double vale = cXConditions.valesBuffer[cIDX];
|
||||||
|
box.lower = vale;
|
||||||
|
box.upper = cXConditions.valesGoldenBuffer[cIDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
int lowerValeIDX = -1;
|
||||||
|
double lowerVale = cHelper
|
||||||
|
.mX121Helper
|
||||||
|
.xpvHelper
|
||||||
|
.GetLowerVale(
|
||||||
|
lowerValeIDX,
|
||||||
|
vale,
|
||||||
|
cBar.Index() //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
int higherValeIDX = -1;
|
||||||
|
double higherVale = cHelper
|
||||||
|
.mX121Helper
|
||||||
|
.xpvHelper
|
||||||
|
.GetHigherVale(
|
||||||
|
higherValeIDX,
|
||||||
|
vale,
|
||||||
|
cBar.Index() //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (IsValidIndex(lowerValeIDX) &&
|
||||||
|
IsValidIndex(higherValeIDX))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
fromIDX =
|
||||||
|
lowerValeIDX < higherValeIDX
|
||||||
|
? lowerValeIDX
|
||||||
|
: higherValeIDX;
|
||||||
|
}
|
||||||
|
else if (IsValidIndex(lowerValeIDX) &&
|
||||||
|
!IsValidIndex(higherValeIDX))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
fromIDX = lowerValeIDX;
|
||||||
|
}
|
||||||
|
else if (!IsValidIndex(lowerValeIDX) &&
|
||||||
|
IsValidIndex(higherValeIDX))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
fromIDX = higherValeIDX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
double peak = cXConditions.peaksBuffer[cIDX];
|
||||||
|
box.upper = peak;
|
||||||
|
|
||||||
|
//
|
||||||
|
box.lower = cXConditions.peaksGoldenBuffer[cIDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
int lowerPeakIDX = -1;
|
||||||
|
double lowerPeak = cHelper
|
||||||
|
.mX121Helper
|
||||||
|
.xpvHelper
|
||||||
|
.GetLowerPeak(
|
||||||
|
lowerPeakIDX,
|
||||||
|
peak,
|
||||||
|
cBar.Index() //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
int higherPeakIDX = -1;
|
||||||
|
double higherPeak = cHelper
|
||||||
|
.mX121Helper
|
||||||
|
.xpvHelper
|
||||||
|
.GetHigherPeak(
|
||||||
|
higherPeakIDX,
|
||||||
|
peak,
|
||||||
|
cBar.Index() //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (IsValidIndex(lowerPeakIDX) &&
|
||||||
|
IsValidIndex(higherPeakIDX))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
fromIDX =
|
||||||
|
lowerPeakIDX < higherPeakIDX
|
||||||
|
? lowerPeakIDX
|
||||||
|
: higherPeakIDX;
|
||||||
|
}
|
||||||
|
else if (IsValidIndex(lowerPeakIDX) &&
|
||||||
|
!IsValidIndex(higherPeakIDX))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
fromIDX = lowerPeakIDX;
|
||||||
|
}
|
||||||
|
else if (!IsValidIndex(lowerPeakIDX) &&
|
||||||
|
IsValidIndex(higherPeakIDX))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
fromIDX = higherPeakIDX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (IsValidIndex(fromIDX))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
box.from = iTime(
|
||||||
|
zBar.symbol,
|
||||||
|
zBar.period,
|
||||||
|
fromIDX //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
box.from = pBar.time;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Holder Box ...
|
||||||
|
XBoxZone tmpBoxes[];
|
||||||
|
if (chState.IsValid())
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (isBullish)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Demand Zones ...
|
||||||
|
XBoxZone tmp[];
|
||||||
|
ToBox(
|
||||||
|
chState.demandZones,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Copy(
|
||||||
|
tmp,
|
||||||
|
tmpBoxes,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
Clean(tmp);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish Order Blocks ...
|
||||||
|
ToBox(
|
||||||
|
chState.bullishOrderBlocks,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Copy(
|
||||||
|
tmp,
|
||||||
|
tmpBoxes,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
Clean(tmp);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish Fair Value Gaps ...
|
||||||
|
ToBox(
|
||||||
|
chState.bullishFairValueGaps,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Copy(
|
||||||
|
tmp,
|
||||||
|
tmpBoxes,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
Clean(tmp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Supply Zones ...
|
||||||
|
XBoxZone tmp[];
|
||||||
|
ToBox(
|
||||||
|
chState.supplyZones,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Copy(
|
||||||
|
tmp,
|
||||||
|
tmpBoxes,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
Clean(tmp);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish Order Blocks ...
|
||||||
|
ToBox(
|
||||||
|
chState.bearishOrderBlocks,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Copy(
|
||||||
|
tmp,
|
||||||
|
tmpBoxes,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
Clean(tmp);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish Fair Value Gaps ...
|
||||||
|
ToBox(
|
||||||
|
chState.bearishFairValueGaps,
|
||||||
|
tmp //
|
||||||
|
);
|
||||||
|
Copy(
|
||||||
|
tmp,
|
||||||
|
tmpBoxes,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
Clean(tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
has = HasChild(tmpBoxes);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
while (HasChild(tmpBoxes))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
idx = GetOldest(tmpBoxes);
|
||||||
|
has = IsValidIndex(idx);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone iBox = tmpBoxes[idx];
|
||||||
|
ArrayRemove(
|
||||||
|
tmpBoxes,
|
||||||
|
idx,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
has = IsBoxInside(
|
||||||
|
box,
|
||||||
|
iBox //
|
||||||
|
);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
holderBox = iBox;
|
||||||
|
holderBox.to = TimeCurrent();
|
||||||
|
iBox.Clean();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
iBox.Clean();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(tmpBoxes);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fix Box Upper and Lower based on Strategy ...
|
||||||
|
|
||||||
|
//
|
||||||
|
double points = GetPoints(box.symbol);
|
||||||
|
double minPointsDiff = points * 20;
|
||||||
|
|
||||||
|
// //
|
||||||
|
// double prefferSL = 0;
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // First Check Based on Prev Bar ...
|
||||||
|
// // double prevDiff =
|
||||||
|
// // isBullish
|
||||||
|
// // ? cBar.low < zBar.open
|
||||||
|
// // ? zBar.open - cBar.low
|
||||||
|
// // : 0
|
||||||
|
// // : isBearish
|
||||||
|
// // ? cBar.high > zBar.open
|
||||||
|
// // ? cBar.high - zBar.open
|
||||||
|
// // : 0
|
||||||
|
// // : 0;
|
||||||
|
// // if (prevDiff >= minPointsDiff)
|
||||||
|
// // {
|
||||||
|
// // //
|
||||||
|
// // prefferSL =
|
||||||
|
// // isBullish
|
||||||
|
// // ? cBar.low
|
||||||
|
// // : cBar.high;
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Other SL Conditions ...
|
||||||
|
// if (prefferSL <= 0)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// if (isBullish)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// if (zBar.open < cXConditions.valesGoldenBuffer[cIDX])
|
||||||
|
// {
|
||||||
|
// prefferSL = cXConditions.valesBuffer[cIDX];
|
||||||
|
// }
|
||||||
|
// else if (zBar.open > cXConditions.valesGoldenBuffer[cIDX])
|
||||||
|
// {
|
||||||
|
// prefferSL = cXConditions.valesGoldenBuffer[cIDX];
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// if (zBar.open > cXConditions.peaksGoldenBuffer[cIDX])
|
||||||
|
// {
|
||||||
|
// prefferSL = cXConditions.peaksBuffer[cIDX];
|
||||||
|
// }
|
||||||
|
// else if (zBar.open < cXConditions.peaksGoldenBuffer[cIDX])
|
||||||
|
// {
|
||||||
|
// prefferSL = cXConditions.peaksGoldenBuffer[cIDX];
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (prefferSL > 0)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// prefferSL =
|
||||||
|
// prefferSL <= minPointsDiff
|
||||||
|
// ? minPointsDiff
|
||||||
|
// : prefferSL;
|
||||||
|
|
||||||
|
// //
|
||||||
|
// box.upper =
|
||||||
|
// isBullish
|
||||||
|
// ? zBar.open
|
||||||
|
// : prefferSL;
|
||||||
|
|
||||||
|
// //
|
||||||
|
// box.lower =
|
||||||
|
// isBullish
|
||||||
|
// ? prefferSL
|
||||||
|
// : zBar.open;
|
||||||
|
// }
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate Conditions to Force Has Holder Box ...
|
||||||
|
result =
|
||||||
|
result &&
|
||||||
|
holderBox.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
isBullish = false;
|
||||||
|
isBearish = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check All Conditions ...
|
||||||
|
result =
|
||||||
|
box.IsValid() &&
|
||||||
|
HasDirection(dir) &&
|
||||||
|
(isBullish ||
|
||||||
|
isBearish);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cleanup Resources ...
|
||||||
|
zBar.Clean();
|
||||||
|
cBar.Clean();
|
||||||
|
pBar.Clean();
|
||||||
|
cState.Clean();
|
||||||
|
chState.Clean();
|
||||||
|
ZeroMemory(cHelper);
|
||||||
|
cConditions.Clean();
|
||||||
|
cXConditions.Clean();
|
||||||
|
ZeroMemory(chHelper);
|
||||||
|
chConditions.Clean();
|
||||||
|
chXConditions.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool HasSenario4Conditions(
|
||||||
|
ENUM_X_CYCLES cycle,
|
||||||
|
XBoxZone &box,
|
||||||
|
XBoxZone &holderBox,
|
||||||
|
ENUM_X_DIRECTION &dir,
|
||||||
|
X121SMCStrategySignalProviderData &provider,
|
||||||
|
ENUM_X_CYCLES holderCycle = X_CYCLE_NONE,
|
||||||
|
int barIndex = 0 //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fil Selected Data ...
|
||||||
|
XPOIState cState;
|
||||||
|
X121Conditions cXConditions;
|
||||||
|
XC121SMCCycleHelper *cHelper;
|
||||||
|
X121SMCCycleConditions cConditions;
|
||||||
|
result = provider.SelectCycle(
|
||||||
|
cycle,
|
||||||
|
cState,
|
||||||
|
cXConditions,
|
||||||
|
cHelper,
|
||||||
|
cConditions //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
cState.Clean();
|
||||||
|
ZeroMemory(cHelper);
|
||||||
|
cConditions.Clean();
|
||||||
|
cXConditions.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
Parse(cXConditions);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fil Selected Data ...
|
||||||
|
XPOIState chState;
|
||||||
|
X121Conditions chXConditions;
|
||||||
|
XC121SMCCycleHelper *chHelper;
|
||||||
|
X121SMCCycleConditions chConditions;
|
||||||
|
if (holderCycle != X_CYCLE_NONE)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
result = provider.SelectCycle(
|
||||||
|
holderCycle,
|
||||||
|
chState,
|
||||||
|
chXConditions,
|
||||||
|
chHelper,
|
||||||
|
chConditions //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
chState.Clean();
|
||||||
|
ZeroMemory(chHelper);
|
||||||
|
chConditions.Clean();
|
||||||
|
chXConditions.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Parse(chXConditions);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Normalize Args ...
|
||||||
|
|
||||||
|
//
|
||||||
|
box.Clean();
|
||||||
|
holderBox.Clean();
|
||||||
|
dir = X_DIRECTION_NONE;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (barIndex < 0)
|
||||||
|
{
|
||||||
|
barIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int idx = -1;
|
||||||
|
int count = 0;
|
||||||
|
bool has = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
int zIDX = barIndex;
|
||||||
|
int cIDX = zIDX + 1;
|
||||||
|
int pIDX = cIDX + 1;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isBullish = false;
|
||||||
|
bool isBearish = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
XOHCL zBar;
|
||||||
|
XOHCL cBar;
|
||||||
|
XOHCL pBar;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initial Bars ...
|
||||||
|
result = zBar.Init(
|
||||||
|
cState.symbol,
|
||||||
|
cState.period,
|
||||||
|
barIndex //
|
||||||
|
);
|
||||||
|
result =
|
||||||
|
result &&
|
||||||
|
zBar.GetPreviousBar(cBar);
|
||||||
|
result =
|
||||||
|
result &&
|
||||||
|
cBar.GetPreviousBar(pBar);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
zBar.Clean();
|
||||||
|
cBar.Clean();
|
||||||
|
pBar.Clean();
|
||||||
|
cState.Clean();
|
||||||
|
chState.Clean();
|
||||||
|
ZeroMemory(cHelper);
|
||||||
|
cConditions.Clean();
|
||||||
|
cXConditions.Clean();
|
||||||
|
ZeroMemory(chHelper);
|
||||||
|
chConditions.Clean();
|
||||||
|
chXConditions.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Detecting Signal Conditions ...
|
// Detecting Signal Conditions ...
|
||||||
|
|
||||||
|
|||||||
@@ -457,11 +457,19 @@ class XCX121SMCXWZSignalDetector : public XCBase
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Select and Provide SL Based on ...
|
// Select and Provide SL Based on ...
|
||||||
|
double iAtr = 0;
|
||||||
if (signalProvider == X121SMC_XWZ_PROVIDER_ACTIVATED_MA)
|
if (signalProvider == X121SMC_XWZ_PROVIDER_ACTIVATED_MA)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
|
iAtr = provider.decisionXConditions.atrBuffer[1];
|
||||||
|
iAtr *= 1.5;
|
||||||
}
|
}
|
||||||
else if (signalProvider == X121SMC_XWZ_PROVIDER_ACTIVATED_BOX)
|
else if (signalProvider == X121SMC_XWZ_PROVIDER_ACTIVATED_BOX)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
|
iAtr = provider.decisionXConditions.atrBuffer[1];
|
||||||
|
iAtr *= 1.5;
|
||||||
|
|
||||||
// //
|
// //
|
||||||
// if (isBullish)
|
// if (isBullish)
|
||||||
// {
|
// {
|
||||||
@@ -498,11 +506,10 @@ class XCX121SMCXWZSignalDetector : public XCBase
|
|||||||
}
|
}
|
||||||
else if (signalProvider == X121SMC_XWZ_PROVIDER_ACTIVATED_AREA)
|
else if (signalProvider == X121SMC_XWZ_PROVIDER_ACTIVATED_AREA)
|
||||||
{
|
{
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
double iAtr = provider.decisionXConditions.atrBuffer[1];
|
iAtr = provider.decisionXConditions.atrBuffer[1];
|
||||||
iAtr *= 1.5;
|
iAtr *= 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Select Condition SL ...
|
// Select Condition SL ...
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -792,22 +792,22 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
|
|
||||||
//
|
//
|
||||||
// XPV ...
|
// XPV ...
|
||||||
x121Inputs.xpvInputs.showSar = showAll || false;
|
x121Inputs.xpvInputs.showSar = showAll || true;
|
||||||
x121Inputs.xpvInputs.showPeaks = showAll || false;
|
x121Inputs.xpvInputs.showPeaks = showAll || true;
|
||||||
x121Inputs.xpvInputs.showVales = showAll || false;
|
x121Inputs.xpvInputs.showVales = showAll || true;
|
||||||
x121Inputs.xpvInputs.showGoldenZones = showAll || false;
|
x121Inputs.xpvInputs.showGoldenZones = showAll || true;
|
||||||
|
|
||||||
//
|
//
|
||||||
// XHK ...
|
// XHK ...
|
||||||
|
|
||||||
//
|
//
|
||||||
x121Inputs.xhkInputs.drawRawXHKCandles = showAll || false;
|
x121Inputs.xhkInputs.drawRawXHKCandles = showAll || false;
|
||||||
x121Inputs.xhkInputs.drawSmoothedXHKCandles = showAll || false;
|
x121Inputs.xhkInputs.drawSmoothedXHKCandles = showAll || true;
|
||||||
|
|
||||||
//
|
//
|
||||||
// XATR ...
|
// XATR ...
|
||||||
x121Inputs.xatrInputs.showATRUpper = showAll || true;
|
x121Inputs.xatrInputs.showATRUpper = showAll || false;
|
||||||
x121Inputs.xatrInputs.showATRLower = showAll || true;
|
x121Inputs.xatrInputs.showATRLower = showAll || false;
|
||||||
|
|
||||||
//
|
//
|
||||||
// XSTR ...
|
// XSTR ...
|
||||||
@@ -850,69 +850,12 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
//
|
//
|
||||||
int requiredPOIS = MaxAllowedRequiredPOIs();
|
int requiredPOIS = MaxAllowedRequiredPOIs();
|
||||||
|
|
||||||
//
|
|
||||||
// Decision Cycle ...
|
|
||||||
mDecisionCycleHelper = new XC121SMCCycleHelper();
|
|
||||||
isInited = mDecisionCycleHelper.Init(
|
|
||||||
symbol,
|
|
||||||
PERIOD_M1,
|
|
||||||
x121Inputs,
|
|
||||||
requiredPOIS //
|
|
||||||
);
|
|
||||||
if (isInited)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Configure POI Drawer ...
|
|
||||||
color bullishColor = clrDodgerBlue;
|
|
||||||
color bearishColor = clrSienna;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Bars ...
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.BarBullishColor(bullishColor);
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.BarBearishColor(bearishColor);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Swings ...
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.SwingLowColor(bullishColor);
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.SwingHighColor(bearishColor);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Momentum ...
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.BullishMomentumBarColor(bullishColor);
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.BearishMomentumBarColor(bearishColor);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Rejection ...
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.BullishRejectionBarColor(bullishColor);
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.BearishRejectionBarColor(bearishColor);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Support and Resistance ...
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.SupportZoneColor(bullishColor);
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.ResistanceZoneColor(bearishColor);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Demand and Supply ...
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.DemandZoneColor(bullishColor);
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.SupplyZoneColor(bearishColor);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Order Blocks ...
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.BullishOrderBlockColor(bullishColor);
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.BearishOrderBlockColor(bearishColor);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Fair Value Gaps ...
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.BullishFVGColor(bullishColor);
|
|
||||||
mDecisionCycleHelper.mPOIDrawer.BearishFVGColor(bearishColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Trigger Cycle ...
|
// Trigger Cycle ...
|
||||||
mTriggerCycleHelper = new XC121SMCCycleHelper();
|
mTriggerCycleHelper = new XC121SMCCycleHelper();
|
||||||
isInited = mTriggerCycleHelper.Init(
|
isInited = mTriggerCycleHelper.Init(
|
||||||
symbol,
|
symbol,
|
||||||
PERIOD_M5,
|
PERIOD_M1,
|
||||||
x121Inputs,
|
x121Inputs,
|
||||||
requiredPOIS //
|
requiredPOIS //
|
||||||
);
|
);
|
||||||
@@ -964,6 +907,63 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
mTriggerCycleHelper.mPOIDrawer.BearishFVGColor(bearishColor);
|
mTriggerCycleHelper.mPOIDrawer.BearishFVGColor(bearishColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Decision Cycle ...
|
||||||
|
mDecisionCycleHelper = new XC121SMCCycleHelper();
|
||||||
|
isInited = mDecisionCycleHelper.Init(
|
||||||
|
symbol,
|
||||||
|
PERIOD_M5,
|
||||||
|
x121Inputs,
|
||||||
|
requiredPOIS //
|
||||||
|
);
|
||||||
|
if (isInited)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Configure POI Drawer ...
|
||||||
|
color bullishColor = clrDodgerBlue;
|
||||||
|
color bearishColor = clrSienna;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bars ...
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.BarBullishColor(bullishColor);
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.BarBearishColor(bearishColor);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Swings ...
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.SwingLowColor(bullishColor);
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.SwingHighColor(bearishColor);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Momentum ...
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.BullishMomentumBarColor(bullishColor);
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.BearishMomentumBarColor(bearishColor);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Rejection ...
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.BullishRejectionBarColor(bullishColor);
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.BearishRejectionBarColor(bearishColor);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Support and Resistance ...
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.SupportZoneColor(bullishColor);
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.ResistanceZoneColor(bearishColor);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Demand and Supply ...
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.DemandZoneColor(bullishColor);
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.SupplyZoneColor(bearishColor);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Order Blocks ...
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.BullishOrderBlockColor(bullishColor);
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.BearishOrderBlockColor(bearishColor);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fair Value Gaps ...
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.BullishFVGColor(bullishColor);
|
||||||
|
mDecisionCycleHelper.mPOIDrawer.BearishFVGColor(bearishColor);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Analyse Cycle ...
|
// Analyse Cycle ...
|
||||||
mAnalyseCycleHelper = new XC121SMCCycleHelper();
|
mAnalyseCycleHelper = new XC121SMCCycleHelper();
|
||||||
|
|||||||
Reference in New Issue
Block a user