This commit is contained in:
2024-06-27 19:03:17 +03:30
parent 3fca0fb9c5
commit 8dfe216d82
3 changed files with 504 additions and 91 deletions
+217 -91
View File
@@ -4231,7 +4231,7 @@ public:
;
//
bool forceState = mSetups[i].ForceState();
bool forceState = mForce; // mSetups[i].ForceState();
//
if (!forceState)
@@ -4600,6 +4600,10 @@ public:
eSignals //
);
}
else
{
Alert("INNNValid Signal");
}
}
//
@@ -4625,7 +4629,7 @@ public:
bool HandleStateManagement(XSignal &signals[]) override
{
//
bool result = false;
const bool result = false;
//
// Do all State Management here ...
@@ -4637,10 +4641,10 @@ public:
// Make State of Signalling to Force State for Recieving
// Signal and Clear their Tp and SL for allowing hedges ...
EQMHandleForceState(signals);
if (mForce)
{
result = true;
}
// if (mForce)
// {
// result = true;
// }
//
DoHedge();
@@ -5215,8 +5219,8 @@ private:
if (result)
{
//
mForce = false;
mTradeHandler.Sync();
EQMClearAllForceStates();
}
//
@@ -5295,7 +5299,9 @@ private:
// Validate Force Marigin ...
double marigin = mTrader.mAccount.GetMargin();
double minFreeMarigin = MinFreeMargingForOpenTrades();
double forceMargin = 3 * minFreeMarigin; // TODO: Make It Configurable
double forceMargin = minFreeMarigin * 2; // TODO: Make It Configurable
bool isMarginForce = marigin >= forceMargin;
bool isMarginHotForce = marigin >= forceMargin * 3;
//
// Retrieving Positions ...
@@ -5305,15 +5311,9 @@ private:
{
//
mForce = false;
//
datetime cTime = TimeCurrent();
string message = "Exit From Force State: " + ToString(cTime);
//
// Log(message);
return;
}
bool isPositionsCountHotForce = positionsCount >= 10;
//
XPosition oldest;
@@ -5324,21 +5324,13 @@ private:
//
// Check Force State ...
bool isForce = marigin >= forceMargin && oldestAge >= 288;
bool isForce = isMarginForce; // && oldestAge >= 288;
if (!isForce)
{
//
if (mForce)
{
//
mForce = false;
//
datetime cTime = TimeCurrent();
string message = "Exit From Force State: " + ToString(cTime);
//
// Log(message);
}
return;
}
@@ -5379,6 +5371,181 @@ private:
return;
}
//
XSignal signals[];
int forceSignalsCount = ArraySize(forceSignals);
if (IsValidSize(forceSignalsCount))
{
//
// Check if Symbol Contains or Not ...
for (int i = 0; i < forceSignalsCount; i++)
{
//
XSignal iForceSignal = forceSignals[i];
//
int symbolIDX = -1;
bool isSymbolContains = IsContainsSymbol(
iForceSignal.symbol,
symbolIDX,
symbolPositions //
);
if (!isSymbolContains)
{
//
AddRef(
iForceSignal,
signals //
);
//
continue;
}
else
{
//
ENUM_POSITION_TYPE iType = iForceSignal.type;
bool isLong = IsLong(iType);
//
XSymbolPositions iSymbolPositions = symbolPositions[symbolIDX];
if (isLong)
{
//
if (iSymbolPositions.longsProfit > 0)
{
//
if (!isMarginHotForce && !isPositionsCountHotForce)
{
//
AddRef(
iForceSignal,
signals //
);
}
else
{
}
}
else
{
//
// In Drawdown ...
if (isMarginHotForce && !isPositionsCountHotForce)
{
}
else
{
}
}
}
else
{
//
if (iSymbolPositions.shortsProfit > 0)
{
//
if (!isMarginHotForce && !isPositionsCountHotForce)
{
//
AddRef(
iForceSignal,
signals //
);
}
else
{
}
}
else
{
//
// In Drawdown ...
if (!isMarginHotForce && !isPositionsCountHotForce)
{
}
else
{
}
}
}
}
}
}
//
int signalsCount = ArraySize(signals);
if (IsValidSize(signalsCount))
{
EQMExecuteSignals(signals);
}
else
{
//
// Handle CLosing ...
if (!isMarginHotForce)
{
return;
}
//
for (int i = 0; i < symbolPositionsCount; i++)
{
//
XSymbolPositions iSymbolPositions = symbolPositions[i];
//
if (!iSymbolPositions.HasChild())
{
continue;
}
//
if (iSymbolPositions.profit > 0)
{
continue;
}
//
XPosition iOldest;
int oldestAge = GetOldest(
iOldest,
iSymbolPositions.positions //
);
if (oldestAge <= 140)
{
continue;
}
//
int maxInDPIDX = FindMaxDrawdownIndex(
iSymbolPositions.positions //
);
if (!IsValidIndex(maxInDPIDX))
{
continue;
}
//
XPosition maxInDP = iSymbolPositions.positions[maxInDPIDX];
//
string comment = XEQMSupportToken + " Close due Max In D ...";
bool isClosed = mTrader.Close(
maxInDP.ticket,
comment //
);
if (isClosed)
{
//
string message = XEQMSupportToken + " Close (" + ToString(maxInDP.ticket) + ") due Max In D ...";
//
Alert(message);
}
}
}
//
// Log("symbolPositionsCount: " + ToString(symbolPositionsCount));
}
@@ -5393,92 +5560,68 @@ private:
)
{
//
// Check Force State ...
// if (!ForceState())
// {
// return;
// }
//
int setupIDX = FindSetupIndex(signal.symbol);
if (!IsValidIndex(setupIDX))
if (!mForce)
{
return;
}
//
bool isForce = mSetups[setupIDX].ForceState();
if (!isForce)
{
return;
}
//
// Check Delay Between Two Signals ...
bool isMarginPassed = IsMarginPassed();
bool isDelayPassed = IsSignalDelayPassed(signal);
bool isNumberOfPositionsPassed = IsNumberOfPositionsPassed();
bool canUseSignal =
isMarginPassed &&
isDelayPassed &&
isNumberOfPositionsPassed;
//
XSignal signals[];
//
if (isValid)
if (isValid || pushers > 1)
{
//
bool canSupport =
//
mForce &&
EnableSupport() &&
SupportOnlyForces()
//
;
bool canGrid =
//
mForce &&
EnableGrid() &&
GridOnlyForces()
//
;
bool canRecover =
//
mForce &&
EnableRecovery() &&
RecoverOnlyForces()
//
;
//
if (canUseSignal)
{
//
AddRef(
signal,
signals //
);
AddRef(
signal,
signals //
);
//
// Add new Signal Info ...
mTradeHandler.Add(
signal,
pushers,
canGrid,
canRecover,
canSupport,
conditions[0],
conditions[1],
conditions[2],
conditions[3],
conditions[4] //
);
}
//
// Add new Signal Info ...
mTradeHandler.Add(
signal,
pushers,
canGrid,
canRecover,
canSupport,
conditions[0],
conditions[1],
conditions[2],
conditions[3],
conditions[4] //
);
}
//
if (ArraySize(signals) > 0)
{
EQMExecuteSignals(signals);
//
// EQMExecuteSignals(signals);
EQMHandleForceState(signals);
}
}
@@ -5575,23 +5718,6 @@ private:
}
}
//
void EQMClearAllForceStates()
{
//
int setupsCount = CountSetups();
if (!IsValidSize(setupsCount))
{
return;
}
//
for (int i = 0; i < setupsCount; i++)
{
mSetups[i].ForceState(false);
}
}
//
};