fix x786 ...
This commit is contained in:
@@ -418,54 +418,106 @@ public:
|
||||
void HandleEQMState(XSignal &signals[])
|
||||
{
|
||||
//
|
||||
XSignal accepted[];
|
||||
bool equityReached = !mTrader.CheckEquityForTrade();
|
||||
bool maxAllowedReached = !mTrader.CheckPositionsForTrade();
|
||||
bool enableEQM = equityReached || maxAllowedReached;
|
||||
// if (!enableEQM)
|
||||
// {
|
||||
// //
|
||||
// return;
|
||||
// }
|
||||
if (!enableEQM)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
int signalsCount = ArraySize(signals);
|
||||
if (IsValidSize(signalsCount))
|
||||
{
|
||||
//
|
||||
Print("Cnverts " + ToString(signalsCount) + " Signal using SupRes ...");
|
||||
// Extract required Data ...
|
||||
XPosition positions[];
|
||||
int positionsCount = mTrader.GetPositions(
|
||||
positions);
|
||||
if (!IsValidSize(positionsCount))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
int longs = 0;
|
||||
double longProfits = 0;
|
||||
double longVolumes = 0;
|
||||
|
||||
//
|
||||
int shorts = 0;
|
||||
double shortProfits = 0;
|
||||
double shortVolumes = 0;
|
||||
|
||||
//
|
||||
CountPositions(
|
||||
positions,
|
||||
longs,
|
||||
longProfits,
|
||||
longVolumes,
|
||||
shorts,
|
||||
shortProfits,
|
||||
shortVolumes //
|
||||
);
|
||||
|
||||
//
|
||||
for (int i = 0; i < signalsCount; i++)
|
||||
{
|
||||
//
|
||||
XSignal iSignal = signals[i];
|
||||
bool isLong = IsLong(iSignal.type);
|
||||
|
||||
//
|
||||
bool canAccept =
|
||||
//
|
||||
isLong
|
||||
? longs == 0
|
||||
: shorts == 0
|
||||
//
|
||||
;
|
||||
if (!canAccept)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
iSignal.provider = XEQMSupportToken;
|
||||
|
||||
//
|
||||
AddRef(
|
||||
iSignal,
|
||||
accepted //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
int acceptedCount = ArraySize(accepted);
|
||||
if (!IsValidSize(acceptedCount))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Execute EQM Signals ...
|
||||
ENUM_X_SIGNAL_EXECUTION_RESULT reasons[];
|
||||
int executed = mTrader.ExecuteSignals(
|
||||
accepted,
|
||||
reasons,
|
||||
ORDER_TIME_GTC,
|
||||
NULL,
|
||||
false //
|
||||
);
|
||||
if (executed > 0)
|
||||
{
|
||||
//
|
||||
string message = "EQM Execute " + ToString(executed) + " Signals ...";
|
||||
|
||||
//
|
||||
mAlert.Alert(message);
|
||||
}
|
||||
}
|
||||
|
||||
// //
|
||||
// string mSymbols[];
|
||||
// XSCPositionHolder *mHolders[];
|
||||
// int symbolsCount = FilterSymbolBasedPositions(
|
||||
// mSymbols,
|
||||
// mHolders //
|
||||
// );
|
||||
|
||||
// //
|
||||
// for (int i = 0; i < symbolsCount; i++)
|
||||
// {
|
||||
// //
|
||||
// string iSymbol = mSymbols[i];
|
||||
// XSCPositionHolder *iHolder = mHolders[i];
|
||||
|
||||
// //
|
||||
// // We Can Select Multiple Positions for Place EQM Supports ...
|
||||
|
||||
// //
|
||||
// // Select Max In Drawdown Position and Protect it ...
|
||||
// XPosition iSelectedPosition;
|
||||
// bool iHasPosition = iHolder.GetMaxInDrawdown(iSelectedPosition);
|
||||
// if (iHasPosition)
|
||||
// {
|
||||
// //
|
||||
// // Try to Protect Max In Drawdown Positions Position ...
|
||||
// PlaceEQMOrders(iSelectedPosition);
|
||||
// }
|
||||
// }
|
||||
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
@@ -730,7 +782,7 @@ public:
|
||||
}
|
||||
|
||||
//
|
||||
void HandleTrailManagement(XPosition &positions[])
|
||||
void HandleTrailManagement(XPosition &positions[])
|
||||
{
|
||||
//
|
||||
// TODO:
|
||||
@@ -761,7 +813,8 @@ public:
|
||||
//
|
||||
bool canManageState =
|
||||
//
|
||||
iPosition.provider != XEQMSupportToken
|
||||
true
|
||||
// iPosition.provider != XEQMSupportToken
|
||||
// &&
|
||||
// iPosition.provider != "WSC"
|
||||
//
|
||||
@@ -818,7 +871,7 @@ public:
|
||||
// IsLong(iPosition.type)
|
||||
// ? iPosition.sl + appliedSL
|
||||
// : iPosition.sl - appliedSL;
|
||||
|
||||
|
||||
//
|
||||
double sl =
|
||||
IsLong(iPosition.type)
|
||||
@@ -1130,6 +1183,9 @@ public:
|
||||
// Cleaning Source ...
|
||||
Clean(signals);
|
||||
|
||||
//
|
||||
XSignal mEQMManaged[];
|
||||
|
||||
//
|
||||
// Loop through Signals for Management ...
|
||||
for (int i = 0; i < tmpsCount; i++)
|
||||
@@ -1186,38 +1242,31 @@ public:
|
||||
//
|
||||
continue;
|
||||
}
|
||||
else if (positionsCount < 4)
|
||||
//
|
||||
else if (positionsCount < GetMaxAllowedPositions())
|
||||
{
|
||||
//
|
||||
// Next Signal in a While of Specific Provider ...
|
||||
|
||||
//
|
||||
// Find Longest Position and Check it's Age ...
|
||||
// Compare it by min age for same provider signals ...
|
||||
XPosition youngest;
|
||||
int youngestAge = GetYoungest(
|
||||
youngest,
|
||||
positions //
|
||||
);
|
||||
if (youngestAge == -1 || youngestAge < minDistanceBetweenTwoSameProviderSignal)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
AddRef(
|
||||
iSignal,
|
||||
signals //
|
||||
);
|
||||
|
||||
// //
|
||||
// if (youngest.profit > 0)
|
||||
// {
|
||||
// }
|
||||
|
||||
//
|
||||
continue;
|
||||
}
|
||||
//
|
||||
else
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
iSignal,
|
||||
mEQMManaged //
|
||||
);
|
||||
}
|
||||
|
||||
// else if (profit > 0 && symbolProfit > 0)
|
||||
// {
|
||||
// //
|
||||
@@ -1228,6 +1277,12 @@ public:
|
||||
// }
|
||||
}
|
||||
|
||||
//
|
||||
if (IsValidSize(ArraySize(mEQMManaged)))
|
||||
{
|
||||
HandleEQMState(mEQMManaged);
|
||||
}
|
||||
|
||||
//
|
||||
result = ArraySize(signals);
|
||||
|
||||
@@ -1352,6 +1407,56 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
void ManageUnExecutedSignals(
|
||||
ENUM_X_SIGNAL_EXECUTION_RESULT &states[],
|
||||
XSignal &unExecutedSignals[] //
|
||||
) override
|
||||
{
|
||||
//
|
||||
XSignal filteredSignals[];
|
||||
|
||||
//
|
||||
int unExecutedSignalsCount = ArraySize(unExecutedSignals);
|
||||
if (!IsValidSize(unExecutedSignalsCount))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < unExecutedSignalsCount; i++)
|
||||
{
|
||||
//
|
||||
ENUM_X_SIGNAL_EXECUTION_RESULT iState = states[i];
|
||||
bool isStateValid =
|
||||
//
|
||||
iState == X_SIGNAL_EXECUTION_FAILED_NO_EQUITY ||
|
||||
iState == X_SIGNAL_EXECUTION_FAILED_MAX_REACHED
|
||||
//
|
||||
;
|
||||
if (!isStateValid)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
AddRef(
|
||||
unExecutedSignals[i],
|
||||
filteredSignals //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
int filteredSignalsCount = ArraySize(filteredSignals);
|
||||
if (!IsValidSize(filteredSignalsCount))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
HandleEQMState(filteredSignals);
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
|
||||
Reference in New Issue
Block a user