This commit is contained in:
2025-02-26 01:44:21 +03:30
parent 22298e8bab
commit 727888d783
19 changed files with 19179 additions and 9414 deletions
+38 -10
View File
@@ -1845,25 +1845,36 @@ class XCSignalObject : public XCBaseObject
//
// TARGET ...
if (signal.target > 0)
bool hasTargets = HasChild(signal.targets);
if (hasTargets)
{
//
string targetName = ToString(X_TARGET) + "_" + nameMD5;
int targetsCount = ArraySize(signal.targets);
for (int i = 0; i < targetsCount; i++)
{
//
string targetName = ToString(X_TARGET) + "_" + ToString(i) + "_" + nameMD5;
CChartObjectTrend *mTargetTrend;
mTargetTrend = new CChartObjectTrend();
result = mTargetTrend.Create(
chart_id,
targetName,
window,
time1,
signal.target,
signal.targets[i],
time2,
signal.target //
signal.targets[i] //
);
if (!result)
{
//
mTPTrend.Delete();
mSLTrend.Delete();
return result;
break;
}
//
mTargetTrends.Add(mTargetTrend);
}
}
@@ -1884,7 +1895,7 @@ class XCSignalObject : public XCBaseObject
//
mTPTrend.Delete();
mSLTrend.Delete();
mTargetTrend.Delete();
mTargetTrends.Clear();
return result;
}
@@ -1996,7 +2007,12 @@ class XCSignalObject : public XCBaseObject
}
//
mTargetTrend.Width(value);
for (int i = 0; i < mTargetTrends.Total(); i++)
{
//
CChartObjectTrend *iTrend = (CChartObjectTrend *)mTargetTrends.At(i);
iTrend.Width(value);
}
}
/**
@@ -2006,7 +2022,13 @@ class XCSignalObject : public XCBaseObject
*/
void TargetColor(color value)
{
mTargetTrend.Color(value);
//
for (int i = 0; i < mTargetTrends.Total(); i++)
{
//
CChartObjectTrend *iTrend = (CChartObjectTrend *)mTargetTrends.At(i);
iTrend.Color(value);
}
}
/**
@@ -2016,7 +2038,13 @@ class XCSignalObject : public XCBaseObject
*/
void TargetStyle(ENUM_LINE_STYLE value)
{
mTargetTrend.Style(value);
//
for (int i = 0; i < mTargetTrends.Total(); i++)
{
//
CChartObjectTrend *iTrend = (CChartObjectTrend *)mTargetTrends.At(i);
iTrend.Style(value);
}
}
//
@@ -2077,7 +2105,7 @@ class XCSignalObject : public XCBaseObject
CChartObjectTrend mTPTrend;
CChartObjectTrend mSLTrend;
CChartObjectTrend mEntryTrend;
CChartObjectTrend mTargetTrend;
CArrayObj mTargetTrends;
};
class XCOHCLObject : public XCBaseObject
File diff suppressed because it is too large Load Diff
-182
View File
@@ -3924,24 +3924,6 @@ class XCPOIDrawer : public XCBase
}
}
//
if (drawTicksZone && state.ticksZone != NULL)
{
//
XCTicksZoneObject *iObj;
bool isCreated = CreateTicksZone(
state.ticksZone,
iObj //
);
if (isCreated)
{
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
//
result = ArraySize(drawnObjects);
@@ -4629,170 +4611,6 @@ class XCPOIDrawer : public XCBase
}
}
//
// Supply Zones ...
has = item.HasSupplyZones();
if (has &&
drawSupplyZones)
{
//
Clean(tmpObjects);
count = item.CountSupplyZones();
for (int i = 0; i < count; i++)
{
//
XCSupplyZoneObject *iZoneObj;
has = CreateSupplyZone(
item.supplyZones[i],
iZoneObj //
);
if (has)
{
//
Add(
(XCBaseObject *)iZoneObj,
tmpObjects //
);
}
}
//
count = ArraySize(tmpObjects);
has = IsValidSize(count);
if (has)
{
//
Copy(
tmpObjects,
objects,
false //
);
}
}
//
// Demand Zones ...
has = item.HasDemandZones();
if (has &&
drawDemandZones)
{
//
Clean(tmpObjects);
count = item.CountDemandZones();
for (int i = 0; i < count; i++)
{
//
XCDemandZoneObject *iZoneObj;
has = CreateDemandZone(
item.demandZones[i],
iZoneObj //
);
if (has)
{
//
Add(
(XCBaseObject *)iZoneObj,
tmpObjects //
);
}
}
//
count = ArraySize(tmpObjects);
has = IsValidSize(count);
if (has)
{
//
Copy(
tmpObjects,
objects,
false //
);
}
}
//
// Support Zones ...
has = item.HasSupportZones();
if (has &&
drawSupportZones)
{
//
Clean(tmpObjects);
count = item.CountSupportZones();
for (int i = 0; i < count; i++)
{
//
XCSupportZoneObject *iZoneObj;
has = CreateSupportZone(
item.supportZones[i],
iZoneObj //
);
if (has)
{
//
Add(
(XCBaseObject *)iZoneObj,
tmpObjects //
);
}
}
//
count = ArraySize(tmpObjects);
has = IsValidSize(count);
if (has)
{
//
Copy(
tmpObjects,
objects,
false //
);
}
}
//
// Resistance Zones ...
has = item.HasResistanceZones();
if (has &&
drawResistanceZones)
{
//
Clean(tmpObjects);
count = item.CountResistanceZones();
for (int i = 0; i < count; i++)
{
//
XCResistanceZoneObject *iZoneObj;
has = CreateResistanceZone(
item.resistanceZones[i],
iZoneObj //
);
if (has)
{
//
Add(
(XCBaseObject *)iZoneObj,
tmpObjects //
);
}
}
//
count = ArraySize(tmpObjects);
has = IsValidSize(count);
if (has)
{
//
Copy(
tmpObjects,
objects,
false //
);
}
}
//
Clean(tmpObjects);
+97
View File
@@ -0,0 +1,97 @@
//
// Fix Signal TP Based On Working Zone ...
// double maxAllowedTP =
// hasLong
// ? mXWZConditions.workingZone.upper
// : mXWZConditions.workingZone.lower;
// bool canApplyMaxAlowedTP = (hasLong &&
// signal.tp > maxAllowedTP) ||
// (!hasLong && signal.tp < maxAllowedTP);
// if (canApplyMaxAlowedTP)
// {
// signal.tp = maxAllowedTP;
// }
//
// Configuring Global Protector ...
// signal.trailSL = true;
// signal.trailSLStartOnReachTPLevel = 3;
// signal.fullTPLevel = signal.GetRiskRewardRatio();
// //
// mXSupDemOBSSignalDetector.RemoveDraws();
// mXSupDemOBSSignalDetector.DrawConditions(
// mXSupDemOBSConditions,
// mVisionCycleHelper.mPOIDrawer //
// );
// //
// mXSupDemOBSSignalDetector.RemoveWorkingZoneDraws();
// mXSupDemOBSSignalDetector.DrawWorkingZone(
// mXSupDemOBSConditions,
// mVisionCycleHelper.mPOIDrawer //
// );
//
// bool canReplaceTarget =
// signal.target > 0 &&
// (hasLong
// ? signal.target > signal.tp
// : signal.target < signal.tp);
// if (canReplaceTarget)
// {
// //
// signal.tp = conditions.target;
// signal.target = tp;
// }
//
// consolidationState.UpdateTo(cTime);
// XPOIState filtered;
// consolidationState.Filter(
// filtered,
// NULL,
// XZONE_STATE_PASSED,
// false,
// XZONE_STATE_FAILED,
// false,
// XZONE_STATE_FAILED,
// false,
// XZONE_STATE_IGNORED,
// false //
// );
// XCBaseObject *objects[];
// int objectsCount = drawer.DrawState(
// filtered,
// objects //
// );
// if (IsValidSize(objectsCount))
// {
// //
// Print("");
// }
// //
// XOBFVG activeObfvgs[];
// int activeObfvgsCount = ExtractOBFVGs(
// activeObfvgs,
// consolidationState,
// analyseState //
// );
// bool hasActiveOBFVGs = IsValidSize(activeObfvgsCount);
// if (hasActiveOBFVGs)
// {
// //
// SpecifiedUpdateTo(activeObfvgs);
// for (int i = 0; i < activeObfvgsCount; i++)
// {
// //
// XCBaseObject *objects[];
// int objectsCount = drawer.DrawOBFVG(
// activeObfvgs[i],
// objects //
// );
// }
// }
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+129 -137
View File
@@ -22,146 +22,11 @@
//
// Imports ...
#include "../Libraries/x-saherelm.x-poi.lib.mq5"
#include "../Libraries/x-saherelm.xobfvg.lib.mq5"
#include "../Libraries/x-saherelm.x-poi.state.lib.mq5"
//
// Extensions ...
/**
* Combine a Collection of States into dest ...
*
* @param dest: XPOIState instance ...
* @param source: XPOIState Collection ...
*/
void CombineStates(
XPOIState &dest,
XPOIState &source[] //
)
{
//
dest.Clean();
//
int count = ArraySize(source);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XPOIState iState = source[i];
//
if (dest.ticksZone == NULL)
{
dest.ticksZone = iState.ticksZone;
}
//
Copy(
iState.swingHighs,
dest.swingHighs,
false //
);
//
Copy(
iState.swingLows,
dest.swingLows,
false //
);
//
Copy(
iState.bullishMomentumBars,
dest.bullishMomentumBars,
false //
);
//
Copy(
iState.bearishMomentumBars,
dest.bearishMomentumBars,
false //
);
//
Copy(
iState.bullishRejectionBars,
dest.bullishRejectionBars,
false //
);
//
Copy(
iState.bearishRejectionBars,
dest.bearishRejectionBars,
false //
);
//
Copy(
iState.supportZones,
dest.supportZones,
false //
);
//
Copy(
iState.resistanceZones,
dest.resistanceZones,
false //
);
//
Copy(
iState.supplyZones,
dest.supplyZones,
false //
);
//
Copy(
iState.demandZones,
dest.demandZones,
false //
);
//
Copy(
iState.bullishOrderBlocks,
dest.bullishOrderBlocks,
false //
);
//
Copy(
iState.bearishOrderBlocks,
dest.bearishOrderBlocks,
false //
);
//
Copy(
iState.bullishFairValueGaps,
dest.bullishFairValueGaps,
false //
);
//
Copy(
iState.bearishFairValueGaps,
dest.bearishFairValueGaps,
false //
);
//
}
}
template <typename T>
bool ToZone(
T *&source[],
@@ -265,7 +130,7 @@ bool ToBox(
template <typename T>
int GetOldest(
T *&sourec[] //
T *&source[] //
)
{
//
@@ -732,6 +597,47 @@ bool IsInside(
return result;
}
template <typename T>
bool IsInsideOr(
T *source,
T *dest //
)
{
//
bool result = false;
//
XBoxZone sourceBox;
result = ToBox(
sourceBox,
source //
);
if (!result)
{
return result;
}
//
XBoxZone destBox;
result = ToBox(
destBox,
dest //
);
if (!result)
{
return result;
}
//
result = IsBoxInsideOr(
sourceBox,
destBox //
);
//
return result;
}
template <typename T, typename F>
bool IsInsideDiff(
T *source,
@@ -775,6 +681,48 @@ bool IsInsideDiff(
return result;
}
template <typename T, typename F>
bool IsInsideOrDiff(
T *source,
F *dest,
bool forceSideOut = false //
)
{
//
bool result = false;
//
XBoxZone sourceBox;
result = ToBox(
sourceBox,
source //
);
if (!result)
{
return result;
}
//
XBoxZone destBox;
result = ToBox(
destBox,
dest //
);
if (!result)
{
return result;
}
//
result = IsBoxInsideOr(
sourceBox,
destBox //
);
//
return result;
}
template <typename T>
bool FindIndex(
int &index,
@@ -1117,6 +1065,50 @@ bool IsBoxInside(
return result;
}
/**
* Detect source BoX is Inside Dest Box or Have a Side Out on it ...
*
* @param source: XBoxZone instance, source box which checks by dest ...
* @param dest: XBoxZone instance, dest Box which compares source with it ...
*
* @return ( bool )
*/
bool IsBoxInsideOr(
XBoxZone &source,
XBoxZone &dest //
)
{
//
bool result = false;
//
result = source.IsValid() &&
dest.IsValid() &&
!source.IsSame(dest);
if (!result)
{
return result;
}
//
bool isLowerInside =
source.lower > dest.lower &&
source.lower < dest.upper &&
(source.upper < dest.upper ||
source.upper > dest.upper);
bool isUpperInside =
source.upper < dest.upper &&
source.upper > dest.lower &&
(source.lower > dest.lower ||
source.lower < dest.lower);
result =
isLowerInside ||
isUpperInside;
//
return result;
}
/**
* Check Value is Inside Specified Box ...
*
+14 -634
View File
@@ -27,9 +27,6 @@
//
// Definitions ...
//
// Definitions ...
//
// All Available POI(s) ...
enum ENUM_XPOIS
@@ -76,6 +73,8 @@ enum ENUM_XPOIS
// Event Types ...
enum ENUM_XPOI_EVENTS
{
//
X_POI_EVENT_NONE,
//
// Trading Days ...
X_TRADE_DAY_FIRST_BAR, // Trading Day First Bar ...
@@ -3392,7 +3391,8 @@ class XCSupplyZone : public XCBarZone
*/
bool Init(
XOHCL &bar,
int range = 0 //
int range = 0,
bool useRangeAsStart = false //
)
{
//
@@ -3427,7 +3427,10 @@ class XCSupplyZone : public XCBarZone
int periodSeconds = PeriodSeconds(bar.period);
//
datetime from = (datetime)((int)time - (range * periodSeconds));
datetime from =
!useRangeAsStart
? (datetime)((int)time - (range * periodSeconds))
: time;
datetime to = (datetime)((int)time + (range * periodSeconds));
//
@@ -3502,7 +3505,8 @@ class XCDemandZone : public XCBarZone
*/
bool Init(
XOHCL &bar,
int range = 0 //
int range = 0,
bool useRangeAsStart = false //
)
{
//
@@ -3537,7 +3541,10 @@ class XCDemandZone : public XCBarZone
int periodSeconds = PeriodSeconds(bar.period);
//
datetime from = (datetime)((int)time - (range * periodSeconds));
datetime from =
!useRangeAsStart
? (datetime)((int)time - (range * periodSeconds))
: time;
datetime to = (datetime)((int)time + (range * periodSeconds));
//
@@ -5168,633 +5175,6 @@ class XCSession : public XCFromToZone
//
};
//
//
// Model Exists Founded POIs ...
struct XPOIState
{
//
string symbol;
ENUM_TIMEFRAMES period;
datetime time;
//
XCTicksZone *ticksZone; // Ticks Zone ...
//
XCSwing *swingHighs[]; // Holds Founded Swing Highs ...
XCSwing *swingLows[]; // Holds Founded Swing Lows ...
XCMomentumBar *bullishMomentumBars[]; // Holds Founded Bullish Momentum Bars ...
XCMomentumBar *bearishMomentumBars[]; // Holds Founded Bearish Momentum Bars ...
XCRejectionBar *bullishRejectionBars[]; // Holds Founded Bullish Rejection Bars ...
XCRejectionBar *bearishRejectionBars[]; // Holds Founded Bearish Rejection Bars ...
XCSupportZone *supportZones[]; // Holds Founded Support Zones ...
XCResistanceZone *resistanceZones[]; // Holds Founded Resistance Zones ...
XCSupplyZone *supplyZones[]; // Holds Founded Supply Zones ...
XCDemandZone *demandZones[]; // Holds Founded Demand Zones ...
XCOrderBlock *bullishOrderBlocks[]; // Holds Founded Bullish Order Blocks ...
XCOrderBlock *bearishOrderBlocks[]; // Holds Founded Bearish Order Blocks ...
XCFVG *bullishFairValueGaps[]; // Holds Founded Bullish Fair Value Gaps ...
XCFVG *bearishFairValueGaps[]; // Holds Founded Bearish Fair Value Gaps ...
//
// Constructor ...
void XPOIState()
{
Clean();
}
//
// Actions ...
/**
* Cleanup all props ...
*/
void Clean()
{
//
symbol = NULL;
period = NULL;
time = NULL;
//
ticksZone = NULL;
//
Clean(swingHighs);
Clean(swingLows);
Clean(bullishMomentumBars);
Clean(bearishMomentumBars);
Clean(bullishRejectionBars);
Clean(bearishRejectionBars);
Clean(supportZones);
Clean(resistanceZones);
Clean(supplyZones);
Clean(demandZones);
Clean(bullishOrderBlocks);
Clean(bearishOrderBlocks);
Clean(bullishFairValueGaps);
Clean(bearishFairValueGaps);
//
ZeroMemory(this);
}
/**
* Validate ...
*
* @return ( bool )
*/
bool IsValid()
{
//
bool result = false;
//
result =
IsSpecifiedValid(symbol) &&
IsSpecifiedValid(period) &&
IsSpecifiedValid(time);
//
return result;
}
/**
* Check State has Childs or not ...
*
* @return ( bool )
*/
bool HasChild()
{
//
bool result = false;
//
result =
//
IsValidSize(CountSwingHighs()) ||
IsValidSize(CountSwingLows()) ||
IsValidSize(CountBullishMomentumBars()) ||
IsValidSize(CountBearishMomentumBars()) ||
IsValidSize(CountBullishRejectionBars()) ||
IsValidSize(CountBearishRejectionBars()) ||
IsValidSize(CountSupportZones()) ||
IsValidSize(CountResistanceZones()) ||
IsValidSize(CountSupplyZones()) ||
IsValidSize(CountDemandZones()) ||
IsValidSize(CountBullishOrderBlocks()) ||
IsValidSize(CountBearishOrderBlocks()) ||
IsValidSize(CountBullishFairValueGaps()) ||
IsValidSize(CountBearishFairValueGaps())
//
;
//
return result;
}
/**
* Fill Dest State by Current State's Data ...
*
* @param dest: XPOIState instance, reference to specified dest ...
*
*/
void Fill(XPOIState &dest)
{
//
if (!IsValid() ||
!HasChild())
{
return;
}
//
dest.symbol = symbol;
dest.period = period;
dest.time = time;
//
Copy(
swingHighs,
dest.swingHighs,
false //
);
Copy(
swingLows,
dest.swingLows,
false //
);
Copy(
bullishMomentumBars,
dest.bullishMomentumBars,
false //
);
Copy(
bearishMomentumBars,
dest.bearishMomentumBars,
false //
);
Copy(
bullishRejectionBars,
dest.bullishRejectionBars,
false //
);
Copy(
bearishRejectionBars,
dest.bearishRejectionBars,
false //
);
Copy(
supportZones,
dest.supportZones,
false //
);
Copy(
resistanceZones,
dest.resistanceZones,
false //
);
Copy(
supplyZones,
dest.supplyZones,
false //
);
Copy(
demandZones,
dest.demandZones,
false //
);
Copy(
bullishOrderBlocks,
dest.bullishOrderBlocks,
false //
);
Copy(
bearishOrderBlocks,
dest.bearishOrderBlocks,
false //
);
Copy(
bullishFairValueGaps,
dest.bullishFairValueGaps,
false //
);
Copy(
bearishFairValueGaps,
dest.bearishFairValueGaps,
false //
);
//
}
/**
* Calculate Liquidity Percent for Specified Direction ...
*
* @param forDirection: ENUM_X_DIRECTION member, Specified Liquidity ...
* @param price: Double, Specified Price ...
*
* @return ( double )
*/
double CalculateLiquidityPercent(
ENUM_X_DIRECTION forDirection,
double price = 0 //
)
{
//
double result = 0;
//
if (!IsValid() ||
ticksZone == NULL)
{
return result;
}
//
// Normalize Price for Actions ...
if (price <= 0)
{
//
MqlTick mTick;
bool isTickRetrieved = GetTick(
symbol,
mTick //
);
if (isTickRetrieved)
{
price = mTick.bid;
}
}
//
result = ticksZone
.CalculateLiquidityPercent(
forDirection,
price //
);
//
return result;
}
//
// Counters ...
//
int CountSwingHighs()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
result = ArraySize(swingHighs);
//
return result;
}
//
bool HasSwingHighs()
{
return IsValidSize(CountSwingHighs());
}
//
int CountSwingLows()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
result = ArraySize(swingLows);
//
return result;
}
//
bool HasSwingLows()
{
return IsValidSize(CountSwingLows());
}
//
int CountBullishMomentumBars()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
result = ArraySize(bullishMomentumBars);
//
return result;
}
//
bool HasBullishMomentumBars()
{
return IsValidSize(CountBullishMomentumBars());
}
//
int CountBearishMomentumBars()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
result = ArraySize(bearishMomentumBars);
//
return result;
}
//
bool HasBearishMomentumBars()
{
return IsValidSize(CountBearishMomentumBars());
}
//
int CountBullishRejectionBars()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
result = ArraySize(bullishRejectionBars);
//
return result;
}
//
bool HasBullishRejectionBars()
{
return IsValidSize(CountBullishRejectionBars());
}
//
int CountBearishRejectionBars()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
result = ArraySize(bearishRejectionBars);
//
return result;
}
//
bool HasBearishRejectionBars()
{
return IsValidSize(CountBearishRejectionBars());
}
//
int CountSupportZones()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
result = ArraySize(supportZones);
//
return result;
}
//
bool HasSupportZones()
{
return IsValidSize(CountSupportZones());
}
//
int CountResistanceZones()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
result = ArraySize(resistanceZones);
//
return result;
}
//
bool HasResistanceZones()
{
return IsValidSize(CountResistanceZones());
}
//
int CountSupplyZones()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
result = ArraySize(supplyZones);
//
return result;
}
//
bool HasSupplyZones()
{
return IsValidSize(CountSupplyZones());
}
//
int CountDemandZones()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
result = ArraySize(demandZones);
//
return result;
}
//
bool HasDemandZones()
{
return IsValidSize(CountDemandZones());
}
//
int CountBullishOrderBlocks()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
result = ArraySize(bullishOrderBlocks);
//
return result;
}
//
bool HasBullishOrderBlocks()
{
return IsValidSize(CountBullishOrderBlocks());
}
//
int CountBearishOrderBlocks()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
result = ArraySize(bearishOrderBlocks);
//
return result;
}
//
bool HasBearishOrderBlocks()
{
return IsValidSize(CountBearishOrderBlocks());
}
//
int CountBullishFairValueGaps()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
result = ArraySize(bullishFairValueGaps);
//
return result;
}
//
bool HasBullishFairValueGaps()
{
return IsValidSize(CountBullishFairValueGaps());
}
//
int CountBearishFairValueGaps()
{
//
int result = 0;
//
if (!IsValid())
{
return result;
}
//
result = ArraySize(bearishFairValueGaps);
//
return result;
}
//
bool HasBearishFairValueGaps()
{
return IsValidSize(CountBearishFairValueGaps());
}
//
};
//
// Consolidation Zone ...
struct XConsolidationZone
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -1118,7 +1118,7 @@ struct XSignal
//
// Traget ...
double target; // Force Risk Free On Target ...
double targets[]; // Force Risk Free On Targets ...
bool ignoreEAVolume; // Ignore EA Volume ...
//
@@ -1679,7 +1679,7 @@ struct XSignal
conditions = NULL;
//
target = 0;
Clean(targets);
ignoreEAVolume = false;
//
File diff suppressed because it is too large Load Diff
@@ -299,16 +299,16 @@ class XC121SMCCycleHelper : public XCBase
string symbol,
ENUM_TIMEFRAMES period,
X121Inputs &x121Inputs,
int requiredPOIS = 50 //
int requiredPOIs = 50 //
)
{
//
bool result = false;
//
if (requiredPOIS < 10)
if (requiredPOIs < 10)
{
requiredPOIS = 10;
requiredPOIs = 10;
}
//
@@ -341,8 +341,21 @@ class XC121SMCCycleHelper : public XCBase
symbol,
period //
);
mPOIDetector.MaxNumberOfPOIs(requiredPOIS);
mPOIDetector.MaxNumberOfRequiredPOIs(requiredPOIS);
mPOIDetector.MaxRequiredPOIs(requiredPOIs);
//
int maxLoopbackBars = mPOIDetector.MaxAllowedLoopbackForInit();
int periodSeconds = PeriodSeconds(period);
if (periodSeconds > PeriodSeconds(PERIOD_M15)) {
//
int multiplier = periodSeconds / PeriodSeconds(PERIOD_M15);
//
if (multiplier >= 1) {
maxLoopbackBars *= 2;
}
}
mPOIDetector.MaxAllowedLoopbackForInit(maxLoopbackBars);
mPOIDetector.Init();
//
@@ -48,7 +48,7 @@ struct X121SMCTradeData
double commission; // Commission
string conditions; // Signal Conditions
double maxDrawdown; // Max Position Drawdown
bool isTargeted; // Check Targetted Before Or Not
double lastTarget; // Check Last Targetted
double lastTrailedTPLevel; // Hold Last Trailed TP Level
//
@@ -115,7 +115,7 @@ struct X121SMCTradeData
conditions = NULL;
//
isTargeted = false;
lastTarget = 0;
//
signal.Clean();
@@ -644,9 +644,22 @@ struct X121SMCTradeData
*
* @return ( double )
*/
double Target()
int Targets(double &targets[])
{
return signal.target;
//
int result = 0;
//
Copy(
signal.targets,
targets //
);
//
result = ArraySize(targets);
//
return result;
}
/**
@@ -3722,13 +3735,33 @@ class XC121SMCTradeHandler : public XCBaseAlert
//
// Handle RF On Target ...
double target = iData.Target();
double targets[];
int targetsCount = iData.Targets(targets);
bool hasTargets = IsValidSize(targetsCount);
if (hasTargets)
{
//
for (int k = 0; k < targetsCount; k++)
{
//
double target = targets[k];
bool isValidTarget =
iData.lastTarget == 0
? true
: isLong
? target > iData.lastTarget
: target < iData.lastTarget;
if (!isValidTarget)
{
continue;
}
//
double targetDelta = isLong
? target + (15 * points)
: target - (15 * points);
bool canRF =
target > 0 &&
!iData.isTargeted &&
(isLong ? target > entry
: target < entry) &&
(isLong
@@ -3756,7 +3789,7 @@ class XC121SMCTradeHandler : public XCBaseAlert
//
// Update mData ...
mData[i].isTargeted = true;
mData[i].lastTarget = target;
//
string message = prefix +
@@ -3770,6 +3803,8 @@ class XC121SMCTradeHandler : public XCBaseAlert
}
}
}
}
}
//
// Calculate Max Draw Down ...
+5 -2
View File
@@ -267,8 +267,8 @@ struct X121SMCStrategyConditions
//
double sl;
double tp;
double target;
string provider;
double targets[];
ENUM_X_DIRECTION signalDir;
//
@@ -286,9 +286,9 @@ struct X121SMCStrategyConditions
void Clean()
{
//
time = NULL;
symbol = NULL;
period = NULL;
time = NULL;
//
sl = 0;
@@ -296,6 +296,9 @@ struct X121SMCStrategyConditions
provider = NULL;
signalDir = X_DIRECTION_NONE;
//
Clean(targets);
//
ZeroMemory(this);
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+11 -88
View File
@@ -294,20 +294,12 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
signal.pushers = pushers;
signal.provider = provider;
signal.time = TimeCurrent();
signal.target = conditions.target;
//
bool canReplaceTarget =
signal.target > 0 &&
(hasLong
? signal.target > signal.tp
: signal.target < signal.tp);
if (canReplaceTarget)
{
//
signal.tp = conditions.target;
signal.target = tp;
}
Copy(
conditions.targets,
signal.targets //
);
//
result = PrepareSignal(signal);
@@ -354,40 +346,6 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
signal.volume = cVolume;
}
}
//
// Fix Signal TP Based On Working Zone ...
// double maxAllowedTP =
// hasLong
// ? mXWZConditions.workingZone.upper
// : mXWZConditions.workingZone.lower;
// bool canApplyMaxAlowedTP = (hasLong &&
// signal.tp > maxAllowedTP) ||
// (!hasLong && signal.tp < maxAllowedTP);
// if (canApplyMaxAlowedTP)
// {
// signal.tp = maxAllowedTP;
// }
//
// Configuring Global Protector ...
// signal.trailSL = true;
// signal.trailSLStartOnReachTPLevel = 3;
// signal.fullTPLevel = signal.GetRiskRewardRatio();
// //
// mXSupDemOBSSignalDetector.RemoveDraws();
// mXSupDemOBSSignalDetector.DrawConditions(
// mXSupDemOBSConditions,
// mVisionCycleHelper.mPOIDrawer //
// );
// //
// mXSupDemOBSSignalDetector.RemoveWorkingZoneDraws();
// mXSupDemOBSSignalDetector.DrawWorkingZone(
// mXSupDemOBSConditions,
// mVisionCycleHelper.mPOIDrawer //
// );
}
//
@@ -595,33 +553,9 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
setupDir = mXWZSignalDetector.mConditions.dir;
setupTime = mXWZSignalDetector.mConditions.setupTime;
//
if (!isSetuped)
{
//
mXWZSignalDetector.RemoveDraws();
// mXWZSignalDetector.RemoveWorkingZoneDraws();
//
// mXWZSignalDetector.DrawWorkingZone(
// mXWZSignalDetector.mConditions,
// mVisionCycleHelper.mPOIDrawer //
// );
//
mXWZSignalDetector.DrawConditions(
mXWZSignalDetector.mConditions,
mVisionCycleHelper.mPOIDrawer //
);
}
//
if (isSetuped)
{
//
mXWZSignalDetector.RemoveDraws();
// mXWZSignalDetector.RemoveWorkingZoneDraws();
//
int items = mXWZSignalDetector
.AddConditionsIfNotExists();
@@ -694,22 +628,6 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
//
if (canTrigger)
{
//
mXWZSignalDetector.RemoveDraws();
// mXWZSignalDetector.RemoveWorkingZoneDraws();
//
// mXWZSignalDetector.DrawWorkingZone(
// mTmpConditions[i],
// mVisionCycleHelper.mPOIDrawer //
// );
//
mXWZSignalDetector.DrawConditions(
mTmpConditions[i],
mVisionCycleHelper.mPOIDrawer //
);
//
selectedIndex = i;
mConditions = mTmpConditions[i];
@@ -749,7 +667,12 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
conditions.sl = mConditions.sl;
conditions.provider = providerStr;
conditions.signalDir = mConditions.dir;
conditions.target = mConditions.target;
//
Copy(
mConditions.targets,
conditions.targets //
);
//
xWZConditions = mConditions;
@@ -785,7 +708,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
//
if (mMaxAllowedRequiredPOIs <= 0)
{
mMaxAllowedRequiredPOIs = 50;
mMaxAllowedRequiredPOIs = 200;
}
//