Cleanup Work Space after Backup 14040203 ...
This commit is contained in:
@@ -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
@@ -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]
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1,27 +0,0 @@
|
||||
|
||||
//
|
||||
// XCC ...
|
||||
|
||||
//
|
||||
// XPV ...
|
||||
|
||||
//
|
||||
// XHK ...
|
||||
|
||||
//
|
||||
// XMAS ...
|
||||
|
||||
//
|
||||
// XATR ...
|
||||
|
||||
//
|
||||
// XSTR ...
|
||||
|
||||
//
|
||||
// XCHE ...
|
||||
|
||||
//
|
||||
// X3MA ...
|
||||
|
||||
//
|
||||
// XVWAP ...
|
||||
@@ -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 ...
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -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);
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -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
@@ -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();
|
||||
}
|
||||
|
||||
//
|
||||
@@ -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 ...
|
||||
//
|
||||
@@ -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);
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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 ...
|
||||
@@ -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 ...
|
||||
|
||||
//
|
||||
};
|
||||
|
||||
//
|
||||
Reference in New Issue
Block a user