This commit is contained in:
2024-06-30 18:36:14 +03:30
parent c234592b3b
commit 9542db22cb
2 changed files with 383 additions and 80 deletions
+82 -40
View File
@@ -4401,6 +4401,25 @@ public:
int maxAllowed = MaxAllowedTrades();
bool perDirection = UseMaxAllowedPerDirection();
//
XPosition positions[];
int positionsCount = mTrader.GetPositions(positions);
bool hasPositions = IsValidSize(positionsCount);
//
double minProfitPerTrade = MinProfitPerTrade();
double minProfitPerTradeVolumeFactor = minProfitPerTradeVolumeFactor();
//
XSymbolPositions symbolPositions[];
int smybolPositionsCount = ExtractSymbolPositions(
positions,
symbolPositions,
minProfitPerTrade,
minProfitPerTradeVolumeFactor //
);
bool hasSymbolPositions = IsValidSize(smybolPositionsCount);
//
for (int i = 0; i < signalsCount; i++)
{
@@ -4408,10 +4427,47 @@ public:
XSignal iSignal = tmpSignals[i];
//
bool isSignalValid = false;
bool isLong = IsLong(iSignal.type);
//
isSignalValid = IsSignalDelayPassed(iSignal);
bool isSignalValid = false;
bool hasSameTypeSignal = false;
bool isFirstSymbolSignal = false;
//
// Find Symbol Index ...
int symbolIDX = FindSymbolIndex(
iSignal.symbol,
symbolPositions //
);
bool isValidSymbolIDX = IsValidIndex(symbolIDX);
if (!isValidSymbolIDX)
{
//
// We Sure it is First Signal of Smybol in a While ...
hasSameTypeSignal = false;
isFirstSymbolSignal = true;
}
else
{
//
// We Sure it isnt First Signal of Symbol at current State ...
isFirstSymbolSignal = false;
//
// Check Has Same Type Signal or not ...
hasSameTypeSignal =
isLong
? symbolPositions[symbolIDX].longs > 1
: symbolPositions[symbolIDX].shorts > 1;
}
//
// Check Signal Delay Passed ...
isSignalValid = IsSignalDelayPassed(
iSignal,
symbolPositions[symbolIDX] //
);
if (!isSignalValid)
{
continue;
@@ -4422,22 +4478,12 @@ public:
if (mCloseOnOpposit)
{
//
// Select Signal Opposit Positions ...
ENUM_X_POSITION_TYPES iOpposit = GetOppositPositionType(iSignal.type);
//
XPosition iPositions[];
int iPositionsCount = mTrader.GetPositions(
iPositions,
iSignal.symbol,
NULL, // All Providers ...
NULL, // All Periods ...
iOpposit // Opposit Positions ...
);
//
if (IsValidSize(iPositionsCount))
{
int oppositCount =
isLong
? symbolPositions[symbolIDX].CountShorts()
: symbolPositions[symbolIDX].CountLongs();
bool hasOpposit = IsValidSize(oppositCount);
if (hasOpposit) {
//
string comment = "Close due Opposit ...";
@@ -4491,10 +4537,13 @@ public:
}
//
isSignalValid =
iSupportsCount <= 0
? iSymbolsPositionsCount < maxAllowed
: iSymbolsPositionsCount - iSupportsCount < maxAllowed;
isFirstOfSymbol =
//
isSignalValid =
iSupportsCount <= 0
? iSymbolsPositionsCount < maxAllowed
: iSymbolsPositionsCount - iSupportsCount < maxAllowed;
if (!isSignalValid)
{
continue;
@@ -4507,7 +4556,6 @@ public:
//
// Only Accept Next Same Type when Previous in Profit ...
bool isSameTypeExists = false;
if (isSignalValid)
{
//
@@ -4599,6 +4647,7 @@ public:
//
// Multiply Signal Volume ...
// Create First Signal Opposit Protector ...
if (isSignalValid)
{
//
@@ -4647,6 +4696,9 @@ public:
double volumeMultiplier = IncreaseNextSignalsVolumeMultiplier();
iSignal.volume = iSignal.volume * (multiplier * volumeMultiplier);
}
//
//
}
//
@@ -4948,7 +5000,8 @@ protected:
//
// Check Delay Between Two Signals ...
bool IsSignalDelayPassed(
XSignal &signal //
XSignal &signal,
XSymbolPositions &positions //
)
{
//
@@ -4972,29 +5025,18 @@ protected:
}
//
// Retrieve Positions ...
// Based On Provider and Symbol and TimeFrame ...
XPosition positions[];
int positionsCount = mTrader.GetPositions(
positions,
signal.symbol,
NULL, // signal.provider,
NULL, // signal.period,
ToPositionType(signal.type),
true // Filter By Magic ...
XPosition youngest;
int youngestAge = positions.GetYoungest(
youngest,
iSignal.type //
);
result = !IsValidSize(positionsCount);
result = !IsValidIndex(youngestAge);
if (result)
{
return result;
}
//
XPosition youngest;
int youngestAge = GetYoungest(
youngest,
positions //
);
result = youngestAge >= delay;
//