This commit is contained in:
2025-03-27 17:47:02 +03:30
parent 8278d132dd
commit c00704b83b
11 changed files with 1530 additions and 559 deletions
+768 -184
View File
@@ -1,214 +1,798 @@
//
// 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();
//
// 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);
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();
//
// Check Bar Place Based on Golden Zones ...
return result;
}
//
bool isBarInPeaksGoldenZone =
cBar.high <= cXConditions.peaksBuffer[cIDX] &&
cBar.low >= cXConditions.peaksGoldenBuffer[cIDX];
//
XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer;
//
bool isBarInValesGoldenZone =
cBar.high >= cXConditions.valesBuffer[cIDX] &&
cBar.low <= cXConditions.valesGoldenBuffer[cIDX];
//
// Checking Other Conditions ...
//
XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer;
//
// 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);
//
// X3MA ...
// //
// // Continuation Bullish ...
// bool isContinuationBullish =
// //
// isBarValidForBullish &&
// cXConditions.isSarBullish &&
// cXConditions.isStrBullish &&
// cXConditions.isNewPeakOverLast
// //
// ;
//
bool isX3MaFastMidOverPeaksGoldeZone =
isX3MaFastOverPeaksGoldenZone &&
isX3MaMidOverPeaksGoldenZone;
// //
// // 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)
{
//
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] //
// Converts FairValueGaps to Box ...
ToBox(
cState.fairValueGaps,
tmpBoxes //
);
//
double x3MaFastMidMin = MathMin(
cXConditions.x3maFastBuffer[cIDX],
cXConditions.x3maMidBuffer[cIDX] //
);
// 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);
//
double vwapFastMidMax = MathMax(
cXConditions.vwapFastBuffer[cIDX],
cXConditions.vwapMidBuffer[cIDX] //
);
// 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();
}
}
}
//
double vwapFastMidMin = MathMin(
cXConditions.vwapFastBuffer[cIDX],
cXConditions.vwapMidBuffer[cIDX] //
);
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);
}
}
//
double x3maVWapFastMidMax = MathMax(x3MaFastMidMax, vwapFastMidMax);
double x3maVWapFastMidMin = MathMin(x3MaFastMidMin, vwapFastMidMin);
// Draw FVG ...
if (fvgBox.IsValid())
{
//
XCBoxObject *iObj;
has = drawer.DrawBox(
fvgBox,
iObj //
);
if (has)
{
iObj.BoxStyle(STYLE_SOLID);
}
}
//
double x3maVWapMax = MathMax(cXConditions.x3maMax, cXConditions.vwapMax);
double x3maVWapMin = MathMin(cXConditions.x3maMin, cXConditions.vwapMin);
// 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;
//
double x3maVWapDiff = x3maVWapMax - x3maVWapMin;
box.ob = obBox;
box.fvg = fvgBox;
box.sharp = supResBox;
}
//
double atr = cXConditions.atrBuffer[cIDX];
//
// Check All Conditions ...
result =
box.IsValid() &&
HasDirection(dir) &&
(isBullish ||
isBearish);
//
bool isConsolidate = x3maVWapDiff <= (3 * atr);
//
// Cleanup Resources ...
zBar.Clean();
cBar.Clean();
pBar.Clean();
cState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cStateEvents.Clean();
cXConditions.Clean();
//
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
//
)
//
;
//
return result;
}
+14 -1
View File
@@ -440,6 +440,10 @@ struct X121Conditions
double x3maMax;
double vwapMin;
double vwapMax;
double senkouMax;
double senkouMin;
double tenKijMax;
double tenKijMin;
//
bool isSarIncreased;
@@ -723,7 +727,10 @@ struct X121Conditions
vwapMax = 0;
x3maMin = 0;
x3maMax = 0;
senkouMax = 0;
senkouMin = 0;
tenKijMax = 0;
tenKijMin = 0;
//
// Slopes ...
@@ -3626,6 +3633,12 @@ class XCX121Helper : public XCBase
conditions.isSenkouSpanACrossedOverB = xichConditions.isSenkouSpanACrossedOverB;
conditions.isSenkouSpanACrossedUnderB = xichConditions.isSenkouSpanACrossedUnderB;
//
conditions.tenKijMax = MathMax(xichConditions.tenkanSenBuffer[cIDX], xichConditions.kijunSenBuffer[cIDX]);
conditions.tenKijMin = MathMin(xichConditions.tenkanSenBuffer[cIDX], xichConditions.kijunSenBuffer[cIDX]);
conditions.senkouMax = MathMax(xichConditions.senkouSpanABuffer[cIDX], xichConditions.senkouSpanBBuffer[cIDX]);
conditions.senkouMin = MathMin(xichConditions.senkouSpanABuffer[cIDX], xichConditions.senkouSpanBBuffer[cIDX]);
//
// Slopes ...
+4 -4
View File
@@ -901,15 +901,15 @@ class XCX121XICHHelper : public XCBaseHelper
//
bool isSenkouSpanAOverB =
conditions.senkouSpanABuffer[cIDX] > conditions.senkouSpanABuffer[cIDX];
conditions.senkouSpanABuffer[cIDX] > conditions.senkouSpanBBuffer[cIDX];
bool isSenkouSpanAOverBPrev =
conditions.senkouSpanABuffer[pIDX] > conditions.senkouSpanABuffer[pIDX];
conditions.senkouSpanABuffer[pIDX] > conditions.senkouSpanBBuffer[pIDX];
//
bool isSenkouSpanAUnderB =
conditions.senkouSpanABuffer[cIDX] < conditions.senkouSpanABuffer[cIDX];
conditions.senkouSpanABuffer[cIDX] < conditions.senkouSpanBBuffer[cIDX];
bool isSenkouSpanAUnderBPrev =
conditions.senkouSpanABuffer[pIDX] < conditions.senkouSpanABuffer[pIDX];
conditions.senkouSpanABuffer[pIDX] < conditions.senkouSpanBBuffer[pIDX];
//
bool isSenkouSpanACrossedOverB = isSenkouSpanAOverB &&
+6 -6
View File
@@ -85,7 +85,7 @@ double tenkanSenBuffer[];
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBrown
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
#property indicator_width1 2
//
#define kijunSenBufferIndex 1
@@ -96,7 +96,7 @@ double kijunSenBuffer[];
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrDodgerBlue
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
#property indicator_width2 2
//
#define chikouSpanBufferIndex 2
@@ -107,7 +107,7 @@ double chikouSpanBuffer[];
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrDarkGreen
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
#property indicator_width3 2
//
#define senkouSpanABufferIndex 3
@@ -118,7 +118,7 @@ double senkouSpanABuffer[];
#property indicator_type4 DRAW_LINE
#property indicator_color4 clrLightGray
#property indicator_style4 STYLE_DASHDOTDOT
#property indicator_width4 1
#property indicator_width4 2
//
#define senkouSpanBBufferIndex 4
@@ -129,7 +129,7 @@ double senkouSpanBBuffer[];
#property indicator_type5 DRAW_LINE
#property indicator_color5 clrLightGray
#property indicator_style5 STYLE_DASHDOTDOT
#property indicator_width5 1
#property indicator_width5 2
//
#define senkouABufferIndex 5
@@ -147,7 +147,7 @@ double senkouBBuffer[];
#property indicator_type6 DRAW_FILLING
#property indicator_color6 clrAqua, clrMagenta
#property indicator_style6 STYLE_SOLID
#property indicator_width6 1
#property indicator_width6 2
//
// Data Buffers ...
+113
View File
@@ -960,6 +960,119 @@ struct XOHCL
return result;
}
//
bool HasFiboPressure(
ENUM_X_DIRECTION forDir,
ENUM_X_FIBO_LEVELS level = X_FIBO_LEVEL_382 //
)
{
//
bool result = false;
//
result = IsValid() &&
HasDirection(forDir);
if (!result)
{
return result;
}
//
bool isBullish = IsBullish(forDir);
bool isBearish = IsBearish(forDir);
//
double fiboLevelValue = GetFibonacciLevel(
high,
low,
level,
forDir //
);
//
isBullish =
isBullish &&
GetDown() > fiboLevelValue;
isBearish =
isBearish &&
GetUp() < fiboLevelValue;
//
result = isBullish ||
isBearish;
//
return result;
}
//
bool IsRejected(
double price,
ENUM_X_DIRECTION forDir,
bool forceType = false,
bool forcePressure = false //
)
{
//
bool result = false;
//
result = IsValid() &&
price > 0 &&
HasDirection(forDir);
if (!result)
{
return result;
}
//
bool isBullish =
IsBullish(forDir) &&
low < price &&
GetDown() > price;
//
bool isBearish =
IsBearish(forDir) &&
high > price &&
GetUp() < price;
//
if (forceType)
{
//
isBullish =
isBullish &&
IsBullish();
//
isBearish =
isBearish &&
IsBearish();
}
//
if (forcePressure)
{
//
isBullish =
isBullish &&
HasFiboPressure(forDir);
//
isBearish =
isBearish &&
HasFiboPressure(forDir);
}
//
result = isBullish ||
isBearish;
//
return result;
}
//
// Find Highest Bar Index ...
int FindHighestIndex(
@@ -3240,4 +3240,139 @@ bool DetectBoxNearestPriceOut(
return result;
}
/**
* Count number of Box Retests ...
*
* @param box: XBoxZone instance Reference ...
* @param forDir: ENUM_X_DIRECTION member, Specified Retesting Direction ...
* @param forPeriod: ENUM_TIMEFRAMES member, Specified Retesting Period ...
* @param forceType: bool, Specified Retest Bar Direction is Same as Retesting Direction ...
* @param forcePressure: bool, Specified Retest Bar must Has Fibo Pressure or not ...
*
* @return ( int )
*/
int CountBoxRetest(
XBoxZone &box,
ENUM_X_DIRECTION forDir = NULL,
ENUM_TIMEFRAMES forPeriod = NULL,
bool forceType = false,
bool forcePressure = false //
)
{
//
int result = 0;
//
if (!IsValid(forPeriod))
{
forPeriod = box.period;
}
//
if (!IsValid(forDir))
{
forDir = box.dir;
}
//
bool isValid =
box.IsValid() &&
IsValid(forDir);
if (!isValid)
{
return result;
}
//
int fromIDX = GetBarIndex(
box.symbol,
forPeriod,
box.from //
);
//
int toIDX = GetBarIndex(
box.symbol,
forPeriod,
box.to //
);
//
for (int i = fromIDX; i >= toIDX; i--)
{
//
// Initialize Indexed Bar ...
XOHCL iBar;
isValid = iBar.Init(
box.symbol,
forPeriod,
i //
);
if (!isValid)
{
//
iBar.Clean();
continue;
}
//
bool isUpperBullishRejected = iBar.IsRejected(
box.upper,
X_DIRECTION_BULLISH,
forceType,
forcePressure //
);
bool isUpperBearishRejected = iBar.IsRejected(
box.upper,
X_DIRECTION_BEARISH,
forceType,
forcePressure //
);
//
bool isLowerBullishRejected = iBar.IsRejected(
box.lower,
X_DIRECTION_BULLISH,
forceType,
forcePressure //
);
bool isLowerBearishRejected = iBar.IsRejected(
box.lower,
X_DIRECTION_BEARISH,
forceType,
forcePressure //
);
//
if (forDir == X_DIRECTION_ALL ||
forDir == X_DIRECTION_BULLISH)
{
//
if (isUpperBullishRejected ||
isLowerBullishRejected)
{
result++;
}
}
//
if (forDir == X_DIRECTION_ALL ||
forDir == X_DIRECTION_BEARISH)
{
//
if (isUpperBearishRejected ||
isLowerBearishRejected)
{
result++;
}
}
//
iBar.Clean();
}
//
return result;
}
//
+199
View File
@@ -1052,6 +1052,205 @@ struct XPOIState
return ArraySize(bearishConsolidationZones);
}
//
// Box Retrievers ...
//
int SupportResistancesAsBox(XBoxZone &items[])
{
//
XBoxZone tmpBoxes[];
//
ToBox(
supportZones,
tmpBoxes //
);
Copy(
tmpBoxes,
items,
false //
);
Clean(tmpBoxes);
//
ToBox(
resistanceZones,
tmpBoxes //
);
Copy(
tmpBoxes,
items,
false //
);
Clean(tmpBoxes);
//
int result = ArraySize(items);
//
return result;
}
//
int SupplyDemandsAsBox(XBoxZone &items[])
{
//
XBoxZone tmpBoxes[];
//
ToBox(
supplyZones,
tmpBoxes //
);
Copy(
tmpBoxes,
items,
false //
);
Clean(tmpBoxes);
//
ToBox(
demandZones,
tmpBoxes //
);
Copy(
tmpBoxes,
items,
false //
);
Clean(tmpBoxes);
//
int result = ArraySize(items);
//
return result;
}
//
int OrderBlocksAsBox(XBoxZone &items[])
{
//
XBoxZone tmpBoxes[];
//
ToBox(
bullishOrderBlocks,
tmpBoxes //
);
Copy(
tmpBoxes,
items,
false //
);
Clean(tmpBoxes);
//
ToBox(
bearishOrderBlocks,
tmpBoxes //
);
Copy(
tmpBoxes,
items,
false //
);
Clean(tmpBoxes);
//
int result = ArraySize(items);
//
return result;
}
//
int FairValueGapsAsBox(XBoxZone &items[])
{
//
XBoxZone tmpBoxes[];
//
ToBox(
bullishFairValueGaps,
tmpBoxes //
);
Copy(
tmpBoxes,
items,
false //
);
Clean(tmpBoxes);
//
ToBox(
bearishFairValueGaps,
tmpBoxes //
);
Copy(
tmpBoxes,
items,
false //
);
Clean(tmpBoxes);
//
int result = ArraySize(items);
//
return result;
}
//
int SpikesAsBox(XBoxZone &items[])
{
//
Copy(
bullishSpikes,
items,
false //
);
//
Copy(
bearishSpikes,
items,
false //
);
//
int result = ArraySize(items);
//
return result;
}
//
int SharpsAsBox(XBoxZone &items[])
{
//
Copy(
bullishSharps,
items,
false //
);
//
Copy(
bearishSharps,
items,
false //
);
//
int result = ArraySize(items);
//
return result;
}
//
// Tools ...
@@ -3499,6 +3499,7 @@ struct X121SMCStrategyConditionParser
// XWPVZ ...
bool HasXWPVZConditions(
ENUM_X_CYCLES cycle,
ENUM_X_CYCLES vCycle,
XSignalBox &box,
ENUM_X_DIRECTION &dir,
X121SMCStrategySignalProviderData &provider,
@@ -3541,6 +3542,42 @@ struct X121SMCStrategyConditionParser
}
Parse(cXConditions);
//
// Fil Selected Data ...
XPOIState vState;
X121Conditions vXConditions;
XPOIStateEvents vStateEvents;
XC121SMCCycleHelper *vHelper;
X121SMCCycleConditions vConditions;
result = provider.SelectCycle(
vCycle,
vState,
vStateEvents,
vXConditions,
vHelper,
vConditions //
);
if (!result)
{
//
cState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
cStateEvents.Clean();
//
vState.Clean();
ZeroMemory(vHelper);
cConditions.Clean();
vXConditions.Clean();
vStateEvents.Clean();
//
return result;
}
Parse(vXConditions);
//
// Normalize Args ...
@@ -3569,6 +3606,7 @@ struct X121SMCStrategyConditionParser
XOHCL zBar;
XOHCL cBar;
XOHCL pBar;
XOHCL pPBar;
//
// Initial Bars ...
@@ -3583,6 +3621,9 @@ struct X121SMCStrategyConditionParser
result =
result &&
cBar.GetPreviousBar(pBar);
result =
result &&
pBar.GetPreviousBar(pPBar);
if (!result)
{
//
@@ -3620,156 +3661,156 @@ struct X121SMCStrategyConditionParser
isBarValidForDir &&
IsBearish(iBarPosDir);
// //
// // Continuation Bullish ...
// bool isContinuationBullish =
// //
// isBarValidForBullish &&
// cXConditions.isSarBullish &&
// cXConditions.isStrBullish &&
// cXConditions.isNewPeakOverLast
// //
// ;
//
// Senkou Span A/B Rejections ...
// //
// // Continuation Bearish ...
// bool isContinuationBearish =
// //
// isBarValidForBearish &&
// cXConditions.isSarBearish &&
// cXConditions.isStrBearish &&
// cXConditions.isNewValeUnderLast
// //
// ;
//
bool forceType = false;
bool forcePressure = true;
//
bool isBullishRejectSenkouAB = cBar.IsRejected(
cXConditions.senkouMax,
X_DIRECTION_BULLISH,
forceType, // Force Type ...
forcePressure // Force Pressure ...
);
//
bool isBearishRejectSenkouAB = cBar.IsRejected(
cXConditions.senkouMin,
X_DIRECTION_BEARISH,
forceType, // Force Type ...
forcePressure // Force Pressure ...
);
//
// TenkanSen/KijunSen Rejections ...
//
bool isBullishRejectTenKij = cBar.IsRejected(
cXConditions.tenKijMax,
X_DIRECTION_BULLISH,
forceType, // Force Type ...
forcePressure // Force Pressure ...
);
//
bool isBearishRejectTenKij = cBar.IsRejected(
cXConditions.tenKijMin,
X_DIRECTION_BEARISH,
forceType, // Force Type ...
forcePressure // Force Pressure ...
);
//
// X3MaFast Rejections ...
//
bool isBullishRejectedFastMa = cBar.IsRejected(
cXConditions.x3maFastBuffer[cIDX],
X_DIRECTION_BULLISH,
forceType, // Force Type ...
forcePressure // Force Pressure ...
);
//
bool isBearishRejectedFastMa = cBar.IsRejected(
cXConditions.x3maFastBuffer[cIDX],
X_DIRECTION_BEARISH,
forceType, // Force Type ...
forcePressure // Force Pressure ...
);
//
bool isValidBullishRejectedFastMa =
isBullishRejectedFastMa &&
cBar.low > cXConditions.senkouMax;
//
bool isValidBearishRejectedFastMa =
isBearishRejectedFastMa &&
cBar.high < cXConditions.senkouMin;
//
// Bigger Cycle Verification ...
//
double vBullishScore = 0;
double vBearishScore = 0;
vXConditions.GenerateScore(
vBullishScore,
vBearishScore //
);
//
bool isVBUllishPassed =
cBar.low > vXConditions.senkouMax &&
vBullishScore > (vBearishScore * 1.5);
//
bool isVBearishPassed =
cBar.high < vXConditions.senkouMin &&
vBearishScore > (vBullishScore * 1.5);
//
// Bullish Conditions ...
isBullish =
//
isVBUllishPassed &&
isBullishRejectSenkouAB
//
;
//
// Bearish Conditions ...
isBearish =
//
isVBearishPassed &&
isBearishRejectSenkouAB
//
;
//
result = isBullish ||
isBearish;
if (result)
{
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
}
//
// Detecting a Zone and Validate it ...
//
XBoxZone tmpBoxes[];
//
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)
bool hasOB = false;
bool hasFVG = false;
bool hasSupRes = false;
//
// Select Support and Resistance ...
if (result)
{
//
// Converts FairValueGaps to Box ...
ToBox(
cState.fairValueGaps,
tmpBoxes //
);
//
// Select FVG ...
while (HasChild(tmpBoxes))
if (!hasSupRes)
{
//
idx = GetYoungest(tmpBoxes);
has = IsValidIndex(idx);
if (!has)
{
break;
}
cState.OrderBlocksAsBox(tmpBoxes);
cState.FairValueGapsAsBox(tmpBoxes);
cState.SupplyDemandsAsBox(tmpBoxes);
cState.SupportResistancesAsBox(tmpBoxes);
//
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)
{
@@ -3777,7 +3818,7 @@ struct X121SMCStrategyConditionParser
while (HasChild(tmpBoxes))
{
//
idx = GetYoungest(tmpBoxes);
idx = GetOldest(tmpBoxes);
has = IsValidIndex(idx);
if (!has)
{
@@ -3791,133 +3832,43 @@ struct X121SMCStrategyConditionParser
idx,
1 //
);
iBox.to = TimeCurrent();
//
// Validate Order Blocks ...
bool isSameDir = iBox.dir == fvgBox.dir;
bool isFVGInsideOB = IsBoxInsideOr(
fvgBox,
iBox //
// Try to Validate Support and Resistance ...
int retests = CountBoxRetest(
iBox,
dir,
cBar.period //
);
bool isTyped =
isBullish
? iBox.IsBullish()
: iBox.IsBearish();
bool isRetested = retests >= 1;
bool isPlaced =
isBullish
? (
//
(cBar.low < iBox.upper &&
cBar.low > iBox.lower)
//
)
: (
//
(cBar.high < iBox.upper &&
cBar.high > iBox.lower)
//
);
//
has =
isSameDir &&
isFVGInsideOB;
isTyped &&
isPlaced &&
isRetested;
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;
@@ -3929,95 +3880,20 @@ struct X121SMCStrategyConditionParser
}
//
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;
}
hasSupRes = supResBox.IsValid();
Clean(tmpBoxes);
}
}
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);
}
}
}
Clean(tmpBoxes);
//
// Bullish Conditions ...
isBullish =
//
// Base Condition ...
(
//
// false
isBullishFVGRejected
//
)
isBullish &&
hasSupRes
//
;
@@ -4025,13 +3901,8 @@ struct X121SMCStrategyConditionParser
// Bearish Conditions ...
isBearish =
//
// Base Condition ...
(
//
// false
isBearishFVGRejected
//
)
isBearish &&
hasSupRes
//
;
@@ -4043,14 +3914,36 @@ struct X121SMCStrategyConditionParser
if (result)
{
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
bool drawBoxes = true;
if (drawBoxes)
{
//
if (hasSupRes)
{
//
supResBox.to = TimeCurrent();
//
XCBoxObject *iObj;
has = drawer.DrawBox(
supResBox,
iObj //
);
//
if (has)
{
iObj.BoxWidth(2);
iObj.BoxStyle(STYLE_DOT);
}
}
}
//
result = false;
Print("Signal ...");
result = false;
isBearish = false;
isBullish = false;
}
//
@@ -4066,11 +3959,17 @@ struct X121SMCStrategyConditionParser
zBar.Clean();
cBar.Clean();
pBar.Clean();
pPBar.Clean();
cState.Clean();
ZeroMemory(cHelper);
vState.Clean();
cConditions.Clean();
cConditions.Clean();
ZeroMemory(cHelper);
ZeroMemory(vHelper);
cStateEvents.Clean();
cXConditions.Clean();
vXConditions.Clean();
vStateEvents.Clean();
//
return result;
@@ -118,12 +118,12 @@ class XCX121SMCXWZSignalDetector : public XCBase
result = provider.Prepare(
zIndex,
loopback,
false, // Trigger ...
true, // Decision ...
true, // Analyse ...
true, // Verification ...
true, // Consolidation ...
true // Vision ...
true, // Trigger ...
true, // Decision ...
true, // Analyse ...
true, // Verification ...
true, // Consolidation ...
true // Vision ...
);
if (!result)
{
@@ -516,6 +516,33 @@ class XCX121SMCXWZSignalDetector : public XCBase
// Fix rf Reward ...
rfRewar = 2;
}
else if (signalProvider == X121SMC_XWZ_PROVIDER_XWPVZ)
{
//
iAtr = provider.decisionXConditions.atrBuffer[1];
iAtr *= 0;
//
Clean(sls);
//
// Prepare Box fro SL ...
double risk = pivot - point;
iSL = risk <= (100 * points)
? pivot
: isBullish
? NormalizePrice(entry - (50 * points), signalBox.ob.symbol)
: NormalizePrice(entry + (50 * points), signalBox.ob.symbol);
Add(
iSL,
sls //
);
//
// Fix rf Reward ...
rfRewar = 2;
}
//
Print("XWZ ", ToString(signalBoxDir), " Signal Provided: ", EnumToString(signalProvider));
@@ -2102,6 +2102,7 @@ struct X121SMCStrategyXWZWorkingZone
//
isSenario5Happend = cParser.HasXWPVZConditions(
X_CYCLE_DECISION,
X_CYCLE_CONSOLIDATION,
box,
dir,
provider,
@@ -734,9 +734,6 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
//
bool showAll = false;
//
x121Inputs.showRSI = showAll || false;
//
// XPV ...
@@ -769,7 +766,10 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
x121Inputs.x3maInputs.x3maSlowMALength = 200;
//
x121Inputs.xichInputs.shiftKumo = false;
x121Inputs.xichInputs.shiftKumo = true;
//
x121Inputs.showRSI = showAll || false;
//
// x121Inputs.xcheInputs.cheLength = 14;
@@ -800,8 +800,8 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
//
// XPV ...
x121Inputs.xpvInputs.showSar = showAll || false;
x121Inputs.xpvInputs.showPeaks = showAll || false;
x121Inputs.xpvInputs.showVales = 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 || false;
@@ -854,7 +854,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
//
// X3MA ...
x121Inputs.x3maInputs.showX3MaFast = showAll || false;
x121Inputs.x3maInputs.showX3MaFast = showAll || true;
x121Inputs.x3maInputs.showX3MaMid = showAll || false;
x121Inputs.x3maInputs.showX3MaSlow = showAll || false;
@@ -862,7 +862,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
// XICH ...
x121Inputs.xichInputs.showTenkanSen = showAll || true;
x121Inputs.xichInputs.showKijunSen = showAll || true;
x121Inputs.xichInputs.showChikouSpan = showAll || false;
x121Inputs.xichInputs.showChikouSpan = showAll || true;
x121Inputs.xichInputs.showSenkouSpanA = showAll || true;
x121Inputs.xichInputs.showSenkouSpanB = showAll || true;
x121Inputs.xichInputs.showKumo = showAll || false;