Last ...
This commit is contained in:
@@ -799,6 +799,9 @@ class XCSignalObject : public XCBaseObject
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string nameMD5 = ToMD5(name);
|
||||
|
||||
//
|
||||
int delay = (PeriodSeconds(signal.period) * 2);
|
||||
datetime time1 = (datetime)((int)signal.time - delay);
|
||||
@@ -806,7 +809,7 @@ class XCSignalObject : public XCBaseObject
|
||||
|
||||
//
|
||||
// TP ...
|
||||
string tpName = ToString(X_TP) + "_" + name;
|
||||
string tpName = ToString(X_TP) + "_" + nameMD5;
|
||||
result = mTPTrend.Create(
|
||||
chart_id,
|
||||
tpName,
|
||||
@@ -823,7 +826,7 @@ class XCSignalObject : public XCBaseObject
|
||||
|
||||
//
|
||||
// SL ...
|
||||
string slName = ToString(X_SL) + "_" + name;
|
||||
string slName = ToString(X_SL) + "_" + nameMD5;
|
||||
result = mSLTrend.Create(
|
||||
chart_id,
|
||||
slName,
|
||||
@@ -842,7 +845,7 @@ class XCSignalObject : public XCBaseObject
|
||||
|
||||
//
|
||||
// ENTRY ...
|
||||
string entrName = ToString(X_ENTRY) + "_" + name;
|
||||
string entrName = ToString(X_ENTRY) + "_" + nameMD5;
|
||||
result = mEntryTrend.Create(
|
||||
chart_id,
|
||||
entrName,
|
||||
|
||||
@@ -1738,7 +1738,8 @@ class XCPOIDrawer : public XSCBase
|
||||
*/
|
||||
bool CreateResistanceZone(
|
||||
XOHCL &bar,
|
||||
XCResistanceZoneObject *&object //
|
||||
XCResistanceZoneObject *&object,
|
||||
datetime destTime = NULL //
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -1762,7 +1763,10 @@ class XCPOIDrawer : public XSCBase
|
||||
string name = bar.GetTag(ToString(X_POI_RESISTANCE_ZONE));
|
||||
|
||||
//
|
||||
datetime time2 = (datetime)((int)bar.time + (PeriodSeconds(bar.period) * 5));
|
||||
datetime time2 =
|
||||
IsValid(destTime)
|
||||
? destTime
|
||||
: (datetime)((int)bar.time + (PeriodSeconds(bar.period) * 5));
|
||||
|
||||
//
|
||||
bool fill = ResistanceZoneFill();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -276,6 +276,13 @@ void OnSignalRecieved(
|
||||
{
|
||||
//
|
||||
// TODO: Implement this ...
|
||||
|
||||
//
|
||||
ENUM_X_SIGNAL_EXECUTION_RESULT state;
|
||||
eaTrader.ExecuteSignal(
|
||||
signal,
|
||||
state //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -446,6 +453,9 @@ bool InitEA()
|
||||
_Period //
|
||||
);
|
||||
|
||||
//
|
||||
iX121SMCStrategy.AddXSignalEventHandler(OnSignalRecieved);
|
||||
|
||||
//
|
||||
ConfigureStrategy(iX121SMCStrategy);
|
||||
RegisterStrategy(iX121SMCStrategy);
|
||||
@@ -508,6 +518,9 @@ bool InitEA()
|
||||
_Period //
|
||||
);
|
||||
|
||||
//
|
||||
iX121SMCStrategy.AddXSignalEventHandler(OnSignalRecieved);
|
||||
|
||||
//
|
||||
// Register Strategy ...
|
||||
ConfigureStrategy(iX121SMCStrategy);
|
||||
|
||||
@@ -538,39 +538,40 @@ struct XOHCL
|
||||
time = iTime(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
barIndex
|
||||
//
|
||||
barIndex //
|
||||
);
|
||||
|
||||
//
|
||||
open = iOpen(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
barIndex
|
||||
//
|
||||
barIndex //
|
||||
);
|
||||
open = NormalizePrice(open, mSymbol);
|
||||
|
||||
//
|
||||
close = iClose(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
barIndex
|
||||
//
|
||||
barIndex //
|
||||
);
|
||||
close = NormalizePrice(close, mSymbol);
|
||||
|
||||
//
|
||||
high = iHigh(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
barIndex);
|
||||
barIndex //
|
||||
);
|
||||
high = NormalizePrice(high, mSymbol);
|
||||
|
||||
//
|
||||
low = iLow(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
barIndex
|
||||
//
|
||||
barIndex //
|
||||
);
|
||||
low = NormalizePrice(low, mSymbol);
|
||||
|
||||
//
|
||||
bool result = IsValid();
|
||||
|
||||
@@ -436,6 +436,45 @@ struct XZone
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double GetRange()
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
if (!IsValid())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = upper - lower;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double GetMiddle()
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
double range = GetRange();
|
||||
if (range <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = lower + (range / 2);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetTag()
|
||||
{
|
||||
@@ -1730,11 +1769,12 @@ bool IsInside(
|
||||
double upper =
|
||||
edge == X_ZONE_UPPER_EDGE
|
||||
? source.high
|
||||
: source.GetDown();
|
||||
: source.GetUp();
|
||||
double lower =
|
||||
edge == X_ZONE_UPPER_EDGE
|
||||
? source.GetUp()
|
||||
? source.GetDown()
|
||||
: source.low;
|
||||
|
||||
result = iSource.Init(
|
||||
upper,
|
||||
lower,
|
||||
@@ -1759,9 +1799,328 @@ bool IsInside(
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check a Zone is Between to other Zones ...
|
||||
*
|
||||
* @param source: XZone instance ...
|
||||
* @param upper: XZone instance ...
|
||||
* @param lower: XZone instance ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool IsBetween(
|
||||
XZone &source,
|
||||
XZone &upper,
|
||||
XZone &lower //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = source.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool isUpperValid = upper.IsValid();
|
||||
bool isLowerValid = lower.IsValid();
|
||||
|
||||
//
|
||||
result = isUpperValid ||
|
||||
isLowerValid;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (isUpperValid)
|
||||
{
|
||||
//
|
||||
result = source.upper < upper.lower;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
if (isLowerValid)
|
||||
{
|
||||
//
|
||||
result = source.lower > lower.upper;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
bool IsBetween(
|
||||
XOHCL &source,
|
||||
XZone &upper,
|
||||
XZone &lower //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = source.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool isUpperValid = upper.IsValid();
|
||||
bool isLowerValid = lower.IsValid();
|
||||
|
||||
//
|
||||
result = isUpperValid ||
|
||||
isLowerValid;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (isUpperValid)
|
||||
{
|
||||
//
|
||||
result = source.high < upper.lower;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
if (isLowerValid)
|
||||
{
|
||||
//
|
||||
result = source.low > lower.upper;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// State Extensions ...
|
||||
|
||||
/**
|
||||
* Normalize and Combine States ...
|
||||
*
|
||||
* @param dest: XPOIState instance ...ّ
|
||||
* @param states: XPOIState instance ...ّ
|
||||
*/
|
||||
void CombineStates(
|
||||
XPOIState &dest,
|
||||
XPOIState &states[] //
|
||||
)
|
||||
{
|
||||
//
|
||||
dest.Clean();
|
||||
|
||||
//
|
||||
int count = ArraySize(states);
|
||||
if (!IsValidSize(count))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
XPOIState iState = states[i];
|
||||
|
||||
//
|
||||
dest.symbol = iState.symbol;
|
||||
dest.period =
|
||||
!IsValid(dest.period) ||
|
||||
PeriodSeconds(dest.period) < PeriodSeconds(iState.period)
|
||||
? iState.period
|
||||
: dest.period;
|
||||
dest.reportedAt =
|
||||
!IsValid(dest.reportedAt) ||
|
||||
dest.reportedAt > iState.reportedAt
|
||||
? iState.reportedAt
|
||||
: dest.reportedAt;
|
||||
|
||||
//
|
||||
// Demand ...
|
||||
int iCount = ArraySize(iState.demandZones);
|
||||
if (IsValidSize(iCount))
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
iState.demandZones,
|
||||
dest.demandZones,
|
||||
false //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Supply ...
|
||||
iCount = ArraySize(iState.supplyZones);
|
||||
if (IsValidSize(iCount))
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
iState.supplyZones,
|
||||
dest.supplyZones,
|
||||
false //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Order Blocks ...
|
||||
|
||||
//
|
||||
iCount = ArraySize(iState.bullishOrderBlocks);
|
||||
if (IsValidSize(iCount))
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
iState.bullishOrderBlocks,
|
||||
dest.bullishOrderBlocks,
|
||||
false //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
iCount = ArraySize(iState.bearishOrderBlocks);
|
||||
if (IsValidSize(iCount))
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
iState.bearishOrderBlocks,
|
||||
dest.bearishOrderBlocks,
|
||||
false //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Fair Value Gaps ...
|
||||
|
||||
//
|
||||
iCount = ArraySize(iState.bullishFVGs);
|
||||
if (IsValidSize(iCount))
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
iState.bullishFVGs,
|
||||
dest.bullishFVGs,
|
||||
false //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
iCount = ArraySize(iState.bearishFVGs);
|
||||
if (IsValidSize(iCount))
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
iState.bearishFVGs,
|
||||
dest.bearishFVGs,
|
||||
false //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Supports ...
|
||||
iCount = ArraySize(iState.supportZones);
|
||||
if (IsValidSize(iCount))
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
iState.supportZones,
|
||||
dest.supportZones,
|
||||
false //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Resistances ...
|
||||
iCount = ArraySize(iState.resistanceZones);
|
||||
if (IsValidSize(iCount))
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
iState.resistanceZones,
|
||||
dest.resistanceZones,
|
||||
false //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Swings ...
|
||||
|
||||
//
|
||||
// Swing Highs ...
|
||||
iCount = ArraySize(iState.swingHighs);
|
||||
if (IsValidSize(iCount))
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
iState.swingHighs,
|
||||
dest.swingHighs,
|
||||
false //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Swing Lows ...
|
||||
iCount = ArraySize(iState.swingLows);
|
||||
if (IsValidSize(iCount))
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
iState.swingLows,
|
||||
dest.swingLows,
|
||||
false //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Momentum Bars ...
|
||||
iCount = ArraySize(iState.momentumBars);
|
||||
if (IsValidSize(iCount))
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
iState.momentumBars,
|
||||
dest.momentumBars,
|
||||
false //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Rejection Bars ...
|
||||
iCount = ArraySize(iState.rejectionBars);
|
||||
if (IsValidSize(iCount))
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
iState.rejectionBars,
|
||||
dest.rejectionBars,
|
||||
false //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check State has Bullish Trend or not ...
|
||||
*
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
// Complete this ...
|
||||
@@ -121,6 +121,34 @@ struct X121SMCStrategyConditions
|
||||
Clean(bullishRejectionBars);
|
||||
}
|
||||
|
||||
void CleanDemand()
|
||||
{
|
||||
//
|
||||
demandZone.Clean();
|
||||
|
||||
//
|
||||
Clean(supports);
|
||||
Clean(swingLows);
|
||||
Clean(bullishFVGs);
|
||||
Clean(bullishOrderBlocks);
|
||||
Clean(bullishMomentumBars);
|
||||
Clean(bullishRejectionBars);
|
||||
}
|
||||
|
||||
void CleanSupply()
|
||||
{
|
||||
//
|
||||
supplyZone.Clean();
|
||||
|
||||
//
|
||||
Clean(swingHighs);
|
||||
Clean(resistances);
|
||||
Clean(bearishFVGs);
|
||||
Clean(bearishOrderBlocks);
|
||||
Clean(bearishMomentumBars);
|
||||
Clean(bearishRejectionBars);
|
||||
}
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
bool IsValid()
|
||||
@@ -263,6 +291,63 @@ struct X121SMCStrategyConditions
|
||||
//
|
||||
};
|
||||
|
||||
//
|
||||
// Market Structure Models ...
|
||||
struct X121SMCMarketStructure
|
||||
{
|
||||
//
|
||||
XZone demandZone;
|
||||
XZone supplyZone;
|
||||
|
||||
//
|
||||
XZone demandZones[];
|
||||
XZone supplyZones[];
|
||||
|
||||
//
|
||||
XZone bearishOrderBlocks[];
|
||||
XZone bearishFVGs[];
|
||||
|
||||
//
|
||||
XOHCL swingHighs[];
|
||||
XOHCL resistances[];
|
||||
XOHCL bearishMomentumBars[];
|
||||
XOHCL bearishRejectionBars[];
|
||||
|
||||
//
|
||||
XZone bullishOrderBlocks[];
|
||||
XZone bullishFVGs[];
|
||||
|
||||
//
|
||||
XOHCL supports[];
|
||||
XOHCL swingLows[];
|
||||
XOHCL bullishMomentumBars[];
|
||||
XOHCL bullishRejectionBars[];
|
||||
|
||||
//
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
demandZone.Clean();
|
||||
supplyZone.Clean();
|
||||
|
||||
//
|
||||
Clean(supports);
|
||||
Clean(swingLows);
|
||||
Clean(swingHighs);
|
||||
Clean(demandZones);
|
||||
Clean(supplyZones);
|
||||
Clean(bearishFVGs);
|
||||
Clean(resistances);
|
||||
Clean(bullishFVGs);
|
||||
Clean(bearishOrderBlocks);
|
||||
Clean(bullishOrderBlocks);
|
||||
Clean(bearishMomentumBars);
|
||||
Clean(bearishRejectionBars);
|
||||
Clean(bullishMomentumBars);
|
||||
Clean(bullishRejectionBars);
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// On Signal Event Handler ...
|
||||
typedef void (*TOnX121SMCSignal)(
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user