Cleanup Work Space after Backup 14040203 ...

This commit is contained in:
2025-04-23 05:10:12 +03:30
parent 5316d60869
commit f48d272bba
76 changed files with 0 additions and 81839 deletions
-236
View File
@@ -1,236 +0,0 @@
//
// HTF Proves ...
// //
// double scoreMultiplier = 1.5;
// //
// bool isConsolidationScoreBullish =
// provider.consolidationBullishScore > (provider.consolidationBearishScore * scoreMultiplier);
// //
// bool isConsolidationScoreBearish =
// provider.consolidationBearishScore > (provider.consolidationBullishScore * scoreMultiplier);
//
//
//
// //
// // Detect Kumo Trend ...
// bool isKumoBullish = provider.decisionXConditions.isSenkouSpanAOverB;
// bool isKumoBearish = provider.decisionXConditions.isSenkouSpanAUnderB;
// //
// // Detect Nearest Cross ...
// XOHCL tkCrossedBar;
// ENUM_X_DIRECTION tkCrossDir;
// bool hasNearestTenkanSenKijunSenCross =
// provider
// .decisionCycleHelper
// .DetectNearestTenKijCross(
// tkCrossedBar,
// tkCrossDir,
// zIndex //
// );
// //
// bool isNearestTenkensSenCrossedOverKijunSen =
// hasNearestTenkanSenKijunSenCross &&
// IsBullish(tkCrossDir);
// //
// bool isNearestTenkensSenCrossedUnderKijunSen =
// hasNearestTenkanSenKijunSenCross &&
// IsBearish(tkCrossDir);
// //
// // Detect Nearest Volume ...
// XOHCL vSwitchedBar;
// ENUM_X_DIRECTION vSwitchedDir;
// bool isVolumeSwitched =
// provider
// .decisionCycleHelper
// .DetectNearestVolumeSwitched(
// vSwitchedBar,
// vSwitchedDir,
// zIndex //
// );
// bool isVolumeBullish =
// isVolumeSwitched &&
// IsBullish(vSwitchedDir);
// bool isVolumeBearish =
// isVolumeSwitched &&
// IsBearish(vSwitchedDir);
// //
// // Detect Nearest Delta Crossed ...
// XOHCL deltaCrossedBar;
// ENUM_X_DIRECTION deltaCrossedDir;
// bool isDeltaCrossed =
// provider
// .decisionCycleHelper
// .DetectNearestDeltaSwitched(
// deltaCrossedBar,
// deltaCrossedDir,
// zIndex //
// );
// bool isDeltaBullish =
// isDeltaCrossed &&
// IsBullish(deltaCrossedDir);
// bool isDeltaBearish =
// isDeltaCrossed &&
// IsBearish(deltaCrossedDir);
// //
// // Detect Nearest Str Switched ...
// XOHCL strSwitchedBar;
// ENUM_X_DIRECTION strSwitchedDir;
// bool isStrSwitched =
// provider
// .decisionCycleHelper
// .DetectNearestStrSwitched(
// strSwitchedBar,
// strSwitchedDir,
// zIndex //
// );
// bool isStrBullish =
// isStrSwitched &&
// IsBullish(deltaCrossedDir);
// bool isStrBearish =
// isStrSwitched &&
// IsBearish(deltaCrossedDir);
// //
// // Detect Price in TK Zone ...
// bool isBarInsideTKZone =
// isNearestTenkensSenCrossedOverKijunSen
// ? cBar.low < provider.decisionXConditions.tenkanSenBuffer[cIndex]
// : isNearestTenkensSenCrossedUnderKijunSen
// ? cBar.high > provider.decisionXConditions.tenkanSenBuffer[cIndex]
// : false;
// //
// // Checking Bar Based on Positions State ...
// ENUM_X_DIRECTION iBarPosDir;
// bool isBarValidForDir = provider.decisionCycleHelper
// .mBarAnalyser
// .IsValidForPosition(
// cBar,
// iBarPosDir //
// );
// bool isBarValidForBullish =
// isBarValidForDir &&
// IsBullish(iBarPosDir);
// bool isBarValidForBearish =
// isBarValidForDir &&
// IsBearish(iBarPosDir);
//
// Summarize Conditions ...
//
isBullish =
//
false
// isStrBullish &&
// isKumoBullish &&
// isDeltaBullish &&
// isVolumeBullish &&
// isBarInsideTKZone &&
// isBarValidForBullish &&
// isConsolidationScoreBullish &&
// isNearestTenkensSenCrossedOverKijunSen
//
;
//
isBearish =
//
false
// isStrBearish &&
// isKumoBearish &&
// isDeltaBearish &&
// isVolumeBearish &&
// isBarInsideTKZone &&
// isBarValidForBearish &&
// isConsolidationScoreBearish &&
// isNearestTenkensSenCrossedUnderKijunSen
//
;
///////////////////////////////////////////////////////////////////////////////
//
iBox.to = TimeCurrent();
XCBoxObject *iObj;
has = helper.poiDrawer.DrawBox(
iBox,
iObj //
);
if (has)
{
//
iObj.BoxWidth(2);
//
color iCLR =
iBox.IsBullish()
? clrAqua
: clrMagenta;
iObj.BoxColor(iCLR);
iObj.BoxStyle(STYLE_SOLID);
}
//////////////////////////////////////////////////////////////////////////////////////
//
// COMPLEX ...
//
double iKTIRNDs[] = {
cKI,
cTKI,
cTrend //
};
//
double iKTIRNDMax = GetMax(iKTIRNDs);
double iKTIRNDMin = GetMin(iKTIRNDs);
//
// Conditions Preparing ...
//
bool isTKITRNDBullish =
cKIState > 0 &&
cTKIState > 0 &&
ctrendState > 0;
//
bool isTKITRNDBullishPrev =
pKIState > 0 &&
pTKIState > 0 &&
ptrendState > 0;
//
bool isTKITRNDBearish =
cKIState < 0 &&
cTKIState < 0 &&
ctrendState < 0;
//
bool isTKITRNDBearishPrev =
pKIState < 0 &&
pTKIState < 0 &&
ptrendState < 0;
//
bool isTKITRNDSwitchedToBullish =
isTKITRNDBullish &&
!isTKITRNDBullishPrev;
//
bool isTKITRNDSwitchedToBearish =
isTKITRNDBearish &&
!isTKITRNDBearishPrev;
File diff suppressed because it is too large Load Diff
-36
View File
@@ -1,36 +0,0 @@
// isLowsUnderValesGolden &&
// conditions.isStrSwitchedToBullish
//
// conditions.isStrBullish &&
// conditions.isRejectUpHSM // &&
//
// isStrBullishVPattern &&
// isSwingLowSameAsVale &&
// !conditions.isNewPeakUnderLast
//
// zBar.IsBullish() &&
// isSameStrBreakedUp &&
// isCBarValidForBullish &&
// conditions.isStrBullish &&
// conditions.isATROverLast &&
// conditions.isVidyaUnderLSM // &&
// zBar.close > conditions.strSMHighBuffer[cIDX]
//
// isHighsOverPeaksGolden &&
// conditions.isStrSwitchedToBearish
// conditions.isStrBearish &&
// conditions.isRejectDownLSM // &&
//
// isStrBearishVPattern &&
// isSwingHighSameAsPeak &&
// !conditions.isNewValeOverLast
//
// zBar.IsBearish() &&
// isSameStrBreakedDown &&
// isCBarValidForBearish &&
// conditions.isStrBearish &&
// conditions.isATRUnderLast &&
// conditions.isVidyaOverHSM // &&
// zBar.close < conditions.strSMLowBuffer[cIDX]
-959
View File
@@ -1,959 +0,0 @@
//
// Detect Signals Based On XPV Indicator Golden Zones ...
//
bool HasXPVConditions(
ENUM_X_CYCLES cycle,
XBoxZone &box,
ENUM_X_DIRECTION &dir,
X121SMCStrategySignalProviderData &provider,
int barIndex = 0 //
)
{
//
bool result = false;
//
box.Clean();
dir = X_DIRECTION_NONE;
//
// Fil Selected Data ...
XPOIState cState;
X121Conditions cXConditions;
XPOIStateEvents cStateEvents;
XC121SMCCycleHelper *cHelper;
X121SMCCycleConditions cConditions;
result = provider.SelectCycle(
cycle,
cState,
cStateEvents,
cXConditions,
cHelper,
cConditions //
);
if (!result)
{
//
cState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
cStateEvents.Clean();
//
return result;
}
//
// Normalize Args ...
//
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;
int ppIDX = pIDX + 1;
//
bool isBullish = false;
bool isBearish = false;
//
XOHCL zBar;
XOHCL cBar;
XOHCL pBar;
XOHCL pPBar;
//
// Initial Bars ...
result = zBar.Init(
cState.symbol,
cState.period,
barIndex //
);
result =
result &&
zBar.GetPreviousBar(cBar);
result =
result &&
cBar.GetPreviousBar(pBar);
result =
result &&
pBar.GetPreviousBar(pPBar);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
cState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
//
return result;
}
//
// Checking Conditions ...
//
// Retrieve Some Values ...
//
double peak = cXConditions.peaksBuffer[cIDX];
double peakZ = cXConditions.peaksBuffer[zIDX];
double peakP = cXConditions.peaksBuffer[pIDX];
double peakPP = cXConditions.peaksBuffer[ppIDX];
//
double vale = cXConditions.valesBuffer[cIDX];
double valeZ = cXConditions.valesBuffer[zIDX];
double valeP = cXConditions.valesBuffer[pIDX];
double valePP = cXConditions.valesBuffer[ppIDX];
//
double atrUpperSM = cXConditions.atrUpperSMBuffer[cIDX];
double atrLowerSM = cXConditions.atrLowerSMBuffer[cIDX];
//
double atrUpperSMZ = cXConditions.atrUpperSMBuffer[zIDX];
double atrLowerSMZ = cXConditions.atrLowerSMBuffer[zIDX];
//
double atrUpperSMP = cXConditions.atrUpperSMBuffer[pIDX];
double atrLowerSMP = cXConditions.atrLowerSMBuffer[pIDX];
//
double atrUpperSMPP = cXConditions.atrUpperSMBuffer[ppIDX];
double atrLowerSMPP = cXConditions.atrLowerSMBuffer[ppIDX];
//
double rsiChange = cXConditions.rsiChangeBuffer[cIDX];
double rsiChangeZ = cXConditions.rsiChangeBuffer[zIDX];
double rsiChangeP = cXConditions.rsiChangeBuffer[pIDX];
double rsiChangePP = cXConditions.rsiChangeBuffer[ppIDX];
//
double rsiChangeSM = cXConditions.rsiChangeSMBuffer[cIDX];
double rsiChangeSMZ = cXConditions.rsiChangeSMBuffer[zIDX];
double rsiChangeSMP = cXConditions.rsiChangeSMBuffer[pIDX];
double rsiChangeSMPP = cXConditions.rsiChangeSMBuffer[ppIDX];
//
double peaksGolden = cXConditions.peaksGoldenBuffer[cIDX];
double peaksGoldenZ = cXConditions.peaksGoldenBuffer[zIDX];
double peaksGoldenP = cXConditions.peaksGoldenBuffer[pIDX];
double peaksGoldenPP = cXConditions.peaksGoldenBuffer[ppIDX];
//
double valesGolden = cXConditions.valesGoldenBuffer[cIDX];
double valesGoldenZ = cXConditions.valesGoldenBuffer[zIDX];
double valesGoldenP = cXConditions.valesGoldenBuffer[pIDX];
double valesGoldenPP = cXConditions.valesGoldenBuffer[ppIDX];
//
double priceChange = cXConditions.priceChangeBuffer[cIDX];
double priceChangeZ = cXConditions.priceChangeBuffer[zIDX];
double priceChangeP = cXConditions.priceChangeBuffer[pIDX];
double priceChangePP = cXConditions.priceChangeBuffer[ppIDX];
//
double priceChangeSM = cXConditions.priceChangeSMBuffer[cIDX];
double priceChangeSMZ = cXConditions.priceChangeSMBuffer[zIDX];
double priceChangeSMP = cXConditions.priceChangeSMBuffer[pIDX];
double priceChangeSMPP = cXConditions.priceChangeSMBuffer[ppIDX];
//
//
//
//
bool isPSwingLow =
//
(pBar.low < pPBar.low &&
pBar.low < cBar.low &&
zBar.open > cBar.low)
//
;
//
bool isCSwingLow =
//
(pBar.low < pPBar.low &&
cBar.low < pBar.low &&
zBar.close > cBar.low)
//
;
//
bool isSwingLow =
//
isPSwingLow ||
isCSwingLow
//
;
//
bool isPSwingHigh =
//
pBar.high >= pPBar.high &&
pBar.high > cBar.high &&
zBar.open < cBar.high
//
;
//
bool isCSwingHigh =
//
(pBar.high >= pPBar.high &&
cBar.high > pBar.high &&
zBar.close < cBar.high)
//
;
//
bool isSwingHigh =
//
isPSwingHigh &&
isCSwingHigh
//
;
//
bool isBarsOverPeaksGoldenZone =
//
cBar.high > peaksGolden &&
pBar.high > peaksGoldenP
//
;
//
bool isBarsUnderValesGoldenZone =
//
cBar.low < valesGolden &&
pBar.low < valesGoldenP
//
;
//
bool isBarsOverAtrUpper =
//
cBar.high > atrUpperSM &&
pBar.high > atrUpperSMP
//
;
//
bool isBarsUnderAtrLower =
//
cBar.low < atrLowerSM &&
pBar.low < atrLowerSMP
//
;
//
bool isRsiChangeOverAtrUpper =
rsiChangeP > atrUpperSMP;
//
bool isRsiChangeUnderAtrLower =
rsiChangeP < atrLowerSMP;
//
bool isRsiChangeOverPeaksGoldenZone =
rsiChangeP > peaksGoldenP;
//
bool isRsiChangeUnderValesGoldenZone =
rsiChangeP < valesGoldenP;
//
bool isPriceChangeOverAtrUpper =
priceChangeP > atrUpperSMP;
//
bool isPriceChangeUnderAtrLower =
priceChangeP < atrLowerSMP;
//
bool isPriceChangeOverPeaksGoldenZone =
priceChangeP > peaksGoldenP;
//
bool isPriceChangeUnderValesGoldenZone =
priceChangeP < valesGoldenP;
//
// XPV Peaks or Vales ...
//
bool isCBarEqualsToPeak = cBar.high == peak;
bool isCBarEqualsToVale = cBar.low == vale;
//
bool isPBarEqualsToPeak = pBar.high == peakP;
bool isPBarEqualsToVale = pBar.low == valeP;
//
bool isPPBarEqualsToPeak = pPBar.high == peakPP;
bool isPPBarEqualsToVale = pPBar.low == valePP;
//
bool isBarsEqualsToPeak = isCBarEqualsToPeak ||
isPBarEqualsToPeak ||
isPPBarEqualsToPeak;
bool isBarsEqualsToVale = isCBarEqualsToVale ||
isPBarEqualsToVale ||
isPPBarEqualsToVale;
//
// Detect VPatterns ...
//
bool isRsiChangeBullishVPattern =
//
rsiChangeP < rsiChangePP &&
rsiChangeP < rsiChange &&
rsiChangeP < rsiChangeZ
//
;
//
bool isRsiChangeBearishVPattern =
//
rsiChangeP > rsiChangePP &&
rsiChangeP > rsiChange &&
rsiChangeP > rsiChangeZ
//
;
//
bool isRsiChangeBullish =
//
(isRsiChangeUnderAtrLower &&
isRsiChangeBullishVPattern &&
isRsiChangeUnderValesGoldenZone)
//
;
bool isRsiChangeBearish =
//
(isRsiChangeOverAtrUpper &&
isRsiChangeBearishVPattern &&
isRsiChangeOverPeaksGoldenZone)
//
;
//
bool isPriceChangeBullishVPattern =
//
priceChangeP < priceChangePP &&
priceChangeP < priceChange &&
priceChangeP < priceChangeZ
//
;
//
bool isPriceChangeBearishVPattern =
//
priceChangeP > priceChangePP &&
priceChangeP > priceChange &&
priceChangeP > priceChangeZ
//
;
//
bool isPriceChangeBullish =
//
(isPriceChangeUnderAtrLower &&
isPriceChangeBullishVPattern &&
isPriceChangeUnderValesGoldenZone)
//
;
//
bool isPriceChangeBearish =
//
(isPriceChangeOverAtrUpper &&
isPriceChangeBearishVPattern &&
isPriceChangeOverPeaksGoldenZone)
//
;
//
// XVWAP ...
//
bool isVWapIsBullish =
//
(cXConditions.isVWapBullishOrdered &&
cXConditions.isVWapSwitchedToBullishState)
//
||
//
(cXConditions.isVWapBullishState &&
cXConditions.isVWapSwitchedToBullishOrdered)
//
;
//
bool isVWapIsBearish =
//
(cXConditions.isVWapBearishOrdered &&
cXConditions.isVWapSwitchedToBearishState)
//
||
//
(cXConditions.isVWapBearishState &&
cXConditions.isVWapSwitchedToBearishOrdered)
//
;
//
// Checking Bar States ...
//
ENUM_X_DIRECTION cBarPosDir;
bool isCBarValidForPosition =
cHelper
.mBarAnalyser
.IsValidForPosition(
cBar,
cBarPosDir //
);
//
ENUM_X_DIRECTION pBarPosDir;
bool isPBarValidForPosition =
cHelper
.mBarAnalyser
.IsValidForPosition(
pBar,
pBarPosDir //
);
//
bool isBarValidForBullish =
//
(isCBarValidForPosition &&
IsBullish(cBarPosDir))
//
&&
//
(isPBarValidForPosition &&
IsBullish(pBarPosDir))
//
;
//
bool isBarValidForBearish =
//
(isCBarValidForPosition &&
IsBearish(cBarPosDir))
//
&&
//
(isPBarValidForPosition &&
IsBearish(pBarPosDir))
//
;
//
// Summarize Conditions ...
//
isBullish =
//
// isVWapIsBullish &&
// isBarsEqualsToVale &&
// isBarValidForBullish &&
isSwingLow &&
isBarsUnderAtrLower &&
isRsiChangeBullish &&
isPriceChangeBullish &&
isBarsUnderValesGoldenZone
//
;
//
isBearish =
//
// isVWapIsBearish &&
// isBarsEqualsToPeak &&
// isBarValidForBearish &&
isSwingHigh &&
isBarsOverAtrUpper &&
isRsiChangeBearish &&
isPriceChangeBearish &&
isBarsOverPeaksGoldenZone
//
;
//
// Filling Requirements ...
result =
isBullish ||
isBearish;
if (result)
{
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
box.dir = dir;
box.from = pPBar.time;
box.to = TimeCurrent();
box.symbol = cBar.symbol;
box.period = cBar.period;
//
double points = GetPoints(box.symbol);
//
// Usually is Preffered SL ...
double pivot = 0;
//
// Usually is Current Price or Entry Price ...
double point = GetEntry(
cBar.symbol,
dir //
);
//
box.upper =
isBullish
? point
: pivot;
//
box.lower =
isBullish
? pivot
: point;
//
XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer;
bool drawBoxes = true;
if (drawBoxes)
{
//
if (box.IsValid())
{
//
XCBoxObject *iObj;
bool isCreated = drawer.DrawBox(
box,
iObj //
);
//
if (isCreated)
{
//
// TODO: ...
}
}
}
}
//
// Check All Conditions ...
result =
box.IsValid() &&
HasDirection(dir) &&
(isBullish ||
isBearish);
//
// Cleanup Resources ...
zBar.Clean();
cBar.Clean();
pBar.Clean();
pPBar.Clean();
cState.Clean();
cConditions.Clean();
cConditions.Clean();
ZeroMemory(cHelper);
cStateEvents.Clean();
cXConditions.Clean();
//
return result;
}
//
bool HasXSTRConditions(
ENUM_X_CYCLES cycle,
XBoxZone &box,
ENUM_X_DIRECTION &dir,
X121SMCStrategySignalProviderData &provider,
int barIndex = 0 //
)
{
//
bool result = false;
//
box.Clean();
dir = X_DIRECTION_NONE;
//
// Fil Selected Data ...
XPOIState cState;
X121Conditions cXConditions;
XPOIStateEvents cStateEvents;
XC121SMCCycleHelper *cHelper;
X121SMCCycleConditions cConditions;
result = provider.SelectCycle(
cycle,
cState,
cStateEvents,
cXConditions,
cHelper,
cConditions //
);
if (!result)
{
//
cState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
cStateEvents.Clean();
//
return result;
}
//
// Normalize Args ...
//
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;
int ppIDX = pIDX + 1;
//
bool isBullish = false;
bool isBearish = false;
//
XOHCL zBar;
XOHCL cBar;
XOHCL pBar;
XOHCL pPBar;
//
// Initial Bars ...
result = zBar.Init(
cState.symbol,
cState.period,
barIndex //
);
result =
result &&
zBar.GetPreviousBar(cBar);
result =
result &&
cBar.GetPreviousBar(pBar);
result =
result &&
pBar.GetPreviousBar(pPBar);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
cState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
//
return result;
}
//
// Checking Conditions ...
//
// XSTR ...
bool isStrIsBullish =
(cXConditions.isStrBullish ||
cXConditions.isStrSwitchedToBullish);
bool isStrIsBearish =
(cXConditions.isStrBearish ||
cXConditions.isStrSwitchedToBearish);
//
// Detecting Str Box ...
XBoxZone strBox;
bool hasStrBox = false;
if (!hasStrBox)
{
//
hasStrBox =
cXConditions.isStrBullish ||
cXConditions.isStrBearish;
if (hasStrBox)
{
//
ENUM_X_DIRECTION strDir =
cXConditions.isStrBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
XOHCL lastBar;
ENUM_X_DIRECTION lastDir;
bool hasLast =
cHelper
.DetectNearestStrSwitched(
lastBar,
lastDir,
zIDX //
);
//
XOHCL prevBar;
ENUM_X_DIRECTION prevDir;
bool hasPrev =
hasLast &&
cHelper
.DetectNearestStrSwitched(
prevBar,
prevDir,
lastBar.Index() + 1 //
);
//
hasStrBox =
hasLast &&
hasPrev;
if (hasStrBox)
{
//
int fromIDX = MathMax(
lastBar.Index(),
prevBar.Index() //
);
//
string symbol = cBar.symbol;
ENUM_TIMEFRAMES period = cBar.period;
//
datetime from = GetBarTime(
symbol,
period,
fromIDX //
);
//
int length = fromIDX - barIndex;
//
double upper = zBar.FindHighest(
length,
MODE_HIGH //
);
//
double lower = zBar.FindLowest(
length,
MODE_LOW //
);
//
strBox.from = from;
strBox.dir = strDir;
strBox.lower = lower;
strBox.upper = upper;
strBox.symbol = symbol;
strBox.period = period;
strBox.type = "XSTRBox";
strBox.to = TimeCurrent();
//
hasStrBox = strBox.IsValid();
}
//
lastBar.Clean();
prevBar.Clean();
}
}
//
// XFastMa ...
//
bool isFastMaOverStr =
(cXConditions.x3maFastBuffer[cIDX] > cXConditions.strBuffer[cIDX]);
//
bool isFastMaUnderStr =
(cXConditions.x3maFastBuffer[cIDX] < cXConditions.strBuffer[cIDX]);
//
bool isFastMaBullishReject =
cBar.low < pBar.low &&
cBar.low > cXConditions.strBuffer[cIDX] &&
cBar.low < cXConditions.x3maFastBuffer[cIDX] &&
cBar.GetDown() > cXConditions.x3maFastBuffer[cIDX];
//
bool isFastMaBearishReject =
cBar.high > pBar.high &&
cBar.high < cXConditions.strBuffer[cIDX] &&
cBar.high > cXConditions.x3maFastBuffer[cIDX] &&
cBar.GetUp() < cXConditions.x3maFastBuffer[cIDX];
//
// Summarize Conditions ...
//
isBullish =
//
// false
hasStrBox &&
isStrIsBullish &&
isFastMaOverStr &&
isFastMaBullishReject
//
//
;
//
isBearish =
//
// false
hasStrBox &&
isStrIsBearish &&
isFastMaUnderStr &&
isFastMaBearishReject
//
;
//
// Filling Requirements ...
result =
isBullish ||
isBearish;
if (result)
{
//
XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer;
XCBoxObject *iObj;
bool isCreated = drawer.DrawBox(
strBox,
iObj //
);
if (isCreated)
{
//
Print("STRBox");
}
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
box.dir = dir;
box.from = pPBar.time;
box.to = TimeCurrent();
box.symbol = cBar.symbol;
box.period = cBar.period;
//
double points = GetPoints(box.symbol);
//
double pivot = cXConditions.strBuffer[cIDX];
// isBullish
// ? cBar.low - (points * 5)
// : cBar.high + (points * 5);
//
double point = GetEntry(
cBar.symbol,
dir //
);
//
box.upper =
isBullish
? point
: pivot;
//
box.lower =
isBullish
? pivot
: point;
//
bool drawBoxes = true;
if (drawBoxes)
{
//
}
}
//
// Check All Conditions ...
result =
box.IsValid() &&
HasDirection(dir) &&
(isBullish ||
isBearish);
//
// Cleanup Resources ...
zBar.Clean();
cBar.Clean();
pBar.Clean();
pPBar.Clean();
cState.Clean();
strBox.Clean();
cConditions.Clean();
cConditions.Clean();
ZeroMemory(cHelper);
cStateEvents.Clean();
cXConditions.Clean();
//
return result;
}
-128
View File
@@ -1,128 +0,0 @@
#property copyright "Your Name"
#property link "https://www.example.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
// Input parameters
input int SwingPeriod = 5; // Lookback period for swing detection
// Global variables
double LastSwingHigh = 0, LastSwingLow = 0;
bool IsBullish = false;
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
// Start from the latest bar
for(int i = rates_total - prev_calculated - 1; i >= 0; i--)
{
// Detect swing high and low
if(IsSwingHigh(high, low, i, SwingPeriod))
{
LastSwingHigh = high[i];
CheckStructure(i, high[i], low[i], time[i]);
}
if(IsSwingLow(high, low, i, SwingPeriod))
{
LastSwingLow = low[i];
CheckStructure(i, high[i], low[i], time[i]);
}
}
return(rates_total);
}
//+------------------------------------------------------------------+
bool IsSwingHigh(const double &high[], const double &low[], int index, int period)
{
if(index < period || index >= ArraySize(high) - period) return false;
for(int i = 1; i <= period; i++)
{
if(high[index] <= high[index - i] || high[index] <= high[index + i])
return false;
}
return true;
}
//+------------------------------------------------------------------+
bool IsSwingLow(const double &high[], const double &low[], int index, int period)
{
if(index < period || index >= ArraySize(low) - period) return false;
for(int i = 1; i <= period; i++)
{
if(low[index] >= low[index - i] || low[index] >= low[index + i])
return false;
}
return true;
}
//+------------------------------------------------------------------+
void CheckStructure(int index, double high, double low, datetime time)
{
// Determine trend direction
if(LastSwingHigh > 0 && LastSwingLow > 0)
{
IsBullish = (LastSwingHigh > LastSwingLow);
// Check for BOS
if(IsBullish && high > LastSwingHigh)
{
LastSwingHigh = high;
ObjectCreate(0, "BOS_" + TimeToString(time), OBJ_TEXT, 0, time, high);
ObjectSetString(0, "BOS_" + TimeToString(time), OBJPROP_TEXT, "BOS");
ObjectSetInteger(0, "BOS_" + TimeToString(time), OBJPROP_COLOR, clrGreen);
Alert("Break of Structure (BOS) detected at " + DoubleToString(high, 5));
}
else if(!IsBullish && low < LastSwingLow)
{
LastSwingLow = low;
ObjectCreate(0, "BOS_" + TimeToString(time), OBJ_TEXT, 0, time, low);
ObjectSetString(0, "BOS_" + TimeToString(time), OBJPROP_TEXT, "BOS");
ObjectSetInteger(0, "BOS_" + TimeToString(time), OBJPROP_COLOR, clrRed);
Alert("Break of Structure (BOS) detected at " + DoubleToString(low, 5));
}
// Check for CHoCH
if(IsBullish && low < LastSwingLow)
{
LastSwingLow = low;
ObjectCreate(0, "CHoCH_" + TimeToString(time), OBJ_TEXT, 0, time, low);
ObjectSetString(0, "CHoCH_" + TimeToString(time), OBJPROP_TEXT, "CHoCH");
ObjectSetInteger(0, "CHoCH_" + TimeToString(time), OBJPROP_COLOR, clrRed);
Alert("Change of Character (CHoCH) detected at " + DoubleToString(low, 5));
IsBullish = false; // Trend may reverse
}
else if(!IsBullish && high > LastSwingHigh)
{
LastSwingHigh = high;
ObjectCreate(0, "CHoCH_" + TimeToString(time), OBJ_TEXT, 0, time, high);
ObjectSetString(0, "CHoCH_" + TimeToString(time), OBJPROP_TEXT, "CHoCH");
ObjectSetInteger(0, "CHoCH_" + TimeToString(time), OBJPROP_COLOR, clrGreen);
Alert("Change of Character (CHoCH) detected at " + DoubleToString(high, 5));
IsBullish = true; // Trend may reverse
}
}
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectsDeleteAll(0, "BOS_");
ObjectsDeleteAll(0, "CHoCH_");
}
@@ -1,888 +0,0 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Indicator
// -------------------------------------------------
// Name: X121 XSMC
// Description: XSMC ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm X121 XSMC Indicator"
#property strict
//
// Definitions ...
//
#define ShortName "X121 XSMC"
//
// Includes Common Library ...
#include "../Libraries/x-saherelm.common.lib.mq5"
//
// Inputs ...
//
// Market ...
input group "Market";
input int swingLength = 5; // Swing Length
//
input group "Presentation";
//
input int startCalculationForLastBars = 1000; // Calculate Last n Bars
input int trendArrowCode = 117; // Trend Arrow
input int swingLowsArrowCode = 159; // Swing Lows Arrow
input int swingHighsArrowCode = 159; // Swing Highs Arrow
input int swingLowBOSArrowCode = 233; // Swing Low BOS Arrow
input int swingHighBOSArrowCode = 234; // Swing High BOS Arrow
input int swingLowCHOCHArrowCode = 225; // Swing Low CHOCH Arrow
input int swingHighCHOCHArrowCode = 226; // Swing High CHOCH Arrow
//
input bool showTrend = true; // Show Trend
input bool showSwingLows = true; // Show Swing Lows
input bool showSwingHighs = true; // Show Swing Highs
input bool showSwingLowBOS = true; // Show Swing Low BOS
input bool showSwingHighBOS = true; // Show Swing High BOS
input bool showSwingLowCHOCH = true; // Show Swing Low CHOCH
input bool showSwingHighCHOCH = true; // Show Swing High CHOCH
//
// Buffers ...
//
#define hideColorIDX 0
#define bullishColorIDX 1
#define bearishColorIDX 2
#define neuturalColorIDX 3
//
#define emptyValue 0.0
//
#property indicator_chart_window
//
#property indicator_buffers 9
#property indicator_plots 7
//
// Plot Buffers ...
//
// Swing Lows ...
//
#define swingLowsBufferIndex 0
double swingLowsBuffer[];
//
#property indicator_label1 "X121 SWL"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrAqua
#property indicator_width1 1
//
// Swng Highs ...
//
#define swingHighsBufferIndex 1
double swingHighsBuffer[];
//
#property indicator_label2 "X121 SWH"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrMagenta
#property indicator_width2 1
//
// Swing Low BOS ...
#define swingLowsBOSBufferIndex 2
double swingLowsBOSBuffer[];
//
#property indicator_label3 "X121 SWLBOS"
#property indicator_type3 DRAW_ARROW
#property indicator_color3 clrAqua
#property indicator_width3 3
//
// Swing High BOS ...
#define swingHighsBOSBufferIndex 3
double swingHighsBOSBuffer[];
//
#property indicator_label4 "X121 SWHBOS"
#property indicator_type4 DRAW_ARROW
#property indicator_color4 clrMagenta
#property indicator_width4 3
//
// Swing Low CHOCH ...
#define swingLowsCHOCHBufferIndex 4
double swingLowsCHOCHBuffer[];
//
#property indicator_label5 "X121 SWLCHOCH"
#property indicator_type5 DRAW_ARROW
#property indicator_color5 clrYellow
#property indicator_width5 3
//
// Swing High CHOCH ...
#define swingHighsCHOCHBufferIndex 5
double swingHighsCHOCHBuffer[];
//
#property indicator_label6 "X121 SWHCHOCH"
#property indicator_type6 DRAW_ARROW
#property indicator_color6 clrYellow
#property indicator_width6 3
//
// Trend ...
#define trendBufferIndex 6
double trendBuffer[];
#define trendColorBufferIndex 7
double trendColorBuffer[];
//
#property indicator_label7 "X121 TRND"
#property indicator_type7 DRAW_COLOR_ARROW
#property indicator_color7 CLR_NONE, clrAqua, clrMagenta, clrGray
#property indicator_width7 3
//
// Data Buffers ...
//
int mLastBufferIndex = 7;
//
// Trend State ...
#define trendStateBufferIndex mLastBufferIndex + 1
double trendStateBuffer[];
//
// Variables, Properties and etc ...
//
// this counts Available Bars ...
int limit;
//
int maxLength;
//
double lastSwing = 0.0;
ENUM_X_DIRECTION lastSwingDir = X_DIRECTION_NONE;
//
// Event Handlers ...
/**
* Initialize Indicator ...
*
* @return ( int )
*/
int OnInit()
{
//
// Validate Inputs ...
if (!ValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
// Initialize Indicator Handlers ...
//
// because in some cases we may have more than one input for
// calculation and we must prevent any calculation
// untill we pass the biggest input length, here we get max Input length
// and then wait until pass it ...
maxLength = ExtractMaxLengthOfInputs();
//
// Define Index Buffers ...
DefineBuffers();
//
// Set Indicator ShortName ...
SetIndicatorName();
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
/**
* De Initialize Indicator ...
*
* @param reason: Integer, De Initialization Reason ...
*/
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
}
/**
* Calculate Bars ...
*
* @param rates_total: Integer, Total Bars on Chart ...
* @param prev_calculated: Integer, Total Calculated Bars on Charts ...
* @param time: DateTime Array, History of Open Time ...
* @param open: Double Array, History of Open Prices ...
* @param high: Double Array, History of High Prices ...
* @param low: Double Array, History of Low Prices ...
* @param close: Double Array, History of Close Prices ...
* @param tick_volume: Long, History of Tick Volumes on Bar ...
* @param volume: Long, History of Trade Volumes ...
* @param spread: Double, History of Spread Price ...
*
* @return ( int )
*/
int OnCalculate(
const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[] //
)
{
//
// Prepare Buffers ...
ArraySetAsSeries(time, true);
ArraySetAsSeries(open, true);
ArraySetAsSeries(high, true);
ArraySetAsSeries(low, true);
ArraySetAsSeries(close, true);
ArraySetAsSeries(tick_volume, true);
ArraySetAsSeries(volume, true);
ArraySetAsSeries(spread, true);
//
limit = (prev_calculated > rates_total || prev_calculated <= 0)
? rates_total
: (rates_total - prev_calculated) + 1;
//
// Main Loop ...
for (int i = limit - 1; i >= 0 && !IsStopped(); i--)
{
//
CalculateBuffers(
i,
prev_calculated,
rates_total,
//
open,
high,
close,
low,
tick_volume //
);
}
//
return rates_total;
}
//
// Functions ...
/**
* Validate Input Args for Initialization ...
*
* @return ( bool )
*/
bool ValidateInputs()
{
//
bool result =
//
swingLength > 0
//
;
//
return result;
}
/**
* Extract Max Length of Inputs ...
*
* @return ( int )
*/
int ExtractMaxLengthOfInputs()
{
//
int result = 0;
//
result = swingLength;
//
return result;
}
/**
* Define Required Buffers ...
*/
void DefineBuffers()
{
//
// Plot Buffers ...
//
// Swing Lows ...
//
ENUM_DRAW_TYPE swingLowsDrawType = showSwingLows ? DRAW_ARROW : DRAW_NONE;
//
ArraySetAsSeries(swingLowsBuffer, true);
SetIndexBuffer(swingLowsBufferIndex, swingLowsBuffer, INDICATOR_DATA);
//
PlotIndexSetInteger(swingLowsBufferIndex, PLOT_SHOW_DATA, showSwingLows);
PlotIndexSetInteger(swingLowsBufferIndex, PLOT_DRAW_TYPE, swingLowsDrawType);
//
PlotIndexSetDouble(swingLowsBufferIndex, PLOT_EMPTY_VALUE, emptyValue);
PlotIndexSetInteger(swingLowsBufferIndex, PLOT_ARROW, swingLowsArrowCode);
//
// Swing Highs ...
//
ENUM_DRAW_TYPE swingHighsDrawType = showSwingHighs ? DRAW_ARROW : DRAW_NONE;
//
ArraySetAsSeries(swingHighsBuffer, true);
SetIndexBuffer(swingHighsBufferIndex, swingHighsBuffer, INDICATOR_DATA);
//
PlotIndexSetInteger(swingHighsBufferIndex, PLOT_SHOW_DATA, showSwingHighs);
PlotIndexSetInteger(swingHighsBufferIndex, PLOT_DRAW_TYPE, swingHighsDrawType);
//
PlotIndexSetDouble(swingHighsBufferIndex, PLOT_EMPTY_VALUE, emptyValue);
PlotIndexSetInteger(swingHighsBufferIndex, PLOT_ARROW, swingHighsArrowCode);
//
// Trends ...
//
ENUM_DRAW_TYPE trendDrawType = showTrend ? DRAW_COLOR_ARROW : DRAW_NONE;
//
ArraySetAsSeries(trendBuffer, true);
SetIndexBuffer(trendBufferIndex, trendBuffer, INDICATOR_DATA);
//
PlotIndexSetInteger(trendBufferIndex, PLOT_SHOW_DATA, showTrend);
PlotIndexSetInteger(trendBufferIndex, PLOT_DRAW_TYPE, trendDrawType);
//
PlotIndexSetDouble(trendBufferIndex, PLOT_EMPTY_VALUE, emptyValue);
PlotIndexSetInteger(trendBufferIndex, PLOT_ARROW, trendArrowCode);
//
ArraySetAsSeries(trendColorBuffer, true);
SetIndexBuffer(trendColorBufferIndex, trendColorBuffer, INDICATOR_COLOR_INDEX);
//
// SWLBOS ...
//
ENUM_DRAW_TYPE swingLowBOSDrawType = showSwingLowBOS ? DRAW_ARROW : DRAW_NONE;
//
ArraySetAsSeries(swingLowsBOSBuffer, true);
SetIndexBuffer(swingLowsBOSBufferIndex, swingLowsBOSBuffer, INDICATOR_DATA);
//
PlotIndexSetInteger(swingLowsBOSBufferIndex, PLOT_SHOW_DATA, showSwingLowBOS);
PlotIndexSetInteger(swingLowsBOSBufferIndex, PLOT_DRAW_TYPE, swingLowBOSDrawType);
//
PlotIndexSetDouble(swingLowsBOSBufferIndex, PLOT_EMPTY_VALUE, emptyValue);
PlotIndexSetInteger(swingLowsBOSBufferIndex, PLOT_ARROW, swingLowBOSArrowCode);
//
// SWHBOS ...
//
ENUM_DRAW_TYPE swingHighBOSDrawType = showSwingHighBOS ? DRAW_ARROW : DRAW_NONE;
//
ArraySetAsSeries(swingHighsBOSBuffer, true);
SetIndexBuffer(swingHighsBOSBufferIndex, swingHighsBOSBuffer, INDICATOR_DATA);
//
PlotIndexSetInteger(swingHighsBOSBufferIndex, PLOT_SHOW_DATA, showSwingHighBOS);
PlotIndexSetInteger(swingHighsBOSBufferIndex, PLOT_DRAW_TYPE, swingHighBOSDrawType);
//
PlotIndexSetDouble(swingHighsBOSBufferIndex, PLOT_EMPTY_VALUE, emptyValue);
PlotIndexSetInteger(swingHighsBOSBufferIndex, PLOT_ARROW, swingHighBOSArrowCode);
//
// SWLCHOCH ...
//
ENUM_DRAW_TYPE swingLowCHOCHDrawType = showSwingLowCHOCH ? DRAW_ARROW : DRAW_NONE;
//
ArraySetAsSeries(swingLowsCHOCHBuffer, true);
SetIndexBuffer(swingLowsCHOCHBufferIndex, swingLowsCHOCHBuffer, INDICATOR_DATA);
//
PlotIndexSetInteger(swingLowsCHOCHBufferIndex, PLOT_SHOW_DATA, showSwingLowCHOCH);
PlotIndexSetInteger(swingLowsCHOCHBufferIndex, PLOT_DRAW_TYPE, swingLowCHOCHDrawType);
//
PlotIndexSetDouble(swingLowsCHOCHBufferIndex, PLOT_EMPTY_VALUE, emptyValue);
PlotIndexSetInteger(swingLowsCHOCHBufferIndex, PLOT_ARROW, swingLowCHOCHArrowCode);
//
// SWHCHOCH ...
//
ENUM_DRAW_TYPE swingHighCHOCHDrawType = showSwingHighCHOCH ? DRAW_ARROW : DRAW_NONE;
//
ArraySetAsSeries(swingHighsCHOCHBuffer, true);
SetIndexBuffer(swingHighsCHOCHBufferIndex, swingHighsCHOCHBuffer, INDICATOR_DATA);
//
PlotIndexSetInteger(swingHighsCHOCHBufferIndex, PLOT_SHOW_DATA, showSwingHighCHOCH);
PlotIndexSetInteger(swingHighsCHOCHBufferIndex, PLOT_DRAW_TYPE, swingHighCHOCHDrawType);
//
PlotIndexSetDouble(swingHighsCHOCHBufferIndex, PLOT_EMPTY_VALUE, emptyValue);
PlotIndexSetInteger(swingHighsCHOCHBufferIndex, PLOT_ARROW, swingHighCHOCHArrowCode);
//
// Data Buffers ...
//
ArraySetAsSeries(trendStateBuffer, true);
SetIndexBuffer(trendStateBufferIndex, trendStateBuffer, INDICATOR_CALCULATIONS);
}
/**
* Set Indicator Short Name and also we can define Buffers Labels ...
*/
void SetIndicatorName()
{
//
IndicatorSetString(INDICATOR_SHORTNAME, ShortName);
IndicatorSetInteger(INDICATOR_DIGITS, 2);
}
/**
* Calculate Custom Buffers ...
*
* @param bar_index: Integer, Represent Current Bar ...
* @param prevCalculated: Integer, Represent Previous Calculated Bars ...
* @param ratesTotal: Integer, Represents All Available Bars ...
* @param open: Double Array, History of Open Prices ...
* @param high: Double Array, History of High Prices ...
* @param close: Double Array, History of Close Prices ...
* @param low: Double Array, History of Low Prices ...
* @param tickVolume: Long, History of Tick Volumes on Bar ...
*/
void CalculateBuffers(
int bar_index, // Selected Bar Index
const int prevCalculated,
const int ratesTotal,
const double &open[],
const double &high[],
const double &close[],
const double &low[],
const long &tickVolume[] //
)
{
//
int barsLimit = startCalculationForLastBars > 0
? startCalculationForLastBars
: 0;
//
// bool canCalculate = true;
bool canCalculate =
barsLimit == 0 ||
bar_index <= barsLimit;
if (canCalculate)
{
//
CalculateValues(
bar_index,
prevCalculated,
ratesTotal,
open,
high,
close,
low //
);
}
else
{
FillBuffersZero(bar_index);
}
}
//
// Custom ...
/**
* Fill All Bufers to Zero Vlue for Specified Bar Index ...
*
* @param barIndex: Integer ...
*/
void FillBuffersZero(int barIndex)
{
//
trendBuffer[barIndex] = emptyValue;
swingLowsBuffer[barIndex] = emptyValue;
swingHighsBuffer[barIndex] = emptyValue;
swingLowsBOSBuffer[barIndex] = emptyValue;
swingHighsBOSBuffer[barIndex] = emptyValue;
swingLowsCHOCHBuffer[barIndex] = emptyValue;
swingHighsCHOCHBuffer[barIndex] = emptyValue;
//
trendColorBuffer[barIndex] = hideColorIDX;
trendStateBuffer[barIndex] = (double)((int)X_DIRECTION_NONE);
}
/**
* Calculate Values ...
*
* @param bar_index: Integer, Represent Current Bar ...
* @param prevCalculated: Integer, Represent Previous Calculated Bars ...
* @param ratesTotal: Integer, Represents All Available Bars ...
* @param open: Double Array, History of Open Prices ...
* @param high: Double Array, History of High Prices ...
* @param close: Double Array, History of Close Prices ...
* @param low: Double Array, History of Low Prices ...
*/
void CalculateValues(
int bar_index, // Selected Bar Index
const int prevCalculated,
const int ratesTotal,
const double &open[],
const double &high[],
const double &close[],
const double &low[] //
)
{
//
int lastBarIndex = bar_index + 1;
bool isFirstBar =
startCalculationForLastBars > 0
? bar_index == startCalculationForLastBars
: bar_index == ratesTotal;
//
double iLow = low[bar_index];
double iHigh = high[bar_index];
//
// Swing Low ...
double lastSwingLow = isFirstBar
? emptyValue
: swingLowsBuffer[lastBarIndex];
bool isSwingLow = IsSwingLow(high, low, bar_index, swingLength);
double iSwingLow =
!isSwingLow
? lastSwingLow
: iLow;
swingLowsBuffer[bar_index] = iSwingLow;
//
// Swing High ...
double lastSwingHigh = isFirstBar
? emptyValue
: swingHighsBuffer[lastBarIndex];
bool isSwingHigh = IsSwingHigh(high, low, bar_index, swingLength);
double iSwingHigh =
!isSwingHigh
? lastSwingHigh
: iHigh;
swingHighsBuffer[bar_index] = iSwingHigh;
//
// Detect Last Swing/Last Swing Direction ...
bool isSwing = isSwingLow ||
isSwingHigh;
if (isSwing)
{
//
if (isSwingLow)
{
//
lastSwing = iSwingLow;
lastSwingDir = X_DIRECTION_BULLISH;
}
else if (isSwingHigh)
{
//
lastSwing = iSwingHigh;
lastSwingDir = X_DIRECTION_BEARISH;
}
}
//
// Detect Trend ...
//
// Detecting Trend Direction ...
ENUM_X_DIRECTION lastTendDir =
isFirstBar
? X_DIRECTION_NONE
: (ENUM_X_DIRECTION)((int)trendStateBuffer[lastBarIndex]);
ENUM_X_DIRECTION iTrendDir =
isSwingLow &&
iSwingLow > lastSwingLow
? X_DIRECTION_BULLISH
: isSwingHigh &&
iSwingHigh < lastSwingHigh
? X_DIRECTION_BEARISH
: lastTendDir;
bool isTrendChanged =
HasDirection(lastTendDir) &&
HasDirection(iTrendDir) &&
lastTendDir != iTrendDir;
//
// Detecting Trend State ...
double iTrendState = (int)iTrendDir;
trendStateBuffer[bar_index] = iTrendState;
//
// Detecting Trend Value ...
double lastTrendValue =
isFirstBar
? emptyValue
: trendBuffer[lastBarIndex];
double iTrendValue =
IsBullish(iTrendDir)
? isTrendChanged
? iLow
: lastTrendValue
: IsBearish(iTrendDir)
? isTrendChanged
? iHigh
: lastTrendValue
: lastTrendValue;
trendBuffer[bar_index] = iTrendValue;
//
// Detecting Trend Color ...
double iTrendColorValue =
IsBullish(iTrendDir)
? bullishColorIDX
: IsBearish(iTrendDir)
? bearishColorIDX
: hideColorIDX;
bool isTrendBreaked = false;
if (IsBullish(iTrendDir))
{
//
isTrendBreaked = iHigh < lastTrendValue;
if (isTrendBreaked)
{
iTrendColorValue = bearishColorIDX;
}
}
else if (IsBearish(iTrendDir))
{
//
isTrendBreaked = iLow > lastTrendValue;
if (isTrendBreaked)
{
iTrendColorValue = bullishColorIDX;
}
}
trendColorBuffer[bar_index] = iTrendColorValue;
//
bool isTrendBullish = iTrendColorValue == bullishColorIDX;
bool isTrendBearish = iTrendColorValue == bearishColorIDX;
//
// Detecting BOS ...
//
// Swing Low BOS ...
double lastSwingLowBOSValue =
isFirstBar
? emptyValue
: swingLowsBOSBuffer[lastBarIndex];
double iSwingLowBOSValue =
isTrendBullish &&
iHigh > lastSwing
? iLow
: emptyValue;
bool isSwingLowBOSBreaked =
iSwingLowBOSValue != emptyValue &&
iLow < iSwingLowBOSValue;
if (isSwingLowBOSBreaked)
{
iSwingLowBOSValue = emptyValue;
}
swingLowsBOSBuffer[bar_index] = iSwingLowBOSValue;
//
// Swing High BOS ...
double lastSwingHighBOSValue =
isFirstBar
? emptyValue
: swingHighsBOSBuffer[lastBarIndex];
double iSwingHighBOSValue =
isTrendBearish &&
iLow < lastSwing
? iHigh
: emptyValue;
bool isSwingHighBOSBreaked =
iSwingHighBOSValue != emptyValue &&
iHigh > iSwingHighBOSValue;
if (isSwingHighBOSBreaked)
{
iSwingHighBOSValue = emptyValue;
}
swingHighsBOSBuffer[bar_index] = iSwingHighBOSValue;
//
// Detecting CHOCHs ...
//
// Swing Low CHOCH ...
double lastSwingLowCHOCHValue =
isFirstBar
? emptyValue
: swingLowsCHOCHBuffer[lastBarIndex];
double iSwingLowCHOCHValue =
isTrendBullish &&
iLow < lastSwing
? iLow
: emptyValue;
swingLowsCHOCHBuffer[bar_index] = iSwingLowCHOCHValue;
//
// Swing High CHOCH ...
double lastSwingHighCHOCHValue =
isFirstBar
? emptyValue
: swingHighsCHOCHBuffer[lastBarIndex];
double iSwingHighCHOCHValue =
isTrendBearish &&
iHigh > lastSwing
? iHigh
: emptyValue;
swingHighsCHOCHBuffer[bar_index] = iSwingHighCHOCHValue;
}
//
// Tools ...
//
bool IsSwingLow(
const double &high[],
const double &low[],
int index,
int length //
)
{
//
bool result = false;
//
result = index - length > 0;
if (!result)
{
return result;
}
//
for (int i = 1; i <= length; i++)
{
//
result = low[index] < low[index - 1] &&
low[index] < low[index + i];
if (!result)
{
break;
}
}
//
return result;
}
//
bool IsSwingHigh(
const double &high[],
const double &low[],
int index,
int length //
)
{
//
bool result = false;
//
result = index - length > 0;
if (!result)
{
return result;
}
//
for (int i = 1; i <= length; i++)
{
//
result = high[index] > high[index - 1] &&
high[index] > high[index + i];
if (!result)
{
break;
}
}
//
return result;
}
//
File diff suppressed because it is too large Load Diff
@@ -1,637 +0,0 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Indicator
// -------------------------------------------------
// Name: X121 XSTR
// Description: XSTR ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm X121 XSTR Indicator"
#property strict
//
// Definitions ...
//
#define ShortName "X121 XSTR"
//
// Includes Common Library ...
#include "../Libraries/x-saherelm.common.lib.mq5"
//
// Inputs ...
//
// Market ...
input group "Market";
input int strLength = 14; // Length
input double strMultiplier = 3; // Multiplier
input ENUM_APPLIED_PRICE strAppliedTo = PRICE_MEDIAN; // Applied To
//
input group "Presentation";
//
input bool showStr = true; // Show Str
input bool showStrUpper = true; // Show Str Upper
input bool showStrLower = true; // Show Str Lower
//
// Buffers ...
//
#define hideColorIDX 0
#define bullishColorIDX 1
#define bearishColorIDX 2
#define neuturalColorIDX 3
//
#property indicator_chart_window
//
#property indicator_buffers 7
#property indicator_plots 3
//
// STR ...
#define strBufferIndex 0
double strBuffer[];
#define strColorBufferIndex 1
double strColorBuffer[];
//
#define strPlotBufferIndex 0
#property indicator_label1 "X121 STR"
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 CLR_NONE, clrLime, clrRed, clrGray
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//
// Up ...
#define strUpBufferIndex 2
double strUpBuffer[];
//
#define strUpPlotBufferIndex 1
#property indicator_label2 "X121 STR U"
#property indicator_type2 DRAW_LINE
#property indicator_color2 C'255,106,0'
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//
// Down ...
#define strDownBufferIndex 3
double strDownBuffer[];
//
#define strDownPlotBufferIndex 2
#property indicator_label3 "X121 STR D"
#property indicator_type3 DRAW_LINE
#property indicator_color3 C'255,106,0'
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
//
// Data Buffers ...
//
int mLastBufferIndex = 3;
//
// STR ...
//
// Atr ...
#define atrBufferIndex mLastBufferIndex + 1
double atrBuffer[];
//
// Price ...
#define strPriceBufferIndex mLastBufferIndex + 2
double strPriceBuffer[];
//
// Trend ...
#define strStateBufferIndex mLastBufferIndex + 3
double strStateBuffer[];
//
// Variables, Properties and etc ...
//
// this counts Available Bars ...
int limit;
//
int maxLength;
//
// ATR Handler ...
int atrHandler = INVALID_HANDLE;
//
bool isStrTrendChanged;
bool isStrStartBearishTrend;
bool isStrStartBullishTrend;
//
int changeOfTrend;
int startBearishTrend;
int startBullishTrend;
//
// Event Handlers ...
/**
* Initialize Indicator ...
*
* @return ( int )
*/
int OnInit()
{
//
// Validate Inputs ...
if (!ValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
// Initialize Indicator Handlers ...
//
// ATR ...
atrHandler = iATR(
_Symbol,
_Period,
strLength //
);
bool isInited = atrHandler != INVALID_HANDLE;
if (!isInited)
{
return INIT_FAILED;
}
//
// because in some cases we may have more than one input for
// calculation and we must prevent any calculation
// untill we pass the biggest input length, here we get max Input length
// and then wait until pass it ...
maxLength = ExtractMaxLengthOfInputs();
//
// Define Index Buffers ...
DefineBuffers();
//
// Set Indicator ShortName ...
SetIndicatorName();
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
/**
* De Initialize Indicator ...
*
* @param reason: Integer, De Initialization Reason ...
*/
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
//
IndicatorRelease(atrHandler);
}
/**
* Calculate Bars ...
*
* @param rates_total: Integer, Total Bars on Chart ...
* @param prev_calculated: Integer, Total Calculated Bars on Charts ...
* @param time: DateTime Array, History of Open Time ...
* @param open: Double Array, History of Open Prices ...
* @param high: Double Array, History of High Prices ...
* @param low: Double Array, History of Low Prices ...
* @param close: Double Array, History of Close Prices ...
* @param tick_volume: Long, History of Tick Volumes on Bar ...
* @param volume: Long, History of Trade Volumes ...
* @param spread: Double, History of Spread Price ...
*
* @return ( int )
*/
int OnCalculate(
const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[] //
)
{
//
// Prepare Buffers ...
//
// Validate Calculated Bars ...
//
// ATR ...
int atrCalculatedBars = BarsCalculated(atrHandler);
//
bool isPassedRequiredCalculatedBars =
//
// ATR ...
atrCalculatedBars >= 0
//
;
if (!isPassedRequiredCalculatedBars)
{
return prev_calculated;
}
//
//
// checking for the limit start of calculation of an indicator ...
limit =
(prev_calculated > rates_total || prev_calculated <= 0)
? maxLength
: prev_calculated - 1;
//
// Buffers Copy ...
//
// ATR ...
int copiedAtrs = CopyBuffer(atrHandler, 0, 0, rates_total, atrBuffer);
//
// Validate Copied Items ...
bool isPassedRequiredCopiedItems =
//
// ATR ...
copiedAtrs >= 0
//
;
if (!isPassedRequiredCopiedItems)
{
return prev_calculated;
}
//
// Main Loop ...
for (int i = limit; i < rates_total && !IsStopped(); i++)
{
//
CalculateBuffers(
i,
prev_calculated,
rates_total,
//
open,
high,
close,
low,
tick_volume //
);
}
//
return rates_total;
}
//
// Functions ...
/**
* Validate Input Args for Initialization ...
*
* @return ( bool )
*/
bool ValidateInputs()
{
//
bool result =
//
// STR ...
strLength > 0 &&
strMultiplier > 0
//
;
//
return result;
}
/**
* Extract Max Length of Inputs ...
*
* @return ( int )
*/
int ExtractMaxLengthOfInputs()
{
//
int result = 0;
//
result = MathMax(1, strLength);
//
return result;
}
/**
* Define Required Buffers ...
*/
void DefineBuffers()
{
//
// STR ...
SetIndexBuffer(strBufferIndex, strBuffer, INDICATOR_DATA);
SetIndexBuffer(strColorBufferIndex, strColorBuffer, INDICATOR_COLOR_INDEX);
//
ENUM_DRAW_TYPE strUpDrawType = showStrUpper ? DRAW_LINE : DRAW_NONE;
SetIndexBuffer(strUpBufferIndex, strUpBuffer, INDICATOR_DATA);
PlotIndexSetDouble(strUpPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE);
PlotIndexSetInteger(strUpPlotBufferIndex, PLOT_SHOW_DATA, showStrUpper);
PlotIndexSetInteger(strUpPlotBufferIndex, PLOT_DRAW_TYPE, strUpDrawType);
//
ENUM_DRAW_TYPE strDownDrawType = showStrLower ? DRAW_LINE : DRAW_NONE;
SetIndexBuffer(strDownBufferIndex, strDownBuffer, INDICATOR_DATA);
PlotIndexSetDouble(strDownPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE);
PlotIndexSetInteger(strDownPlotBufferIndex, PLOT_SHOW_DATA, showStrLower);
PlotIndexSetInteger(strDownPlotBufferIndex, PLOT_DRAW_TYPE, strDownDrawType);
//
// Data Buffers ...
//
// STR ...
//
SetIndexBuffer(strPriceBufferIndex, strPriceBuffer, INDICATOR_CALCULATIONS);
SetIndexBuffer(strStateBufferIndex, strStateBuffer, INDICATOR_CALCULATIONS);
}
/**
* Set Indicator Short Name and also we can define Buffers Labels ...
*/
void SetIndicatorName()
{
IndicatorSetString(INDICATOR_SHORTNAME, ShortName);
}
/**
* Calculate Custom Buffers ...
*
* @param bar_index: Integer, Represent Current Bar ...
* @param prevCalculated: Integer, Represent Previous Calculated Bars ...
* @param ratesTotal: Integer, Represents All Available Bars ...
* @param open: Double Array, History of Open Prices ...
* @param high: Double Array, History of High Prices ...
* @param close: Double Array, History of Close Prices ...
* @param low: Double Array, History of Low Prices ...
* @param tickVolume: Long, History of Tick Volumes on Bar ...
*/
void CalculateBuffers(
int bar_index, // Selected Bar Index
const int prevCalculated,
const int ratesTotal,
const double &open[],
const double &high[],
const double &close[],
const double &low[],
const long &tickVolume[] //
)
{
//
CalculateStr(
bar_index,
prevCalculated,
ratesTotal,
open,
high,
close,
low //
);
}
//
// Custom ...
/**
* Fill All Bufers to Zero Vlue for Specified Bar Index ...
*
* @param barIndex: Integer ...
*/
void FillBuffersZero(int barIndex)
{
//
// STR ...
strBuffer[barIndex] = 0;
strUpBuffer[barIndex] = 0;
strDownBuffer[barIndex] = 0;
strPriceBuffer[barIndex] = 0;
strColorBuffer[barIndex] = hideColorIDX;
strStateBuffer[barIndex] = hideColorIDX;
}
/**
* Calculate STR ...
*
* @param bar_index: Integer, Represent Current Bar ...
* @param prevCalculated: Integer, Represent Previous Calculated Bars ...
* @param ratesTotal: Integer, Represents All Available Bars ...
* @param open: Double Array, History of Open Prices ...
* @param high: Double Array, History of High Prices ...
* @param close: Double Array, History of Close Prices ...
* @param low: Double Array, History of Low Prices ...
*/
void CalculateStr(
int bar_index, // Selected Bar Index
const int prevCalculated,
const int ratesTotal,
const double &open[],
const double &high[],
const double &close[],
const double &low[] //
)
{
//
// Calculated Price ...
ENUM_X_PRICE mPTYpe = ToXPrice(strAppliedTo);
double price = GetAppliedPrice(
mPTYpe,
open,
high,
low,
close,
bar_index //
);
strPriceBuffer[bar_index] = price;
//
double atr = atrBuffer[bar_index];
//
// Up ...
strUpBuffer[bar_index] = price + (strMultiplier * atr);
//
// Down ...
strDownBuffer[bar_index] = price - (strMultiplier * atr);
//
if (close[bar_index] > strUpBuffer[bar_index - 1])
{
//
strStateBuffer[bar_index] = 1;
if (strStateBuffer[bar_index - 1] == -1)
{
changeOfTrend = 1;
}
}
else if (close[bar_index] < strDownBuffer[bar_index - 1])
{
//
strStateBuffer[bar_index] = -1;
if (strStateBuffer[bar_index - 1] == 1)
{
changeOfTrend = 1;
}
}
else if (strStateBuffer[bar_index - 1] == 1)
{
//
strStateBuffer[bar_index] = 1;
changeOfTrend = 0;
}
else if (strStateBuffer[bar_index - 1] == -1)
{
//
strStateBuffer[bar_index] = -1;
changeOfTrend = 0;
}
//
// Down Trend Starting ...
if (strStateBuffer[bar_index] < 0 && strStateBuffer[bar_index - 1] > 0)
{
startBearishTrend = 1;
}
else
{
startBearishTrend = 0;
}
//
// Up Trend Starting ...
if (strStateBuffer[bar_index] > 0 && strStateBuffer[bar_index - 1] < 0)
{
startBullishTrend = 1;
}
else
{
startBullishTrend = 0;
}
//
if (strStateBuffer[bar_index] > 0 && strDownBuffer[bar_index] < strDownBuffer[bar_index - 1])
{
strDownBuffer[bar_index] = strDownBuffer[bar_index - 1];
}
//
if (strStateBuffer[bar_index] < 0 && strUpBuffer[bar_index] > strUpBuffer[bar_index - 1])
{
strUpBuffer[bar_index] = strUpBuffer[bar_index - 1];
}
//
if (startBearishTrend == 1)
{
strUpBuffer[bar_index] = strPriceBuffer[bar_index] + (strMultiplier * atr);
}
//
if (startBullishTrend == 1)
{
strDownBuffer[bar_index] = strPriceBuffer[bar_index] - (strMultiplier * atr);
}
//
// Draw the indicator ...
//
double colorIDX = hideColorIDX;
strColorBuffer[bar_index] = colorIDX;
//
if (strStateBuffer[bar_index] == 1)
{
//
strBuffer[bar_index] = strDownBuffer[bar_index];
if (changeOfTrend == 1)
{
strBuffer[bar_index - 1] = strBuffer[bar_index - 2];
changeOfTrend = 0;
}
//
colorIDX = bullishColorIDX;
}
else if (strStateBuffer[bar_index] == -1)
{
//
strBuffer[bar_index] = strUpBuffer[bar_index];
if (changeOfTrend == 1)
{
//
strBuffer[bar_index - 1] = strBuffer[bar_index - 2];
changeOfTrend = 0;
}
//
colorIDX = bearishColorIDX;
}
//
if (showStr)
{
strColorBuffer[bar_index] = colorIDX;
}
}
//
@@ -1,793 +0,0 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Indicator
// -------------------------------------------------
// Name: X121 XSTR
// Description: XSTR ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm X121 XSTR Indicator"
#property strict
//
// Definitions ...
//
#define ShortName "X121 XSTR"
//
// Includes Common Library ...
#include "../Libraries/x-saherelm.common.lib.mq5"
//
// Inputs ...
//
// Market ...
input group "Market";
input int strLength = 14; // Length
input double strMultiplier = 3; // Multiplier
input ENUM_MA_METHOD strBoundaryMode = MODE_SMA; // Boundary Mode
input ENUM_APPLIED_PRICE strAppliedTo = PRICE_MEDIAN; // Applied To
//
input group "Presentation";
input bool showStr = true; // Show Str
input bool showStrMid = true; // Show Str Mid
input bool showStrUpper = true; // Show Str Upper
input bool showStrLower = true; // Show Str Lower
input bool showStrLowMa = true; // Show Low Smoothed Buffer
input bool showStrHighMa = true; // Show High Smoothed Buffer
//
// Buffers ...
//
#define hideColorIDX 0
#define bullishColorIDX 1
#define bearishColorIDX 2
#define neuturalColorIDX 3
//
#define emptyValue 0.0
//
#property indicator_chart_window
//
#property indicator_buffers 11
#property indicator_plots 6
//
// STR ...
#define strBufferIndex 0
double strBuffer[];
#define strColorBufferIndex 1
double strColorBuffer[];
//
#define strPlotBufferIndex 0
#property indicator_label1 "X121 STR"
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 CLR_NONE, clrLime, clrRed, clrGray
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//
// Up ...
#define strUpBufferIndex 2
double strUpBuffer[];
//
#define strUpPlotBufferIndex 1
#property indicator_label2 "X121 STR U"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrBlueViolet
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//
// Down ...
#define strDownBufferIndex 3
double strDownBuffer[];
//
#define strDownPlotBufferIndex 2
#property indicator_label3 "X121 STR D"
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrBlueViolet
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
//
// High MA ...
#define strHighMaBufferIndex 4
double strHighMaBuffer[];
//
#define strHighMaPlotBufferIndex 3
#property indicator_label4 "X121 STR HSM"
#property indicator_type4 DRAW_LINE
#property indicator_color4 clrAqua
#property indicator_style4 STYLE_SOLID
#property indicator_width4 1
//
// Low Ma ...
#define strLowMaBufferIndex 5
double strLowMaBuffer[];
//
#define strLowMaPlotBufferIndex 4
#property indicator_label5 "X121 STR LSM"
#property indicator_type5 DRAW_LINE
#property indicator_color5 clrMagenta
#property indicator_style5 STYLE_SOLID
#property indicator_width5 1
//
// STR Mmid ...
#define strMidBufferIndex 6
double strMidBuffer[];
#define strMidColorBufferIndex 7
double strMidColorBuffer[];
//
#define strMidPlotBufferIndex 5
#property indicator_label6 "X121 STR Mid"
#property indicator_type6 DRAW_COLOR_LINE
#property indicator_color6 CLR_NONE, clrLime, clrRed, clrGray
#property indicator_style6 STYLE_SOLID
#property indicator_width6 1
//
// Data Buffers ...
//
int mLastBufferIndex = 7;
//
// STR ...
//
// Atr ...
#define atrBufferIndex mLastBufferIndex + 1
double atrBuffer[];
//
// Price ...
#define strPriceBufferIndex mLastBufferIndex + 2
double strPriceBuffer[];
//
// Trend ...
#define strStateBufferIndex mLastBufferIndex + 3
double strStateBuffer[];
//
// Variables, Properties and etc ...
//
// this counts Available Bars ...
int limit;
//
int maxLength;
//
// ATR Handler ...
int atrHandler = INVALID_HANDLE;
//
// MA Handler ...
int lowMaHandler = INVALID_HANDLE;
int highMaHandler = INVALID_HANDLE;
//
bool isStrTrendChanged;
bool isStrStartBearishTrend;
bool isStrStartBullishTrend;
//
int changeOfTrend;
int startBearishTrend;
int startBullishTrend;
//
// Event Handlers ...
/**
* Initialize Indicator ...
*
* @return ( int )
*/
int OnInit()
{
//
// Validate Inputs ...
if (!ValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
// Initialize Indicator Handlers ...
//
// ATR ...
atrHandler = iATR(
_Symbol,
_Period,
strLength //
);
bool isInited = atrHandler != INVALID_HANDLE;
if (!isInited)
{
return INIT_FAILED;
}
//
// Low Ma ...
lowMaHandler = iMA(
_Symbol,
_Period,
strLength,
0,
strBoundaryMode,
PRICE_LOW //
);
isInited = lowMaHandler != INVALID_HANDLE;
if (!isInited)
{
return INIT_FAILED;
}
//
// High Ma ...
highMaHandler = iMA(
_Symbol,
_Period,
strLength,
0,
strBoundaryMode,
PRICE_HIGH //
);
isInited = highMaHandler != INVALID_HANDLE;
if (!isInited)
{
return INIT_FAILED;
}
//
// because in some cases we may have more than one input for
// calculation and we must prevent any calculation
// untill we pass the biggest input length, here we get max Input length
// and then wait until pass it ...
maxLength = ExtractMaxLengthOfInputs();
//
// Define Index Buffers ...
DefineBuffers();
//
// Set Indicator ShortName ...
SetIndicatorName();
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
/**
* De Initialize Indicator ...
*
* @param reason: Integer, De Initialization Reason ...
*/
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
//
IndicatorRelease(atrHandler);
IndicatorRelease(lowMaHandler);
IndicatorRelease(highMaHandler);
}
/**
* Calculate Bars ...
*
* @param rates_total: Integer, Total Bars on Chart ...
* @param prev_calculated: Integer, Total Calculated Bars on Charts ...
* @param time: DateTime Array, History of Open Time ...
* @param open: Double Array, History of Open Prices ...
* @param high: Double Array, History of High Prices ...
* @param low: Double Array, History of Low Prices ...
* @param close: Double Array, History of Close Prices ...
* @param tick_volume: Long, History of Tick Volumes on Bar ...
* @param volume: Long, History of Trade Volumes ...
* @param spread: Double, History of Spread Price ...
*
* @return ( int )
*/
int OnCalculate(
const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[] //
)
{
//
// Prepare Buffers ...
//
// Validate Calculated Bars ...
//
// ATR ...
int atrCalculatedBars = BarsCalculated(atrHandler);
//
// Low Ma ...
int lowMaCalculatedBars = BarsCalculated(lowMaHandler);
//
// High Ma ...
int highMaCalculatedBars = BarsCalculated(highMaHandler);
//
bool isPassedRequiredCalculatedBars =
//
// ATR ...
atrCalculatedBars >= 0 &&
//
// Low Ma ...
lowMaCalculatedBars >= 0 &&
//
// High Ma ...
highMaCalculatedBars >= 0
//
;
if (!isPassedRequiredCalculatedBars)
{
return prev_calculated;
}
//
//
// checking for the limit start of calculation of an indicator ...
limit =
(prev_calculated > rates_total || prev_calculated <= 0)
? maxLength
: prev_calculated - 1;
//
// Buffers Copy ...
//
// ATR ...
int copiedAtrs = CopyBuffer(atrHandler, 0, 0, rates_total, atrBuffer);
//
// Low Ma ...
int copiedLowMas = CopyBuffer(lowMaHandler, 0, 0, rates_total, strLowMaBuffer);
//
// High Ma ...
int copiedHighMas = CopyBuffer(highMaHandler, 0, 0, rates_total, strHighMaBuffer);
//
// Validate Copied Items ...
bool isPassedRequiredCopiedItems =
//
// ATR ...
copiedAtrs >= 0 &&
//
// Low Ma ...
copiedLowMas >= 0 &&
//
// Hig Ma ...
copiedHighMas >= 0
//
;
if (!isPassedRequiredCopiedItems)
{
return prev_calculated;
}
//
// Main Loop ...
for (int i = limit; i < rates_total && !IsStopped(); i++)
{
//
CalculateBuffers(
i,
prev_calculated,
rates_total,
//
open,
high,
close,
low,
tick_volume //
);
}
//
return rates_total;
}
//
// Functions ...
/**
* Validate Input Args for Initialization ...
*
* @return ( bool )
*/
bool ValidateInputs()
{
//
bool result =
//
// STR ...
strLength > 0 &&
strMultiplier > 0
//
;
//
return result;
}
/**
* Extract Max Length of Inputs ...
*
* @return ( int )
*/
int ExtractMaxLengthOfInputs()
{
//
int result = 0;
//
result = MathMax(1, strLength);
//
return result;
}
/**
* Define Required Buffers ...
*/
void DefineBuffers()
{
//
// STR ...
SetIndexBuffer(strBufferIndex, strBuffer, INDICATOR_DATA);
SetIndexBuffer(strColorBufferIndex, strColorBuffer, INDICATOR_COLOR_INDEX);
//
ENUM_DRAW_TYPE strUpDrawType = showStrUpper ? DRAW_LINE : DRAW_NONE;
SetIndexBuffer(strUpBufferIndex, strUpBuffer, INDICATOR_DATA);
PlotIndexSetDouble(strUpPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue);
PlotIndexSetInteger(strUpPlotBufferIndex, PLOT_SHOW_DATA, showStrUpper);
PlotIndexSetInteger(strUpPlotBufferIndex, PLOT_DRAW_TYPE, strUpDrawType);
//
ENUM_DRAW_TYPE strDownDrawType = showStrLower ? DRAW_LINE : DRAW_NONE;
SetIndexBuffer(strDownBufferIndex, strDownBuffer, INDICATOR_DATA);
PlotIndexSetDouble(strDownPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue);
PlotIndexSetInteger(strDownPlotBufferIndex, PLOT_SHOW_DATA, showStrLower);
PlotIndexSetInteger(strDownPlotBufferIndex, PLOT_DRAW_TYPE, strDownDrawType);
//
ENUM_DRAW_TYPE strLowMaDrawType = showStrLowMa ? DRAW_LINE : DRAW_NONE;
SetIndexBuffer(strLowMaBufferIndex, strLowMaBuffer, INDICATOR_DATA);
PlotIndexSetDouble(strLowMaPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue);
PlotIndexSetInteger(strLowMaPlotBufferIndex, PLOT_SHOW_DATA, showStrLowMa);
PlotIndexSetInteger(strLowMaPlotBufferIndex, PLOT_DRAW_TYPE, strLowMaDrawType);
//
ENUM_DRAW_TYPE strHighMaDrawType = showStrHighMa ? DRAW_LINE : DRAW_NONE;
SetIndexBuffer(strHighMaBufferIndex, strHighMaBuffer, INDICATOR_DATA);
PlotIndexSetDouble(strHighMaPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue);
PlotIndexSetInteger(strHighMaPlotBufferIndex, PLOT_SHOW_DATA, showStrHighMa);
PlotIndexSetInteger(strHighMaPlotBufferIndex, PLOT_DRAW_TYPE, strHighMaDrawType);
//
ENUM_DRAW_TYPE strMidDrawType = showStrMid ? DRAW_COLOR_LINE : DRAW_NONE;
SetIndexBuffer(strMidBufferIndex, strMidBuffer, INDICATOR_DATA);
SetIndexBuffer(strMidColorBufferIndex, strMidColorBuffer, INDICATOR_COLOR_INDEX);
PlotIndexSetDouble(strMidPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue);
PlotIndexSetInteger(strMidPlotBufferIndex, PLOT_SHOW_DATA, showStrMid);
PlotIndexSetInteger(strMidPlotBufferIndex, PLOT_DRAW_TYPE, strMidDrawType);
//
// Data Buffers ...
//
SetIndexBuffer(strPriceBufferIndex, strPriceBuffer, INDICATOR_CALCULATIONS);
SetIndexBuffer(strStateBufferIndex, strStateBuffer, INDICATOR_CALCULATIONS);
}
/**
* Set Indicator Short Name and also we can define Buffers Labels ...
*/
void SetIndicatorName()
{
IndicatorSetString(INDICATOR_SHORTNAME, ShortName);
}
/**
* Calculate Custom Buffers ...
*
* @param bar_index: Integer, Represent Current Bar ...
* @param prevCalculated: Integer, Represent Previous Calculated Bars ...
* @param ratesTotal: Integer, Represents All Available Bars ...
* @param open: Double Array, History of Open Prices ...
* @param high: Double Array, History of High Prices ...
* @param close: Double Array, History of Close Prices ...
* @param low: Double Array, History of Low Prices ...
* @param tickVolume: Long, History of Tick Volumes on Bar ...
*/
void CalculateBuffers(
int bar_index, // Selected Bar Index
const int prevCalculated,
const int ratesTotal,
const double &open[],
const double &high[],
const double &close[],
const double &low[],
const long &tickVolume[] //
)
{
//
CalculateStr(
bar_index,
prevCalculated,
ratesTotal,
open,
high,
close,
low //
);
}
//
// Custom ...
/**
* Fill All Bufers to Zero Vlue for Specified Bar Index ...
*
* @param barIndex: Integer ...
*/
void FillBuffersZero(int barIndex)
{
//
// STR ...
strBuffer[barIndex] = emptyValue;
strUpBuffer[barIndex] = emptyValue;
strMidBuffer[barIndex] = emptyValue;
strMidBuffer[barIndex] = emptyValue;
strDownBuffer[barIndex] = emptyValue;
strPriceBuffer[barIndex] = emptyValue;
strLowMaBuffer[barIndex] = emptyValue;
strHighMaBuffer[barIndex] = emptyValue;
//
strColorBuffer[barIndex] = hideColorIDX;
strStateBuffer[barIndex] = hideColorIDX;
}
/**
* Calculate STR ...
*
* @param bar_index: Integer, Represent Current Bar ...
* @param prevCalculated: Integer, Represent Previous Calculated Bars ...
* @param ratesTotal: Integer, Represents All Available Bars ...
* @param open: Double Array, History of Open Prices ...
* @param high: Double Array, History of High Prices ...
* @param close: Double Array, History of Close Prices ...
* @param low: Double Array, History of Low Prices ...
*/
void CalculateStr(
int bar_index, // Selected Bar Index
const int prevCalculated,
const int ratesTotal,
const double &open[],
const double &high[],
const double &close[],
const double &low[] //
)
{
//
// Calculated Price ...
ENUM_X_PRICE mPType = ToXPrice(strAppliedTo);
double price = GetAppliedPrice(
mPType,
open,
high,
low,
close,
bar_index //
);
strPriceBuffer[bar_index] = price;
//
double atr = atrBuffer[bar_index];
//
// Up ...
strUpBuffer[bar_index] = price + (strMultiplier * atr);
//
// Down ...
strDownBuffer[bar_index] = price - (strMultiplier * atr);
//
if (close[bar_index] > strUpBuffer[bar_index - 1])
{
//
strStateBuffer[bar_index] = 1;
if (strStateBuffer[bar_index - 1] == -1)
{
changeOfTrend = 1;
}
}
else if (close[bar_index] < strDownBuffer[bar_index - 1])
{
//
strStateBuffer[bar_index] = -1;
if (strStateBuffer[bar_index - 1] == 1)
{
changeOfTrend = 1;
}
}
else if (strStateBuffer[bar_index - 1] == 1)
{
//
strStateBuffer[bar_index] = 1;
changeOfTrend = 0;
}
else if (strStateBuffer[bar_index - 1] == -1)
{
//
strStateBuffer[bar_index] = -1;
changeOfTrend = 0;
}
//
// Down Trend Starting ...
if (strStateBuffer[bar_index] < 0 && strStateBuffer[bar_index - 1] > 0)
{
startBearishTrend = 1;
}
else
{
startBearishTrend = 0;
}
//
// Up Trend Starting ...
if (strStateBuffer[bar_index] > 0 && strStateBuffer[bar_index - 1] < 0)
{
startBullishTrend = 1;
}
else
{
startBullishTrend = 0;
}
//
if (strStateBuffer[bar_index] > 0 && strDownBuffer[bar_index] < strDownBuffer[bar_index - 1])
{
strDownBuffer[bar_index] = strDownBuffer[bar_index - 1];
}
//
if (strStateBuffer[bar_index] < 0 && strUpBuffer[bar_index] > strUpBuffer[bar_index - 1])
{
strUpBuffer[bar_index] = strUpBuffer[bar_index - 1];
}
//
if (startBearishTrend == 1)
{
strUpBuffer[bar_index] = strPriceBuffer[bar_index] + (strMultiplier * atr);
}
//
if (startBullishTrend == 1)
{
strDownBuffer[bar_index] = strPriceBuffer[bar_index] - (strMultiplier * atr);
}
//
// Draw the indicator ...
//
double colorIDX = hideColorIDX;
strColorBuffer[bar_index] = colorIDX;
//
if (strStateBuffer[bar_index] == 1)
{
//
strBuffer[bar_index] = strDownBuffer[bar_index];
if (changeOfTrend == 1)
{
strBuffer[bar_index - 1] = strBuffer[bar_index - 2];
changeOfTrend = 0;
}
//
colorIDX = bullishColorIDX;
}
else if (strStateBuffer[bar_index] == -1)
{
//
strBuffer[bar_index] = strUpBuffer[bar_index];
if (changeOfTrend == 1)
{
//
strBuffer[bar_index - 1] = strBuffer[bar_index - 2];
changeOfTrend = 0;
}
//
colorIDX = bearishColorIDX;
}
//
if (showStr)
{
strColorBuffer[bar_index] = colorIDX;
}
//
// Str Mid ...
//
double iStrMid = strDownBuffer[bar_index] + ((strUpBuffer[bar_index] - strDownBuffer[bar_index]) / 2);
strMidBuffer[bar_index] = iStrMid;
//
double iStrColor = close[bar_index] > strMidBuffer[bar_index]
? bullishColorIDX
: close[bar_index] < strMidBuffer[bar_index]
? bearishColorIDX
: neuturalColorIDX;
strMidColorBuffer[bar_index] = iStrColor;
//
}
//
-27
View File
@@ -1,27 +0,0 @@
//
// XCC ...
//
// XPV ...
//
// XHK ...
//
// XMAS ...
//
// XATR ...
//
// XSTR ...
//
// XCHE ...
//
// X3MA ...
//
// XVWAP ...
-82
View File
@@ -1,82 +0,0 @@
//
// XCC ...
//
// Buffers ...
//
// Conditions ...
//
// XPV ...
//
// Buffers ...
//
// Conditions ...
//
// XHK ...
//
// Buffers ...
//
// Conditions ...
//
// XMAS ...
//
// Buffers ...
//
// Conditions ...
//
// XATR ...
//
// Buffers ...
//
// Conditions ...
//
// XSTR ...
//
// Buffers ...
//
// Conditions ...
//
// XCHE ...
//
// Buffers ...
//
// Conditions ...
//
// X3MA ...
//
// Buffers ...
//
// Conditions ...
//
// XVWAP ...
//
// Buffers ...
//
// Conditions ...
-359
View File
@@ -1,359 +0,0 @@
//
// XCC ...
//
// Buffers ...
//
// Conditions ...
//
// XPV ...
//
// Buffers ...
//
double sarBuffer[];
double cHHBuffer[];
double cLLBuffer[];
double sHHBuffer[];
double sLLBuffer[];
double mHHBuffer[];
double mLLBuffer[];
double lHHBuffer[];
double lLLBuffer[];
double hHHBuffer[];
double hLLBuffer[];
double peaksBuffer[];
double valesBuffer[];
double supportsBuffer[];
double peaksGoldenBuffer[];
double valesGoldenBuffer[];
double resistancesBuffer[];
double fractalsUpperBuffer[];
double fractalsLowerBuffer[];
//
// Conditions ...
//
bool isSarBullish;
bool isSarBearish;
//
bool isSarSwitchedToBullish;
bool isSarSwitchedToBearish;
//
bool isNewPeak;
bool isNewPeakOverLast;
bool isNewPeakUnderLast;
//
bool isNewVale;
bool isNewValeOverLast;
bool isNewValeUnderLast;
//
// XHK ...
//
// Buffers ...
//
double xhkSMLowBuffer[];
double xhkRawLowBuffer[];
double xhkSMOpenBuffer[];
double xhkSMHighBuffer[];
double xhkRawOpenBuffer[];
double xhkRawHighBuffer[];
double xhkSMCloseBuffer[];
double xhkRawCloseBuffer[];
//
// Conditions ...
//
bool isSMHKBullish;
bool isRawHKBullish;
bool isSMHKSwitchedToBullish;
bool isRawHKSwitchedToBullish;
//
bool isSMHKBearish;
bool isRawHKBearish;
bool isSMHKSwitchedToBearish;
bool isRawHKSwitchedToBearish;
//
bool isClosedOverSMHK;
bool isClosedUnderSMHK;
bool isClosedOverRawHK;
bool isClosedUnderRawHK;
//
bool isRawHKClosedOverSMHK;
bool isRawHKClosedUnderSMHK;
//
// XMAS ...
//
// Buffers ...
//
double midBuffer[];
double upperBuffer[];
double lowerBuffer[];
//
// Conditions ...
//
// XATR ...
//
// Buffers ...
//
double rsiBuffer[];
double atrBuffer[];
double atrUpperBuffer[];
double atrLowerBuffer[];
double atrUpperSMBuffer[];
double atrLowerSMBuffer[];
double rsiChangeBuffer[];
double rsiChangeSMBuffer[];
double priceChangeBuffer[];
double priceChangeSMBuffer[];
//
// Conditions ...
//
bool isRsiInRange;
bool isRsiOverSold;
bool isRsiOverBought;
bool isRsiCrossedOverOverSold;
bool isRsiCrossedUnderOverSold;
bool isRsiCrossedOverOverBought;
bool isRsiCrossedUnderOverBought;
//
bool isRsiSMOverPriceChange;
bool isRsiSMUnderPriceChange;
//
bool isRsiSMCrossedOverPriceChange;
bool isRsiSMCrossedUnderPriceChange;
//
bool isPriceChangeSMOverRsi;
bool isPriceChangeSMUnderRsi;
//
bool isPriceChangeSMCrossedOverRsi;
bool isPriceChangeSMCrossedUnderRsi;
//
bool isRsiOverRsiSM;
bool isRsiUnderRsiSM;
//
bool isRsiCrossedOverRsiSM;
bool isRsiCrossedUnderRsiSM;
//
bool isPriceChangeOverPriceChangeSM;
bool isPriceChangeUnderPriceChangeSM;
//
bool isPriceChangeCrossedOverPriceChangeSM;
bool isPriceChangeCrossedUnderPriceChangeSM;
//
// XSTR ...
//
// Buffers ...
//
double strBuffer[];
double strUpBuffer[];
double strDownBuffer[];
double strPriceBuffer[];
double strStateBuffer[];
//
// Conditions ...
//
bool isStrBullish;
bool isStrBearish;
//
bool isStrSwitchedToBullish;
bool isStrSwitchedToBearish;
//
// XCHE ...
//
// Buffers ...
//
double le1Buffer[];
double se1Buffer[];
double le2Buffer[];
double se2Buffer[];
double le1StartBuffer[];
double se1StartBuffer[];
double le2StartBuffer[];
double se2StartBuffer[];
//
// Conditions ...
//
bool isChe1Bullish;
bool isChe1Bearish;
//
bool isChe1SwitchedToBullish;
bool isChe1SwitchedToBearish;
//
bool isChe2Bullish;
bool isChe2Bearish;
//
bool isChe2SwitchedToBullish;
bool isChe2SwitchedToBearish;
//
bool isCheBullish;
bool isCheBearish;
//
bool isCheSwitchedToBullish;
bool isCheSwitchedToBearish;
//
// X3MA ...
//
// Buffers ...
//
double x3maMidBuffer[];
double x3maFastBuffer[];
double x3maSlowBuffer[];
double x3maMidStateBuffer[];
double x3maFastStateBuffer[];
double x3maSlowStateBuffer[];
//
// Conditions ...
//
bool isX3MaFastBullish;
bool isX3MaFastBearish;
bool isX3MaFastNeutural;
//
bool isX3MaMidBullish;
bool isX3MaMidBearish;
bool isX3MaMidNeutural;
//
bool isX3MaSlowBullish;
bool isX3MaSlowBearish;
bool isX3MaSlowNeutural;
//
bool isX3MaFastOverMid;
bool isX3MaMidOverSlow;
//
bool isX3MaFastUnderMid;
bool isX3MaMidUnderSlow;
//
bool isX3MaBullishState;
bool isX3MaBearishState;
bool isX3MaNeuturalState;
//
bool isX3MaBullishOrdered;
bool isX3MaBearishOrdered;
//
bool isX3MaSwitchedToBullishOrdered;
bool isX3MaSwitchedToBearishOrdered;
//
bool isX3MaSwitchedToBullishState;
bool isX3MaSwitchedToBearishState;
bool isX3MaSwitchedToNeuturalState;
//
// XVWAP ...
//
// Buffers ...
//
double vwapMidBuffer[];
double vwapFastBuffer[];
double vwapSlowBuffer[];
double vwapPriceBuffer[];
double vwapVolumeBuffer[];
double vwapMidStateBuffer[];
double vwapFastStateBuffer[];
double vwapSlowStateBuffer[];
//
// Conditions ...
//
bool isVWapFastBullish;
bool isVWapFastBearish;
bool isVWapFastNeutural;
//
bool isVWapMidBullish;
bool isVWapMidBearish;
bool isVWapMidNeutural;
//
bool isVWapSlowBullish;
bool isVWapSlowBearish;
bool isVWapSlowNeutural;
//
bool isVWapFastOverMid;
bool isVWapMidOverSlow;
//
bool isVWapFastUnderMid;
bool isVWapMidUnderSlow;
//
bool isVWapBullishState;
bool isVWapBearishState;
bool isVWapNeuturalState;
//
bool isVWapBullishOrdered;
bool isVWapBearishOrdered;
//
bool isVWapSwitchedToBullishOrdered;
bool isVWapSwitchedToBearishOrdered;
//
bool isVWapSwitchedToBullishState;
bool isVWapSwitchedToBearishState;
bool isVWapSwitchedToNeuturalState;
-408
View File
@@ -1,408 +0,0 @@
//
// XPV ...
//
// Buffers ...
//
// Clean ...
//
Clean(sarBuffer);
Clean(cHHBuffer);
Clean(cLLBuffer);
Clean(sHHBuffer);
Clean(sLLBuffer);
Clean(mHHBuffer);
Clean(mLLBuffer);
Clean(lHHBuffer);
Clean(lLLBuffer);
Clean(hHHBuffer);
Clean(hLLBuffer);
Clean(peaksBuffer);
Clean(valesBuffer);
Clean(supportsBuffer);
Clean(peaksGoldenBuffer);
Clean(valesGoldenBuffer);
Clean(resistancesBuffer);
Clean(fractalsUpperBuffer);
Clean(fractalsLowerBuffer);
//
// Set As Series ...
//
ArraySetAsSeries(sarBuffer, true);
ArraySetAsSeries(cHHBuffer, true);
ArraySetAsSeries(cLLBuffer, true);
ArraySetAsSeries(sHHBuffer, true);
ArraySetAsSeries(sLLBuffer, true);
ArraySetAsSeries(mHHBuffer, true);
ArraySetAsSeries(mLLBuffer, true);
ArraySetAsSeries(lHHBuffer, true);
ArraySetAsSeries(lLLBuffer, true);
ArraySetAsSeries(hHHBuffer, true);
ArraySetAsSeries(hLLBuffer, true);
ArraySetAsSeries(peaksBuffer, true);
ArraySetAsSeries(valesBuffer, true);
ArraySetAsSeries(supportsBuffer, true);
ArraySetAsSeries(peaksGoldenBuffer, true);
ArraySetAsSeries(valesGoldenBuffer, true);
ArraySetAsSeries(resistancesBuffer, true);
ArraySetAsSeries(fractalsUpperBuffer, true);
ArraySetAsSeries(fractalsLowerBuffer, true);
//
// Conditions ...
//
isNewPeak = false;
isNewVale = false;
isSarBullish = false;
isSarBearish = false;
isNewPeakOverLast = false;
isNewValeOverLast = false;
isNewPeakUnderLast = false;
isNewValeUnderLast = false;
isSarSwitchedToBullish = false;
isSarSwitchedToBearish = false;
//
// XHK ...
//
// Buffers ...
//
// Clean ...
//
Clean(xhkSMLowBuffer);
Clean(xhkRawLowBuffer);
Clean(xhkSMOpenBuffer);
Clean(xhkSMHighBuffer);
Clean(xhkRawOpenBuffer);
Clean(xhkRawHighBuffer);
Clean(xhkSMCloseBuffer);
Clean(xhkRawCloseBuffer);
//
// Set As Series ...
//
ArraySetAsSeries(xhkSMLowBuffer, true);
ArraySetAsSeries(xhkRawLowBuffer, true);
ArraySetAsSeries(xhkSMOpenBuffer, true);
ArraySetAsSeries(xhkSMHighBuffer, true);
ArraySetAsSeries(xhkRawOpenBuffer, true);
ArraySetAsSeries(xhkRawHighBuffer, true);
ArraySetAsSeries(xhkSMCloseBuffer, true);
ArraySetAsSeries(xhkRawCloseBuffer, true);
//
// Conditions ...
//
isSMHKBullish = false;
isSMHKBearish = false;
isRawHKBullish = false;
isRawHKBearish = false;
isClosedOverSMHK = false;
isClosedUnderSMHK = false;
isClosedOverRawHK = false;
isClosedUnderRawHK = false;
isRawHKClosedOverSMHK = false;
isRawHKClosedUnderSMHK = false;
isSMHKSwitchedToBearish = false;
isSMHKSwitchedToBullish = false;
isRawHKSwitchedToBullish = false;
isRawHKSwitchedToBearish = false;
//
// XMAS ...
//
// Buffers ...
//
// Clean ...
//
Clean(midBuffer);
Clean(upperBuffer);
Clean(lowerBuffer);
//
// Set As Series ...
//
ArraySetAsSeries(midBuffer, true);
ArraySetAsSeries(upperBuffer, true);
ArraySetAsSeries(lowerBuffer, true);
//
// Conditions ...
//
// XATR ...
//
// Buffers ...
//
// Clean ...
//
Clean(rsiBuffer);
Clean(atrBuffer);
Clean(atrUpperBuffer);
Clean(atrLowerBuffer);
Clean(rsiChangeBuffer);
Clean(atrUpperSMBuffer);
Clean(atrLowerSMBuffer);
Clean(rsiChangeSMBuffer);
Clean(priceChangeBuffer);
Clean(priceChangeSMBuffer);
//
// Set As Series ...
//
ArraySetAsSeries(rsiBuffer, true);
ArraySetAsSeries(atrBuffer, true);
ArraySetAsSeries(atrUpperBuffer, true);
ArraySetAsSeries(atrLowerBuffer, true);
ArraySetAsSeries(rsiChangeBuffer, true);
ArraySetAsSeries(atrUpperSMBuffer, true);
ArraySetAsSeries(atrLowerSMBuffer, true);
ArraySetAsSeries(rsiChangeSMBuffer, true);
ArraySetAsSeries(priceChangeBuffer, true);
ArraySetAsSeries(priceChangeSMBuffer, true);
//
// Conditions ...
//
isRsiInRange = false;
isRsiOverSold = false;
isRsiOverRsiSM = false;
isRsiUnderRsiSM = false;
isRsiOverBought = false;
isRsiCrossedOverRsiSM = false;
isRsiCrossedUnderRsiSM = false;
isPriceChangeSMOverRsi = false;
isRsiSMOverPriceChange = false;
isRsiSMUnderPriceChange = false;
isPriceChangeSMUnderRsi = false;
isRsiCrossedOverOverSold = false;
isRsiCrossedUnderOverSold = false;
isRsiCrossedOverOverBought = false;
isRsiCrossedUnderOverBought = false;
isRsiSMCrossedOverPriceChange = false;
isPriceChangeSMCrossedOverRsi = false;
isRsiSMCrossedUnderPriceChange = false;
isPriceChangeSMCrossedUnderRsi = false;
isPriceChangeOverPriceChangeSM = false;
isPriceChangeUnderPriceChangeSM = false;
isPriceChangeCrossedOverPriceChangeSM = false;
isPriceChangeCrossedUnderPriceChangeSM = false;
//
// XSTR ...
//
// Buffers ...
//
// Clean ...
//
Clean(strBuffer);
Clean(strUpBuffer);
Clean(strDownBuffer);
Clean(strPriceBuffer);
Clean(strStateBuffer);
//
// Set As Series ...
//
ArraySetAsSeries(strBuffer, true);
ArraySetAsSeries(strUpBuffer, true);
ArraySetAsSeries(strDownBuffer, true);
ArraySetAsSeries(strPriceBuffer, true);
ArraySetAsSeries(strStateBuffer, true);
//
// Conditions ...
//
isStrBullish = false;
isStrBearish = false;
isStrSwitchedToBullish = false;
isStrSwitchedToBearish = false;
//
// XCHE ...
//
// Buffers ...
//
// Clean ...
//
Clean(le1Buffer);
Clean(se1Buffer);
Clean(le2Buffer);
Clean(se2Buffer);
Clean(le1StartBuffer);
Clean(se1StartBuffer);
Clean(le2StartBuffer);
Clean(se2StartBuffer);
//
// Set As Series ...
//
ArraySetAsSeries(le1Buffer, true);
ArraySetAsSeries(se1Buffer, true);
ArraySetAsSeries(le2Buffer, true);
ArraySetAsSeries(se2Buffer, true);
ArraySetAsSeries(le1StartBuffer, true);
ArraySetAsSeries(se1StartBuffer, true);
ArraySetAsSeries(le2StartBuffer, true);
ArraySetAsSeries(se2StartBuffer, true);
//
// Conditions ...
//
isCheBullish = false;
isCheBearish = false;
isChe1Bullish = false;
isChe1Bearish = false;
isChe2Bullish = false;
isChe2Bearish = false;
isCheSwitchedToBullish = false;
isCheSwitchedToBearish = false;
isChe1SwitchedToBullish = false;
isChe1SwitchedToBearish = false;
isChe2SwitchedToBullish = false;
isChe2SwitchedToBearish = false;
//
// X3MA ...
//
// Buffers ...
//
// Clean ...
//
Clean(x3maMidBuffer);
Clean(x3maFastBuffer);
Clean(x3maSlowBuffer);
Clean(x3maMidStateBuffer);
Clean(x3maFastStateBuffer);
Clean(x3maSlowStateBuffer);
//
// Set As Series ...
//
ArraySetAsSeries(x3maMidBuffer, true);
ArraySetAsSeries(x3maFastBuffer, true);
ArraySetAsSeries(x3maSlowBuffer, true);
ArraySetAsSeries(x3maMidStateBuffer, true);
ArraySetAsSeries(x3maFastStateBuffer, true);
ArraySetAsSeries(x3maSlowStateBuffer, true);
//
// Conditions ...
//
isX3MaMidBullish = false;
isX3MaMidBearish = false;
isX3MaFastBullish = false;
isX3MaFastBearish = false;
isX3MaMidNeutural = false;
isX3MaSlowBullish = false;
isX3MaSlowBearish = false;
isX3MaFastOverMid = false;
isX3MaMidOverSlow = false;
isX3MaFastNeutural = false;
isX3MaSlowNeutural = false;
isX3MaFastUnderMid = false;
isX3MaMidUnderSlow = false;
isX3MaBullishState = false;
isX3MaBearishState = false;
isX3MaNeuturalState = false;
isX3MaBullishOrdered = false;
isX3MaBearishOrdered = false;
isX3MaSwitchedToBullishState = false;
isX3MaSwitchedToBearishState = false;
isX3MaSwitchedToNeuturalState = false;
isX3MaSwitchedToBullishOrdered = false;
isX3MaSwitchedToBearishOrdered = false;
//
// XVWAP ...
//
// Buffers ...
//
// Clean ...
//
Clean(vwapMidBuffer);
Clean(vwapFastBuffer);
Clean(vwapSlowBuffer);
Clean(vwapPriceBuffer);
Clean(vwapVolumeBuffer);
Clean(vwapMidStateBuffer);
Clean(vwapFastStateBuffer);
Clean(vwapSlowStateBuffer);
//
// Set As Series ...
//
ArraySetAsSeries(vwapMidBuffer, true);
ArraySetAsSeries(vwapFastBuffer, true);
ArraySetAsSeries(vwapSlowBuffer, true);
ArraySetAsSeries(vwapPriceBuffer, true);
ArraySetAsSeries(vwapVolumeBuffer, true);
ArraySetAsSeries(vwapMidStateBuffer, true);
ArraySetAsSeries(vwapFastStateBuffer, true);
ArraySetAsSeries(vwapSlowStateBuffer, true);
//
// Conditions ...
//
isVWapMidBullish = false;
isVWapMidBearish = false;
isVWapMidNeutural = false;
isVWapFastBullish = false;
isVWapFastBearish = false;
isVWapSlowBullish = false;
isVWapSlowBearish = false;
isVWapFastOverMid = false;
isVWapMidOverSlow = false;
isVWapFastNeutural = false;
isVWapSlowNeutural = false;
isVWapFastUnderMid = false;
isVWapMidUnderSlow = false;
isVWapBullishState = false;
isVWapBearishState = false;
isVWapNeuturalState = false;
isVWapBullishOrdered = false;
isVWapBearishOrdered = false;
isVWapSwitchedToBullishState = false;
isVWapSwitchedToBearishState = false;
isVWapSwitchedToNeuturalState = false;
isVWapSwitchedToBullishOrdered = false;
isVWapSwitchedToBearishOrdered = false;
-96
View File
@@ -1,96 +0,0 @@
//
// XDON ...
x121Inputs.xdonInputs.showOpen = showAll || false;
x121Inputs.xdonInputs.showClose = showAll || false;
x121Inputs.xdonInputs.showLow = showAll || false;
x121Inputs.xdonInputs.showHigh = showAll || false;
//
// XICH ...
x121Inputs.xichInputs.showTenkanSen = showAll || false;
x121Inputs.xichInputs.showKijunSen = showAll || false;
x121Inputs.xichInputs.showChikouSpan = showAll || false;
x121Inputs.xichInputs.showSenkouSpanA = showAll || false;
x121Inputs.xichInputs.showSenkouSpanB = showAll || false;
x121Inputs.xichInputs.showKumo = showAll || false;
//
// XCC ...
x121Inputs.xccInputs.showCandles = showAll || true;
//
// XPV ...
//
x121Inputs.xpvInputs.showSar = showAll || false;
x121Inputs.xpvInputs.showPeaks = showAll || true;
x121Inputs.xpvInputs.showVales = showAll || true;
x121Inputs.xpvInputs.showSupports = showAll || false;
x121Inputs.xpvInputs.showResistances = showAll || false;
x121Inputs.xpvInputs.showGoldenZones = showAll || true;
//
// XHK ...
//
x121Inputs.xhkInputs.drawRawXHKCandles = showAll || false;
x121Inputs.xhkInputs.drawSmoothedXHKCandles = showAll || false;
//
// XMAS ...
//
x121Inputs.xmasInputs.showUpper = showAll || false;
x121Inputs.xmasInputs.showMid = showAll || false;
x121Inputs.xmasInputs.showLower = showAll || false;
//
// XATR ...
x121Inputs.xatrInputs.showATRUpper = showAll || false;
x121Inputs.xatrInputs.showATRLower = showAll || false;
//
// XSTR ...
x121Inputs.xstrInputs.showStr = showAll || true;
x121Inputs.xstrInputs.showStrUpper = showAll || false;
x121Inputs.xstrInputs.showStrLower = showAll || false;
//
// XCHE ...
x121Inputs.xcheInputs.showLE1 = showAll || false;
x121Inputs.xcheInputs.showLE2 = showAll || false;
x121Inputs.xcheInputs.showSE1 = showAll || false;
x121Inputs.xcheInputs.showSE2 = showAll || false;
//
// XVWAP ...
x121Inputs.xvwapInputs.showVWapFast = showAll || false;
x121Inputs.xvwapInputs.showVWapMedium = showAll || false;
x121Inputs.xvwapInputs.showVWapSlow = showAll || false;
//
// X3MA ...
x121Inputs.x3maInputs.showX3MaFast = showAll || true;
x121Inputs.x3maInputs.showX3MaMid = showAll || false;
x121Inputs.x3maInputs.showX3MaSlow = showAll || false;
//
//
// x121Inputs.xcheInputs.cheLength = 14;
// x121Inputs.xcheInputs.cheLoopback = 7;
// x121Inputs.xcheInputs.cheMultiplier1 = 1.5;
// x121Inputs.xcheInputs.cheMultiplier2 = 2;
//
// x121Inputs.xstrInputs.strLength = 14;
// x121Inputs.xstrInputs.strMultiplier = 1.5;
//
// x121Inputs.xccInputs.upColor = clrLime;
// x121Inputs.xccInputs.downColor = clrRed;
// x121Inputs.xccInputs.lineColor = CLR_NONE;
// x121Inputs.xccInputs.bearishColor = clrRed;
// x121Inputs.xccInputs.bullishColor = clrLime;
// x121Inputs.xccInputs.volumesColor = clrGreen;
-411
View File
@@ -1,411 +0,0 @@
// This indicator is created under TechnoBlooms - Innovating Trading Indicators and Strategies.
// All rights reserved. Unauthorized copying or distribution is prohibited.
// © TechnoBlooms
//@version=6
indicator("AutoFibGauge (TechnoBlooms) ", overlay=true)
//----------------------------------------------------------------------------
// Initialize with a default value that's not NaN
//----------------------------------------------------------------------------
var float highestHigh = 0.0
var float lowestLow = 0.0
var float level0 = na
var float level100 = na
var float level236 = na
var float level382 = na
var float level500 = na
var float level618 = na
var float level786 = na
// Variables for labels
var label label0 = na
var label label100 = na
var label label236 = na
var label label382 = na
var label label500 = na
var label label618 = na
var label label786 = na
var int positionState = 0 // 0 = neutral, 1 = buy, -1 = sell
Thermometer_position = input.string("Middle right", title="Position", options=["Middle left", "Middle right"], group='Thermometer Settings')
//-------------------------------------------------------------------------------
//input how many candles to consider for drawing fibonacci
//-------------------------------------------------------------------------------
num_of_cand = input(25,"No of Candles to find fib")
//-------------------------------------------------------------------------------
// Calculate the highest high and lowest low of the last n candles
//-------------------------------------------------------------------------------
highestHigh := ta.highest(high, num_of_cand)
lowestLow := ta.lowest(low, num_of_cand)
hhBar = ta.highestbars(high, num_of_cand)
llBar = ta.lowestbars(low, num_of_cand)
// Calculate actual bar indices (negative offsets need to be converted)
currentBar = bar_index
highBarIndex = currentBar + hhBar
lowBarIndex = currentBar + llBar
//-------------------------------------------------------------------------------
// Calculate Simple Moving Average (SMA)
//-------------------------------------------------------------------------------
SLength = input(20,"Short Length")
LLength = input(55,"Long Length") // You can adjust this to change the SMA period
Strend = ta.sma(close,SLength)
LTrend = ta.sma(close, LLength)
//-------------------------------------------------------------------------------------------
// Determine if we're in an uptrend or downtrend based on the current close relative to SMA
//-------------------------------------------------------------------------------------------
isUptrend = Strend > LTrend
barColor = isUptrend ?#26a6c6 : #9c1f98
barcolor(barColor, title="Trend-Based Bar Color")
//----------------------------------------
//Choose Visibility of MA lines
//----------------------------------------
showSMAShort = input.bool(false,"Short SMA")
showSMALong = input.bool(false,"Long SMA")
//---------------------------------------------------
//Choose which all fib lines to display
//---------------------------------------------------
showFib0 = input.bool(true, "Fib 0",group = "Show Fib Lines")
showFib236 = input.bool(true,"Fib 23.6",group = "Show Fib Lines")
showFib382 = input.bool(true,"Fib 38.2",group = "Show Fib Lines")
showFib500 = input.bool(true,"Fib 50",group = "Show Fib Lines")
showFib618 = input.bool(true,"Fib 61.8",group = "Show Fib Lines")
showFib786 = input.bool(true,"Fib 78.6",group = "Show Fib Lines")
showFib100 = input.bool(true,"Fib 100",group = "Show Fib Lines")
//----------------------------------------------------------------
// Choose background color of thermometer
//----------------------------------------------------------------
color0 = color.from_gradient(0, 0, 7, color.aqua, color.purple)
color1 = color.from_gradient(1, 0, 7, color.aqua, color.purple)
color2 = color.from_gradient(2, 0, 7, color.aqua, color.purple)
color3 = color.from_gradient(3, 0, 7, color.aqua, color.purple)
color4 = color.from_gradient(4, 0, 7, color.aqua, color.purple)
color5 = color.from_gradient(5, 0, 7, color.aqua, color.purple)
color6 = color.from_gradient(6, 0, 7, color.aqua, color.purple)
color7 = color.from_gradient(7, 7, 14, color.purple, color.red)
color8 = color.from_gradient(8, 7, 14, color.purple, color.red)
color9 = color.from_gradient(9, 7, 14, color.purple, color.red)
color10 = color.from_gradient(10, 7, 14, color.purple, color.red)
color11 = color.from_gradient(11, 7, 14, color.purple, color.red)
color12 = color.from_gradient(12, 7, 14, color.purple, color.red)
color13 = color.from_gradient(13, 7, 14,color.purple, color.red)
//---------------------------------------------------------------------
// Calculate Fibonacci levels based on trend
//---------------------------------------------------------------------
if not na(highestHigh) and not na(lowestLow) and highestHigh != lowestLow
float diff = highestHigh - lowestLow
if isUptrend
level0 := highestHigh
level100 := lowestLow
level236 := highestHigh - (diff * 0.236)
level382 := highestHigh - (diff * 0.382)
level500 := highestHigh - (diff * 0.500)
level618 := highestHigh - (diff * 0.618)
level786 := highestHigh - (diff * 0.786)
else
level0 := lowestLow
level100 := highestHigh
level236 := lowestLow + (diff * 0.236)
level382 := lowestLow + (diff * 0.382)
level500 := lowestLow + (diff * 0.500)
level618 := lowestLow + (diff * 0.618)
level786 := lowestLow + (diff * 0.786)
//-------------------------------------------------
// Delete old labels
//-------------------------------------------------
label.delete(label0)
label.delete(label100)
label.delete(label236)
label.delete(label382)
label.delete(label500)
label.delete(label618)
label.delete(label786)
//----------------------------------------------------
// Draw new labels, considering trend
//----------------------------------------------------
if showFib0
label0 := label.new(bar_index+5, level0, text="0.0%", color=color0, textcolor=color.white, style=label.style_label_left)
if showFib100
label100 := label.new(bar_index+5, level100, text="100.0%", color=color12, textcolor=color.white, style=label.style_label_left)
if showFib236
label236 := label.new(bar_index+5, level236, text="23.6%", color=color2, textcolor=color.white, style=label.style_label_left)
if showFib382
label382 := label.new(bar_index+5, level382, text="38.2%", color=color4, textcolor=color.white, style=label.style_label_left)
if showFib500
label500 := label.new(bar_index+5, level500, text="50.0%", color=color6, textcolor=color.white, style=label.style_label_left)
if showFib618
label618 := label.new(bar_index+5, level618, text="61.8%", color=color8, textcolor=color.white, style=label.style_label_left)
if showFib786
label786 := label.new(bar_index+5, level786, text="78.6%", color=color10, textcolor=color.white, style=label.style_label_left)
//---------------------------------------------------------------
// Draw straight lines to 20 candles back
//---------------------------------------------------------------
var line line0 = na
var line line100 = na
var line line236 = na
var line line382 = na
var line line500 = na
var line line618 = na
var line line786 = na
line.delete(line0)
line.delete(line100)
line.delete(line236)
line.delete(line382)
line.delete(line500)
line.delete(line618)
line.delete(line786)
if showFib0
line0 := line.new(bar_index[num_of_cand], level0, bar_index+5, level0, color=color0, width=1)
if showFib100
line100 := line.new(bar_index[num_of_cand], level100, bar_index+5, level100, color=color12, width=1)
if showFib236
line236 := line.new(bar_index[num_of_cand], level236, bar_index+5, level236, color=color2, width=1)
if showFib382
line382 := line.new(bar_index[num_of_cand], level382, bar_index+5, level382, color=color4, width=1)
if showFib500
line500 := line.new(bar_index[num_of_cand], level500, bar_index+5, level500, color=color6,width = 1)
if showFib618
line618 := line.new(bar_index[num_of_cand], level618, bar_index+5, level618, color=color8,width = 1)
if showFib786
line786 := line.new(bar_index[num_of_cand], level786, bar_index+5, level786, color=color10,width = 1)
// Draw dashed line for showing Fib range
var line fibline = na
//-------------------------------------------------------------------------
//Highlight Golden Ration region
//-------------------------------------------------------------------------
var box box1 = na
var box box2 = na
var box box3 = na
var box box2_lower = na
var box box2_upper = na
var box box3_lower = na
var box box3_upper = na
// Draw gradient shading with darker areas above and below 61.8%, fading toward 38.2% and 78.6%
// Delete previous boxes
if not na(box1)
box.delete(box1)
if not na(box2_lower)
box.delete(box2_lower)
if not na(box2_upper)
box.delete(box2_upper)
if not na(box3_lower)
box.delete(box3_lower)
if not na(box3_upper)
box.delete(box3_upper)
// Base layer: Full range (38.2% to 78.6%) - lightest shade
// box1 := box.new(left=bar_index[num_of_cand], top=level786, right=bar_index+5, bottom=level382, bgcolor=color.new(color.yellow, 100), border_width=0)
// Middle layers: Split around 61.8%, fading outward
box2_lower := box.new(left=bar_index[num_of_cand], top=(level618 + level382)/2, right=bar_index+5, bottom=level382, bgcolor=color.new(color.yellow, 100), border_width=0)
box2_upper := box.new(left=bar_index[num_of_cand], top=level786, right=bar_index+5, bottom=(level786 + level618)/2, bgcolor=color.new(color.yellow, 100), border_width=0)
// Core layers: Closest to 61.8%, darkest shade
box3_lower := box.new(left=bar_index[num_of_cand], top=level618, right=bar_index+5, bottom=(level618 + level382)/2, bgcolor=color.new(color.yellow, 85), border_width=0)
box3_upper := box.new(left=bar_index[num_of_cand], top=(level786 + level618)/2, right=bar_index+5, bottom=level618, bgcolor=color.new(color.yellow, 85), border_width=0)
if isUptrend
line.delete(fibline)
fibline := line.new(lowBarIndex, lowestLow, highBarIndex, highestHigh, color=color.gray, style=line.style_dashed)
else
line.delete(fibline)
fibline := line.new(highBarIndex, highestHigh, lowBarIndex, lowestLow, color=color.gray, style=line.style_dashed)
//-------------------------
// Plot SMA
//-------------------------
plot(showSMAShort? Strend:na, title="SMA", color=color.blue, linewidth=1)
plot(showSMALong? LTrend:na, title="Strend", color=#f321b4, linewidth=1)
//-----------------------------------------------------------
//create labels in Thermometer when trend = 1 (uptrend)
//-----------------------------------------------------------
var table_position = Thermometer_position == 'Top right' ? position.top_right :
Thermometer_position == 'Top left' ? position.top_left :
Thermometer_position == 'Top center' ? position.top_center :
Thermometer_position == 'Bottom right' ? position.bottom_right :
Thermometer_position == 'Bottom left' ? position.bottom_left :
Thermometer_position == 'Bottom center' ? position.bottom_center :
Thermometer_position == 'Middle right' ? position.middle_right : position.middle_right
tbl = table.new(position=table_position, columns = 100, rows=100)
closenum=math.round(close,0)
if level0 < level100
table.cell(tbl,0,0,text = label100.get_text() , text_color = #f83f8c)
table.cell(tbl,0,11,text = label236.get_text() ,text_color = #f83f8c)
table.cell(tbl,0,8,text = label382.get_text() ,text_color = #f83f8c)
table.cell(tbl,0,5,text = label618.get_text() , text_color =#f83f8c)
table.cell(tbl,0,2,text = label786.get_text(),text_color = #f83f8c)
table.cell(tbl,0,13,text = label0.get_text(), text_color = #f83f8c)
table.cell(tbl,2,13,text = str.tostring(level0," #,###"), text_color = #f83f8c)
table.cell(tbl,2,11,text = str.tostring(level236, " #,###"),text_color = #f83f8c)
table.cell(tbl,2,8,text = str.tostring(level382, " #,###"),text_color = #f83f8c)
table.cell(tbl,2,5,text = str.tostring(level618, " #,###"), text_color =#f83f8c)
table.cell(tbl,2,2,text = str.tostring(level786, " #,###"),text_color = #f83f8c)
table.cell(tbl,2,0,text = str.tostring(level100," #,###"), text_color = #f83f8c)
for i = 0 to 13 by 1
table.cell(tbl, 1, i, "", bgcolor = i < 8 ? color.from_gradient(i, 0, 7, color.aqua, color.purple) : color.from_gradient(i, 7, 14, color.purple, color.red))
var reg = 0
bkcolor = color.aqua
if closenum > level0 and closenum < level236
reg := 12
if closenum > level236 and closenum < level382
reg := 9
if closenum > level382 and closenum < level618
reg := 6
if closenum > level618 and closenum < level786
reg := 3
if closenum > level786 and closenum < level100
reg := 1
if closenum == level0
reg := 0
if closenum == level236
reg := 11
if closenum == level382
reg := 8
if closenum == level618
reg := 5
if closenum == level786
reg := 2
if reg == 12
bkcolor := color12
if reg == 9
bkcolor := color9
if reg == 6
bkcolor := color6
if reg == 3
bkcolor := color3
if reg == 1
bkcolor := color1
if reg == 2
bkcolor := color2
if reg == 4
bkcolor := color4
if reg == 5
bkcolor := color5
if reg == 7
bkcolor := color7
if reg == 8
bkcolor := color8
if reg == 10
bkcolor := color10
if reg == 11
bkcolor := color11
if reg == 13
bkcolor := color13
table.cell(tbl,1,reg,"🌕", text_size = size.small,bgcolor = bkcolor)
//-----------------------------------------------------------
//create labels in Thermometer
//-----------------------------------------------------------
else
table.cell(tbl,0,13,text = label100.get_text() , text_color = #f83f8c)
table.cell(tbl,0,2,text = label236.get_text() ,text_color = #f83f8c)
table.cell(tbl,0,5,text = label382.get_text() ,text_color = #f83f8c)
table.cell(tbl,0,8,text = label618.get_text() , text_color =#f83f8c)
table.cell(tbl,0,11,text = label786.get_text(),text_color = #f83f8c)
table.cell(tbl,0,0,text = label0.get_text(), text_color = #f83f8c)
table.cell(tbl,2,0,text = str.tostring(level0," #,###"), text_color = #f83f8c)
table.cell(tbl,2,2,text = str.tostring(level236, " #,###"),text_color = #f83f8c)
table.cell(tbl,2,5,text = str.tostring(level382, " #,###"),text_color = #f83f8c)
table.cell(tbl,2,8,text = str.tostring(level618, " #,###"), text_color =#f83f8c)
table.cell(tbl,2,11,text = str.tostring(level786, " #,###"),text_color = #f83f8c)
table.cell(tbl,2,13,text = str.tostring(level100," #,###"), text_color = #f83f8c)
for i = 0 to 13 by 1
table.cell(tbl, 1, i, "", bgcolor = i < 8 ? color.from_gradient(i, 0, 7, color.aqua, color.purple) : color.from_gradient(i, 7, 14, color.purple, color.red))
var reg = 0
bkcolor = color.aqua
if closenum > level100 and closenum < level786
reg := 12
if closenum > level786 and closenum < level618
reg := 9
if closenum > level618 and closenum < level382
reg := 6
if closenum > level382 and closenum < level236
reg := 3
if closenum > level236 and closenum < level0
reg := 1
if closenum == level0
reg := 0
if closenum == level236
reg := 11
if closenum == level382
reg := 8
if closenum == level618
reg := 5
if closenum == level786
reg := 2
if reg == 12
bkcolor := color12
if reg == 9
bkcolor := color9
if reg == 6
bkcolor := color6
if reg == 3
bkcolor := color3
if reg == 1
bkcolor := color1
if reg == 2
bkcolor := color2
if reg == 4
bkcolor := color4
if reg == 5
bkcolor := color5
if reg == 7
bkcolor := color7
if reg == 8
bkcolor := color8
if reg == 10
bkcolor := color10
if reg == 11
bkcolor := color11
if reg == 13
bkcolor := color13
table.cell(tbl,1,reg,"🌕", text_size = size.small,bgcolor = bkcolor)
-75
View File
@@ -1,75 +0,0 @@
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © LonesomeTheBlue
//@version=4
study("Cumulative Delta Volume", "CDV")
linestyle = input(defval = 'Candle', title = "Style", options = ['Candle', 'Line'])
hacandle = input(defval = true, title = "Heikin Ashi Candles?")
showma1 = input(defval = false, title = "SMA 1", inline = "ma1")
ma1len = input(defval = 50, title = "", minval = 1, inline = "ma1")
ma1col = input(defval = color.lime, title = "", inline = "ma1")
showma2 = input(defval = false, title = "SMA 2", inline = "ma2")
ma2len = input(defval = 200, title = "", minval = 1, inline = "ma2")
ma2col = input(defval = color.red, title = "", inline = "ma2")
showema1 = input(defval = false, title = "EMA 1", inline = "ema1")
ema1len = input(defval = 50, title = "", minval = 1, inline = "ema1")
ema1col = input(defval = color.lime, title = "", inline = "ema1")
showema2 = input(defval = false, title = "EMA 2", inline = "ema2")
ema2len = input(defval = 200, title = "", minval = 1, inline = "ema2")
ema2col = input(defval = color.red, title = "", inline = "ema2")
colorup = input(defval = color.lime, title = "Body", inline = "bcol")
colordown = input(defval = color.red, title = "", inline = "bcol")
bcolup = input(defval = #74e05e, title = "Border", inline = "bocol")
bcoldown = input(defval = #ffad7d, title = "", inline = "bocol")
wcolup = input(defval = #b5b5b8, title = "Wicks", inline = "wcol")
wcoldown = input(defval = #b5b5b8, title = "", inline = "wcol")
tw = high - max(open, close)
bw = min(open, close) - low
body = abs(close - open)
_rate(cond) =>
ret = 0.5 * (tw + bw + (cond ? 2 * body : 0)) / (tw + bw + body)
ret := nz(ret) == 0 ? 0.5 : ret
ret
deltaup = volume * _rate(open <= close)
deltadown = volume * _rate(open > close)
delta = close >= open ? deltaup : -deltadown
cumdelta = cum(delta)
float ctl = na
float o = na
float h = na
float l = na
float c = na
if linestyle == 'Candle'
o := cumdelta[1]
h := max(cumdelta, cumdelta[1])
l := min(cumdelta, cumdelta[1])
c := cumdelta
ctl
else
ctl := cumdelta
plot(ctl, title = "CDV Line", color = color.blue, linewidth = 2)
float haclose = na
float haopen = na
float hahigh = na
float halow = na
haclose := (o + h + l + c) / 4
haopen := na(haopen[1]) ? (o + c) / 2 : (haopen[1] + haclose[1]) / 2
hahigh := max(h, max(haopen, haclose))
halow := min(l, min(haopen, haclose))
c_ = hacandle ? haclose : c
o_ = hacandle ? haopen : o
h_ = hacandle ? hahigh : h
l_ = hacandle ? halow : l
plotcandle(o_, h_, l_, c_, title='CDV Candles', color = o_ <= c_ ? colorup : colordown, bordercolor = o_ <= c_ ? bcolup : bcoldown, wickcolor = o_ <= c_ ? bcolup : bcoldown)
plot(showma1 and linestyle == "Candle" ? sma(c_, ma1len) : na, title = "SMA 1", color = ma1col)
plot(showma2 and linestyle == "Candle" ? sma(c_, ma2len) : na, title = "SMA 2", color = ma2col)
plot(showema1 and linestyle == "Candle" ? ema(c_, ema1len) : na, title = "EMA 1", color = ema1col)
plot(showema2 and linestyle == "Candle" ? ema(c_, ema2len) : na, title = "EMA 2", color = ema2col)
-37
View File
@@ -1,37 +0,0 @@
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Ankit_1618
//@version=4
study("Cumulative Volume Delta")
upper_wick = close>open ? high-close : high-open
lower_wick = close>open ? open-low : close-low
spread = high-low
body_length = spread - (upper_wick + lower_wick)
percent_upper_wick = upper_wick/spread
percent_lower_wick = lower_wick/spread
percent_body_length = body_length/spread
buying_volume = close>open ? (percent_body_length + (percent_upper_wick + percent_lower_wick)/2)*volume : ((percent_upper_wick + percent_lower_wick)/2) * volume
selling_volume = close<open ? (percent_body_length + (percent_upper_wick + percent_lower_wick)/2)*volume : ((percent_upper_wick + percent_lower_wick)/2) * volume
cumulation_length = input(14)
cumulative_buying_volume = ema(buying_volume,cumulation_length)
cumulative_selling_volume = ema(selling_volume,cumulation_length)
fill_color = cumulative_buying_volume > cumulative_selling_volume ? color.green : cumulative_buying_volume < cumulative_selling_volume ? color.red : color.yellow
pb = plot(cumulative_buying_volume, color=color.green , transp=70)
ps = plot(cumulative_selling_volume, color=color.red , transp=70)
fill(pb, ps, color = fill_color)
volume_strength_wave = cumulative_buying_volume > cumulative_selling_volume ? cumulative_buying_volume : cumulative_selling_volume
ema_volume_strength_wave = ema(volume_strength_wave , cumulation_length)
plot(ema_volume_strength_wave, color=color.gray, transp=80)
cumulative_volume_delta = cumulative_buying_volume - cumulative_selling_volume
plot(cumulative_volume_delta, color= cumulative_volume_delta>0 ? color.green : color.red, style=plot.style_columns, transp=61)
-135
View File
@@ -1,135 +0,0 @@
//+------------------------------------------------------------------+
//| CumulativeDelta.mq5 |
//| Copyright © 2023, YourName |
//| |
//+------------------------------------------------------------------+
#property copyright "YourName"
#property link "https://www.yourwebsite.com"
#property version "1.00"
//
#include "../Libraries/x-saherelm.common.lib.mq5"
//
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots 3
//
//--- Plot settings for Line
#property indicator_label1 "Cumulative Delta"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrYellow
//
//--- Plot settings for Histogram
#property indicator_label2 "Delta"
#property indicator_type2 DRAW_HISTOGRAM
#property indicator_color2 clrGray
//
//--- Plot settings for Moving Average line
#property indicator_label3 "Signal"
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrOrchid
//
//--- Input parameters
input int MAPeriod = 14; // Period for the moving average
//
//--- Indicator buffers
double MABuffer[];
double DeltaBuffer[];
double CumulativeDeltaBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//
// Attach buffer to the indicator
SetIndexBuffer(2, MABuffer, INDICATOR_DATA);
SetIndexBuffer(1, DeltaBuffer, INDICATOR_DATA);
SetIndexBuffer(0, CumulativeDeltaBuffer, INDICATOR_DATA);
IndicatorSetString(INDICATOR_SHORTNAME, "Cumulative Delta");
//
return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[] //
)
{
//
// Start from the first uncalculated bar
int start = MathMax(prev_calculated - 1, 0);
//
// Loop through bars
for (int i = start; i < rates_total; i++)
{
//
// Calculate Delta based on bar-level data
double delta = 0.0;
if (close[i] > open[i])
{
delta = (double)tick_volume[i]; // Buying pressure (bullish bar)
}
else if (close[i] < open[i])
{
delta = -(double)tick_volume[i]; // Selling pressure (bearish bar)
}
//
// Accumulate cumulative delta
if (i == 0)
{
//
DeltaBuffer[i] = delta;
CumulativeDeltaBuffer[i] = delta; // First bar starts with delta
}
else
{
//
DeltaBuffer[i] = DeltaBuffer[i - 1] + delta;
CumulativeDeltaBuffer[i] = CumulativeDeltaBuffer[i - 1] + delta;
}
//
// Calculate Moving Average of Cumulative Delta
if (i >= MAPeriod - 1)
{
//
double sum = 0.0;
for (int j = 0; j < MAPeriod; j++)
{
sum += CumulativeDeltaBuffer[i - j];
}
//
MABuffer[i] = sum / MAPeriod; // Simple Moving Average
}
else
{
MABuffer[i] = EMPTY_VALUE; // Not enough data for MA
}
}
//
return (rates_total);
}
//+------------------------------------------------------------------+
-347
View File
@@ -1,347 +0,0 @@
//+------------------------------------------------------------------+
//| ForexSessionHighLowIndicator.mq5 |
//| Copyright 2023, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net/"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_plots 4
// Session times (in broker time)
input string SydneyStart = "22:00"; // Sydney session start (GMT+10 when DST)
input string SydneyEnd = "07:00"; // Sydney session end
input string TokyoStart = "00:00"; // Tokyo session start (GMT+9)
input string TokyoEnd = "09:00"; // Tokyo session end
input string LondonStart = "08:00"; // London session start (GMT+0)
input string LondonEnd = "17:00"; // London session end
input string NewYorkStart = "13:00"; // New York session start (GMT-4/5)
input string NewYorkEnd = "22:00"; // New York session end
input color SydneyColor = clrDodgerBlue; // Sydney session color
input color TokyoColor = clrMediumSeaGreen; // Tokyo session color
input color LondonColor = clrGold; // London session color
input color NewYorkColor = clrTomato; // New York session color
input int LineWidth = 1; // Line width
input bool ShowLabels = true; // Show session labels
input bool ShowHighLow = true; // Show high/low prices
// Buffers for session high/low
double SydneyHighBuffer[];
double SydneyLowBuffer[];
double TokyoHighBuffer[];
double TokyoLowBuffer[];
double LondonHighBuffer[];
double LondonLowBuffer[];
double NewYorkHighBuffer[];
double NewYorkLowBuffer[];
// Global variables
int SydneyStartHour, SydneyStartMin;
int SydneyEndHour, SydneyEndMin;
int TokyoStartHour, TokyoStartMin;
int TokyoEndHour, TokyoEndMin;
int LondonStartHour, LondonStartMin;
int LondonEndHour, LondonEndMin;
int NewYorkStartHour, NewYorkStartMin;
int NewYorkEndHour, NewYorkEndMin;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// Parse session times
ParseTime(SydneyStart, SydneyStartHour, SydneyStartMin);
ParseTime(SydneyEnd, SydneyEndHour, SydneyEndMin);
ParseTime(TokyoStart, TokyoStartHour, TokyoStartMin);
ParseTime(TokyoEnd, TokyoEndHour, TokyoEndMin);
ParseTime(LondonStart, LondonStartHour, LondonStartMin);
ParseTime(LondonEnd, LondonEndHour, LondonEndMin);
ParseTime(NewYorkStart, NewYorkStartHour, NewYorkStartMin);
ParseTime(NewYorkEnd, NewYorkEndHour, NewYorkEndMin);
// Set indicator properties
SetIndexBuffer(0, SydneyHighBuffer, INDICATOR_DATA);
SetIndexBuffer(1, SydneyLowBuffer, INDICATOR_DATA);
SetIndexBuffer(2, TokyoHighBuffer, INDICATOR_DATA);
SetIndexBuffer(3, TokyoLowBuffer, INDICATOR_DATA);
SetIndexBuffer(4, LondonHighBuffer, INDICATOR_DATA);
SetIndexBuffer(5, LondonLowBuffer, INDICATOR_DATA);
SetIndexBuffer(6, NewYorkHighBuffer, INDICATOR_DATA);
SetIndexBuffer(7, NewYorkLowBuffer, INDICATOR_DATA);
// Set drawing styles
PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
PlotIndexSetInteger(0, PLOT_LINE_COLOR, SydneyColor);
PlotIndexSetInteger(0, PLOT_LINE_WIDTH, LineWidth);
PlotIndexSetString(0, PLOT_LABEL, "Sydney High");
PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_LINE);
PlotIndexSetInteger(1, PLOT_LINE_COLOR, SydneyColor);
PlotIndexSetInteger(1, PLOT_LINE_STYLE, STYLE_DOT);
PlotIndexSetInteger(1, PLOT_LINE_WIDTH, LineWidth);
PlotIndexSetString(1, PLOT_LABEL, "Sydney Low");
PlotIndexSetInteger(2, PLOT_DRAW_TYPE, DRAW_LINE);
PlotIndexSetInteger(2, PLOT_LINE_COLOR, TokyoColor);
PlotIndexSetInteger(2, PLOT_LINE_WIDTH, LineWidth);
PlotIndexSetString(2, PLOT_LABEL, "Tokyo High");
PlotIndexSetInteger(3, PLOT_DRAW_TYPE, DRAW_LINE);
PlotIndexSetInteger(3, PLOT_LINE_COLOR, TokyoColor);
PlotIndexSetInteger(3, PLOT_LINE_STYLE, STYLE_DOT);
PlotIndexSetInteger(3, PLOT_LINE_WIDTH, LineWidth);
PlotIndexSetString(3, PLOT_LABEL, "Tokyo Low");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
// Check if we have enough data
if(rates_total < 2) return(0);
// Set all buffers to EMPTY_VALUE initially
ArrayInitialize(SydneyHighBuffer, EMPTY_VALUE);
ArrayInitialize(SydneyLowBuffer, EMPTY_VALUE);
ArrayInitialize(TokyoHighBuffer, EMPTY_VALUE);
ArrayInitialize(TokyoLowBuffer, EMPTY_VALUE);
ArrayInitialize(LondonHighBuffer, EMPTY_VALUE);
ArrayInitialize(LondonLowBuffer, EMPTY_VALUE);
ArrayInitialize(NewYorkHighBuffer, EMPTY_VALUE);
ArrayInitialize(NewYorkLowBuffer, EMPTY_VALUE);
// Calculate start position
int start = (prev_calculated == 0) ? 0 : prev_calculated - 1;
// Main calculation loop
for(int i = start; i < rates_total; i++)
{
MqlDateTime dt;
TimeToStruct(time[i], dt);
// Check if current time is within any session
bool inSydney = IsInSession(dt.hour, dt.min, SydneyStartHour, SydneyStartMin, SydneyEndHour, SydneyEndMin);
bool inTokyo = IsInSession(dt.hour, dt.min, TokyoStartHour, TokyoStartMin, TokyoEndHour, TokyoEndMin);
bool inLondon = IsInSession(dt.hour, dt.min, LondonStartHour, LondonStartMin, LondonEndHour, LondonEndMin);
bool inNewYork = IsInSession(dt.hour, dt.min, NewYorkStartHour, NewYorkStartMin, NewYorkEndHour, NewYorkEndMin);
// Find session boundaries and calculate high/low
if(inSydney)
{
CalculateSessionHighLow(i, rates_total, time, high, low, SydneyHighBuffer, SydneyLowBuffer, SydneyStartHour, SydneyStartMin, SydneyEndHour, SydneyEndMin);
}
if(inTokyo)
{
CalculateSessionHighLow(i, rates_total, time, high, low, TokyoHighBuffer, TokyoLowBuffer, TokyoStartHour, TokyoStartMin, TokyoEndHour, TokyoEndMin);
}
if(inLondon)
{
CalculateSessionHighLow(i, rates_total, time, high, low, LondonHighBuffer, LondonLowBuffer, LondonStartHour, LondonStartMin, LondonEndHour, LondonEndMin);
}
if(inNewYork)
{
CalculateSessionHighLow(i, rates_total, time, high, low, NewYorkHighBuffer, NewYorkLowBuffer, NewYorkStartHour, NewYorkStartMin, NewYorkEndHour, NewYorkEndMin);
}
// Add labels if enabled
if(ShowLabels && i == rates_total - 1)
{
AddSessionLabels(time[rates_total-1], high[rates_total-1], low[rates_total-1]);
}
}
return(rates_total);
}
//+------------------------------------------------------------------+
//| Parse time string into hours and minutes |
//+------------------------------------------------------------------+
void ParseTime(string timeStr, int &hour, int &min)
{
string parts[];
StringSplit(timeStr, ':', parts);
hour = (int)StringToInteger(parts[0]);
min = (ArraySize(parts) > 1) ? (int)StringToInteger(parts[1]) : 0;
}
//+------------------------------------------------------------------+
//| Check if current time is within a session |
//+------------------------------------------------------------------+
bool IsInSession(int currentHour, int currentMin, int startHour, int startMin, int endHour, int endMin)
{
int currentTime = currentHour * 100 + currentMin;
int sessionStart = startHour * 100 + startMin;
int sessionEnd = endHour * 100 + endMin;
// Handle sessions that cross midnight
if(sessionStart > sessionEnd)
{
return(currentTime >= sessionStart || currentTime < sessionEnd);
}
else
{
return(currentTime >= sessionStart && currentTime < sessionEnd);
}
}
//+------------------------------------------------------------------+
//| Calculate session high and low |
//+------------------------------------------------------------------+
void CalculateSessionHighLow(int index, int rates_total, const datetime &time[], const double &high[], const double &low[],
double &highBuffer[], double &lowBuffer[], int startHour, int startMin, int endHour, int endMin)
{
// Find the start of the current session
MqlDateTime currentDt, sessionStartDt;
TimeToStruct(time[index], currentDt);
TimeToStruct(time[index], sessionStartDt);
sessionStartDt.hour = startHour;
sessionStartDt.min = startMin;
sessionStartDt.sec = 0;
datetime sessionStartTime = StructToTime(sessionStartDt);
// If session crosses midnight, adjust the start time
int sessionStart = startHour * 100 + startMin;
int sessionEnd = endHour * 100 + endMin;
if(sessionStart > sessionEnd)
{
// Session crosses midnight, check if we need to use previous day
int currentTime = currentDt.hour * 100 + currentDt.min;
if(currentTime < sessionEnd)
{
sessionStartTime -= 86400; // Subtract one day
}
}
// Find the bar index for the session start
int sessionStartIndex = iBarShift(NULL, 0, sessionStartTime);
if(sessionStartIndex < 0) sessionStartIndex = 0;
// Calculate high and low for the session
double sessionHigh = high[sessionStartIndex];
double sessionLow = low[sessionStartIndex];
for(int j = sessionStartIndex; j <= index; j++)
{
if(j >= rates_total) continue;
if(high[j] > sessionHigh) sessionHigh = high[j];
if(low[j] < sessionLow) sessionLow = low[j];
}
// Store the values in buffers
highBuffer[index] = sessionHigh;
lowBuffer[index] = sessionLow;
// If ShowHighLow is enabled, draw the levels
if(ShowHighLow && index == rates_total - 1)
{
string sessionName = "";
color sessionClr = clrNONE;
if(startHour == SydneyStartHour && startMin == SydneyStartMin)
{
sessionName = "Sydney";
sessionClr = SydneyColor;
}
else if(startHour == TokyoStartHour && startMin == TokyoStartMin)
{
sessionName = "Tokyo";
sessionClr = TokyoColor;
}
else if(startHour == LondonStartHour && startMin == LondonStartMin)
{
sessionName = "London";
sessionClr = LondonColor;
}
else if(startHour == NewYorkStartHour && startMin == NewYorkStartMin)
{
sessionName = "NewYork";
sessionClr = NewYorkColor;
}
if(sessionName != "")
{
string highLabel = sessionName + " High: " + DoubleToString(sessionHigh, _Digits);
string lowLabel = sessionName + " Low: " + DoubleToString(sessionLow, _Digits);
ObjectCreate(0, highLabel, OBJ_HLINE, 0, 0, sessionHigh);
ObjectSetInteger(0, highLabel, OBJPROP_COLOR, sessionClr);
ObjectSetInteger(0, highLabel, OBJPROP_WIDTH, LineWidth);
ObjectSetInteger(0, highLabel, OBJPROP_BACK, true);
ObjectCreate(0, lowLabel, OBJ_HLINE, 0, 0, sessionLow);
ObjectSetInteger(0, lowLabel, OBJPROP_COLOR, sessionClr);
ObjectSetInteger(0, lowLabel, OBJPROP_WIDTH, LineWidth);
ObjectSetInteger(0, lowLabel, OBJPROP_STYLE, STYLE_DOT);
ObjectSetInteger(0, lowLabel, OBJPROP_BACK, true);
}
}
}
//+------------------------------------------------------------------+
//| Add session labels to the chart |
//+------------------------------------------------------------------+
void AddSessionLabels(datetime currentTime, double currentHigh, double currentLow)
{
MqlDateTime dt;
TimeToStruct(currentTime, dt);
// Remove previous labels
ObjectsDeleteAll(0, "SessionLabel_");
if(IsInSession(dt.hour, dt.min, SydneyStartHour, SydneyStartMin, SydneyEndHour, SydneyEndMin))
{
ObjectCreate(0, "SessionLabel_Sydney", OBJ_TEXT, 0, currentTime, currentHigh + 10 * _Point);
ObjectSetString(0, "SessionLabel_Sydney", OBJPROP_TEXT, "Sydney Session");
ObjectSetInteger(0, "SessionLabel_Sydney", OBJPROP_COLOR, SydneyColor);
ObjectSetInteger(0, "SessionLabel_Sydney", OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER);
}
if(IsInSession(dt.hour, dt.min, TokyoStartHour, TokyoStartMin, TokyoEndHour, TokyoEndMin))
{
ObjectCreate(0, "SessionLabel_Tokyo", OBJ_TEXT, 0, currentTime, currentHigh + 20 * _Point);
ObjectSetString(0, "SessionLabel_Tokyo", OBJPROP_TEXT, "Tokyo Session");
ObjectSetInteger(0, "SessionLabel_Tokyo", OBJPROP_COLOR, TokyoColor);
ObjectSetInteger(0, "SessionLabel_Tokyo", OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER);
}
if(IsInSession(dt.hour, dt.min, LondonStartHour, LondonStartMin, LondonEndHour, LondonEndMin))
{
ObjectCreate(0, "SessionLabel_London", OBJ_TEXT, 0, currentTime, currentHigh + 30 * _Point);
ObjectSetString(0, "SessionLabel_London", OBJPROP_TEXT, "London Session");
ObjectSetInteger(0, "SessionLabel_London", OBJPROP_COLOR, LondonColor);
ObjectSetInteger(0, "SessionLabel_London", OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER);
}
if(IsInSession(dt.hour, dt.min, NewYorkStartHour, NewYorkStartMin, NewYorkEndHour, NewYorkEndMin))
{
ObjectCreate(0, "SessionLabel_NewYork", OBJ_TEXT, 0, currentTime, currentHigh + 40 * _Point);
ObjectSetString(0, "SessionLabel_NewYork", OBJPROP_TEXT, "New York Session");
ObjectSetInteger(0, "SessionLabel_NewYork", OBJPROP_COLOR, NewYorkColor);
ObjectSetInteger(0, "SessionLabel_NewYork", OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER);
}
}
//+------------------------------------------------------------------+
-35
View File
@@ -1,35 +0,0 @@
//
XCPOIDrawer *drawer = cHelper.mPOIDrawer;
//
if (cStateEvents.hasNewFairValueGap)
{
//
int idx = GetYoungest(cState.fairValueGaps);
has = IsValidIndex(idx);
if (has)
{
//
XBoxZone box;
has = ToBox(
box,
cState.fairValueGaps[idx] //
);
if (has)
{
//
XCBoxObject *iObj;
has = drawer.DrawBox(
box,
iObj //
);
if (has)
{
Print("Box Drawn ...");
}
}
}
}
//
ZeroMemory(drawer);
-66
View File
@@ -1,66 +0,0 @@
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Mattes00
//@version=6
indicator("25-75 Percentile SuperTrend | Mattes", shorttitle = "25-75 ST | Mattes", overlay = true)
subject = input.int (14,"Supertrend length", minval = 2 , group="25-75 Percentile SuperTrend")
mult = input.float (1, "Multiplier", step=0.05,group="25-75 Percentile SuperTrend")
slen = input.int (27, "Percentile length", group="25-75 Percentile SuperTrend")
src_2575 = input.source(high, "Median smoothing source", group="25-75 Percentile SuperTrend")
smooth_lower = ta.percentile_nearest_rank(src_2575, slen, 25)
smooth_upper = ta.percentile_nearest_rank(src_2575, slen, 75)
Percentile_SuperTrend_func(mult, atrPeriod) =>
src_long = smooth_upper
src_short = smooth_lower
atr = ta.atr(atrPeriod)
upper = src_long + mult * atr
lower = src_short - mult * atr
pl = nz(lower[1])
pu = nz(upper[1])
lower := lower > pl or close[1] < pl ? lower : pl
upper := upper < pu or close[1] > pu ? upper : pu
int dist = na
float st = na
pt = st[1]
if na(atr[1])
dist := 1
else if pt == pu
dist := close > upper ? -1 : 1
else
dist := close < lower ? 1 : -1
st := dist == -1 ? lower : upper
[st, dist]
[x, dist] = Percentile_SuperTrend_func(mult, subject)
ST_L = ta.crossunder(dist, 0)
ST_S = ta.crossover(dist, 0)
Long = ST_L
Short = ST_S
var Mattes = 0
if (Long and not Short)
Mattes := 1
if Short
Mattes := -1
syscol = Mattes == 1 ? color.rgb(45, 162, 252) : Mattes == -1 ? color.rgb(113, 59, 249) : color.gray
BlueTransParent = color.new(color.rgb(45, 162, 252), 50)
PurpleTransParent = color.new(color.rgb(113, 59, 249), 50)
plotcandle(open, high, low, close, 'BarColor', color = syscol, bordercolor = syscol, wickcolor = syscol,force_overlay = true)
upTrend = plot(dist < 0 ? x : na, "Up Trend", color = color.rgb(45, 162, 252), style = plot.style_linebr, linewidth = 2)
downTrend = plot(dist < 0 ? na : x, "Down Trend", color = color.rgb(113, 59, 249), style = plot.style_linebr, linewidth = 2)
s = plot((smooth_lower + smooth_upper) / 2, color = syscol)
fill(s, upTrend, BlueTransParent, fillgaps = false)
fill(s, downTrend, PurpleTransParent, fillgaps = false)
-318
View File
@@ -1,318 +0,0 @@
//+------------------------------------------------------------------+
//| Forex Sessions and Day Range Indicator |
//+------------------------------------------------------------------+
#property copyright "Your Name"
#property link "https://www.example.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 8 // 4 sessions * (High + Low)
#include "../Libraries/x-saherelm.common.lib.mq5"
#include <Arrays/ArrayObj.mqh>
// Define an enumeration for DST rules
enum DST_RULE
{
DST_SYDNEY,
DST_TOKYO,
DST_LONDON,
DST_NEW_YORK
};
struct SessionInfo
{
string name;
int startHour; // Standard start hour (GMT)
int startMinute;
int endHour; // Standard end hour (GMT)
int endMinute;
DST_RULE dstRule; // DST rule for the session
int dstAdjustment; // Hours to add during DST
};
SessionInfo sessions[] = {
{"Sydney", 21, 0, 5, 0, DST_SYDNEY, 1},
{"Tokyo", 23, 0, 8, 0, DST_TOKYO, 0},
{"London", 7, 0, 15, 0, DST_LONDON, 1},
{"New York", 12, 0, 17, 0, DST_NEW_YORK, 1}};
double sessionHighBuffers[]; // Buffer for session highs
double sessionLowBuffers[]; // Buffer for session lows
bool sessionActive[];
double sessionHigh[];
double sessionLow[];
datetime sessionStartTime[];
datetime sessionEndTime[];
double dayHigh = 0;
double dayLow = 0;
datetime dayStartTime;
// Function to extract the year from a datetime value
int GetYear(datetime time)
{
return (int)StringSubstr(TimeToString(time, TIME_DATE), 0, 4);
}
// Function to extract the day of the month from a datetime value
int GetDay(datetime time)
{
MqlDateTime dt;
TimeToStruct(time, dt);
return dt.day;
}
// Function to extract the day of the week from a datetime value (0=Sunday, 6=Saturday)
int GetDayOfWeek(datetime time)
{
MqlDateTime dt;
TimeToStruct(time, dt);
return dt.day_of_week;
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
ArrayResize(sessionActive, ArraySize(sessions));
ArrayResize(sessionHigh, ArraySize(sessions));
ArrayResize(sessionLow, ArraySize(sessions));
ArrayResize(sessionStartTime, ArraySize(sessions));
ArrayResize(sessionEndTime, ArraySize(sessions));
for (int i = 0; i < ArraySize(sessions); i++)
{
sessionActive[i] = false;
sessionHigh[i] = 0;
sessionLow[i] = 0;
sessionStartTime[i] = 0;
sessionEndTime[i] = 0;
}
dayHigh = 0;
dayLow = 0;
dayStartTime = 0;
// Initialize buffers for session highs and lows
int totalSessions = ArraySize(sessions);
int totalBars = iBars(NULL, 0); // Get the number of bars on the chart
ArrayResize(sessionHighBuffers, totalBars); // Resize to match the number of bars
ArrayResize(sessionLowBuffers, totalBars); // Resize to match the number of bars
for (int i = 0; i < totalSessions; i++)
{
SetIndexBuffer(i * 2, sessionHighBuffers, INDICATOR_DATA);
SetIndexBuffer(i * 2 + 1, sessionLowBuffers, INDICATOR_DATA);
// Optional: Set colors for high and low buffers
PlotIndexSetInteger(i * 2, PLOT_LINE_COLOR, clrGreen);
PlotIndexSetInteger(i * 2 + 1, PLOT_LINE_COLOR, clrRed);
IndicatorSetInteger(INDICATOR_LEVELS, 0); // No predefined levels
IndicatorSetString(INDICATOR_SHORTNAME, "Forex Sessions");
}
return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
// Ensure buffers are resized to match the number of bars
if (ArraySize(sessionHighBuffers) < rates_total)
{
ArrayResize(sessionHighBuffers, rates_total);
ArrayResize(sessionLowBuffers, rates_total);
}
datetime currentTime = TimeCurrent();
// Retrieve Ask and Bid prices dynamically
double askPrice = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
double bidPrice = SymbolInfoDouble(Symbol(), SYMBOL_BID);
// Check each session
for (int i = 0; i < ArraySize(sessions); i++)
{
SessionInfo session = sessions[i];
// Determine if DST is active using the session's DST rule
bool dstActive = IsDSTActive(session.dstRule, currentTime);
int adjStartHour = session.startHour + (dstActive ? session.dstAdjustment : 0);
int adjEndHour = session.endHour + (dstActive ? session.dstAdjustment : 0);
datetime todayStart = StringToTime(TimeToString(currentTime, TIME_DATE) + " " +
IntegerToString(adjStartHour) + ":" +
IntegerToString(session.startMinute));
datetime todayEnd = StringToTime(TimeToString(currentTime, TIME_DATE) + " " +
IntegerToString(adjEndHour) + ":" +
IntegerToString(session.endMinute));
// Handle sessions spanning midnight
if (adjEndHour < adjStartHour)
{
todayEnd += 24 * 3600;
}
if (currentTime >= todayStart && currentTime < todayEnd)
{
if (!sessionActive[i])
{
sessionActive[i] = true;
sessionStartTime[i] = todayStart;
sessionEndTime[i] = todayEnd;
sessionHigh[i] = askPrice;
sessionLow[i] = bidPrice;
}
else
{
if (askPrice > sessionHigh[i])
sessionHigh[i] = askPrice;
if (bidPrice < sessionLow[i])
sessionLow[i] = bidPrice;
}
// Update buffers for the current bar
sessionHighBuffers[rates_total - 1] = sessionHigh[i];
sessionLowBuffers[rates_total - 1] = sessionLow[i];
}
else
{
sessionActive[i] = false;
sessionHighBuffers[rates_total - 1] = EMPTY_VALUE; // Clear buffer when session is inactive
sessionLowBuffers[rates_total - 1] = EMPTY_VALUE;
}
}
// Check day range
bool dstActiveNY = IsDSTActive(DST_NEW_YORK, currentTime);
int dayStartHour = dstActiveNY ? 21 : 22;
datetime todayDayStart = StringToTime(TimeToString(currentTime, TIME_DATE) + " " +
IntegerToString(dayStartHour) + ":00");
if (currentTime < todayDayStart)
{
todayDayStart -= 24 * 3600;
}
if (dayStartTime != todayDayStart)
{
dayStartTime = todayDayStart;
dayHigh = askPrice;
dayLow = bidPrice;
}
else
{
if (askPrice > dayHigh)
dayHigh = askPrice;
if (bidPrice < dayLow)
dayLow = bidPrice;
}
// Display information on chart
string comment = "Active Forex Sessions:\n";
for (int i = 0; i < ArraySize(sessions); i++)
{
if (sessionActive[i])
{
comment += sessions[i].name + " Session\n" +
"High: " + DoubleToString(sessionHigh[i], _Digits) + "\n" +
"Low: " + DoubleToString(sessionLow[i], _Digits) + "\n";
}
}
comment += "\nDay Range:\n" +
"High: " + DoubleToString(dayHigh, _Digits) + "\n" +
"Low: " + DoubleToString(dayLow, _Digits);
Comment(comment);
return (rates_total);
}
//+------------------------------------------------------------------+
//| Check if DST is active for a given session |
//+------------------------------------------------------------------+
bool IsDSTActive(DST_RULE dstRule, datetime time)
{
switch (dstRule)
{
case DST_SYDNEY:
return IsSydneyDST(time);
case DST_TOKYO:
return IsTokyoDST(time);
case DST_LONDON:
return IsLondonDST(time);
case DST_NEW_YORK:
return IsNewYorkDST(time);
default:
return false;
}
}
//+------------------------------------------------------------------+
//| DST Check Functions |
//+------------------------------------------------------------------+
bool IsLondonDST(datetime time)
{
int year = GetYear(time);
datetime march31 = StringToTime(ToString(year) + ".03.31 00:00");
int lastSundayMarch = GetDay(march31) - (GetDayOfWeek(march31) % 7);
datetime dstStart = StringToTime(ToString(year) + ".03." + IntegerToString(lastSundayMarch) + " 01:00");
datetime oct31 = StringToTime(ToString(year) + ".10.31 00:00");
int lastSundayOct = GetDay(oct31) - (GetDayOfWeek(oct31) % 7);
datetime dstEnd = StringToTime(ToString(year) + ".10." + IntegerToString(lastSundayOct) + " 01:00");
return time >= dstStart && time < dstEnd;
}
bool IsNewYorkDST(datetime time)
{
int year = GetYear(time);
datetime march1 = StringToTime(ToString(year) + ".03.01 00:00");
int dayOfWeekMarch1 = GetDayOfWeek(march1);
int secondSundayMarch = 1 + (7 - dayOfWeekMarch1) % 7 + 7;
datetime dstStart = StringToTime(ToString(year) + ".03." + IntegerToString(secondSundayMarch) + " 07:00");
datetime nov1 = StringToTime(ToString(year) + ".11.01 00:00");
int dayOfWeekNov1 = GetDayOfWeek(nov1);
int firstSundayNov = 1 + (7 - dayOfWeekNov1) % 7;
datetime dstEnd = StringToTime(ToString(year) + ".11." + IntegerToString(firstSundayNov) + " 06:00");
return time >= dstStart && time < dstEnd;
}
bool IsSydneyDST(datetime time)
{
int year = GetYear(time);
datetime oct1 = StringToTime(ToString(year) + ".10.01 00:00");
int dayOfWeekOct1 = GetDayOfWeek(oct1);
int firstSundayOct = 1 + (7 - dayOfWeekOct1) % 7;
datetime dstStart = StringToTime(ToString(year) + ".10." + IntegerToString(firstSundayOct) + " 13:00");
datetime apr1 = StringToTime(ToString(year) + ".04.01 00:00");
int dayOfWeekApr1 = GetDayOfWeek(apr1);
int firstSundayApr = 1 + (7 - dayOfWeekApr1) % 7;
datetime dstEnd = StringToTime(ToString(year) + ".04." + IntegerToString(firstSundayApr) + " 15:00");
return time >= dstStart && time < dstEnd;
}
bool IsTokyoDST(datetime time)
{
// Tokyo does not observe Daylight Saving Time (DST)
return false;
}
-798
View File
@@ -1,798 +0,0 @@
//
// Checking Bar Based on Positions State ...
ENUM_X_DIRECTION iBarPosDir;
bool isBarValidForDir = cHelper
.mBarAnalyser
.IsValidForPosition(
cBar,
iBarPosDir //
);
bool isBarValidForBullish =
isBarValidForDir &&
IsBullish(iBarPosDir);
bool isBarValidForBearish =
isBarValidForDir &&
IsBearish(iBarPosDir);
//
// Check Bar Place Based on Golden Zones ...
//
bool isBarInPeaksGoldenZone =
cBar.high <= cXConditions.peaksBuffer[cIDX] &&
cBar.low >= cXConditions.peaksGoldenBuffer[cIDX];
//
bool isBarInValesGoldenZone =
cBar.high >= cXConditions.valesBuffer[cIDX] &&
cBar.low <= cXConditions.valesGoldenBuffer[cIDX];
//
XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer;
//
// X3MA ...
//
bool isX3MaFastMidOverPeaksGoldeZone =
isX3MaFastOverPeaksGoldenZone &&
isX3MaMidOverPeaksGoldenZone;
//
bool isX3MaFastMidUnderValesGoldeZone =
isX3MaFastUnderValesGoldenZone &&
isX3MaMidUnderValesGoldenZone;
//
// XVWAP ...
//
bool isVWapFastMidOverPeaksGoldeZone =
isVWapFastOverPeaksGoldenZone &&
isVWapMidOverPeaksGoldenZone;
//
bool isVWapFastMidUnderValesGoldeZone =
isVWapFastUnderValesGoldenZone &&
isVWapMidUnderValesGoldenZone;
//
//
//
bool isX3MaVWapFastUnderValuesGoldenZone =
isX3MaFastUnderValesGoldenZone &&
isVWapFastUnderValesGoldenZone;
//
bool isX3MaVWapFastOverPeaksGoldenZone =
isX3MaFastOverPeaksGoldenZone &&
isVWapFastOverPeaksGoldenZone;
//
//
//
double x3MaFastMidMax = MathMax(
cXConditions.x3maFastBuffer[cIDX],
cXConditions.x3maMidBuffer[cIDX] //
);
//
double x3MaFastMidMin = MathMin(
cXConditions.x3maFastBuffer[cIDX],
cXConditions.x3maMidBuffer[cIDX] //
);
//
double vwapFastMidMax = MathMax(
cXConditions.vwapFastBuffer[cIDX],
cXConditions.vwapMidBuffer[cIDX] //
);
//
double vwapFastMidMin = MathMin(
cXConditions.vwapFastBuffer[cIDX],
cXConditions.vwapMidBuffer[cIDX] //
);
//
//
//
double x3maVWapFastMidMax = MathMax(x3MaFastMidMax, vwapFastMidMax);
double x3maVWapFastMidMin = MathMin(x3MaFastMidMin, vwapFastMidMin);
//
double x3maVWapMax = MathMax(cXConditions.x3maMax, cXConditions.vwapMax);
double x3maVWapMin = MathMin(cXConditions.x3maMin, cXConditions.vwapMin);
//
double x3maVWapDiff = x3maVWapMax - x3maVWapMin;
//
double atr = cXConditions.atrBuffer[cIDX];
//
bool isConsolidate = x3maVWapDiff <= (3 * atr);
//
bool isX3MaVWapSwitchedToBullish =
//
// VWap ...
(
//
(cXConditions.isVWapBullishOrdered &&
cXConditions.isVWapSwitchedToBullishState) ||
(cXConditions.isVWapBullishState &&
cXConditions.isVWapSwitchedToBullishOrdered)
//
)
//
||
//
// X3Ma ...
(
//
(cXConditions.isX3MaBullishOrdered &&
cXConditions.isX3MaSwitchedToBullishState) ||
(cXConditions.isX3MaBullishState &&
cXConditions.isX3MaSwitchedToBullishOrdered)
//
)
//
;
//
bool isX3MaVWapSwitchedToBearish =
//
// VWap ...
(
//
(cXConditions.isVWapBearishOrdered &&
cXConditions.isVWapSwitchedToBearishState) ||
(cXConditions.isVWapBearishState &&
cXConditions.isVWapSwitchedToBearishOrdered)
//
)
//
||
//
// X3Ma ...
(
//
(cXConditions.isX3MaBearishOrdered &&
cXConditions.isX3MaSwitchedToBearishState) ||
(cXConditions.isX3MaBearishState &&
cXConditions.isX3MaSwitchedToBearishOrdered)
//
)
//
;
//
// Bullish Conditions ...
isBullish =
//
// Base Condition ...
(
//
false
//
// isConsolidate &&
// isBarValidForBullish &&
// cXConditions.isSarBullish &&
// isX3MaVWapSwitchedToBullish &&
// cXConditions.isNewPeakOverLast // &&
// isVWapFastMidUnderValesGoldeZone // &&
// cXConditions.isAtrLowerSlopeBullish
//
)
//
;
//
// Bearish Conditions ...
isBearish =
//
// Base Condition ...
(
//
false
//
// isConsolidate &&
// isBarValidForBearish &&
// cXConditions.isSarBearish &&
// isX3MaVWapSwitchedToBearish &&
// cXConditions.isNewValeUnderLast // &&
// isVWapFastMidOverPeaksGoldeZone // &&
// cXConditions.isAtrUpperSlopeBearish
//
)
//
;
////////////////////////////////////////////////////////////////////
//
// XWPVZ ...
bool HasXWPVZConditions(
ENUM_X_CYCLES cycle,
XSignalBox &box,
ENUM_X_DIRECTION &dir,
X121SMCStrategySignalProviderData &provider,
int barIndex = 0 //
)
{
//
bool result = false;
//
box.Clean();
dir = X_DIRECTION_NONE;
//
// Fil Selected Data ...
XPOIState cState;
X121Conditions cXConditions;
XPOIStateEvents cStateEvents;
XC121SMCCycleHelper *cHelper;
X121SMCCycleConditions cConditions;
result = provider.SelectCycle(
cycle,
cState,
cStateEvents,
cXConditions,
cHelper,
cConditions //
);
if (!result)
{
//
cState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
cStateEvents.Clean();
//
return result;
}
Parse(cXConditions);
//
// Normalize Args ...
//
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;
int ppIDX = pIDX + 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();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
//
return result;
}
//
XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer;
//
// Checking Other Conditions ...
//
// Checking Bar Based on Positions State ...
ENUM_X_DIRECTION iBarPosDir;
bool isBarValidForDir = cHelper
.mBarAnalyser
.IsValidForPosition(
cBar,
iBarPosDir //
);
bool isBarValidForBullish =
isBarValidForDir &&
IsBullish(iBarPosDir);
bool isBarValidForBearish =
isBarValidForDir &&
IsBearish(iBarPosDir);
// //
// // Continuation Bullish ...
// bool isContinuationBullish =
// //
// isBarValidForBullish &&
// cXConditions.isSarBullish &&
// cXConditions.isStrBullish &&
// cXConditions.isNewPeakOverLast
// //
// ;
// //
// // Continuation Bearish ...
// bool isContinuationBearish =
// //
// isBarValidForBearish &&
// cXConditions.isSarBearish &&
// cXConditions.isStrBearish &&
// cXConditions.isNewValeUnderLast
// //
// ;
//
XBoxZone obBox;
XBoxZone fvgBox;
XBoxZone supResBox;
XBoxZone tmpBoxes[];
bool isBullishFVGRejected = false;
bool isBearishFVGRejected = false;
bool isFVGLowerBullishRejected = false;
bool isFVGUpperBullishRejected = false;
bool isFVGLowerBearishRejected = false;
bool isFVGUpperBearishRejected = false;
has = cState.HasFairValueGaps();
if (has)
{
//
// Converts FairValueGaps to Box ...
ToBox(
cState.fairValueGaps,
tmpBoxes //
);
//
// Select FVG ...
while (HasChild(tmpBoxes))
{
//
idx = GetYoungest(tmpBoxes);
has = IsValidIndex(idx);
if (!has)
{
break;
}
//
XBoxZone iBox = tmpBoxes[idx];
ArrayRemove(
tmpBoxes,
idx,
1 //
);
//
isFVGLowerBullishRejected =
//
cBar.low < iBox.lower &&
cBar.GetDown() > iBox.lower
//
;
//
isFVGUpperBullishRejected =
//
cBar.low < iBox.upper &&
cBar.GetDown() > iBox.upper
//
;
//
isFVGLowerBearishRejected =
//
cBar.high > iBox.lower &&
cBar.GetUp() < iBox.lower
//
;
//
isFVGUpperBearishRejected =
//
cBar.high > iBox.upper &&
cBar.GetUp() < iBox.upper
//
;
//
//
//
isBullishFVGRejected =
//
iBox.IsBullish() &&
cBar.IsBullish() &&
(isFVGLowerBullishRejected
// || isFVGUpperBullishRejected
)
//
;
//
isBearishFVGRejected =
//
iBox.IsBearish() &&
cBar.IsBearish() &&
( // isFVGLowerBearishRejected ||
isFVGUpperBearishRejected)
//
;
//
has = isBullishFVGRejected ||
isBearishFVGRejected;
if (has)
{
//
iBox.to = TimeCurrent();
fvgBox = iBox;
iBox.Clean();
break;
}
//
iBox.Clean();
}
Clean(tmpBoxes);
//
// Select Order Block which FVG is Inside it ...
has = fvgBox.IsValid();
if (has)
{
//
// Converts Order Blocks to Box ...
ToBox(
cState.orderBlocks,
tmpBoxes //
);
//
// Select Order Blocks ...
has = HasChild(tmpBoxes);
if (has)
{
//
while (HasChild(tmpBoxes))
{
//
idx = GetYoungest(tmpBoxes);
has = IsValidIndex(idx);
if (!has)
{
break;
}
//
XBoxZone iBox = tmpBoxes[idx];
ArrayRemove(
tmpBoxes,
idx,
1 //
);
//
// Validate Order Blocks ...
bool isSameDir = iBox.dir == fvgBox.dir;
bool isFVGInsideOB = IsBoxInsideOr(
fvgBox,
iBox //
);
//
has =
isSameDir &&
isFVGInsideOB;
if (has)
{
//
iBox.to = TimeCurrent();
obBox = iBox;
iBox.Clean();
break;
}
//
iBox.Clean();
}
}
}
//
has = obBox.IsValid();
if (!has)
{
//
obBox.Clean();
fvgBox.Clean();
//
isBullishFVGRejected = false;
isBearishFVGRejected = false;
isFVGLowerBullishRejected = false;
isFVGUpperBullishRejected = false;
isFVGLowerBearishRejected = false;
isFVGUpperBearishRejected = false;
}
Clean(tmpBoxes);
//
// Checking Support nad Resistance ...
bool isDirBullish =
obBox.IsBullish() &&
fvgBox.IsBullish();
has =
obBox.IsValid() &&
fvgBox.IsValid();
if (has)
{
//
// Converts Support or Resistance to Boxes ...
if (isDirBullish)
{
//
ToBox(
cState.supportZones,
tmpBoxes //
);
}
else
{
//
ToBox(
cState.resistanceZones,
tmpBoxes //
);
}
//
// Selecting Support nad Resistance ...
has = HasChild(tmpBoxes);
if (has)
{
//
while (HasChild(tmpBoxes))
{
//
idx = GetYoungest(tmpBoxes);
has = IsValidIndex(idx);
if (!has)
{
break;
}
//
XBoxZone iBox = tmpBoxes[idx];
ArrayRemove(
tmpBoxes,
idx,
1 //
);
//
// Validate Support and Resistane ...
bool isDirPassed = iBox.dir == obBox.dir;
bool isPlacePassed =
IsBoxAbove(
iBox,
fvgBox //
) ||
IsBoxAbove(
fvgBox,
iBox //
) ||
IsBoxInside(
iBox,
fvgBox //
) ||
IsBoxInside(
fvgBox,
iBox //
);
has =
isDirPassed &&
isPlacePassed;
if (has)
{
//
iBox.to = TimeCurrent();
supResBox = iBox;
iBox.Clean();
break;
}
//
iBox.Clean();
}
}
//
has = obBox.IsValid() &&
fvgBox.IsValid() &&
supResBox.IsValid();
if (!has)
{
//
obBox.Clean();
fvgBox.Clean();
supResBox.Clean();
//
isBullishFVGRejected = false;
isBearishFVGRejected = false;
isFVGLowerBullishRejected = false;
isFVGUpperBullishRejected = false;
isFVGLowerBearishRejected = false;
isFVGUpperBearishRejected = false;
}
}
}
Clean(tmpBoxes);
//
// Checking OB and FVG Validation ...
has = obBox.IsValid() &&
fvgBox.IsValid() &&
supResBox.IsValid();
if (has)
{
//
// Draw OB ...
if (obBox.IsValid())
{
//
XCBoxObject *iObj;
has = drawer.DrawBox(
obBox,
iObj //
);
if (has)
{
iObj.BoxStyle(STYLE_DASH);
}
}
//
// Draw FVG ...
if (fvgBox.IsValid())
{
//
XCBoxObject *iObj;
has = drawer.DrawBox(
fvgBox,
iObj //
);
if (has)
{
iObj.BoxStyle(STYLE_SOLID);
}
}
//
// Draw Sup/Res Box ...
if (supResBox.IsValid())
{
//
XCBoxObject *iObj;
has = drawer.DrawBox(
supResBox,
iObj //
);
if (has)
{
iObj.BoxStyle(STYLE_DOT);
}
}
}
//
// Bullish Conditions ...
isBullish =
//
// Base Condition ...
(
//
// false
isBullishFVGRejected
//
)
//
;
//
// Bearish Conditions ...
isBearish =
//
// Base Condition ...
(
//
// false
isBearishFVGRejected
//
)
//
;
//
// Filling Requirements ...
result =
isBullish ||
isBearish;
if (result)
{
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
box.ob = obBox;
box.fvg = fvgBox;
box.sharp = supResBox;
}
//
// Check All Conditions ...
result =
box.IsValid() &&
HasDirection(dir) &&
(isBullish ||
isBearish);
//
// Cleanup Resources ...
zBar.Clean();
cBar.Clean();
pBar.Clean();
cState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cStateEvents.Clean();
cXConditions.Clean();
//
return result;
}
-210
View File
@@ -1,210 +0,0 @@
//+------------------------------------------------------------------+
//| BuySellVolumes.mq5 |
//| Copyright © 2023, YourName |
//| |
//+------------------------------------------------------------------+
#property copyright "YourName"
#property link "https://www.yourwebsite.com"
#property version "1.00"
//
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 4
//--- Plot settings for Buy Volume
#property indicator_label1 "Buy Volume"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrLime
//--- Plot settings for Sell Volume
#property indicator_label2 "Sell Volume"
#property indicator_type2 DRAW_HISTOGRAM
#property indicator_color2 clrRed
//--- Plot settings for Buy Volume MA
#property indicator_label3 "Buy Volume MA"
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrGreen
//--- Plot settings for Sell Volume MA
#property indicator_label4 "Sell Volume MA"
#property indicator_type4 DRAW_LINE
#property indicator_color4 clrRed
//--- Input parameters
input int MAPeriod = 14; // Period for the moving average
//--- Indicator buffers
double BuyVolumeBuffer[]; // Buffer for Buy Volume
double SellVolumeBuffer[]; // Buffer for Sell Volume
double BuyVolumeMABuffer[]; // Buffer for Buy Volume Moving Average
double SellVolumeMABuffer[]; // Buffer for Sell Volume Moving Average
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//
// Attach buffers to the indicator
SetIndexBuffer(0, BuyVolumeBuffer, INDICATOR_DATA);
SetIndexBuffer(1, SellVolumeBuffer, INDICATOR_DATA);
SetIndexBuffer(2, BuyVolumeMABuffer, INDICATOR_DATA);
SetIndexBuffer(3, SellVolumeMABuffer, INDICATOR_DATA);
//
// Set short name for the indicator
IndicatorSetString(INDICATOR_SHORTNAME, "Buy and Sell Volumes");
//
return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[] //
)
{
//
// Start from the first uncalculated bar
int start = MathMax(prev_calculated - 1, 0);
//
// Loop through bars
for (int i = start; i < rates_total; i++)
{
//
// Calculate Buy and Sell Volumes based on bar-level data
double buyVolume = 0.0;
double sellVolume = 0.0;
//
if (close[i] > open[i])
{
//
buyVolume = (double)tick_volume[i]; // Buying pressure (bullish bar)
sellVolume = 0.0;
}
else if (close[i] < open[i])
{
//
sellVolume = (double)tick_volume[i]; // Selling pressure (bearish bar)
buyVolume = 0.0;
}
else
{
//
// Neutral bar: split volume equally between buy and sell
buyVolume = tick_volume[i] / 2.0;
sellVolume = tick_volume[i] / 2.0;
}
//
// Store Buy and Sell Volumes in their respective buffers
BuyVolumeBuffer[i] = buyVolume;
SellVolumeBuffer[i] = sellVolume;
//
// Calculate Moving Averages for Buy and Sell Volumes
if (i >= MAPeriod - 1)
{
//
// Calculate Simple Moving Average for Buy Volume
double buySum = 0.0;
for (int j = 0; j < MAPeriod; j++)
buySum += BuyVolumeBuffer[i - j];
BuyVolumeMABuffer[i] = buySum / MAPeriod;
//
// Calculate Simple Moving Average for Sell Volume
double sellSum = 0.0;
for (int j = 0; j < MAPeriod; j++)
sellSum += SellVolumeBuffer[i - j];
SellVolumeMABuffer[i] = sellSum / MAPeriod;
}
else
{
//
// Not enough data for MA
BuyVolumeMABuffer[i] = EMPTY_VALUE;
SellVolumeMABuffer[i] = EMPTY_VALUE;
}
}
//
// Normalize all values between 0 and 100
// NormalizeValues(rates_total);
//
return (rates_total);
}
//+------------------------------------------------------------------+
//| Normalize all values between 0 and 100 |
//+------------------------------------------------------------------+
void NormalizeValues(int rates_total)
{
//
// Find the maximum and minimum values across all buffers
double maxValue = 0.0;
double minValue = DBL_MAX;
//
for (int i = 0; i < rates_total; i++)
{
//
if (BuyVolumeBuffer[i] != EMPTY_VALUE && BuyVolumeBuffer[i] > maxValue)
maxValue = BuyVolumeBuffer[i];
if (SellVolumeBuffer[i] != EMPTY_VALUE && SellVolumeBuffer[i] > maxValue)
maxValue = SellVolumeBuffer[i];
if (BuyVolumeMABuffer[i] != EMPTY_VALUE && BuyVolumeMABuffer[i] > maxValue)
maxValue = BuyVolumeMABuffer[i];
if (SellVolumeMABuffer[i] != EMPTY_VALUE && SellVolumeMABuffer[i] > maxValue)
maxValue = SellVolumeMABuffer[i];
//
if (BuyVolumeBuffer[i] != EMPTY_VALUE && BuyVolumeBuffer[i] < minValue)
minValue = BuyVolumeBuffer[i];
if (SellVolumeBuffer[i] != EMPTY_VALUE && SellVolumeBuffer[i] < minValue)
minValue = SellVolumeBuffer[i];
if (BuyVolumeMABuffer[i] != EMPTY_VALUE && BuyVolumeMABuffer[i] < minValue)
minValue = BuyVolumeMABuffer[i];
if (SellVolumeMABuffer[i] != EMPTY_VALUE && SellVolumeMABuffer[i] < minValue)
minValue = SellVolumeMABuffer[i];
}
//
// Avoid division by zero
if (maxValue == minValue)
return;
//
// Normalize all values
for (int i = 0; i < rates_total; i++)
{
//
if (BuyVolumeBuffer[i] != EMPTY_VALUE)
BuyVolumeBuffer[i] = ((BuyVolumeBuffer[i] - minValue) / (maxValue - minValue)) * 100.0;
if (SellVolumeBuffer[i] != EMPTY_VALUE)
SellVolumeBuffer[i] = ((SellVolumeBuffer[i] - minValue) / (maxValue - minValue)) * 100.0;
if (BuyVolumeMABuffer[i] != EMPTY_VALUE)
BuyVolumeMABuffer[i] = ((BuyVolumeMABuffer[i] - minValue) / (maxValue - minValue)) * 100.0;
if (SellVolumeMABuffer[i] != EMPTY_VALUE)
SellVolumeMABuffer[i] = ((SellVolumeMABuffer[i] - minValue) / (maxValue - minValue)) * 100.0;
}
}
//+------------------------------------------------------------------+
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-580
View File
@@ -1,580 +0,0 @@
//
bool DetectNearestTenKijCross(
XOHCL &bar,
ENUM_X_DIRECTION &dir,
int barIndex = 0,
int maxAllowedBars = 20 //
)
{
//
bool result = false;
//
bar.Clean();
dir = X_DIRECTION_NONE;
barIndex = NormalizeInt(barIndex, 0);
maxAllowedBars = NormalizeInt(maxAllowedBars, 20);
//
// Looping Through LoopBack Period ...
// for Detecting Result ...
for (int i = barIndex; i < barIndex + maxAllowedBars; i++)
{
//
XOHCL iBar;
result = iBar.Init(
GetSymbol(),
GetPeriod(),
i //
);
if (!result)
{
//
iBar.Clean();
break;
}
//
double iTSen = mX121Helper.xichHelper.GetTenkanSen(i);
double iTSenP = mX121Helper.xichHelper.GetTenkanSen(i + 1);
//
double iKSen = mX121Helper.xichHelper.GetKijunSen(i);
double iKSenP = mX121Helper.xichHelper.GetKijunSen(i + 1);
//
bool isTSenOverKSen = iTSen > iKSen;
bool isTSenOverKSenP = iTSenP > iKSenP;
//
bool isTSenUnderKSen = iTSen < iKSen;
bool isTSenUnderKSenP = iTSenP < iKSenP;
//
//
bool isTSenCrossedOverKSen = isTSenOverKSen &&
!isTSenOverKSenP;
//
bool isTSenCrossedUnderKSen = isTSenUnderKSen &&
!isTSenUnderKSenP;
//
result = isTSenCrossedOverKSen ||
isTSenCrossedUnderKSen;
if (result)
{
//
bar = iBar;
//
dir = isTSenCrossedOverKSen
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
iBar.Clean();
break;
}
//
iBar.Clean();
}
//
return result;
}
//
bool DetectNearestVolumeSwitched(
XOHCL &bar,
ENUM_X_DIRECTION &dir,
int barIndex = 0,
int maxAllowedBars = 20 //
)
{
//
bool result = false;
//
bar.Clean();
dir = X_DIRECTION_NONE;
barIndex = NormalizeInt(barIndex, 0);
maxAllowedBars = NormalizeInt(maxAllowedBars, 20);
//
// Looping Through LoopBack Period ...
// for Detecting Result ...
for (int i = barIndex; i < barIndex + maxAllowedBars; i++)
{
//
XOHCL iBar;
result = iBar.Init(
GetSymbol(),
GetPeriod(),
i //
);
if (!result)
{
//
iBar.Clean();
break;
}
//
double iBullVMa = mX121Helper.xvolumeHelper.GetBullishVolumeMa(i);
double iBullVMaP = mX121Helper.xvolumeHelper.GetBullishVolumeMa(i + 1);
//
double iBearVMa = mX121Helper.xvolumeHelper.GetBearishVolumeMa(i);
double iBearVMaP = mX121Helper.xvolumeHelper.GetBearishVolumeMa(i + 1);
//
bool isBullVMaOverBearVMa = iBullVMa > iBearVMa;
bool isBullVMaOverBearVMaP = iBullVMaP > iBearVMaP;
bool isCrossOver = isBullVMaOverBearVMa &&
!isBullVMaOverBearVMaP;
//
bool isBullVMaUnderBearVMa = iBullVMa < iBearVMa;
bool isBullVMaUnderBearVMaP = iBullVMaP < iBearVMaP;
bool isCrossUnder = isBullVMaUnderBearVMa &&
!isBullVMaUnderBearVMaP;
//
result = isCrossOver ||
isCrossUnder;
if (result)
{
//
bar = iBar;
//
dir = isCrossOver
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
iBar.Clean();
break;
}
//
iBar.Clean();
}
//
return result;
}
//
bool DetectNearestDeltaSwitched(
XOHCL &bar,
ENUM_X_DIRECTION &dir,
int barIndex = 0,
int maxAllowedBars = 20 //
)
{
//
bool result = false;
//
bar.Clean();
dir = X_DIRECTION_NONE;
barIndex = NormalizeInt(barIndex, 0);
maxAllowedBars = NormalizeInt(maxAllowedBars, 20);
//
// Looping Through LoopBack Period ...
// for Detecting Result ...
for (int i = barIndex; i < barIndex + maxAllowedBars; i++)
{
//
XOHCL iBar;
result = iBar.Init(
GetSymbol(),
GetPeriod(),
i //
);
if (!result)
{
//
iBar.Clean();
break;
}
//
double iDelta = mX121Helper.xdeltaHelper.GetDelta(i);
double iDeltaP = mX121Helper.xdeltaHelper.GetDelta(i + 1);
//
double iDeltaMa = mX121Helper.xdeltaHelper.GetDeltaMa(i);
double iDeltaMaP = mX121Helper.xdeltaHelper.GetDeltaMa(i + 1);
//
bool isDeltaOverMa = iDelta > iDeltaMa;
bool isDeltaOverMaP = iDeltaP > iDeltaMaP;
//
bool isDeltaUnderMa = iDelta < iDeltaMa;
bool isDeltaUnderMaP = iDeltaP < iDeltaMaP;
//
bool isCrossOver = isDeltaOverMa &&
!isDeltaOverMaP;
//
bool isCrossUnder = isDeltaUnderMa &&
!isDeltaUnderMaP;
//
result = isCrossOver ||
isCrossUnder;
if (result)
{
//
bar = iBar;
//
dir = isCrossOver
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
iBar.Clean();
break;
}
//
iBar.Clean();
}
//
return result;
}
////////////////////////////////////////////////////////////////////////////
//
// Activated Boxes ...
bool HasActivatedBoxConditions(
ENUM_X_CYCLES cycle,
XSignalBox &box,
ENUM_X_DIRECTION &dir,
XSignalBox &waitingBoxes[],
X121SMCStrategySignalProviderData &provider,
int barIndex = 0 //
)
{
//
bool result = false;
//
box.Clean();
dir = X_DIRECTION_NONE;
//
// Checking Waiting Baoxes Exists ...
result = HasChild(waitingBoxes);
if (!result)
{
return result;
}
//
// Fil Selected Data ...
XPOIState cState;
X121Conditions cXConditions;
XPOIStateEvents cStateEvents;
XC121SMCCycleHelper *cHelper;
X121SMCCycleConditions cConditions;
result = provider.SelectCycle(
cycle,
cState,
cStateEvents,
cXConditions,
cHelper,
cConditions //
);
if (!result)
{
//
cState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
cStateEvents.Clean();
//
return result;
}
Parse(cXConditions);
//
// Normalize Args ...
//
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;
int ppIDX = pIDX + 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();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
//
return result;
}
//
// Checking Bar Based on Positions State ...
ENUM_X_DIRECTION iBarPosDir;
bool isBarValidForDir = cHelper
.mBarAnalyser
.IsValidForPosition(
cBar,
iBarPosDir //
);
bool isBarValidForBullish =
isBarValidForDir &&
IsBullish(iBarPosDir);
bool isBarValidForBearish =
isBarValidForDir &&
IsBearish(iBarPosDir);
//
// Extract Selected Boxes ...
XBoxZone selectedBox;
XSignalBox iSignalBox;
count = ArraySize(waitingBoxes);
has = IsValidSize(count);
if (has)
{
//
for (int i = 0; i < count; i++)
{
//
XSignalBox iBox = waitingBoxes[i];
//
bool isBullish = iBox.ob.IsBullish();
//
has = cBar.low < iBox.sharp.upper &&
cBar.low > iBox.sharp.lower &&
cBar.high > iBox.sharp.lower &&
cBar.high < iBox.sharp.upper;
//
// Force Using OB ...
if (has)
{
//
iSignalBox = iBox;
if (!selectedBox.IsValid())
{
selectedBox = iBox.ob;
}
iBox.Clean();
break;
}
//
iBox.Clean();
}
}
result =
iSignalBox.IsValid() &&
selectedBox.IsValid();
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
cState.Clean();
iSignalBox.Clean();
selectedBox.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
//
return result;
}
//
bool hasSignalBox = iSignalBox.IsValid();
bool isSignalBoxBullish = IsBullish(iSignalBox.ob.dir);
//
// Checking Other Conditions ...
//
// XVWAP ...
//
bool isVWapSlopeBullish =
cXConditions.isVwapFastSlopeBullish &&
cXConditions.isVwapMidSlopeBullish &&
cXConditions.isVwapSlowSlopeBullish;
//
bool isVWapSlopeBearish =
cXConditions.isVwapFastSlopeBearish &&
cXConditions.isVwapMidSlopeBearish &&
cXConditions.isVwapSlowSlopeBearish;
//
bool isVWapBullishCondition =
(cXConditions.isVWapBullishOrdered &&
cXConditions.isVWapSwitchedToBullishState) ||
(cXConditions.isVWapBullishState &&
cXConditions.isVWapSwitchedToBullishOrdered);
//
bool isVWapBearishCondition =
(cXConditions.isVWapBearishOrdered &&
cXConditions.isVWapSwitchedToBearishState) ||
(cXConditions.isVWapBearishState &&
cXConditions.isVWapSwitchedToBearishOrdered);
//
// Bullish Conditions ...
isBullish =
//
// Base Condition ...
(
//
hasSignalBox &&
isSignalBoxBullish &&
isVWapSlopeBullish &&
isBarValidForBullish &&
isVWapBullishCondition
//
)
//
;
//
// Bearish Conditions ...
isBearish =
//
// Base Condition ...
(
//
hasSignalBox &&
isVWapSlopeBearish &&
!isSignalBoxBullish &&
isBarValidForBearish &&
isVWapBearishCondition
//
)
//
;
//
// Filling Requirements ...
result =
isBullish ||
isBearish;
if (result)
{
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
box = iSignalBox;
box.UpdateTo(TimeCurrent());
//
// Provide TP/SL ...
//
box.sl = isBullish
? cXConditions.vwapMin
: cXConditions.vwapMax;
//
box.tp = isBullish
? box.sharp.upper
: box.sharp.lower;
}
//
// Check All Conditions ...
result =
box.IsValid() &&
HasDirection(dir) &&
(isBullish ||
isBearish);
//
// Cleanup Resources ...
zBar.Clean();
cBar.Clean();
pBar.Clean();
cState.Clean();
iSignalBox.Clean();
selectedBox.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cStateEvents.Clean();
cXConditions.Clean();
//
return result;
}
/////////////////////////////////////////////////////////////////////////////////////
-232
View File
@@ -1,232 +0,0 @@
//+------------------------------------------------------------------+
//| SaherElm IT Center MQL5 Expert Advisor |
//| |
//| Name: X121 XPV EA |
//| Description: Multi-Timeframe Peak & Vale Breakout Strategy |
//| Maintainer: Hadi Khazaee Asl |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property strict
//
#include "../Helpers/x-saherelm.x121.xpv.helper.mq5"
// Input Parameters
input double RiskPercent = 1.0; // Risk per trade in percentage
input int StopLossPips = 50; // Stop Loss in pips
input int TakeProfitPips = 100; // Take Profit in pips
input bool UseTrailingStop = true; // Enable trailing stop
input int TrailingStopPips = 30; // Trailing stop distance in pips
input int MagicNumber = 123456; // Unique identifier for trades
input bool DebugMode = true; // Enable debug messages
//
// Global Variables ...
X121XPVInputs mXPVInputs;
XCX121XPVHelper *mXPVHelper;
//+------------------------------------------------------------------+
//| Expert Initialization Function |
//+------------------------------------------------------------------+
int OnInit()
{
//
// Attach the X121 XPV indicator ...
mXPVInputs.Default();
mXPVHelper = new XCX121XPVHelper();
bool isInited = mXPVHelper.Init(
_Symbol,
_Period,
mXPVInputs //
);
if (!isInited)
{
return INIT_FAILED;
}
//
Print("X121 XPV EA Initialized.");
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| Expert Deinitialization Function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//
mXPVInputs.Clean();
ZeroMemory(mXPVHelper);
Print("X121 XPV EA Deinitialized.");
}
//+------------------------------------------------------------------+
//| Expert Tick Function |
//+------------------------------------------------------------------+
void OnTick()
{
//
// Check if there are open positions for this symbol
if (PositionSelect(_Symbol))
{
ManageOpenPosition();
return;
}
//
X121XPVConditions pvConditions;
bool isRetrieved = mXPVHelper.GetConditions(
pvConditions,
1 //
);
if (!isRetrieved)
{
return;
}
//
// Get indicator values
double peak = pvConditions.peaksBuffer[0];
double vale = pvConditions.valesBuffer[0];
double peakGoldenZone = pvConditions.peaksGoldenBuffer[0];
double valeGoldenZone = pvConditions.valesGoldenBuffer[0];
//
// Validate indicator values
if (peak == EMPTY_VALUE || vale == EMPTY_VALUE || peakGoldenZone == EMPTY_VALUE || valeGoldenZone == EMPTY_VALUE)
{
//
if (DebugMode)
Print("Invalid indicator values. Skipping...");
return;
}
//
// Entry Conditions
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
//
// Long Entry
if (bid > peak && bid > peakGoldenZone)
{
OpenTrade(ORDER_TYPE_BUY, peak, valeGoldenZone);
}
//
// Short Entry
if (ask < vale && ask < valeGoldenZone)
{
OpenTrade(ORDER_TYPE_SELL, vale, peakGoldenZone);
}
}
//+------------------------------------------------------------------+
//| Open a Trade |
//+------------------------------------------------------------------+
void OpenTrade(int orderType, double entryLevel, double targetLevel)
{
//
double lotSize = CalculateLotSize(entryLevel, targetLevel);
double sl = (orderType == ORDER_TYPE_BUY) ? entryLevel - StopLossPips * Point() : entryLevel + StopLossPips * Point();
double tp = (orderType == ORDER_TYPE_BUY) ? entryLevel + TakeProfitPips * Point() : entryLevel - TakeProfitPips * Point();
//
// Prepare trade request
MqlTradeRequest request = {};
MqlTradeResult result = {};
//
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = lotSize;
request.type = (ENUM_ORDER_TYPE)orderType;
request.price = (orderType == ORDER_TYPE_BUY) ? SymbolInfoDouble(_Symbol, SYMBOL_ASK) : SymbolInfoDouble(_Symbol, SYMBOL_BID);
request.sl = sl;
request.tp = tp;
request.deviation = 10;
request.magic = MagicNumber;
//
// Send trade request
if (!OrderSend(request, result))
{
Print("Trade failed: ", result.retcode);
}
else
{
Print("Trade opened successfully.");
}
}
//+------------------------------------------------------------------+
//| Manage Open Position |
//+------------------------------------------------------------------+
void ManageOpenPosition()
{
ulong ticket = PositionGetInteger(POSITION_TICKET);
double currentPrice = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) ? SymbolInfoDouble(_Symbol, SYMBOL_BID) : SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
double sl = PositionGetDouble(POSITION_SL);
double tp = PositionGetDouble(POSITION_TP);
// Trailing Stop Logic
if (UseTrailingStop)
{
double newSL = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
? currentPrice - TrailingStopPips * Point()
: currentPrice + TrailingStopPips * Point();
if ((PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && newSL > sl) ||
(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && newSL < sl))
{
ModifyPosition(ticket, newSL, tp);
}
}
}
//+------------------------------------------------------------------+
//| Modify Position |
//+------------------------------------------------------------------+
void ModifyPosition(ulong ticket, double newSL, double newTP)
{
MqlTradeRequest request = {};
MqlTradeResult result = {};
request.action = TRADE_ACTION_SLTP;
request.position = ticket;
request.sl = newSL;
request.tp = newTP;
if (!OrderSend(request, result))
{
Print("Failed to modify position: ", result.retcode);
}
else
{
Print("Position modified successfully.");
}
}
//+------------------------------------------------------------------+
//| Calculate Lot Size |
//+------------------------------------------------------------------+
double CalculateLotSize(double entryLevel, double targetLevel)
{
double riskAmount = AccountInfoDouble(ACCOUNT_BALANCE) * RiskPercent / 100;
double stopLossDistance = MathAbs(entryLevel - targetLevel) / Point();
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double lotSize = riskAmount / (stopLossDistance * tickValue);
// Normalize lot size
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double stepLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
lotSize = MathFloor(lotSize / stepLot) * stepLot;
lotSize = MathMax(minLot, MathMin(maxLot, lotSize));
return lotSize;
}
File diff suppressed because it is too large Load Diff
-573
View File
@@ -1,573 +0,0 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Ocillator
// -------------------------------------------------
// Name: X121 XCDV
// Description: Detect Comulative Delta Volume ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm X121 XCDV Ocillator"
#property strict
//
// Definitions ...
//
#define ShortName "X121_XCDV"
//
// Imports ...
#include "../Libraries/x-saherelm.common.lib.mq5"
//
// Inputs ...
//
// Makret ...
input group "Market";
input int maLength = 14; // Moving Averge Length
input ENUM_X_PRICE maAppliedTo = X_PRICE_CLOSE; // Moving Averge Applied To
input ENUM_X_MA_METHOD maMethod = X_MA_MODE_EMA; // Moving Averge Method
//
// Presentation ...
input group "Presentation";
input int startCalculationForLastBars = 1000; // Calculate Last n Bars
input bool showCDV = true; // Show Delta Line
input bool showMA = true; // Show Delta Histogram
//
// Buffers Props ...
//
#property indicator_separate_window
//
#property indicator_buffers 10
#property indicator_plots 2
//
#define hideColorIDX 0
#define bullishColorIDX 1
#define bearishColorIDX 2
//
// Buffers ...
//
#define openBufferIndex 0
double openBuffer[];
//
#define highBufferIndex 1
double highBuffer[];
//
#define lowBufferIndex 2
double lowBuffer[];
//
#define closeBufferIndex 3
double closeBuffer[];
//
#define colorBufferIndex 4
double colorBuffer[];
//
#define barBufferIndex 0
#property indicator_label1 "X121 XCDV Open;X121 XCDV High;X121 XCDV Low;X121 XCDV Close"
#property indicator_type1 DRAW_COLOR_CANDLES
#property indicator_color1 CLR_NONE, clrLime, clrRed
//
#define maBufferIndex 5
double maBuffer[];
#property indicator_label2 "MA"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrYellow
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//
// Data Buffers ...
#define mLastBufferIndex 5
#define priceBufferIndex mLastBufferIndex + 1
double priceBuffer[];
#define deltaBufferIndex mLastBufferIndex + 2
double deltaBuffer[];
#define cumulativeDeltaBufferIndex mLastBufferIndex + 3
double cumulativeDeltaBuffer[];
//
// Variables, Properties and etc ...
//
// this counts Available Bars ...
int limit;
//
int maxLength;
//
double lastCDV = 0.0;
//
// Event Handlers ...
/**
* Initialize Indicator ...
*
* @return ( int )
*/
int OnInit()
{
//
// Validate Inputs ...
if (!ValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
// Initialize Indicator Handlers ...
//
// because in some cases we may have more than one input for
// calculation and we must prevent any calculation
// untill we pass the biggest input length, here we get max Input length
// and then wait until pass it ...
maxLength = ExtractMaxLengthOfInputs();
//
// Define Index Buffers ...
DefineBuffers();
//
// Set Indicator ShortName ...
SetIndicatorName();
IndicatorSetInteger(INDICATOR_DIGITS, 2);
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
/**
* De Initialize Indicator ...
*
* @param reason: Integer, De Initialization Reason ...
*/
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
}
/**
* Calculate Bars ...
*
* @param rates_total: Integer, Total Bars on Chart ...
* @param prev_calculated: Integer, Total Calculated Bars on Charts ...
* @param time: DateTime Array, History of Open Time ...
* @param open: Double Array, History of Open Prices ...
* @param high: Double Array, History of High Prices ...
* @param low: Double Array, History of Low Prices ...
* @param close: Double Array, History of Close Prices ...
* @param tick_volume: Long, History of Tick Volumes on Bar ...
* @param volume: Long, History of Trade Volumes ...
* @param spread: Double, History of Spread Price ...
*
* @return ( int )
*/
int OnCalculate(
const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[] //
)
{
//
// Prepare Buffers ...
ArraySetAsSeries(time, true);
ArraySetAsSeries(open, true);
ArraySetAsSeries(high, true);
ArraySetAsSeries(low, true);
ArraySetAsSeries(close, true);
ArraySetAsSeries(tick_volume, true);
ArraySetAsSeries(volume, true);
ArraySetAsSeries(spread, true);
//
limit = (prev_calculated > rates_total || prev_calculated <= 0)
? rates_total
: (rates_total - prev_calculated) + 1;
//
// Main Loop ...
for (int i = limit - 1; i >= 0 && !IsStopped(); i--)
{
//
CalculateBuffers(
//
i,
prev_calculated,
rates_total,
//
open,
high,
close,
low,
tick_volume //
);
}
//
return rates_total;
}
//
// Functions ...
/**
* Validate Input Args for Initialization ...
*
* @return ( bool )
*/
bool ValidateInputs()
{
//
bool result = false;
//
result = maLength > 0 &&
IsValid(maMethod) &&
IsValid(maAppliedTo);
//
return result;
}
/**
* Extract Max Length of Inputs ...
*
* @return ( int )
*/
int ExtractMaxLengthOfInputs()
{
//
int result = 0;
//
result = MathMax(0, maLength);
//
return result;
}
/**
* Set Indicator Short Name and also we can define Buffers Labels ...
*/
void SetIndicatorName()
{
IndicatorSetString(INDICATOR_SHORTNAME, ShortName);
}
/**
* Define Required Buffers ...
*/
void DefineBuffers()
{
//
// Plot Buffers ...
//
// CDV ...
//
// Raw Candles Color ...
ArraySetAsSeries(colorBuffer, true);
SetIndexBuffer(colorBufferIndex, colorBuffer, INDICATOR_COLOR_INDEX);
//
ENUM_DRAW_TYPE barDrawType = showCDV ? DRAW_COLOR_CANDLES : DRAW_NONE;
//
// Set EMPTY_VALUE on Candles Buffer ...
PlotIndexSetDouble(barBufferIndex, PLOT_EMPTY_VALUE, 0.0);
PlotIndexSetInteger(barBufferIndex, PLOT_SHOW_DATA, showCDV);
PlotIndexSetInteger(barBufferIndex, PLOT_DRAW_TYPE, barDrawType);
//
// Open ...
ArraySetAsSeries(openBuffer, true);
SetIndexBuffer(openBufferIndex, openBuffer, INDICATOR_DATA);
//
// High ...
ArraySetAsSeries(highBuffer, true);
SetIndexBuffer(highBufferIndex, highBuffer, INDICATOR_DATA);
//
// Close ...
ArraySetAsSeries(closeBuffer, true);
SetIndexBuffer(closeBufferIndex, closeBuffer, INDICATOR_DATA);
//
// Low ...
ArraySetAsSeries(lowBuffer, true);
SetIndexBuffer(lowBufferIndex, lowBuffer, INDICATOR_DATA);
//
// Ma ...
ENUM_DRAW_TYPE maDrawType = showMA ? DRAW_LINE : DRAW_NONE;
//
ArraySetAsSeries(maBuffer, true);
SetIndexBuffer(maBufferIndex, maBuffer, INDICATOR_DATA);
PlotIndexSetDouble(maBufferIndex, PLOT_EMPTY_VALUE, 0);
PlotIndexSetInteger(maBufferIndex, PLOT_SHOW_DATA, showMA);
PlotIndexSetInteger(maBufferIndex, PLOT_DRAW_TYPE, maDrawType);
//
// Data Buffers ...
//
ArraySetAsSeries(priceBuffer, true);
SetIndexBuffer(priceBufferIndex, priceBuffer, INDICATOR_CALCULATIONS);
//
ArraySetAsSeries(deltaBuffer, true);
SetIndexBuffer(deltaBufferIndex, deltaBuffer, INDICATOR_CALCULATIONS);
//
ArraySetAsSeries(cumulativeDeltaBuffer, true);
SetIndexBuffer(cumulativeDeltaBufferIndex, cumulativeDeltaBuffer, INDICATOR_CALCULATIONS);
}
/**
* Calculate Custom Buffers ...
*
* @param bar_index: Integer, Represent Current Bar ...
* @param prevCalculated: Integer, Represent Previous Calculated Bars ...
* @param ratesTotal: Integer, Represents All Available Bars ...
* @param open: Double Array, History of Open Prices ...
* @param high: Double Array, History of High Prices ...
* @param close: Double Array, History of Close Prices ...
* @param low: Double Array, History of Low Prices ...
* @param tickVolume: Long, History of Tick Volumes on Bar ...
*/
void CalculateBuffers(
int bar_index, // Selected Bar Index
const int prevCalculated,
const int ratesTotal,
const double &open[],
const double &high[],
const double &close[],
const double &low[],
const long &tickVolume[] //
)
{
//
int barsLimit = startCalculationForLastBars > 0
? startCalculationForLastBars
: 0;
//
// bool canCalculate = true;
bool canCalculate =
barsLimit == 0 ||
bar_index <= barsLimit;
if (canCalculate)
{
//
CalculateValues(
bar_index,
prevCalculated,
ratesTotal,
open,
high,
close,
low,
tickVolume //
);
}
else
{
FillBuffersZero(bar_index);
}
}
/**
* Fill All Bufers to Zero Vlue for Specified Bar Index ...
*
* @param barIndex: Integer ...
*/
void FillBuffersZero(int barIndex)
{
//
openBuffer[barIndex] = 0.0;
highBuffer[barIndex] = 0.0;
closeBuffer[barIndex] = 0.0;
lowBuffer[barIndex] = 0.0;
colorBuffer[barIndex] = hideColorIDX;
}
/**
* Calculate Vales ...
*
* @param bar_index: Integer, Represent Current Bar ...
* @param prevCalculated: Integer, Represent Previous Calculated Bars ...
* @param ratesTotal: Integer, Represents All Available Bars ...
* @param open: Double Array, History of Open Prices ...
* @param high: Double Array, History of High Prices ...
* @param close: Double Array, History of Close Prices ...
* @param low: Double Array, History of Low Prices ...
* @param tickVolume: Long, History of Tick Volumes on Bar ...
*/
void CalculateValues(
int bar_index, // Selected Bar Index
const int prevCalculated,
const int ratesTotal,
const double &open[],
const double &high[],
const double &close[],
const double &low[],
const long &tickVolume[] //
)
{
//
XOHCL bar;
bool has = bar.Init(
_Symbol,
_Period,
bar_index //
);
if (!has)
{
return;
}
//
double lowShadow = bar.GetLowShadow();
double highShadow = bar.GetHighShadow();
double body = bar.GetBody();
bool isBullish = bar.IsBullish();
bool hasDir = HasDirection(bar.GetDirection());
//
double iRate = 0.5 * (highShadow + lowShadow + (hasDir ? 2 * body : 0)) / (highShadow + lowShadow + body);
iRate = iRate <= 0
? 0.5
: iRate;
//
double iVRate = tickVolume[bar_index] * iRate;
double iDelta = isBullish
? iVRate
: -1 * iVRate;
deltaBuffer[bar_index] = iDelta;
//
double iCumulate = lastCDV + iDelta;
cumulativeDeltaBuffer[bar_index] = iCumulate;
lastCDV = iCumulate;
//
bool isFirstBar =
startCalculationForLastBars > 0
? bar_index == startCalculationForLastBars
: bar_index == ratesTotal;
//
double iO = 0;
double iH = 0;
double iL = 0;
double iC = 0;
if (!isFirstBar)
{
//
iO = cumulativeDeltaBuffer[bar_index + 1];
iH = MathMax(cumulativeDeltaBuffer[bar_index], cumulativeDeltaBuffer[bar_index + 1]);
iL = MathMin(cumulativeDeltaBuffer[bar_index], cumulativeDeltaBuffer[bar_index + 1]);
iC = iCumulate;
}
//
double iClose = (iO + iH + iL + iC) / 4;
double iOpen = isFirstBar
? (iO + iC) / 2
: (openBuffer[bar_index + 1] + closeBuffer[bar_index + 1]) / 2;
double iLow = MathMin(iL, MathMin(iOpen, iClose));
double iHigh = MathMax(iH, MathMax(iOpen, iClose));
//
lowBuffer[bar_index] = iLow;
openBuffer[bar_index] = iOpen;
highBuffer[bar_index] = iHigh;
closeBuffer[bar_index] = iClose;
//
bool isCBullish = iOpen <= iClose;
double iColor = isCBullish
? bullishColorIDX
: bearishColorIDX;
colorBuffer[bar_index] = iColor;
//
double iPrice = GetAppliedPrice(
maAppliedTo,
openBuffer,
highBuffer,
lowBuffer,
closeBuffer,
bar_index //
);
priceBuffer[bar_index] = iPrice;
//
// Calculate Moving Averages ...
int deltaMAsCount = iMAOnBuffer(
ratesTotal,
prevCalculated,
bar_index,
maLength,
priceBuffer,
maBuffer,
maMethod //
);
//
bar.Clean();
}
//
-846
View File
@@ -1,846 +0,0 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Indicator
// -------------------------------------------------
// Name: XICH
// Description: Ichimoku Kinko Hyo ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm XICH Indicator"
#property strict
//
// START Constants ...
//
//
// Indicator Short Name ...
#define ShortName "X121 XICH"
//
// Ichimoku Golden Numbers ...
enum ENUM_X_ICHIMOKU_GOLDEN_NUMBERS
{
X_ICH_BASE = 9,
X_ICH_GOLDEN = 17,
X_ICH_CYCLE = 26,
X_ICH_PERIOD = 35,
X_ICH_STAR = 45,
X_ICH_MED = 52,
X_ICH_LONG = 63,
X_ICH_FULL = 72
};
//
// Ichimoku Lines Calculator Mode ...
enum ENUM_X_ICHIMOKU_CALCULATION_MODE
{
//
X_XICH_HH_LL_MODE = 1, // Highest High and Lowest Low
X_XICH_HO_LC_MODE = 2, // Highest Open and Lowest Close
};
//
// END Constants ...
//
//
// START Inputs ...
//
//
// ICHIMOKU Kinko Hyo ...
//
// TENKANSEN ...
input group "Tenkan Sen";
input int tenkanSenLength = 9; // Length
input ENUM_X_ICHIMOKU_CALCULATION_MODE tenkanSenMode = X_XICH_HH_LL_MODE; // Calculation Mode
//
// KIJUNSEN ...
input group "Kijun Sen";
input int kijunSenLength = 26; // Length
input ENUM_X_ICHIMOKU_CALCULATION_MODE kijunSenMode = X_XICH_HH_LL_MODE; // Calculation Mode
//
// SENKOUSPANB ...
input group "Senkou Span B";
input int senkouSpanBLength = 52; // Length
input ENUM_X_ICHIMOKU_CALCULATION_MODE senkouSpanBMode = X_XICH_HH_LL_MODE; // Calculation Mode
//
// CHIKOUSPAN ...
input group "Chikou Span";
input ENUM_APPLIED_PRICE chikuoSpanAppliedTo = PRICE_CLOSE; // Price Type
//
input group "Presentation";
input bool showTenkanSen = true; // Show Tenkan Sen
input bool showKijunSen = true; // Show Kijun Sen
input bool showKijunSenPlus = false; // Show Kijun Sen +
input bool showKijunSenNegative = false; // Show Kijun Sen -
input bool showChikouSpan = true; // Show Chikou Span
input bool showSenkouSpanA = true; // Show Senkou Span A
input bool showSenkouSpanB = true; // Show Senkou Span B
input bool showKumo = true; // Show Kumo
input bool shiftKumo = true; // Shift Kumo to Future
//
// END Inputs ...
//
//
// START Includes and Imports ...
//
//
// Includes Common Library ...
#include "../Libraries/x-saherelm.common.lib.mq5"
//
// END Includes and Imports ...
//
//
// START Buffers ...
//
#property indicator_chart_window
//
#property indicator_buffers 15
#property indicator_plots 8
//
// PLOTTED Buffers ...
//
// ICHIMOKU ...
//
// TENKANSEN ...
//
#define tenkanSenBufferIndex 0
double tenkanSenBuffer[];
//
#property indicator_label1 "XICH TK"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBrown
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//
// KIJUNSEN ...
//
#define kijunSenBufferIndex 1
double kijunSenBuffer[];
//
#property indicator_label2 "XICH KJ"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrDodgerBlue
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//
#define kijunSenPlusBufferIndex 2
double kijunSenPlusBuffer[];
//
#property indicator_label3 "XICH KJ+"
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrMediumTurquoise
#property indicator_style3 STYLE_DOT
#property indicator_width3 1
//
#define kijunSenNegativeBufferIndex 3
double kijunSenNegativeBuffer[];
//
#property indicator_label4 "XICH KJ-"
#property indicator_type4 DRAW_LINE
#property indicator_color4 clrDarkSeaGreen
#property indicator_style4 STYLE_DOT
#property indicator_width4 1
//
// CHIKOUSPAN ...
//
#define chikouSpanBufferIndex 4
double chikouSpanBuffer[];
//
#property indicator_label5 "XICH CS"
#property indicator_type5 DRAW_LINE
#property indicator_color5 clrDarkGreen
#property indicator_style5 STYLE_SOLID
#property indicator_width5 1
//
#define senkouABufferIndex 5
double senkouABuffer[];
//
#property indicator_label6 "XICH SSA"
#property indicator_type6 DRAW_LINE
#property indicator_color6 clrLightGray
#property indicator_style6 STYLE_DASHDOTDOT
#property indicator_width6 1
//
#define senkouBBufferIndex 6
double senkouBBuffer[];
//
#property indicator_label7 "XICH SSB"
#property indicator_type7 DRAW_LINE
#property indicator_color7 clrLightGray
#property indicator_style7 STYLE_DASHDOTDOT
#property indicator_width7 1
//
// KUMO ...
//
// SENKOUSPANA ...
//
#define senkouSpanABufferIndex 7
double senkouSpanABuffer[];
//
// SENKOUSPANB ...
//
#define senkouSpanBBufferIndex 8
double senkouSpanBBuffer[];
//
// KUMOCLOUD ...
//
#define kumoBufferIndex 7
//
#property indicator_label8 "XICH Kumo"
#property indicator_type8 DRAW_FILLING
#property indicator_color8 clrAqua, clrMagenta
#property indicator_style8 STYLE_SOLID
#property indicator_width8 1
//
// DATA Buffers ...
//
#define dTenkanBufferIndex 9
double dTenkanBuffer[];
//
#define dKijunBufferIndex 10
double dKijunBuffer[];
//
#define dChikouBufferIndex 11
double dChikouBuffer[];
//
#define dSSABufferIndex 12
double dSSABuffer[];
//
#define dSSBBufferIndex 13
double dSSBBuffer[];
//
// END Buffers ...
//
//
// START Global Definitions: Variables, Properties and etc ...
//
//
int maxLength;
int mHandler;
//
ENUM_SERIESMODE mTenkanSenTopMode = NULL;
ENUM_SERIESMODE mTenkanSenBottomMode = NULL;
//
ENUM_SERIESMODE mKijunSenTopMode = NULL;
ENUM_SERIESMODE mKijunSenBottomMode = NULL;
//
ENUM_SERIESMODE mSenkouSpanBTopMode = NULL;
ENUM_SERIESMODE mSenkouSpanBBottomMode = NULL;
//
// END Global Definitions: Variables, Properties and etc ...
//
//
// START Event Handlers ...
//
//
// Initialization ...
int OnInit()
{
//
// Validate Inputs ...
if (!ValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
// because in some cases we may have more than one input for
// calculation and we must prevent any calculation
// untill we pass the biggest input length, here we get max Input length
// and then wait until pass it ...
maxLength = ExtractMaxLengthOfInputs();
//
// Define Index Buffers ...
DefineBuffers();
//
// Init Handler ...
mHandler = iIchimoku(
_Symbol,
_Period,
tenkanSenLength,
kijunSenLength,
senkouSpanBLength);
if (mHandler == INVALID_HANDLE)
{
return INIT_FAILED;
}
//
// Set Indicator ShortName ...
SetIndicatorName();
//
// 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
//
IndicatorRelease(mHandler);
}
//
// Calculating what we want ...
int OnCalculate(
//
// total Candles on chart ...
const int rates_total,
//
// total calculated Candles on charts ...
const int prev_calculated,
//
// history of Candles Open Time ...
const datetime &time[],
//
// history of Candles Open Price ...
const double &open[],
//
// history of Candles High Price ...
const double &high[],
//
// history of Candles Low Price ...
const double &low[],
//
// history of Candles Close Price ...
const double &close[],
//
// history of Tick Volumes on Candle ...
const long &tick_volume[],
//
// history of Trade Volumes ...
const long &volume[],
//
// history of Candles Spread Price ...
const int &spread[])
{
//
// Prepare Buffers ...
ArraySetAsSeries(time, true);
ArraySetAsSeries(open, true);
ArraySetAsSeries(high, true);
ArraySetAsSeries(low, true);
ArraySetAsSeries(close, true);
ArraySetAsSeries(tick_volume, true);
ArraySetAsSeries(volume, true);
ArraySetAsSeries(spread, true);
//
// this counts Available Bars ...
int limit;
//
// Check Calculated Bars ...
int ichCalculatedBars = BarsCalculated(mHandler);
if (ichCalculatedBars < maxLength)
{
return prev_calculated;
}
//
limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1;
//
// Buffers Copy ...
int copiedTenkans = CopyBuffer(mHandler, TENKANSEN_LINE, 0, limit, dTenkanBuffer);
int copiedKijuns = CopyBuffer(mHandler, KIJUNSEN_LINE, 0, limit, dKijunBuffer);
int copiedChikous = CopyBuffer(mHandler, CHIKOUSPAN_LINE, 0, limit, dChikouBuffer);
int copiedSSAs = CopyBuffer(mHandler, SENKOUSPANA_LINE, 0, limit, dSSABuffer);
int copiedSSBs = CopyBuffer(mHandler, SENKOUSPANB_LINE, 0, limit, dSSBBuffer);
if (
copiedSSAs < 0 ||
copiedSSBs < 0 ||
copiedKijuns < 0 ||
copiedTenkans < 0 ||
copiedChikous < 0)
{
return prev_calculated;
}
//
// Main Loop ...
for (int i = limit - 1; i >= 0 && !IsStopped(); i--)
{
CalculateBuffers(i);
}
//
return rates_total;
}
//
// END Event Handlers ...
//
//
// START Functions ...
//
//
// Validate Input Args for Initialization ...
bool ValidateInputs()
{
//
bool result =
//
(tenkanSenLength > 2 &&
kijunSenLength > tenkanSenLength &&
senkouSpanBLength > kijunSenLength)
//
;
//
return result;
}
//
// Retrieve all Exists Input Max Length ...
// use for Start Of Drawing ...
int ExtractMaxLengthOfInputs()
{
//
int result = 0;
//
// Ichimoku ...
result = MathMax(result, tenkanSenLength);
result = MathMax(result, kijunSenLength);
result = MathMax(result, senkouSpanBLength);
//
return result;
}
//
// Define Indexes and Styles ...
void DefineBuffers()
{
//
// ICHIMOKU ...
//
// TENKANSEN ...
//
ENUM_DRAW_TYPE tenkanSenDrawType = showTenkanSen ? DRAW_LINE : DRAW_NONE;
//
ArraySetAsSeries(tenkanSenBuffer, true);
SetIndexBuffer(tenkanSenBufferIndex, tenkanSenBuffer, INDICATOR_DATA);
PlotIndexSetInteger(tenkanSenBufferIndex, PLOT_DRAW_BEGIN, maxLength);
PlotIndexSetInteger(tenkanSenBufferIndex, PLOT_SHOW_DATA, showTenkanSen);
PlotIndexSetInteger(tenkanSenBufferIndex, PLOT_DRAW_TYPE, tenkanSenDrawType);
//
// KIJUNSEN ...
//
ENUM_DRAW_TYPE kijunSenDrawType = showKijunSen ? DRAW_LINE : DRAW_NONE;
//
ArraySetAsSeries(kijunSenBuffer, true);
SetIndexBuffer(kijunSenBufferIndex, kijunSenBuffer, INDICATOR_DATA);
PlotIndexSetInteger(kijunSenBufferIndex, PLOT_DRAW_BEGIN, maxLength);
PlotIndexSetInteger(kijunSenBufferIndex, PLOT_SHOW_DATA, showKijunSen);
PlotIndexSetInteger(kijunSenBufferIndex, PLOT_DRAW_TYPE, kijunSenDrawType);
//
// KIJUNSEN Plus ...
//
ENUM_DRAW_TYPE kijunSenPlusDrawType = showKijunSenPlus ? DRAW_LINE : DRAW_NONE;
//
ArraySetAsSeries(kijunSenPlusBuffer, true);
SetIndexBuffer(kijunSenPlusBufferIndex, kijunSenPlusBuffer, INDICATOR_DATA);
PlotIndexSetInteger(kijunSenPlusBufferIndex, PLOT_DRAW_BEGIN, maxLength);
PlotIndexSetInteger(kijunSenPlusBufferIndex, PLOT_SHIFT, kijunSenLength);
PlotIndexSetInteger(kijunSenPlusBufferIndex, PLOT_SHOW_DATA, false);
PlotIndexSetInteger(kijunSenPlusBufferIndex, PLOT_DRAW_TYPE, kijunSenPlusDrawType);
//
// KIJUNSEN Negative ...
//
ENUM_DRAW_TYPE kijunSenNegativeDrawType = showKijunSenNegative ? DRAW_LINE : DRAW_NONE;
//
ArraySetAsSeries(kijunSenNegativeBuffer, true);
SetIndexBuffer(kijunSenNegativeBufferIndex, kijunSenNegativeBuffer, INDICATOR_DATA);
PlotIndexSetInteger(kijunSenNegativeBufferIndex, PLOT_DRAW_BEGIN, maxLength);
PlotIndexSetInteger(kijunSenNegativeBufferIndex, PLOT_SHIFT, -kijunSenLength);
PlotIndexSetInteger(kijunSenNegativeBufferIndex, PLOT_SHOW_DATA, false);
PlotIndexSetInteger(kijunSenNegativeBufferIndex, PLOT_DRAW_TYPE, kijunSenNegativeDrawType);
//
// CHIKOUSPAN ...
//
ENUM_DRAW_TYPE chikouSpanDrawType = showChikouSpan ? DRAW_LINE : DRAW_NONE;
//
ArraySetAsSeries(chikouSpanBuffer, true);
SetIndexBuffer(chikouSpanBufferIndex, chikouSpanBuffer, INDICATOR_DATA);
PlotIndexSetInteger(chikouSpanBufferIndex, PLOT_DRAW_BEGIN, maxLength);
PlotIndexSetInteger(chikouSpanBufferIndex, PLOT_SHIFT, -kijunSenLength);
PlotIndexSetInteger(chikouSpanBufferIndex, PLOT_SHOW_DATA, showChikouSpan);
PlotIndexSetInteger(chikouSpanBufferIndex, PLOT_DRAW_TYPE, chikouSpanDrawType);
//
// SENKOUSPAN A and B ...
int shiftSize = shiftKumo ? kijunSenLength : 0;
//
// SENKOUSPANA ...
ENUM_DRAW_TYPE senkouSpanADrawType = showSenkouSpanA ? DRAW_LINE : DRAW_NONE;
ArraySetAsSeries(senkouABuffer, true);
SetIndexBuffer(senkouABufferIndex, senkouABuffer, INDICATOR_DATA);
PlotIndexSetInteger(senkouABufferIndex, PLOT_SHIFT, shiftSize);
PlotIndexSetInteger(senkouABufferIndex, PLOT_SHOW_DATA, showSenkouSpanA);
PlotIndexSetInteger(senkouABufferIndex, PLOT_DRAW_TYPE, senkouSpanADrawType);
//
// SENKOUSPANB ...
ENUM_DRAW_TYPE senkouSpanBDrawType = showSenkouSpanB ? DRAW_LINE : DRAW_NONE;
ArraySetAsSeries(senkouBBuffer, true);
SetIndexBuffer(senkouBBufferIndex, senkouBBuffer, INDICATOR_DATA);
PlotIndexSetInteger(senkouBBufferIndex, PLOT_SHIFT, shiftSize);
PlotIndexSetInteger(senkouBBufferIndex, PLOT_SHOW_DATA, showSenkouSpanB);
PlotIndexSetInteger(senkouBBufferIndex, PLOT_DRAW_TYPE, senkouSpanBDrawType);
//
// KUMO ...
//
// SENKOUSPANA ...
ArraySetAsSeries(senkouSpanABuffer, true);
SetIndexBuffer(senkouSpanABufferIndex, senkouSpanABuffer, INDICATOR_DATA);
PlotIndexSetInteger(senkouSpanABufferIndex, PLOT_DRAW_BEGIN, maxLength);
//
// SENKOUSPANB ...
ArraySetAsSeries(senkouSpanBBuffer, true);
SetIndexBuffer(senkouSpanBBufferIndex, senkouSpanBBuffer, INDICATOR_DATA);
PlotIndexSetInteger(senkouSpanBBufferIndex, PLOT_DRAW_BEGIN, maxLength);
//
// KUMO ...
//
ENUM_DRAW_TYPE kumoDrawType = showKumo ? DRAW_FILLING : DRAW_NONE;
//
PlotIndexSetInteger(kumoBufferIndex, PLOT_SHIFT, shiftSize);
PlotIndexSetInteger(kumoBufferIndex, PLOT_SHOW_DATA, false);
PlotIndexSetInteger(kumoBufferIndex, PLOT_DRAW_TYPE, kumoDrawType);
//
// DATA Buffers ...
//
// D Tenkan ...
ArraySetAsSeries(dTenkanBuffer, true);
SetIndexBuffer(dTenkanBufferIndex, dTenkanBuffer, INDICATOR_CALCULATIONS);
//
// D Kijun ...
ArraySetAsSeries(dKijunBuffer, true);
SetIndexBuffer(dKijunBufferIndex, dKijunBuffer, INDICATOR_CALCULATIONS);
//
// D Chikou ...
ArraySetAsSeries(dChikouBuffer, true);
SetIndexBuffer(dChikouBufferIndex, dChikouBuffer, INDICATOR_CALCULATIONS);
//
// D SSA ...
ArraySetAsSeries(dSSABuffer, true);
SetIndexBuffer(dSSABufferIndex, dSSABuffer, INDICATOR_CALCULATIONS);
//
// D SSB ...
ArraySetAsSeries(dSSBBuffer, true);
SetIndexBuffer(dSSBBufferIndex, dSSBBuffer, INDICATOR_CALCULATIONS);
}
//
// Set Indicator Short Name and also we can define Buffers Labels ...
void SetIndicatorName()
{
IndicatorSetString(INDICATOR_SHORTNAME, ShortName);
}
//
// Calculate Buffers ...
void CalculateBuffers(
int bar_index // Selected Bar Index
)
{
//
// ICHIMOKU ...
//
double topValue;
double bottomValue;
//
// TENKANSEN ...
//
// Extract Tenkan Sen Top/Bottom Calculation Mode based on User Input ...
if (mTenkanSenTopMode == NULL || mTenkanSenBottomMode == NULL)
{
//
switch (tenkanSenMode)
{
//
case X_XICH_HH_LL_MODE:
//
mTenkanSenTopMode = MODE_HIGH;
mTenkanSenBottomMode = MODE_LOW;
break;
//
case X_XICH_HO_LC_MODE:
//
mTenkanSenTopMode = MODE_OPEN;
mTenkanSenBottomMode = MODE_CLOSE;
break;
}
}
//
XOHCL bar;
bar.Init(
_Symbol,
_Period,
bar_index
//
);
//
// Calculate Top ...
topValue = bar
.FindHighest(
tenkanSenLength,
mTenkanSenTopMode
//
);
//
// Calculate Bottom ...
bottomValue = bar
.FindLowest(
tenkanSenLength,
mTenkanSenBottomMode
//
);
//
double tenkanSenValue = (topValue + bottomValue) / 2;
tenkanSenBuffer[bar_index] = tenkanSenValue;
//
// KIJUNSEN ...
//
// Extract Kijun Sen Top/Bottom Calculation Mode based on User Input ...
if (mKijunSenTopMode == NULL || mKijunSenBottomMode == NULL)
{
//
switch (kijunSenMode)
{
//
case X_XICH_HH_LL_MODE:
//
mKijunSenTopMode = MODE_HIGH;
mKijunSenBottomMode = MODE_LOW;
break;
//
case X_XICH_HO_LC_MODE:
//
mKijunSenTopMode = MODE_OPEN;
mKijunSenBottomMode = MODE_CLOSE;
break;
}
}
//
// Calculate Top ...
topValue = bar
.FindHighest(
kijunSenLength,
mKijunSenTopMode
//
);
//
// Calculate Bottom ...
bottomValue = bar
.FindLowest(
kijunSenLength,
mKijunSenBottomMode
//
);
//
double kijunSenValue = (topValue + bottomValue) / 2;
kijunSenBuffer[bar_index] = kijunSenValue;
//
kijunSenPlusBuffer[bar_index] = kijunSenValue;
kijunSenNegativeBuffer[bar_index] = kijunSenValue;
//
// CHIKOUSPAN ...
double chikouSpanValue = bar
.GetPrice(chikuoSpanAppliedTo);
//
chikouSpanBuffer[bar_index] = chikouSpanValue;
//
// KUMO ...
//
// SENKOUSPANA ...
double senkouSpanAValue = (tenkanSenValue + kijunSenValue) / 2;
senkouABuffer[bar_index] = senkouSpanAValue;
senkouSpanABuffer[bar_index] = senkouSpanAValue;
//
// SENKOUSPANB ...
//
// Extract Senkou Span B Top/Bottom Calculation Mode based on User Input ...
if (mSenkouSpanBTopMode == NULL || mSenkouSpanBBottomMode == NULL)
{
//
switch (senkouSpanBMode)
{
//
case X_XICH_HH_LL_MODE:
//
mSenkouSpanBTopMode = MODE_HIGH;
mSenkouSpanBBottomMode = MODE_LOW;
break;
//
case X_XICH_HO_LC_MODE:
//
mSenkouSpanBTopMode = MODE_OPEN;
mSenkouSpanBBottomMode = MODE_CLOSE;
break;
}
}
//
// Calculate Top ...
topValue = bar
.FindHighest(
senkouSpanBLength,
mSenkouSpanBTopMode
//
);
//
// Calculate Bottom ...
bottomValue = bar
.FindLowest(
senkouSpanBLength,
mSenkouSpanBBottomMode
//
);
//
double senkouSpanBValue = (topValue + bottomValue) / 2;
senkouBBuffer[bar_index] = senkouSpanBValue;
senkouSpanBBuffer[bar_index] = senkouSpanBValue;
}
//
// END Functions ...
//
-393
View File
@@ -1,393 +0,0 @@
// //
// // XICH ...
// X121XICHConditions xichConditions;
// result = GetICHConditions(
// xichConditions,
// barIndex,
// loopback //
// );
// if (!result)
// {
// //
// xpvConditions.Clean();
// xhkConditions.Clean();
// xichConditions.Clean();
// //
// return result;
// }
// //
// // XDON ...
// X121XDONConditions xdonConditions;
// result = GetDONConditions(
// xdonConditions,
// barIndex,
// loopback //
// );
// if (!result)
// {
// //
// xpvConditions.Clean();
// xhkConditions.Clean();
// xichConditions.Clean();
// xmasConditions.Clean();
// xatrConditions.Clean();
// xstrConditions.Clean();
// xcheConditions.Clean();
// xdonConditions.Clean();
// //
// return result;
// }
// //
// // XDELTA ...
// X121XDELTAConditions xdeltaConditions;
// result = GetDELTAConditions(
// xdeltaConditions,
// barIndex,
// loopback //
// );
// if (!result)
// {
// //
// xpvConditions.Clean();
// xhkConditions.Clean();
// xichConditions.Clean();
// xmasConditions.Clean();
// xatrConditions.Clean();
// xstrConditions.Clean();
// xcheConditions.Clean();
// xdonConditions.Clean();
// x3maConditions.Clean();
// xvwapConditions.Clean();
// xdeltaConditions.Clean();
// //
// return result;
// }
// //
// // XVOLUME ...
// X121XVOLUMEConditions xvolumeConditions;
// result = GetVOLUMEConditions(
// xvolumeConditions,
// barIndex,
// loopback //
// );
// if (!result)
// {
// //
// xpvConditions.Clean();
// xhkConditions.Clean();
// xichConditions.Clean();
// xmasConditions.Clean();
// xatrConditions.Clean();
// xstrConditions.Clean();
// xcheConditions.Clean();
// xdonConditions.Clean();
// x3maConditions.Clean();
// xvwapConditions.Clean();
// xdeltaConditions.Clean();
// xvolumeConditions.Clean();
// //
// return result;
// }
//
// xichConditions.Clean();
// xdonConditions.Clean();
// xdeltaConditions.Clean();
// xvolumeConditions.Clean();
// //
// // XICH ...
// bool GetICHConditions(
// X121XICHConditions &conditions, //
// int barIndex = 0, //
// int loopback = 5 //
// )
// {
// //
// bool result = false;
// //
// result = xichHelper.GetConditions(
// conditions,
// barIndex,
// loopback //
// );
// //
// return result;
// }
// //
// // XDON ...
// bool GetDONConditions(
// X121XDONConditions &conditions, //
// int barIndex = 0, //
// int loopback = 5 //
// )
// {
// //
// bool result = false;
// //
// result = xdonHelper.GetConditions(
// conditions,
// barIndex,
// loopback //
// );
// //
// return result;
// }
// //
// // XDELTA ...
// bool GetDELTAConditions(
// X121XDELTAConditions &conditions, //
// int barIndex = 0, //
// int loopback = 5 //
// )
// {
// //
// bool result = false;
// //
// result = xdeltaHelper.GetConditions(
// conditions,
// barIndex,
// loopback //
// );
// //
// return result;
// }
// //
// // XVOLUME ...
// bool GetVOLUMEConditions(
// X121XVOLUMEConditions &conditions, //
// int barIndex = 0, //
// int loopback = 5 //
// )
// {
// //
// bool result = false;
// //
// result = xvolumeHelper.GetConditions(
// conditions,
// barIndex,
// loopback //
// );
// //
// return result;
// }
//
// xichInputs = inputs.xichInputs;
// xdonInputs = inputs.xdonInputs;
// xdeltaInputs = inputs.xdeltaInputs;
// xvolumeInputs = inputs.xvolumeInputs;
// //
// // XICH ...
// xichHelper = new XCX121XICHHelper();
// result = xichHelper.Init(
// symbol,
// period,
// xichInputs //
// );
// if (!result)
// {
// //
// ZeroMemory(xccHelper);
// ZeroMemory(xpvHelper);
// ZeroMemory(xhkHelper);
// ZeroMemory(xmasHelper);
// ZeroMemory(xatrHelper);
// ZeroMemory(xstrHelper);
// ZeroMemory(xcheHelper);
// ZeroMemory(x3maHelper);
// ZeroMemory(xvwapHelper);
// //
// // ZeroMemory(xichHelper);
// // ZeroMemory(xdonHelper);
// // ZeroMemory(xdeltaHelper);
// // ZeroMemory(xvolumeHelper);
// //
// return result;
// }
// //
// // XDON ...
// xdonHelper = new XCX121XDONHelper();
// result = xdonHelper.Init(
// symbol,
// period,
// xdonInputs //
// );
// if (!result)
// {
// //
// ZeroMemory(xccHelper);
// ZeroMemory(xpvHelper);
// ZeroMemory(xhkHelper);
// ZeroMemory(xmasHelper);
// ZeroMemory(xatrHelper);
// ZeroMemory(xstrHelper);
// ZeroMemory(xcheHelper);
// ZeroMemory(x3maHelper);
// ZeroMemory(xvwapHelper);
// //
// // ZeroMemory(xichHelper);
// // ZeroMemory(xdonHelper);
// // ZeroMemory(xdeltaHelper);
// // ZeroMemory(xvolumeHelper);
// //
// return result;
// }
// //
// // XDELTA ...
// xdeltaHelper = new XCX121XDELTAHelper();
// result = xdeltaHelper.Init(
// symbol,
// period,
// xdeltaInputs //
// );
// if (!result)
// {
// //
// ZeroMemory(xccHelper);
// ZeroMemory(xpvHelper);
// ZeroMemory(xhkHelper);
// ZeroMemory(xmasHelper);
// ZeroMemory(xatrHelper);
// ZeroMemory(xstrHelper);
// ZeroMemory(xcheHelper);
// ZeroMemory(x3maHelper);
// ZeroMemory(xvwapHelper);
// //
// // ZeroMemory(xichHelper);
// // ZeroMemory(xdonHelper);
// // ZeroMemory(xdeltaHelper);
// // ZeroMemory(xvolumeHelper);
// //
// return result;
// }
// //
// // XVOLUME ...
// xvolumeHelper = new XCX121XVOLUMEHelper();
// result = xvolumeHelper.Init(
// symbol,
// period,
// xvolumeInputs //
// );
// if (!result)
// {
// //
// ZeroMemory(xccHelper);
// ZeroMemory(xpvHelper);
// ZeroMemory(xhkHelper);
// ZeroMemory(xmasHelper);
// ZeroMemory(xatrHelper);
// ZeroMemory(xstrHelper);
// ZeroMemory(xcheHelper);
// ZeroMemory(x3maHelper);
// ZeroMemory(xvwapHelper);
// //
// // ZeroMemory(xichHelper);
// // ZeroMemory(xdonHelper);
// // ZeroMemory(xdeltaHelper);
// // ZeroMemory(xvolumeHelper);
// //
// return result;
// }
//
// ZeroMemory(xichHelper);
// ZeroMemory(xdonHelper);
// ZeroMemory(xdeltaHelper);
// ZeroMemory(xvolumeHelper);
//
// XCX121XICHHelper *xichHelper;
// XCX121XDONHelper *xdonHelper;
// XCX121XDELTAHelper *xdeltaHelper;
// XCX121XVOLUMEHelper *xvolumeHelper;
//
// int xdonMax = xdonInputs.Max();
// int xichMax = xichInputs.Max();
// int xdeltaMax = xdeltaInputs.Max();
// int xvolumeMax = xvolumeInputs.Max();
//
// result = MathMax(result, xdonMax);
// result = MathMax(result, xichMax);
// result = MathMax(result, xdeltaMax);
// result = MathMax(result, xvolumeMax);
// &&
// xichInputs.IsValid() &&
// xdonInputs.IsValid() &&
// xdeltaInputs.IsValid() &&
// xvolumeInputs.IsValid()
//
//
// xichInputs.Default();
// xdonInputs.Default();
// xdeltaInputs.Default();
// xvolumeInputs.Default();
//
// xichInputs.Clean();
// xdonInputs.Clean();
// xdeltaInputs.Clean();
// xvolumeInputs.Clean();
//
// xichInputs.Clean();
// xdonInputs.Clean();
// xdeltaInputs.Clean();
// xvolumeInputs.Clean();
//
// delete xichHelper;
// delete xdonHelper;
// delete xdeltaHelper;
// delete xvolumeHelper;
//
// ZeroMemory(xichHelper);
// ZeroMemory(xdonHelper);
// ZeroMemory(xdeltaHelper);
// ZeroMemory(xvolumeHelper);
-431
View File
@@ -1,431 +0,0 @@
//
bool isPeakPivot = conditions.isPeakIsPivot;
bool isValePivot = conditions.isValeIsPivot;
//
bool isPivotBullish = isValePivot &&
isCBarValidForBullish;
//
bool isPivotBearish = isPeakPivot &&
isCBarValidForBearish;
//
bool isPivotBullishReversal =
//
isPivotBullish &&
conditions.isKIBearish &&
conditions.isSarBearish &&
conditions.isTrendBearish &&
conditions.isLastSupportRejected
//
;
//
bool isPivotBearishReversal =
//
isPivotBearish &&
conditions.isKIBullish &&
conditions.isSarBullish &&
conditions.isTrendBullish &&
conditions.isLastResistanceRejected
//
;
//
bool isPivot = isPivotBullishReversal ||
isPivotBearishReversal;
if (isPivot)
{
Print("Pivot: ");
//
if (isPivotBullish)
{
Print("Bullish: ", isPivotBullish);
}
//
if (isPivotBearish)
{
Print("Bearish: ", isPivotBearish);
}
//
Print("Bullish Score: ", bullishScore);
Print("Bearish Score: ", bearishScore);
}
//
bool isOverFib2 = pBar.low > conditions.fiboLevel2Buffer[cIDX];
bool isUnderFib2 = pBar.high < conditions.fiboLevel2Buffer[cIDX];
//
bool isTrendBasedBullish =
isUnderFib2 &&
isCBarValidForBullish &&
conditions.isTrendRejectUp;
//
bool isTrendBasedBearish =
isOverFib2 &&
isCBarValidForBearish &&
conditions.isTrendRejectDown;
//
bool isTrend =
isTrendBasedBullish ||
isTrendBasedBearish;
//
if (isTrend)
{
Print("Trend Based ...");
}
//
bool isBarBreakedKITrendBullish =
cBar.IsBullish() &&
isCBarBullishMomentum &&
cBar.open < conditions.kiBuffer[cIDX] &&
cBar.close > conditions.kiBuffer[cIDX] &&
cBar.open < conditions.trendBuffer[cIDX] &&
cBar.close > conditions.trendBuffer[cIDX];
//
bool isBarBreakedKITrendBearish =
cBar.IsBearish() &&
isCBarBearishMomentum &&
cBar.open > conditions.kiBuffer[cIDX] &&
cBar.close < conditions.kiBuffer[cIDX] &&
cBar.open > conditions.trendBuffer[cIDX] &&
cBar.close > conditions.trendBuffer[cIDX];
//
bool isKITrendBreaked =
isBarBreakedKITrendBullish ||
isBarBreakedKITrendBearish;
//
if (isKITrendBreaked)
{
Print("KI Trend Breaked ...");
}
/////////////////////////////////////////////////////////////
// while (index <= end)
// {
// //
// XCAEAConditions iConditions;
// bool has = helper.GetConditions(
// iConditions,
// index,
// 5 //
// );
// if (!has)
// {
// //
// iConditions.Clean();
// continue;
// }
// //
// zIDX = 0;
// cIDX = zIDX + 1;
// pIDX = cIDX + 1;
// p2IDX = pIDX + 1;
// //
// XOHCL cBar;
// has = cBar.Init(
// iConditions.symbol,
// iConditions.period,
// index + 1 //
// );
// if (!has)
// {
// //
// cBar.Clean();
// iConditions.Clean();
// continue;
// }
// //
// // Read Reuired Data ...
// //
// // KI ...
// //
// double cKI = iConditions.kiBuffer[cIDX];
// double pKI = iConditions.kiBuffer[pIDX];
// double p2KI = iConditions.kiBuffer[p2IDX];
// //
// double cKIState = iConditions.kiStateBuffer[cIDX];
// double pKIState = iConditions.kiStateBuffer[pIDX];
// double p2KIState = iConditions.kiStateBuffer[p2IDX];
// //
// // TKI ...
// //
// double cTKI = iConditions.tkiBuffer[cIDX];
// double pTKI = iConditions.tkiBuffer[pIDX];
// double p2TKI = iConditions.tkiBuffer[p2IDX];
// //
// double cTKIState = iConditions.tkiStateBuffer[cIDX];
// double pTKIState = iConditions.tkiStateBuffer[pIDX];
// double p2TKIState = iConditions.tkiStateBuffer[p2IDX];
// //
// // TREND ...
// //
// double cTrend = iConditions.trendBuffer[cIDX];
// double pTrend = iConditions.trendBuffer[pIDX];
// double p2Trend = iConditions.trendBuffer[p2IDX];
// //
// double ctrendState = iConditions.trendStateBuffer[cIDX];
// double ptrendState = iConditions.trendStateBuffer[pIDX];
// double p2trendState = iConditions.trendStateBuffer[p2IDX];
// //
// // SWING Low ...
// //
// double cSWL = iConditions.swingLowBuffer[cIDX];
// double pSWL = iConditions.swingLowBuffer[pIDX];
// double p2SWL = iConditions.swingLowBuffer[p2IDX];
// //
// // SWING High ...
// //
// double cSWH = iConditions.swingHighBuffer[cIDX];
// double pSWH = iConditions.swingHighBuffer[pIDX];
// double p2SWH = iConditions.swingHighBuffer[p2IDX];
// //
// // PEAK ...
// //
// double cPeak = iConditions.peakBuffer[cIDX];
// double pPeak = iConditions.peakBuffer[pIDX];
// double p2Peak = iConditions.peakBuffer[p2IDX];
// //
// // VALE ...
// //
// double cVale = iConditions.valeBuffer[cIDX];
// double pVale = iConditions.valeBuffer[pIDX];
// double p2Vale = iConditions.valeBuffer[p2IDX];
// //
// // Required Condirions ...
// //
// bool isTKITRNDBullish =
// iConditions.isKIBullish &&
// iConditions.isTKIBullish &&
// iConditions.isTrendBullish;
// //
// bool isTKITRNDBearish =
// iConditions.isKIBearish &&
// iConditions.isTKIBearish &&
// iConditions.isTrendBearish;
// //
// XBoxZone iBox;
// //
// // Check FVG ...
// bool isFVG = barAnalyser.IsFVG(
// cBar,
// iBox,
// false // Force Same Bars ...
// );
// if (isFVG)
// {
// //
// // Validate FVG ...
// bool isFVGBullish = iBox.IsBullish();
// // //
// // isFVG =
// // isFVGBullish
// // ? isTKITRNDBullish
// // : isTKITRNDBearish;
// //
// if (isFVG)
// {
// //
// XCBoxObject *iObj;
// has = drawer.DrawBox(
// iBox,
// iObj //
// );
// if (has)
// {
// iObj.BoxWidth(2);
// }
// }
// }
// //
// index++;
// cBar.Clean();
// iConditions.Clean();
// }
////////////////////////////////////////////////////////////////////
//
XBoxZone tmpFVGBoxes[];
//
int index = barIndex;
int end = index + loopback;
while (index <= end)
{
//
XOHCL cBar;
bool has = cBar.Init(
helper.GetSymbol(),
helper.GetPeriod(),
index + 1 //
);
if (!has)
{
//
cBar.Clean();
continue;
}
//
// Check FVG ...
XBoxZone iBox;
bool isFVG = barAnalyser.IsFVG(
cBar,
iBox,
false // Force Same Bars ...
);
if (isFVG)
{
//
AddBox(
iBox,
tmpFVGBoxes //
);
}
//
index++;
cBar.Clean();
}
//
int idx = -1;
bool has = false;
if (HasChild(tmpFVGBoxes))
{
//
while (HasChild(tmpFVGBoxes))
{
//
idx = GetYoungest(tmpFVGBoxes);
has = IsValidIndex(idx);
if (!has)
{
break;
}
//
XBoxZone iBox = tmpFVGBoxes[idx];
ArrayRemove(
tmpFVGBoxes,
idx,
1 //
);
//
// Here We Have to Validate FVG ...
//
XCBoxObject *iObj;
has = drawer.DrawBox(
iBox,
iObj //
);
//
}
}
//////////////////////////////////////////////////////////////////////////////////
has = HasPeakPivots();
if (has)
{
//
count = CountPeakPivots();
for (int i = 0; i < count; i++)
{
//
XCAPivot iPivot = peakPivots[i];
//
int toIDX = iPivot.ToIndex();
int fromIDX = iPivot.FromIndex();
has = IsValidIndex(toIDX) &&
IsValidIndex(fromIDX);
if (!has)
{
//
iPivot.Clean();
continue;
}
//
for (int j = toIDX; j <= fromIDX; j++) {
//
XCAEAConditions jConditions;
has = helper.GetConditions(
jConditions,
j,
5 //
);
if (!has) {
//
jConditions.Clean();
continue;
}
//
datetime jTime = GetBarTime(
jConditions.symbol,
jConditions.period,
j //
);
//
}
//
iPivot.Clean();
}
}
//////////////////////////////////////////////////////////////////////////////////////////
-45
View File
@@ -1,45 +0,0 @@
//
// PEAKS ...
//
// VALES ...
//
// PEAK SWH RES ...
//
// VALE SWL SUP ...
//
// SWING HIGH ...
//
// SWING LOW ...
//
// KI ...
//
// TKI ...
//
// FVG ...
//
// TREND ...
//
// TKITRND ...
//
// SAME CYCLES HH / LL ...
//
// OSCS ...
//
// RSI ...
//
// CCI ...
-816
View File
@@ -1,816 +0,0 @@
/////////////////////////////////////////////////////////////////////////////////
//
bool DetectXCAEAConditions(
XBoxZone &boxes[],
XCAEAConditions &conditions,
XBoxZone &pivotBox,
XBoxZone &box,
ENUM_X_DIRECTION &dir,
XCXCAEAHelper *helper,
int barIndex = 0,
int loopback = 10 //
)
{
//
bool result = false;
//
int idx = -1;
int count = 0;
bool has = false;
//
box.Clean();
conditions.Clean();
dir = X_DIRECTION_NONE;
//
if (barIndex < 0)
{
barIndex = 0;
}
loopback = NormalizeInt(loopback, 5);
//
string symbol = helper.GetSymbol();
ENUM_TIMEFRAMES period = helper.GetPeriod();
//
result = helper.GetConditions(
conditions,
barIndex,
loopback //
);
if (!result)
{
//
conditions.Clean();
return result;
}
//
int zIDX = barIndex;
int cIDX = zIDX + 1;
int pIDX = cIDX + 1;
int p2IDX = pIDX + 1;
int p3IDX = p2IDX + 1;
int p4IDX = p3IDX + 1;
//
// Reading Parameters ...
//
// KI ...
//
double cKI = conditions.kiBuffer[cIDX];
double pKI = conditions.kiBuffer[pIDX];
double p2KI = conditions.kiBuffer[p2IDX];
//
double cKIState = conditions.kiStateBuffer[cIDX];
double pKIState = conditions.kiStateBuffer[pIDX];
double p2KIState = conditions.kiStateBuffer[p2IDX];
//
// TKI ...
//
double cTKI = conditions.tkiBuffer[cIDX];
double pTKI = conditions.tkiBuffer[pIDX];
double p2TKI = conditions.tkiBuffer[p2IDX];
//
double cTKIState = conditions.tkiStateBuffer[cIDX];
double pTKIState = conditions.tkiStateBuffer[pIDX];
double p2TKIState = conditions.tkiStateBuffer[p2IDX];
//
// TREND ...
//
double cTrend = conditions.trendBuffer[cIDX];
double pTrend = conditions.trendBuffer[pIDX];
double p2Trend = conditions.trendBuffer[p2IDX];
//
double ctrendState = conditions.trendStateBuffer[cIDX];
double ptrendState = conditions.trendStateBuffer[pIDX];
double p2trendState = conditions.trendStateBuffer[p2IDX];
//
// SWING Low ...
double cSWL = conditions.swingLowBuffer[cIDX];
double pSWL = conditions.swingLowBuffer[pIDX];
double p2SWL = conditions.swingLowBuffer[p2IDX];
//
// SWING High ...
double cSWH = conditions.swingHighBuffer[cIDX];
double pSWH = conditions.swingHighBuffer[pIDX];
double p2SWH = conditions.swingHighBuffer[p2IDX];
//
// PEAK ...
double zPeak = conditions.peakBuffer[zIDX];
double cPeak = conditions.peakBuffer[cIDX];
double pPeak = conditions.peakBuffer[pIDX];
double p2Peak = conditions.peakBuffer[p2IDX];
double p3Peak = conditions.peakBuffer[p3IDX];
//
// VALE ...
double zVale = conditions.valeBuffer[zIDX];
double cVale = conditions.valeBuffer[cIDX];
double pVale = conditions.valeBuffer[pIDX];
double p2Vale = conditions.valeBuffer[p2IDX];
double p3Vale = conditions.valeBuffer[p3IDX];
//
// RSI ...
double zRSI = conditions.rsiBuffer[zIDX];
double cRSI = conditions.rsiBuffer[cIDX];
double pRSI = conditions.rsiBuffer[pIDX];
double p2RSI = conditions.rsiBuffer[p2IDX];
double p3RSI = conditions.rsiBuffer[p3IDX];
//
// CCI ...
double zCCI = conditions.cciBuffer[zIDX];
double cCCI = conditions.cciBuffer[cIDX];
double pCCI = conditions.cciBuffer[pIDX];
double p2CCI = conditions.cciBuffer[p2IDX];
double p3CCI = conditions.cciBuffer[p3IDX];
//
// RVI ...
//
double zRVI = conditions.rviBuffer[zIDX];
double cRVI = conditions.rviBuffer[cIDX];
double pRVI = conditions.rviBuffer[pIDX];
double p2RVI = conditions.rviBuffer[p2IDX];
double p3RVI = conditions.rviBuffer[p3IDX];
//
double zRVISignal = conditions.rviSignalBuffer[zIDX];
double cRVISignal = conditions.rviSignalBuffer[cIDX];
double pRVISignal = conditions.rviSignalBuffer[pIDX];
double p2RVISignal = conditions.rviSignalBuffer[p2IDX];
double p3RVISignal = conditions.rviSignalBuffer[p3IDX];
//
// Reading Bars ...
//
XOHCL zBar;
XOHCL cBar;
XOHCL pBar;
XOHCL p2Bar;
XOHCL p3Bar;
XOHCL p4Bar;
result = zBar.Init(
symbol,
period,
zIDX //
);
result =
result &&
zBar.GetPreviousBar(cBar);
result =
result &&
cBar.GetPreviousBar(pBar);
result =
result &&
pBar.GetPreviousBar(p2Bar);
result =
result &&
p2Bar.GetPreviousBar(p3Bar);
result =
result &&
p3Bar.GetPreviousBar(p4Bar);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
p4Bar.Clean();
//
box.Clean();
conditions.Clean();
//
return result;
}
//
// Bars Conditions ...
//
ENUM_X_DIRECTION cBarDir;
//
// Hammer ...
bool isCBarHammer = helper
.barAnalyser
.IsHammer(
cBar,
cBarDir //
);
bool isCBarBullishHammer =
isCBarHammer &&
IsBullish(cBarDir);
bool isCBarBearishHammer =
isCBarHammer &&
IsBearish(cBarDir);
//
// Rejected ...
bool isCBarRejected = helper
.barAnalyser
.IsRejected(
cBar,
cBarDir,
false, // Force Type ...
true // Force Fibo Pressure ...
);
bool isCBarBullishRejected =
isCBarRejected &&
IsBullish(cBarDir);
bool isCBarBearishRejected =
isCBarRejected &&
IsBearish(cBarDir);
//
// Engulfed ...
bool isCBarEngulfed = helper
.barAnalyser
.IsEngulfed(
cBar,
cBarDir //
);
bool isCBarBullishEngulfed =
isCBarEngulfed &&
IsBullish(cBarDir);
bool isCBarBearishEngulfed =
isCBarEngulfed &&
IsBearish(cBarDir);
//
// Momentum ...
bool isCBarMomentum = helper
.barAnalyser
.IsMomentum(
cBar,
cBarDir,
1 //
);
bool isCBarBullishMomentum =
isCBarMomentum &&
IsBullish(cBarDir);
bool isCBarBearishMomentum =
isCBarMomentum &&
IsBearish(cBarDir);
//
// Bar Sumarise ...
//
bool isCBarValidForBullish =
(isCBarBullishHammer ||
isCBarBullishRejected ||
isCBarBullishMomentum ||
isCBarBullishEngulfed);
//
bool isCBarValidForBearish =
(isCBarBearishHammer ||
isCBarBearishRejected ||
isCBarBearishMomentum ||
isCBarBearishEngulfed);
//
double pBarLowShadow = pBar.GetLowShadow();
double pBarHighShadow = pBar.GetHighShadow();
//
bool isPBarSwingLow =
pBarLowShadow > 0 &&
pBar.low < p2Bar.low &&
pBar.low < cBar.low &&
p2Bar.GetUp() >= pBar.low &&
p2Bar.GetDown() <= pBar.high &&
cBar.GetUp() >= pBar.low &&
cBar.GetDown() <= pBar.high;
//
bool isPBarSwingHigh =
pBarHighShadow > 0 &&
pBar.high > p2Bar.high &&
pBar.high > cBar.high &&
p2Bar.GetUp() >= pBar.low &&
p2Bar.GetDown() <= pBar.high &&
cBar.GetUp() >= pBar.low &&
cBar.GetDown() <= pBar.high;
//
// Score ...
//
double bullishScore = 0;
double bearishScore = 0;
conditions.GenerateScore(
bullishScore,
bearishScore //
);
//
bool isScoreBullish =
bullishScore > bearishScore;
//
bool isScoreBearish =
bearishScore > bullishScore;
//
string summary =
conditions
.GenerateSummary();
//
// Detect Selected Box ...
double providedSL = 0;
bool isBoxRejected = false;
bool isBoxActivated = false;
bool hasBoxes = HasChild(boxes);
if (hasBoxes)
{
//
// Detect Selected Boxes ...
XBoxZone tmp[];
Copy(
boxes,
tmp //
);
while (HasChild(tmp))
{
//
idx = GetYoungest(tmp);
has = IsValidIndex(idx);
if (!has)
{
break;
}
//
XBoxZone iBox;
iBox = tmp[idx];
ArrayRemove(
tmp,
idx,
1 //
);
//
// Check Selected Box not RSI or CCI ...
has = iBox.type == ToString(XCA_PEAKSWHRES) ||
iBox.type == ToString(XCA_VALESWLSUP);
if (!has)
{
continue;
}
//
bool isBullish = iBox.IsBullish();
bool isBearish = iBox.IsBearish();
//
double rejectedCheckPrice =
isBullish
? iBox.upper
: iBox.lower;
//
// Check Box Selecting Senarios ...
//
// Selecting Rejected Boxes ...
isBoxRejected = cBar.IsRejected(
rejectedCheckPrice,
iBox.dir,
false,
false //
);
//
// Selecting Activation Boxes ...
//
bool isBullishActivated =
isBullish &&
isPBarSwingLow &&
cBar.IsBullish() &&
cBar.GetUp() > rejectedCheckPrice &&
cBar.GetDown() < rejectedCheckPrice;
//
bool isBearishActivated =
isBearish &&
isPBarSwingHigh &&
cBar.IsBearish() &&
cBar.GetUp() > rejectedCheckPrice &&
cBar.GetDown() < rejectedCheckPrice;
//
isBoxActivated = isBullishActivated ||
isBearishActivated;
//
// Detect Box is Selected or not ...
has =
isBoxRejected ||
isBoxActivated;
if (has)
{
//
pivotBox = iBox;
//
iBox.Clean();
break;
}
//
iBox.Clean();
}
//
Clean(tmp);
}
//
// Force Conditions to Have Selected Box ...
result = hasBoxes &&
pivotBox.IsValid();
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
p4Bar.Clean();
//
box.Clean();
pivotBox.Clean();
conditions.Clean();
//
return result;
}
//
// Conditions ...
//
bool isRSIBullish =
zRSI >= cRSI &&
cRSI > pRSI;
bool isRSIBearish =
zRSI <= cRSI &&
cRSI < pRSI;
//
bool isCCIBullish =
zCCI >= cCCI &&
cCCI > pCCI &&
(zCCI > conditions.cciOSLevel ||
cCCI > conditions.cciOSLevel);
bool isCCIBearish =
zCCI >= cCCI &&
cCCI > pCCI &&
(zCCI < conditions.cciOBLevel ||
cCCI < conditions.cciOBLevel);
//
// Signaller Summarization ...
//
// Cond1 Act Using Box Activation ...
//
bool isCond1Bullish =
//
false &&
isCCIBullish &&
isBoxActivated &&
pivotBox.IsValid() &&
pivotBox.IsBullish()
//
;
//
bool isCond1Bearish =
//
false &&
isCCIBearish &&
isBoxActivated &&
pivotBox.IsValid() &&
pivotBox.IsBearish()
//
;
//
bool isCond1 = isCond1Bullish ||
isCond1Bearish;
if (isCond1)
{
//
providedSL =
isCond1Bullish
? MathMin(pBar.low, pivotBox.lower)
: MathMax(pBar.high, pivotBox.upper);
//
Print("Cond1");
}
//
// Cond2 Act Using Box Rejection ...
//
bool isCond2Bullish =
//
false &&
isBoxRejected &&
pivotBox.IsValid() &&
pivotBox.IsBullish()
//
;
//
bool isCond2Bearish =
//
false &&
isBoxRejected &&
pivotBox.IsValid() &&
pivotBox.IsBearish()
//
;
//
bool isCond2 = isCond2Bullish ||
isCond2Bearish;
if (isCond2)
{
//
providedSL =
isCond1Bullish
? MathMin(pBar.low, pivotBox.lower)
: MathMax(pBar.high, pivotBox.upper);
//
Print("Cond2");
}
//
// Cond3 Act Using CCi Peaks and Vales ...
//
bool isCond3Bullish = false;
//
bool isCond3Bearish = false;
//
bool isCond3 = isCond3Bullish ||
isCond3Bearish;
if (isCond3)
{
//
//
Print("Cond3");
}
//
// Summarise Conditions ...
//
bool isBullish =
//
isCond1Bullish ||
isCond2Bullish;
//
;
//
bool isBearish =
//
isCond1Bearish ||
isCond2Bearish
//
;
//
result = isBullish ||
isBearish;
if (result)
{
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
double entry = GetEntry(
conditions.symbol,
dir //
);
//
double sl =
providedSL > 0
? providedSL
: isBullish
? pivotBox.lower
: pivotBox.upper;
//
box.dir = dir;
box.symbol = conditions.symbol;
box.period = conditions.period;
//
box.upper =
isBullish
? entry
: sl;
//
box.lower =
isBullish
? sl
: entry;
//
box.to = zBar.time;
box.from = p4Bar.time;
//
box.type = "XCASignal";
}
//
result = box.IsValid() &&
HasDirection(dir);
//
// Cleanup Resources ...
//
if (!result)
{
//
box.Clean();
pivotBox.Clean();
conditions.Clean();
}
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
p4Bar.Clean();
//
return result;
}
///////////////////////////////////////////////////////////////////////////////////
//
// Detect Trend Lines ...
//
// RSI ...
bool canLookupValeTrendLine =
detector.HasRSIValePivots() &&
detector.CountRSIValePivots() >= 2;
if (canLookupValeTrendLine)
{
//
XBoxZone rsiVale;
XBoxZone rsiValePrev;
count = detector.CountRSIValePivots();
has = detector.rsiValePivots[count - 1].AsBox(rsiValePrev);
has = has &&
detector.rsiValePivots[count - 2].AsBox(rsiVale);
bool hasTrend = has &&
rsiVale.lower > rsiValePrev.lower;
//
if (hasTrend)
{
//
string valeTrendLineName = "RSIValeTrendLine";
CChartObjectTrend *iVTLine;
iVTLine = new CChartObjectTrend();
has = iVTLine.Create(
0,
valeTrendLineName,
0,
rsiValePrev.from,
rsiValePrev.lower,
rsiVale.to,
rsiVale.lower //
);
if (has)
{
//
iVTLine.RayRight(true);
iVTLine.Width(2);
iVTLine.Color(clrAqua);
iVTLine.Style(STYLE_SOLID);
//
mObjects.Add(iVTLine);
}
}
//
rsiVale.Clean();
rsiValePrev.Clean();
}
//
// CCI ...
// canLookupValeTrendLine =
// detector.HasCCIValePivots() &&
// detector.CountCCIValePivots() >= 2;
// if (canLookupValeTrendLine)
// {
// //
// XBoxZone cciVale;
// XBoxZone cciValePrev;
// count = detector.CountCCIValePivots();
// has = detector.cciValePivots[count - 1].AsBox(cciValePrev);
// has = has &&
// detector.cciValePivots[count - 2].AsBox(cciVale);
// bool hasTrend = has &&
// cciVale.lower > cciValePrev.lower;
// //
// if (hasTrend)
// {
// //
// string valeTrendLineName = "CCIValeTrendLine";
// CChartObjectTrend *iVTLine;
// iVTLine = new CChartObjectTrend();
// has = iVTLine.Create(
// 0,
// valeTrendLineName,
// 0,
// cciValePrev.from,
// cciValePrev.lower,
// cciVale.to,
// cciVale.lower //
// );
// if (has)
// {
// //
// iVTLine.RayRight(true);
// iVTLine.Width(2);
// iVTLine.Color(clrAqua);
// iVTLine.Style(STYLE_SOLID);
// //
// mObjects.Add(iVTLine);
// }
// }
// //
// cciVale.Clean();
// cciValePrev.Clean();
// }
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
@@ -1,481 +0,0 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Indicator
// -------------------------------------------------
// Name: XCXCAEAPOIDetector ...
// Description: Class for XCAEA POI Detector ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm Class for XCAEA POI Detector"
#property strict
//
// Imports ...
#include "../../Classes/x-saherelm.x-bar.analyser.class.mq5"
#include "../Helpers/xcaea.helper.mq5"
//
// Definitions ...
// enum ENUM_X_PIVOT_KINDS
// {
// X_PIVOT_SWL, // SWL
// X_PIVOT_SWH, // SWH
// };
// string ToString(ENUM_X_PIVOT_KINDS value)
// {
// //
// string result = NULL;
// //
// result = EnumToString(value);
// //
// return result;
// }
// struct XSamePivot
// {
// //
// // Props ...
// datetime to;
// string type;
// double value;
// datetime from;
// string symbol;
// ENUM_X_DIRECTION dir;
// ENUM_TIMEFRAMES period;
// //
// // Constructor ...
// XSamePivot()
// {
// Clean();
// }
// //
// // Tools ...
// /**
// * Cleanup Model ...
// */
// void Clean()
// {
// //
// to = NULL;
// value = 0;
// from = NULL;
// type = NULL;
// symbol = NULL;
// period = NULL;
// dir = X_DIRECTION_NONE;
// }
// /**
// * Validate Model ...
// *
// * @return ( bool )
// */
// bool IsValid()
// {
// //
// bool result = false;
// //
// result =
// //
// from < to &&
// value != 0 &&
// IsValid(to) &&
// IsValid(from) &&
// IsValid(symbol) &&
// IsValid(period) &&
// HasDirection(dir)
// //
// ;
// //
// return result;
// }
// /**
// * Check a Model is Same As Other ...
// *
// * @return ( bool )
// */
// bool IsSameAs(XSamePivot &item)
// {
// //
// bool result = false;
// //
// result = IsValid() &&
// item.IsValid();
// if (!result)
// {
// return result;
// }
// //
// result =
// //
// to == item.to &&
// dir == item.dir &&
// from == item.from &&
// type == item.type &&
// value == item.value &&
// symbol == item.symbol &&
// period == item.period
// //
// ;
// //
// return result;
// }
// //
// };
//
// Implementations ...
class XCXCAEAPOIDetector : public XCBase
{
//
// Public ...
public:
//
// Props ...
//
// Constructors ...
XCXCAEAPOIDetector(
XCXCAEAHelper *_helper //
)
{
//
helper = _helper;
barAnalyser = new XCBarAnalyser();
//
Default();
}
//
// De Constructors ...
~XCXCAEAPOIDetector()
{
//
Clean(tkitrndPivots);
//
ZeroMemory(helper);
ZeroMemory(barAnalyser);
}
//
// Properties ...
int TITrndPivotVerification()
{
return tkitrndPivotVerification;
}
void TKITrndPivotVerification(int value)
{
//
value = NormalizeInt(value, 0);
//
tkitrndPivotVerification = value;
}
//
// Tools ...
virtual void Default()
{
//
TKITrndPivotVerification(10);
}
//
void Update(
int barIndex = 0,
int loopback = 100 //
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
loopback = NormalizeInt(loopback, 100);
//
int index = barIndex;
int end = index + loopback;
while (index <= end)
{
//
XCAEAConditions iConditions;
bool has = helper.GetConditions(
iConditions,
index,
loopback //
);
//
// Detecting Same Pivots ...
// HandleTKITRNDPivotDetection(iConditions, index);
//
index++;
iConditions.Clean();
}
//
}
//
// POI Handlers ...
// bool HasTKITRNDPivots()
// {
// return HasChild(tkitrndPivots);
// }
// int CountTKITRNDPivots()
// {
// return ArraySize(tkitrndPivots);
// }
// int FillTKITRNDPivots(XSamePivot &pivots[])
// {
// //
// int result = 0;
// //
// if (!HasTKITRNDPivots())
// {
// return result;
// }
// //
// Copy(
// tkitrndPivots,
// pivots //
// );
// //
// result = ArraySize(pivots);
// //
// return result;
// }
// bool IsTKITRNDPivotExists(
// int &index,
// XSamePivot &pivot //
// )
// {
// //
// bool result = false;
// //
// index = -1;
// //
// result = pivot.IsValid() &&
// HasTKITRNDPivots();
// if (!result)
// {
// return result;
// }
// //
// int count = CountTKITRNDPivots();
// for (int i = 0; i < count; i++)
// {
// //
// XSamePivot iPivot = tkitrndPivots[i];
// //
// bool isSame =
// pivot.IsSameAs(iPivot);
// if (isSame)
// {
// //
// index = i;
// iPivot.Clean();
// //
// break;
// }
// //
// iPivot.Clean();
// }
// //
// result = IsValidIndex(index);
// //
// return result;
// }
//
// Protected ...
protected:
//
// Props ...
// //
// void HandleTKITRNDPivotDetection(
// XCAEAConditions &conditions,
// int barIndex = 0 //
// )
// {
// //
// if (barIndex < 0)
// {
// barIndex = 0;
// }
// //
// if (tkitrndPivotVerification <= 0)
// {
// return;
// }
// //
// datetime barTime = GetBarTime(
// conditions.symbol,
// conditions.period,
// barIndex + 1 //
// );
// //
// int index = 2;
// datetime cTime = barTime;
// int end = ArraySize(conditions.swingLowBuffer);
// //
// int swingLowVerified = 0;
// datetime swingLowFinishAt = NULL;
// datetime swingLowStartAt = barTime;
// double swingLow = conditions.swingLowBuffer[1];
// bool canLookupSwingLow = true;
// //
// bool isVerified = false;
// bool canContinue = true;
// while (index < end && canContinue)
// {
// //
// cTime += PeriodSeconds(conditions.period);
// //
// // Swing Low ...
// double iSWL = conditions.swingLowBuffer[index];
// if (iSWL == swingLow)
// {
// swingLowVerified++;
// }
// else if (iSWL != swingLow)
// {
// //
// isVerified = swingLowVerified >= tkitrndPivotVerification;
// if (isVerified)
// {
// //
// swingLowFinishAt = cTime;
// //
// XSamePivot iPivot;
// //
// iPivot.value = swingLow;
// iPivot.to = swingLowFinishAt;
// iPivot.from = swingLowStartAt;
// iPivot.dir = X_DIRECTION_BULLISH;
// iPivot.symbol = conditions.symbol;
// iPivot.period = conditions.period;
// iPivot.type = ToString(X_PIVOT_SWL);
// //
// if (iPivot.IsValid())
// {
// AddOrUpdateTKITRNDPivot(iPivot);
// }
// }
// //
// // Reset ...
// swingLow = iSWL;
// swingLowVerified = 0;
// swingLowFinishAt = NULL;
// swingLowStartAt = cTime;
// canLookupSwingLow = true;
// }
// //
// index++;
// //
// canContinue = canLookupSwingLow;
// }
// }
// //
// void AddOrUpdateTKITRNDPivot(XSamePivot &pivot)
// {
// //
// int idx = -1;
// bool isExists = IsTKITRNDPivotExists(
// idx,
// pivot //
// );
// if (isExists)
// {
// return;
// }
// //
// AddRef(
// pivot,
// tkitrndPivots //
// );
// }
//
// Prrivate ...
private:
//
// Props ...
int tkitrndPivotVerification; // KI/TKI/Trend Verification ...
//
XCXCAEAHelper *helper;
XCBarAnalyser *barAnalyser;
//
// Same Pivots ...
// XSamePivot tkitrndPivots[]; // TKITrend is Bullish/Bearish and Swing Low/High Under / Over Min / Max ...
//
};
//