last works ...

This commit is contained in:
2025-04-09 04:47:56 +03:30
parent 5eab321741
commit 031c5f3462
13 changed files with 5541 additions and 557 deletions
@@ -90,6 +90,356 @@ enum ENUM_X_CYCLE_EVENTS
VALE_PIVOT_ENDED,
};
//
// XPV Pivot ...
//
enum ENUM_X_PV_PIVOT
{
X_PV_NONE, // None
X_PV_PEAK, // Peak
X_PV_VALE, // Vale
};
//
bool IsValid(ENUM_X_PV_PIVOT value)
{
//
bool result = false;
//
result = value != X_PV_NONE;
//
return result;
}
//
string ToString(ENUM_X_PV_PIVOT value)
{
//
string result = NULL;
//
result = EnumToString(value);
//
return result;
}
//
struct XPVPivot
{
//
// Props ...
datetime to;
double value;
double golden;
datetime from;
string symbol;
ENUM_X_PV_PIVOT type;
ENUM_TIMEFRAMES period;
//
// Constructor ...
XPVPivot()
{
Clean();
}
//
// Tools ...
/**
* Cleanup Model ...
*/
void Clean()
{
//
to = NULL;
value = 0;
from = NULL;
symbol = NULL;
period = NULL;
type = X_PV_NONE;
}
/**
* Validate Model ...
*
* @return ( bool )
*/
bool IsValid()
{
//
bool result = false;
//
result =
//
from < to &&
value > 0 &&
IsValid(to) &&
IsValid(type) &&
IsValid(from) &&
IsValid(symbol) &&
IsValid(period)
//
;
//
return result;
}
/**
* Retrieve Model Direction ...
*
* @return ( ENUM_X_DIRECTION )
*/
ENUM_X_DIRECTION GetDirection()
{
//
ENUM_X_DIRECTION result = X_DIRECTION_NONE;
//
if (!IsValid())
{
return result;
}
//
switch (type)
{
//
case X_PV_PEAK:
result = X_DIRECTION_BEARISH;
break;
//
case X_PV_VALE:
result = X_DIRECTION_BULLISH;
break;
}
//
return result;
}
/**
* Check Direction is Bullish ...
*
* @return ( bool )
*/
bool IsBullish()
{
//
bool result = false;
//
result = IsValid();
if (!result)
{
return result;
}
//
ENUM_X_DIRECTION dir = GetDirection();
result = IsBullish(dir);
//
return result;
}
/**
* Check Direction is Bearish ...
*
* @return ( bool )
*/
bool IsBearish()
{
//
bool result = false;
//
result = IsValid();
if (!result)
{
return result;
}
//
ENUM_X_DIRECTION dir = GetDirection();
result = IsBearish(dir);
//
return result;
}
/**
* To Bar Index ...
*
* @return ( int )
*/
int ToIndex(
ENUM_TIMEFRAMES forPeriod = NULL //
)
{
//
int result = -1;
//
if (!IsValid())
{
return result;
}
//
if (!IsValid(forPeriod))
{
forPeriod = period;
}
//
result = GetBarIndex(
symbol,
forPeriod,
to //
);
//
return result;
}
/**
* From Bar Index ...
*
* @return ( int )
*/
int FromIndex(
ENUM_TIMEFRAMES forPeriod = NULL //
)
{
//
int result = -1;
//
if (!IsValid())
{
return result;
}
//
if (!IsValid(forPeriod))
{
forPeriod = period;
}
//
result = GetBarIndex(
symbol,
forPeriod,
from //
);
//
return result;
}
/**
* Check two Pivot is Same or Not ...
*
* @param item: XPVPivot instance Reference ...
*
* @return ( bool )
*/
bool IsSameAs(XPVPivot &item)
{
//
bool result = false;
//
result = IsValid() &&
item.IsValid();
if (!result)
{
return result;
}
//
result =
//
to == item.to &&
from == item.from &&
type == item.type &&
value == item.value &&
golden == item.golden &&
symbol == item.symbol &&
period == item.period
//
;
//
return result;
}
/**
* Conerts to XBoxZone ...
*
* @param box: XBoxZone instance Reference ...
*
* @return ( bool )
*/
bool AsBox(XBoxZone &box)
{
//
bool result = false;
//
box.Clean();
//
result = IsValid();
if (!result)
{
return result;
}
//
box.to = to;
box.from = from;
box.symbol = symbol;
box.period = period;
box.dir = GetDirection();
box.type = ToString(type);
//
if (IsBullish())
{
//
box.lower = value;
box.upper = golden;
}
else if (IsBearish())
{
//
box.upper = value;
box.lower = golden;
}
//
result = box.IsValid();
if (!result)
{
box.Clean();
}
//
return result;
}
//
};
//
// Cycle Helper ...
class XC121SMCCycleHelper : public XCBase
@@ -478,137 +828,6 @@ class XC121SMCCycleHelper : public XCBase
//
// Tools ...
//
bool GeneratePVBox(
XBoxZone &box,
int barIndex = 0 //
)
{
//
bool result = false;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
box.Clean();
box.symbol = GetSymbol();
box.period = GetPeriod();
//
int index = barIndex;
//
// Peak ...
datetime peaksSameFrom = NULL;
double peak = mX121Helper.xpvHelper.GetPeak(index);
double prevPeak = mX121Helper.xpvHelper.GetPeak(index + 1);
bool startsByPeak = peak == prevPeak;
//
// Vale ...
datetime valesSameFrom = NULL;
double vale = mX121Helper.xpvHelper.GetVale(index);
double prevVale = mX121Helper.xpvHelper.GetVale(index + 1);
bool startsByVale =
!startsByPeak &&
vale == prevVale;
//
bool canBreak = false;
while (!canBreak)
{
//
index++;
//
datetime cTime = iTime(
box.symbol,
box.period,
index //
);
//
// Peak ...
double iPeak = mX121Helper.xpvHelper.GetPeak(index);
//
// Vale ...
double iVale = mX121Helper.xpvHelper.GetVale(index);
//
// Start By Peak or Value ...
bool isSame = false;
if (startsByPeak)
{
//
isSame = iPeak == peak;
bool canSetVale = vale == 0
? true
: iVale > vale;
if (canSetVale)
{
vale = iVale;
}
}
else if (startsByVale)
{
//
isSame = iVale == vale;
bool canSetPeak = peak == 0
? true
: iPeak < peak;
if (canSetPeak)
{
peak = iPeak;
}
}
//
if (isSame)
{
//
box.from = cTime;
box.upper = peak;
box.lower = vale;
}
else if (IsValid(box.from))
{
//
// Complete Box ...
box.to = iTime(
box.symbol,
box.period,
barIndex //
);
//
box.type = "XPVBox";
box.dir = startsByPeak
? X_DIRECTION_BEARISH
: startsByVale
? X_DIRECTION_BULLISH
: X_DIRECTION_NONE;
}
//
canBreak = !isSame;
}
//
result = box.IsValid();
if (!result)
{
box.Clean();
}
//
return result;
}
//
int DetectRejections(
XBoxZone &rejections[],
@@ -1095,7 +1314,7 @@ class XC121SMCCycleHelper : public XCBase
bool mShowBidLine = true; // show bid line
bool mShowAskLine = true; // show ask line
bool mShowGrid = false; // show grids on chart
bool mShowVolumes = false; // show volumes
bool mShowVolumes = false; // show volumes
bool mShowTradeLevels = true; // Displaying trade levels in the chart (levels of open positions, Stop Loss, Take Profit and pending orders)
bool mAutoScroll = true; // chart autoscroll
bool mQuickNavigation = true; // chart quick navigation state