last works ...

This commit is contained in:
2024-10-28 13:56:20 +03:30
parent 2284831018
commit f0d3ededea
6 changed files with 952 additions and 238 deletions
@@ -21,6 +21,7 @@
// //
#include "../Libraries/x-saherelm.x-poi.lib.mq5" #include "../Libraries/x-saherelm.x-poi.lib.mq5"
#include "../Libraries/x-saherelm.xtrade.lib.mq5"
// //
#include <ChartObjects/ChartObject.mqh> #include <ChartObjects/ChartObject.mqh>
@@ -56,6 +57,9 @@ enum ENUM_X_CHART_IDS
X_FROM, X_FROM,
X_UPPER, X_UPPER,
X_LOWER, X_LOWER,
X_ENTRY,
X_SL,
X_TP
}; };
// //
@@ -95,6 +99,21 @@ string ToString(ENUM_X_CHART_IDS value)
case X_LOWER: case X_LOWER:
result = "XLOWER"; result = "XLOWER";
break; break;
//
case X_TP:
result = "XTP";
break;
//
case X_SL:
result = "XSL";
break;
//
case X_ENTRY:
result = "XENTRY";
break;
} }
// //
@@ -574,6 +593,253 @@ class XCZoneObject : public XCBaseObject
// //
// Structured Chart Object ... // Structured Chart Object ...
//
// Signal ...
class XCSignalObject : public XCBaseObject
{
//
public:
//
//
// Constructor ...
void XCSignalObject()
{
}
//
// Deconstructor ...
void ~XCSignalObject()
{
}
/**
* Create a Signal Object on Chart ...
*
* @param chart_id: Long ...
* @param name: String ...
* @param window: Integer ...
* @param signal: XSignal instance ...
*
* @return ( bool )
*/
bool Create(
long chart_id,
const string name,
const int window,
XSignal &signal //
)
{
//
bool result = false;
//
result = IsValid(name) &&
signal
.IsValid();
if (!result)
{
return result;
}
//
int delay = (PeriodSeconds(signal.period) * 2);
datetime time1 = (datetime)((int)signal.time - delay);
datetime time2 = (datetime)((int)signal.time + delay);
//
// TP ...
string tpName = ToString(X_TP) + "_" + name;
result = mTPTrend.Create(
chart_id,
tpName,
window,
time1,
signal.tp,
time2,
signal.tp //
);
if (!result)
{
return result;
}
//
// SL ...
string slName = ToString(X_TP) + "_" + name;
result = mSLTrend.Create(
chart_id,
slName,
window,
time1,
signal.sl,
time2,
signal.sl //
);
if (!result)
{
//
mTPTrend.Delete();
return result;
}
//
// ENTRY ...
string entrName = ToString(X_ENTRY) + "_" + name;
result = mEntryTrend.Create(
chart_id,
entrName,
window,
time1,
signal.entry,
time2,
signal.entry //
);
if (!result)
{
//
mTPTrend.Delete();
mSLTrend.Delete();
return result;
}
//
return result;
}
//
// Setter(s) ...
//
// TP ...
/**
* Set TP Width ...
*
* @param value: Integer ...
*/
void TPWidth(int value)
{
//
if (value < 1)
{
value = 1;
}
//
mTPTrend.Width(value);
}
/**
* Set TP Color ...
*
* @param value: Color ...
*/
void TPColor(color value)
{
mTPTrend.Color(value);
}
/**
* Set TP Style ...
*
* @param value: ENUM_LINE_STYLE ...
*/
void TPStyle(ENUM_LINE_STYLE value)
{
mTPTrend.Style(value);
}
//
// SL ...
/**
* Set SL Width ...
*
* @param value: Integer ...
*/
void SLWidth(int value)
{
//
if (value < 1)
{
value = 1;
}
//
mSLTrend.Width(value);
}
/**
* Set SL Color ...
*
* @param value: Color ...
*/
void SLColor(color value)
{
mSLTrend.Color(value);
}
/**
* Set SL Style ...
*
* @param value: ENUM_LINE_STYLE ...
*/
void SLStyle(ENUM_LINE_STYLE value)
{
mSLTrend.Style(value);
}
//
// ENTRY ...
/**
* Set Entry Width ...
*
* @param value: Integer ...
*/
void EntryWidth(int value)
{
//
if (value < 1)
{
value = 1;
}
//
mEntryTrend.Width(value);
}
/**
* Set Entry Color ...
*
* @param value: Color ...
*/
void EntryColor(color value)
{
mEntryTrend.Color(value);
}
/**
* Set Entry Style ...
*
* @param value: ENUM_LINE_STYLE ...
*/
void EntryStyle(ENUM_LINE_STYLE value)
{
mEntryTrend.Style(value);
}
//
private:
//
//
CChartObjectTrend mTPTrend;
CChartObjectTrend mSLTrend;
CChartObjectTrend mEntryTrend;
};
// //
// XTradeDay Object ... // XTradeDay Object ...
class XCTardeDayObject : public XCFromToObject class XCTardeDayObject : public XCFromToObject
+228
View File
@@ -0,0 +1,228 @@
//
// LONG ...
//
bool isSoImportantLong =
iConditions.demandZone.IsValid() &&
iConditions.bullishFVG.IsValid() &&
iConditions.bullishOrderBlock.IsValid();
//
bool isImportantLong =
iConditions.demandZone.IsValid() &&
(iConditions.bullishFVG.IsValid() ||
iConditions.bullishOrderBlock.IsValid());
//
bool isRiskyLong =
iConditions.demandZone.IsValid() &&
(iConditions.bullishFVG.IsValid() ||
iConditions.bullishOrderBlock.IsValid());
//
bool hasLongConditions = isSoImportantLong ||
isImportantLong ||
isRiskyLong;
//
if (hasLongConditions)
{
//
// Find Trigger for Input Positions ...
// - [] Breakout;
// - [] Engulf;
// - [] Rejection Bar;
// - [] Momentum Bar;
//
type = POSITION_TYPE_BUY;
entry = GetEntry(mSymbol, type);
sl = iConditions.demandZone.lower - (10 * points);
risk = entry - sl;
reward = risk * r2r;
tp = entry + reward;
//
bool isSpreadOK = IsSpreadPass();
//
// Price Must Breakout the Upper of Demand ...
bool isBreakout =
//
cBar.IsBullish() &&
zBar.low > conditions.demandZone.upper &&
cBar.high > conditions.demandZone.upper &&
cBar.close > conditions.demandZone.upper &&
(cBar.open < conditions.demandZone.upper ||
cBar.low < conditions.demandZone.upper)
//
;
//
// Price Must have Bullish Trend and Momentum on Ticks ...
bool isTicksBullishMomentum =
IsTicksBullish() &&
IsTicksHasMomentum();
//
// Detect momentum / Swing Low / Rejection Bars ...
bool hasMomentumBars = false;
int swingLowsCount = ArraySize(_5MState.swingLows);
int momentumBarsCount = ArraySize(_5MState.momentumBars);
int rejectionBarsCount = ArraySize(_5MState.rejectionBars);
if (IsValidSize(swingLowsCount) ||
IsValidSize(momentumBarsCount) ||
IsValidSize(rejectionBarsCount))
{
//
int foundedPOIs = 0;
//
// Check Swing Lows ...
if (IsValidSize(swingLowsCount))
{
//
for (int i = 0; i < swingLowsCount; i++)
{
//
XOHCL iBar = _5MState.swingLows[i];
//
if (iBar.time > iConditions.demandZone.from)
{
//
if (iBar.low < entry)
{
//
foundedPOIs++;
DrawSwingBar(iBar, true);
}
}
}
}
//
// Check Momentum Bars ...
if (IsValidSize(momentumBarsCount))
{
//
for (int i = 0; i < momentumBarsCount; i++)
{
//
XOHCL iBar = _5MState.momentumBars[i];
//
if (iBar.time > iConditions.demandZone.from)
{
//
if (iBar.IsBullish() && iBar.low < entry)
{
//
foundedPOIs++;
DrawMomentumBar(iBar);
}
}
}
}
//
// Check Rejection Bars ...
if (IsValidSize(rejectionBarsCount))
{
//
for (int i = 0; i < rejectionBarsCount; i++)
{
//
XOHCL iBar = _5MState.rejectionBars[i];
//
if (iBar.time > iConditions.demandZone.from)
{
//
if (iBar.low < entry &&
iBar.GetLowShadow() > iBar.GetHighShadow())
{
//
foundedPOIs++;
DrawRejectionBar(iBar);
}
}
}
}
//
pushers = foundedPOIs;
hasMomentumBars = foundedPOIs > 0;
}
//
hasLongConditions =
hasLongConditions &&
//
isSpreadOK &&
//
isBreakout &&
isTicksBullishMomentum &&
//
hasMomentumBars
//
;
//
if (hasLongConditions)
{
//
removeIDX = i;
conditions = iConditions;
result = hasLongConditions;
//
break;
}
}
//
// SHORT ...
//
bool isSoImportantShort =
iConditions.supplyZone.IsValid() &&
iConditions.bearishFVG.IsValid() &&
iConditions.bearishOrderBlock.IsValid();
//
bool isImportantShort =
iConditions.supplyZone.IsValid() &&
(iConditions.bearishFVG.IsValid() ||
iConditions.bearishOrderBlock.IsValid());
//
bool isRiskyShort =
iConditions.supplyZone.IsValid() &&
(!iConditions.bearishFVG.IsValid() &&
!iConditions.bearishOrderBlock.IsValid());
//
bool hasShortConditions = isSoImportantShort ||
isImportantShort ||
isRiskyShort;
//
if (hasShortConditions)
{
//
// Find Trigger for Input Positions ...
// - [] Breakout;
// - [] Engulf;
// - [] Rejection Bar;
// - [] Momentum Bar;
//
//
// removeIDX = i;
// conditions = iConditions;
// // DrawConditions(iConditions);
// Print("hasShortConditions");
break;
}
+48 -6
View File
@@ -200,6 +200,7 @@ struct XTick
datetime time; // Time ... datetime time; // Time ...
double bid; // Bid ... double bid; // Bid ...
double ask; // Ask ... double ask; // Ask ...
double spread; // Spread ...
// //
// Constructor ... // Constructor ...
@@ -223,7 +224,8 @@ struct XTick
string _symbol, string _symbol,
datetime _time, datetime _time,
double _bid, double _bid,
double _ask // double _ask,
double _spread //
) )
{ {
// //
@@ -234,19 +236,59 @@ struct XTick
IsValid(_time) && IsValid(_time) &&
_bid > 0 && _bid > 0 &&
_ask > 0; _ask > 0;
if (!result) { if (!result)
{
return result; return result;
} }
// //
symbol = _symbol;
time = _time;
bid = _bid; bid = _bid;
ask = _ask; ask = _ask;
time = _time;
symbol = _symbol;
spread = _spread;
// //
result = IsValid(); result = IsValid();
//
return result;
}
/**
* Init Tick by Symbol ...
*
* @param _symbol: String ...
*
* @return ( bool )
*/
bool Init(string _symbol)
{
//
bool result = false;
//
result = IsValid(_symbol);
if (!result)
{
return result;
}
//
datetime _time = TimeCurrent();
double _bid = GetBid(_symbol);
double _ask = GetAsk(_symbol);
double _spread = GetSpread(_symbol);
//
result = Init(
_symbol,
_time,
_bid,
_ask,
_spread //
);
// //
return result; return result;
} }
+21 -1
View File
@@ -612,7 +612,8 @@ struct XPosition
} }
// //
double GetRewardInPoint() { double GetRewardInPoint()
{
// //
double result = 0; double result = 0;
@@ -1618,6 +1619,25 @@ struct XSignal
return result; return result;
} }
//
string GetTag()
{
//
string result = NULL;
//
result = "XSignal_" +
symbol + "_" +
ToString(period) + "_" +
ToString(type) + "_" +
ToString(sl) + "_" +
ToString(tp) + "_" +
ToString(entry);
//
return result;
}
// //
// Retrieve String Representation of Signal ... // Retrieve String Representation of Signal ...
string ToString() string ToString()
+29 -2
View File
@@ -53,12 +53,22 @@ struct X121SMCStrategyConditions
XZone supplyZone; XZone supplyZone;
XZone bearishOrderBlock; XZone bearishOrderBlock;
XZone bearishFVG; XZone bearishFVG;
//
XOHCL swingHighs[];
XOHCL bearishMomentumBars[];
XOHCL bearishRejectionBars[];
// //
XZone demandZone; XZone demandZone;
XZone bullishOrderBlock; XZone bullishOrderBlock;
XZone bullishFVG; XZone bullishFVG;
//
XOHCL swingLows[];
XOHCL bullishMomentumBars[];
XOHCL bullishRejectionBars[];
// //
// Constructor ... // Constructor ...
void XStrategyConditions() void XStrategyConditions()
@@ -79,7 +89,24 @@ struct X121SMCStrategyConditions
time = NULL; time = NULL;
// //
// Clean Helpers Conditions ... supplyZone.Clean();
bearishOrderBlock.Clean();
bearishFVG.Clean();
//
demandZone.Clean();
bullishOrderBlock.Clean();
bullishFVG.Clean();
//
Clean(swingHighs);
Clean(bearishMomentumBars);
Clean(bearishRejectionBars);
//
Clean(swingLows);
Clean(bullishMomentumBars);
Clean(bullishRejectionBars);
} }
// //
+360 -229
View File
@@ -314,6 +314,14 @@ class XCX121SMCStrategy : public XSCBaseAlert
signal, signal,
conditions // conditions //
); );
//
DrawSignal(
signal,
conditions);
//
// ClearDraws();
} }
// //
@@ -330,6 +338,9 @@ class XCX121SMCStrategy : public XSCBaseAlert
signal.Clean(); signal.Clean();
conditions.Clean(); conditions.Clean();
//
int pushers = 0;
// //
double sl = 0; double sl = 0;
double tp = 0; double tp = 0;
@@ -472,138 +483,24 @@ class XCX121SMCStrategy : public XSCBaseAlert
for (int i = 0; i < conditionsCount; i++) for (int i = 0; i < conditionsCount; i++)
{ {
// //
result = false;
X121SMCStrategyConditions iConditions = mConditions[i]; X121SMCStrategyConditions iConditions = mConditions[i];
// //
// LONG ... // Longs ...
bool isAllowLong = AllowLong();
// if (isAllowLong)
bool isSoImportantLong =
iConditions.demandZone.IsValid() &&
iConditions.bullishFVG.IsValid() &&
iConditions.bullishOrderBlock.IsValid();
//
bool isImportantLong =
iConditions.demandZone.IsValid() &&
(iConditions.bullishFVG.IsValid() ||
iConditions.bullishOrderBlock.IsValid());
//
bool isRiskyLong =
iConditions.demandZone.IsValid() &&
(iConditions.bullishFVG.IsValid() ||
iConditions.bullishOrderBlock.IsValid());
//
bool hasLongConditions = isSoImportantLong ||
isImportantLong ||
isRiskyLong;
//
if (hasLongConditions)
{ {
// //
// Find Trigger for Input Positions ...
// - [] Breakout;
// - [] Engulf;
// - [] Rejection Bar;
// - [] Momentum Bar;
//
// Price Must Breakout the Upper of Demand ...
bool isBreakout =
//
cBar.IsBullish() &&
zBar.low > conditions.demandZone.upper &&
cBar.high > conditions.demandZone.upper &&
cBar.close > conditions.demandZone.upper &&
(cBar.open < conditions.demandZone.upper ||
cBar.low < conditions.demandZone.upper)
//
;
//
// Price Must have Bullish Trend and Momentum on Ticks ...
bool isTicksBullishMomentum =
IsTicksBullish() &&
IsTicksHasMomentum();
//
bool hasMpmentumBar =
//
cBar.
//
;
//
hasLongConditions =
hasLongConditions &&
//
isBreakout &&
isTicksBullishMomentum
//
;
//
if (hasLongConditions)
{
//
removeIDX = i;
conditions = iConditions;
DrawConditions(iConditions);
Print("hasLongConditions");
break;
}
} }
// //
// SHORT ... // Shorts ...
bool isAllowShort = AllowShort();
// if (isAllowShort)
bool isSoImportantShort =
iConditions.supplyZone.IsValid() &&
iConditions.bearishFVG.IsValid() &&
iConditions.bearishOrderBlock.IsValid();
//
bool isImportantShort =
iConditions.supplyZone.IsValid() &&
(iConditions.bearishFVG.IsValid() ||
iConditions.bearishOrderBlock.IsValid());
//
bool isRiskyShort =
iConditions.supplyZone.IsValid() &&
(!iConditions.bearishFVG.IsValid() &&
!iConditions.bearishOrderBlock.IsValid());
//
bool hasShortConditions = isSoImportantShort ||
isImportantShort ||
isRiskyShort;
//
if (hasShortConditions)
{ {
// //
// Find Trigger for Input Positions ...
// - [] Breakout;
// - [] Engulf;
// - [] Rejection Bar;
// - [] Momentum Bar;
//
//
removeIDX = i;
conditions = iConditions;
DrawConditions(iConditions);
Print("hasShortConditions");
break;
} }
//
} }
// //
@@ -617,6 +514,22 @@ class XCX121SMCStrategy : public XSCBaseAlert
removeIDX, removeIDX,
1 // 1 //
); );
//
signal.sl = sl;
signal.tp = tp;
signal.type = type;
signal.mode = mode;
signal.entry = entry;
signal.volume = volume;
signal.symbol = mSymbol;
signal.pushers = pushers;
signal.provider = GetTag();
signal.time = TimeCurrent();
signal.period = _5MState.period;
//
result = PrepareSignal(signal);
} }
// //
@@ -694,19 +607,9 @@ class XCX121SMCStrategy : public XSCBaseAlert
*/ */
void SaveTickData() void SaveTickData()
{ {
//
datetime time = TimeCurrent();
double ask = GetAsk(mSymbol);
double bid = GetBid(mSymbol);
// //
XTick tick; XTick tick;
bool isInited = tick.Init( bool isInited = tick.Init(mSymbol);
mSymbol,
time,
bid,
ask //
);
if (!isInited) if (!isInited)
{ {
return; return;
@@ -719,6 +622,57 @@ class XCX121SMCStrategy : public XSCBaseAlert
); );
} }
/**
* Check Spread Passed for Positions...
*
* @return ( bool )
*/
bool IsSpreadPass()
{
//
bool result = false;
//
int length = 5;
//
int ticksCount = ArraySize(mTicks);
if (ticksCount <= length)
{
return result;
}
//
int start = -1;
int end = -1;
CalculateTicksParams(
start,
end,
length + 1 //
);
result = IsValidIndex(start) &&
IsValidIndex(end);
if (!result)
{
return result;
}
//
end -= 1;
double spread = 0;
for (int i = start; i < end; i++)
{
spread += mTicks[i].spread;
}
spread /= length;
//
result = mTicks[ticksCount - 1].spread <= spread;
//
return result;
}
/** /**
* Calculate Ticks Param for Looping through Last n items ... * Calculate Ticks Param for Looping through Last n items ...
* *
@@ -907,6 +861,14 @@ class XCX121SMCStrategy : public XSCBaseAlert
// Collect all Drawn Objects ... // Collect all Drawn Objects ...
CArrayObj mDrawnObjects; CArrayObj mDrawnObjects;
/**
* Clear all Drawn Objects ...
*/
void ClearDraws()
{
mDrawnObjects.Clear();
}
/** /**
* Remove Specified Drawn Object ... * Remove Specified Drawn Object ...
* *
@@ -933,7 +895,11 @@ class XCX121SMCStrategy : public XSCBaseAlert
{ {
// //
string iName = ((CChartObject *)mDrawnObjects.At(i)).Name(); string iName = ((CChartObject *)mDrawnObjects.At(i)).Name();
string iObjName = ((XCBaseObject *)mDrawnObjects.At(i)).ObjName(); string iObjName = NULL;
if (!IsValid(iName))
{
iObjName = ((XCBaseObject *)mDrawnObjects.At(i)).ObjName();
}
// //
if ((IsValid(iName) && if ((IsValid(iName) &&
@@ -989,6 +955,10 @@ class XCX121SMCStrategy : public XSCBaseAlert
// //
mForceDisabled = false; mForceDisabled = false;
//
R2R(2);
Volume(0.01);
// //
string symbol = Symbol(); string symbol = Symbol();
ENUM_TIMEFRAMES period = Period(); ENUM_TIMEFRAMES period = Period();
@@ -1092,6 +1062,9 @@ class XCX121SMCStrategy : public XSCBaseAlert
delete m5MPOI; delete m5MPOI;
delete m15MPOI; delete m15MPOI;
// delete m4HSupDemPOI; // delete m4HSupDemPOI;
//
ClearDraws();
} }
/** /**
@@ -1729,26 +1702,10 @@ class XCX121SMCStrategy : public XSCBaseAlert
// //
string name = zone.GetTag(); string name = zone.GetTag();
RemoveObject(name); RemoveObject(name);
// int idx = FindIndex(zone, mSupplyZones);
// if (IsValidIndex(idx))
// {
// // //
// // ArrayRemove(
// // mSupplyZones,
// // idx,
// // 1 //
// // );
// //
// }
// //
zone.to = TimeCurrent(); zone.to = TimeCurrent();
name = zone.GetTag(); name = zone.GetTag();
// AddRef(
// zone,
// mSupplyZones //
// );
// //
XCSupplyZoneObject *iObj; XCSupplyZoneObject *iObj;
@@ -1791,26 +1748,10 @@ class XCX121SMCStrategy : public XSCBaseAlert
// //
string name = zone.GetTag(); string name = zone.GetTag();
RemoveObject(name); RemoveObject(name);
// int idx = FindIndex(zone, mDemandZones);
// if (IsValidIndex(idx))
// {
// // //
// // ArrayRemove(
// // mDemandZones,
// // idx,
// // 1 //
// // );
// //
// }
// //
zone.to = TimeCurrent(); zone.to = TimeCurrent();
name = zone.GetTag(); name = zone.GetTag();
// AddRef(
// zone,
// mDemandZones //
// );
// //
XCDemandZoneObject *iObj; XCDemandZoneObject *iObj;
@@ -1853,26 +1794,10 @@ class XCX121SMCStrategy : public XSCBaseAlert
// //
string name = zone.GetTag(); string name = zone.GetTag();
RemoveObject(name); RemoveObject(name);
// int idx = FindIndex(zone, mBearishOrderBlocks);
// if (IsValidIndex(idx))
// {
// // //
// // ArrayRemove(
// // mBearishOrderBlocks,
// // idx,
// // 1 //
// // );
// //
// }
// //
zone.to = TimeCurrent(); zone.to = TimeCurrent();
name = zone.GetTag(); name = zone.GetTag();
// AddRef(
// zone,
// mBearishOrderBlocks //
// );
// //
XCBearishOrderBlockObject *iObj; XCBearishOrderBlockObject *iObj;
@@ -1915,26 +1840,10 @@ class XCX121SMCStrategy : public XSCBaseAlert
// //
string name = zone.GetTag(); string name = zone.GetTag();
RemoveObject(name); RemoveObject(name);
// int idx = FindIndex(zone, mBullishOrderBlocks);
// if (IsValidIndex(idx))
// {
// // //
// // ArrayRemove(
// // mBullishOrderBlocks,
// // idx,
// // 1 //
// // );
// //
// }
// //
zone.to = TimeCurrent(); zone.to = TimeCurrent();
name = zone.GetTag(); name = zone.GetTag();
// AddRef(
// zone,
// mBullishOrderBlocks //
// );
// //
XCBullishOrderBlockObject *iObj; XCBullishOrderBlockObject *iObj;
@@ -1977,26 +1886,10 @@ class XCX121SMCStrategy : public XSCBaseAlert
// //
string name = zone.GetTag(); string name = zone.GetTag();
RemoveObject(name); RemoveObject(name);
// int idx = FindIndex(zone, mBearishFVGs);
// if (IsValidIndex(idx))
// {
// //
// // ArrayRemove(
// // mBearishFVGs,
// // idx,
// // 1 //
// // );
// //
// }
// //
zone.to = TimeCurrent(); zone.to = TimeCurrent();
name = zone.GetTag(); name = zone.GetTag();
// AddRef(
// zone,
// mBearishFVGs //
// );
// //
XCBearishFVGObject *iObj; XCBearishFVGObject *iObj;
@@ -2039,26 +1932,10 @@ class XCX121SMCStrategy : public XSCBaseAlert
// //
string name = zone.GetTag(); string name = zone.GetTag();
RemoveObject(name); RemoveObject(name);
// int idx = FindIndex(zone, mBullishFVGs);
// if (IsValidIndex(idx))
// {
// // //
// // ArrayRemove(
// // mBullishFVGs,
// // idx,
// // 1 //
// // );
// //
// }
// //
zone.to = TimeCurrent(); zone.to = TimeCurrent();
name = zone.GetTag(); name = zone.GetTag();
// AddRef(
// zone,
// mBullishFVGs //
// );
// //
XCBullishFVGObject *iObj; XCBullishFVGObject *iObj;
@@ -2085,6 +1962,199 @@ class XCX121SMCStrategy : public XSCBaseAlert
mDrawnObjects.Add(iObj); mDrawnObjects.Add(iObj);
} }
/**
* Draw Specified Swing Bars ...
*
* @param bar: XOHLC instance ...
* @param isLow: Boolean ...
*/
void DrawSwingBar(
XOHCL &bar,
bool isLow //
)
{
//
if (!bar.IsValid())
{
return;
}
//
string tagPref =
isLow
? ToString(X_POI_SWING_LOW)
: ToString(X_POI_SWING_HIGH);
string name = bar.GetTag(tagPref);
RemoveObject(name);
//
double price =
isLow
? bar.low
: bar.high;
char arrowCode =
isLow
? (char)188
: (char)108;
color clr =
isLow
? clrAqua
: clrMagenta;
ENUM_ARROW_ANCHOR anchor =
isLow
? ANCHOR_TOP
: ANCHOR_BOTTOM;
//
CChartObjectArrow *iObj;
iObj = new CChartObjectArrow();
bool isCreated = iObj.Create(
ChartID(),
name,
0,
bar.time,
price,
arrowCode //
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.Width(1);
iObj.Color(clr);
iObj.Anchor(anchor);
//
mDrawnObjects.Add(iObj);
}
/**
* Draw Momentum Bar ...
*
* @param bar: XOHCL instance ...
*/
void DrawMomentumBar(XOHCL &bar)
{
//
if (!bar.IsValid())
{
return;
}
//
bool isBullish = bar.IsBullish();
string name = bar.GetTag(ToString(X_POI_MOMENTUM_BAR));
RemoveObject(name);
//
double price =
isBullish
? bar.low
: bar.high;
char arrowCode =
isBullish
? (char)225
: (char)226;
color clr =
isBullish
? clrAqua
: clrMagenta;
ENUM_ARROW_ANCHOR anchor =
isBullish
? ANCHOR_TOP
: ANCHOR_BOTTOM;
//
CChartObjectArrow *iObj;
iObj = new CChartObjectArrow();
bool isCreated = iObj.Create(
ChartID(),
name,
0,
bar.time,
price,
arrowCode //
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.Width(1);
iObj.Color(clr);
iObj.Anchor(anchor);
//
mDrawnObjects.Add(iObj);
}
/**
* Draw Bullish Rejection Bar ...
*
* @param bar: XOHCL instance ...
*/
void DrawRejectionBar(XOHCL &bar)
{
//
if (!bar.IsValid())
{
return;
}
//
bool isBullish = bar.GetLowShadow() > bar.GetHighShadow();
string name = bar.GetTag(ToString(X_POI_REJECTION_BAR));
RemoveObject(name);
//
double price =
isBullish
? bar.low
: bar.high;
char arrowCode =
isBullish
? (char)217
: (char)218;
color clr =
isBullish
? clrAqua
: clrMagenta;
ENUM_ARROW_ANCHOR anchor =
isBullish
? ANCHOR_TOP
: ANCHOR_BOTTOM;
//
CChartObjectArrow *iObj;
iObj = new CChartObjectArrow();
bool isCreated = iObj.Create(
ChartID(),
name,
0,
bar.time,
price,
arrowCode //
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.Width(1);
iObj.Color(clr);
iObj.Anchor(anchor);
//
mDrawnObjects.Add(iObj);
}
/** /**
* Draw Specific Condition ... * Draw Specific Condition ...
* *
@@ -2129,6 +2199,67 @@ class XCX121SMCStrategy : public XSCBaseAlert
} }
} }
/**
* Draw Specified Signal ...
*
* @param signal: XSignal instance ...
* @param conditions: X121SMCStrategyConditions instance ...
*/
void DrawSignal(
XSignal &signal,
X121SMCStrategyConditions &conditions //
)
{
//
if (!signal.IsValid() ||
!conditions.IsValid())
{
//
return;
}
//
// DrawConditions(conditions);
//
string name = signal.GetTag();
RemoveObject(name);
//
XCSignalObject *iObj;
iObj = new XCSignalObject();
//
bool isCreated = iObj.Create(
ChartID(),
name,
0,
signal //
);
if (!isCreated)
{
return;
}
//
iObj.TPWidth(1);
iObj.TPColor(clrGreen);
iObj.TPWidth(STYLE_DOT);
//
iObj.SLWidth(1);
iObj.SLColor(clrRed);
iObj.SLWidth(STYLE_DOT);
//
iObj.EntryWidth(1);
iObj.EntryColor(clrYellow);
iObj.EntryWidth(STYLE_DOT);
//
mDrawnObjects.Add(iObj);
}
// //
}; };