Complete XSMC SMPV Strategy and Prepare for Testing Phase 1 ...

This commit is contained in:
2024-12-12 23:56:49 +03:30
parent 4516229d36
commit ba69ff18c4
6 changed files with 1082 additions and 444 deletions
+82 -228
View File
@@ -30,25 +30,25 @@
//
// Definitions ...
//
const string X121SMCStrategyToken = "X121SMC";
const string X121SMCPVToken = "X121SMCPV";
const string X121SMCBOSToken = "X121SMCBOS";
const string X121SMCSARToken = "X121SMCSAR";
const string X121SMCCHOCHToken = "X121SMCCHOCH";
const string X121SMCPULLBKToken = "X121SMCPULLBK";
//
const string X121SMCSMPVToken = "X121SMCSMPV";
const string X121SMCVWAPCToken = "X121SMCVWAPC";
//
// X121 SMC Providers ...
enum ENUM_X_121_SMC_PROVIDERS
{
//
X_121_SMC_PROVIDER_NONE,
X_121_SMC_PROVIDER_PV,
X_121_SMC_PROVIDER_BOS,
X_121_SMC_PROVIDER_SAR,
X_121_SMC_PROVIDER_CHOCH,
X_121_SMC_PROVIDER_PULLBK,
X_121_SMC_PROVIDER_SMPV,
X_121_SMC_PROVIDER_VWAPC,
};
//
// Pivot Types ...
enum ENUM_XPV_PIVOTS
{
XPV_NONE,
@@ -56,6 +56,8 @@ enum ENUM_XPV_PIVOTS
XPV_VALE,
};
//
// Model a Pivot structure ...
struct XPVPivot
{
//
@@ -634,11 +636,12 @@ struct X121SMCStrategyConditions
//
double sl;
double tp;
string provider;
ENUM_X_DIRECTION signalDir;
ENUM_X_DIRECTION marketStructureDir;
//
//
void X121SMCStrategyConditions()
@@ -661,7 +664,9 @@ struct X121SMCStrategyConditions
//
sl = 0;
tp = 0;
provider = NULL;
signalDir = X_DIRECTION_NONE;
marketStructureDir = X_DIRECTION_NONE;
//
@@ -692,6 +697,64 @@ struct X121SMCStrategyConditions
return result;
}
/**
* Check Conditions Has Valid Bullish Signal ...
*
* @return ( bool )
*/
bool HasBullishSignal()
{
//
bool result = false;
//
result =
(sl > 0 ||
tp > 0) &&
IsValid() &&
HasDirection(signalDir);
if (!result)
{
return result;
}
//
result =
IsBullish(signalDir);
//
return result;
}
/**
* Check Conditions Has Valid Bearish Signal ...
*
* @return ( bool )
*/
bool HasBearishSignal()
{
//
bool result = false;
//
result =
(sl > 0 ||
tp > 0) &&
IsValid() &&
HasDirection(signalDir);
if (!result)
{
return result;
}
//
result =
IsBearish(signalDir);
//
return result;
}
//
// Reporter Functions ...
@@ -1769,28 +1832,13 @@ string ToString(ENUM_X_121_SMC_PROVIDERS value)
switch (value)
{
//
case X_121_SMC_PROVIDER_PV:
result = X121SMCPVToken;
case X_121_SMC_PROVIDER_SMPV:
result = X121SMCSMPVToken;
break;
//
case X_121_SMC_PROVIDER_BOS:
result = X121SMCBOSToken;
break;
//
case X_121_SMC_PROVIDER_SAR:
result = X121SMCSARToken;
break;
//
case X_121_SMC_PROVIDER_CHOCH:
result = X121SMCCHOCHToken;
break;
//
case X_121_SMC_PROVIDER_PULLBK:
result = X121SMCPULLBKToken;
case X_121_SMC_PROVIDER_VWAPC:
result = X121SMCVWAPCToken;
break;
}
@@ -1817,208 +1865,14 @@ ENUM_X_121_SMC_PROVIDERS ParseProvider(string value)
}
//
if (Contains(X121SMCPVToken, value))
if (Contains(X121SMCSMPVToken, value))
{
result = X_121_SMC_PROVIDER_PV;
result = X_121_SMC_PROVIDER_SMPV;
}
else if (Contains(X121SMCBOSToken, value))
else if (Contains(X121SMCVWAPCToken, value))
{
result = X_121_SMC_PROVIDER_BOS;
result = X_121_SMC_PROVIDER_VWAPC;
}
else if (Contains(X121SMCSARToken, value))
{
result = X_121_SMC_PROVIDER_SAR;
}
else if (Contains(X121SMCCHOCHToken, value))
{
result = X_121_SMC_PROVIDER_CHOCH;
}
else if (Contains(X121SMCPULLBKToken, value))
{
result = X_121_SMC_PROVIDER_PULLBK;
}
//
return result;
}
//
// Model Value Changed ...
struct XValueChange
{
//
// Props ...
double before; // Before Change Value ...
double after; // After Change Value ...
datetime time; // Change Time ...
ENUM_X_DIRECTION dir; // Change Direction ...
//
// Constructor ...
XValueChange()
{
Clean();
}
//
// Tools ...
/**
* Initialize ...
*
* @param _before: Double, Value Before Change ...
* @param _after: Double, Value After Change ...
* @param _time: Datetime, Change Time ...
* @param _dir: ENUM_X_DIRECTION member, Specified Changed Direction ...
*
* @return ( bool )
*/
bool Init(
double _before, // Before Change Value ...
double _after, // After Change Value ...
ENUM_X_DIRECTION _dir, // Change Direction ...
datetime _time = NULL // Change Time ...
)
{
//
bool result = false;
//
_time = NormalizeTime(_time);
//
// Validate Inputs ...
result =
//
_after > 0 &&
_before > 0 &&
IsValid(_time) &&
_after != _before &&
HasDirection(_dir)
//
;
if (!result)
{
return result;
}
//
// Set Validated Values ...
dir = _dir;
time = _time;
after = _after;
before = _before;
//
result = IsValid();
//
return result;
}
/**
* Cleaning Up ...
*/
void Clean()
{
//
after = 0;
before = 0;
time = NULL;
dir = X_DIRECTION_NONE;
}
/**
* Validate Model ...
*
* @return ( bool )
*/
bool IsValid()
{
//
bool result = false;
//
result =
//
after > 0 &&
before > 0 &&
IsValid(time) &&
after != before &&
HasDirection(dir)
//
;
//
return result;
}
//
};
/**
* Add Value Change instance to Exists Collection if it's not Exists ...
*
* @param item: XValueChange instance Reference ...
* @param items: XValueChange instance Array Reference ...
*
* @return ( int )
*/
int AddIfNotExists(
XValueChange &item,
XValueChange &items[] //
)
{
//
int result = 0;
//
result = item.IsValid();
if (!result)
{
return result;
}
//
bool canAdd = false;
int count = ArraySize(items);
if (!IsValidSize(count))
{
canAdd = true;
}
else
{
//
XValueChange last;
bool hasItem = GetLastItem(
last,
items //
);
if (!hasItem)
{
canAdd = true;
}
else
{
//
// Compare Last Item with Current ...
canAdd = item.time > last.time;
}
}
//
// Add Item if Allowed ...
if (canAdd)
{
//
AddRef(
item,
items //
);
}
//
result = ArraySize(items);
//
return result;