This commit is contained in:
2024-06-18 07:12:41 +03:30
parent 326d3f4929
commit 13eeb5d541
3 changed files with 474 additions and 233 deletions
+138 -230
View File
@@ -681,9 +681,10 @@ struct XTradeInfo
: selectedEntry;
//
double nextVolume = rLevel % 2 == 1
? volume
: volume * volumeMultiplier;
double nextVolume = selectedVolume * volumeMultiplier;
// rLevel % 2 == 1
// ? volume
// : volume * volumeMultiplier;
//
double zoneUpper =
@@ -1855,11 +1856,7 @@ public:
// Trailling ...
if (EnableTrailling())
{
//
if (!forceState)
{
int traillings = HandleTrailling();
}
int traillings = HandleTrailling();
}
//
@@ -3699,12 +3696,12 @@ public:
: signalGenerator.HasShortVerifications(otherConditions))
//
;
//
bool forceState = ForceState();
//
if (!isValid || forceState)
if (!isValid || (forceState && isValid))
{
//
// Clear Other Conditions ...
@@ -3744,7 +3741,8 @@ public:
mBullishSigns,
mBearishScore,
mBearishSigns,
otherConditions //
otherConditions,
isValid //
);
continue;
}
@@ -4361,40 +4359,64 @@ private:
// EQM Functions ...
//
void DoEQMForceClose()
bool DoEQMForceClose(
double requiredProfit = 0 // Required Profit For EQM Force Hedge ...
)
{
//
bool canDo = mForceCloseProfit > 0;
bool result = false;
//
double hedgingProfit =
requiredProfit == 0
? mForceCloseProfit
: requiredProfit;
bool canDo = hedgingProfit > 0;
if (!canDo)
{
return;
return result;
}
//
XPosition positions[];
int positionsCount = mTrader.GetPositions(positions);
if (!IsValidSize(positionsCount))
result = IsValidSize(positionsCount);
if (!result)
{
return;
return result;
}
//
double profit = SpecifiedCalculatePositionsProfit(positions);
if (profit > 0 && profit > mForceCloseProfit)
result =
hedgingProfit > 0
? profit > 0 && profit > hedgingProfit
: profit <= hedgingProfit;
if (!result)
{
//
string comment = XEQMSupportToken + " Hedge ...";
int closed = Close(
positions,
comment //
);
//
if (IsValidSize(closed))
{
//
}
return result;
}
//
string comment = XEQMSupportToken + " Hedge ...";
int closed = Close(
positions,
comment //
);
//
result = IsValidSize(closed);
//
// Handle Sleeping ...
int restingTime = RestingAfterHedge();
if (result && IsValidSize(restingTime))
{
Sleep(restingTime * 1000);
}
//
return result;
}
//
@@ -4487,6 +4509,43 @@ private:
// Checking Force Sate Conditions ...
if (ForceState())
{
//
// Check Force State Hedging ...
bool isHedged = DoEQMForceClose(2);
if (isHedged)
{
//
ForceState(false);
return;
}
//
isHedged = DoEQMForceClose(1);
if (isHedged)
{
//
ForceState(false);
return;
}
//
isHedged = DoEQMForceClose(0.5);
if (isHedged)
{
//
ForceState(false);
return;
}
isHedged = DoEQMForceClose(0.3);
if (isHedged)
{
//
ForceState(false);
return;
}
//
return;
}
@@ -4532,7 +4591,47 @@ private:
;
if (isForceState)
{
//
ForceState(true);
//
return;
}
//
XPosition supports[];
int supportsCount = ExtractSupports(
positions,
supports //
);
if (!IsValidSize(supportsCount))
{
return;
}
//
int maxSupports = mTradeHandler.EnableSupport()
? MaxNumberOfSupports()
: 0;
int maxGrids = mTradeHandler.EnableGrid()
? MaxNumberOfGrids()
: 0;
int maxRecoveries = mTradeHandler.EnableRecovery()
? MaxNumberOfRecoveries()
: 0;
//
// Supporting Force States ...
bool isProtectionForce =
supportsCount >= 1;
// supportsCount >= (maxSupports + maxGrids + maxRecoveries);
if (isProtectionForce)
{
//
ForceState(true);
//
return;
}
//
@@ -4541,14 +4640,15 @@ private:
//
// Handle any Invalid Signals ...
void EQMHandleInvalidSignal(
XSignal &signal, // Invalid Signal
int pushers, // Pushers
double volumeOSC, // Volume Summary of Signal
double bullishScore, // Bullish Score Summary
int bullishSigns, // Number of Bullish Signs
double bearishScore, // Bearish Score Summary
int bearishSigns, // Number of Bearish Signs
X121SetupConditions &conditions[] // All Time Frames Conditions
XSignal &signal, // Invalid Signal
int pushers, // Pushers
double volumeOSC, // Volume Summary of Signal
double bullishScore, // Bullish Score Summary
int bullishSigns, // Number of Bullish Signs
double bearishScore, // Bearish Score Summary
int bearishSigns, // Number of Bearish Signs
X121SetupConditions &conditions[], // All Time Frames Conditions
bool isValid = false // IsValid Signal ...
)
{
//
@@ -4559,199 +4659,7 @@ private:
}
//
// Create an Instance of Signal Generator Structure ...
X121SignalGenerator signalGenerator;
//
int signalConditionsIDX = FindSignalConditionsIndex(
signal,
conditions //
);
if (!IsValidIndex(signalConditionsIDX))
{
return;
}
//
int longValidations = 0;
int shortValidations = 0;
//
bool isOSCValidForLong = signalGenerator
.IsOSCLongVerified(conditions[signalConditionsIDX]);
bool isOSCValidForShort = signalGenerator
.IsOSCShortVerified(conditions[signalConditionsIDX]);
//
// Calculate Long/Short Validations ...
for (int i = 0; i < ArraySize(conditions); i++)
{
//
int longValids = signalGenerator
.CountLongValidations(conditions[i]);
longValidations += longValids;
//
int shortValids = signalGenerator
.CountShortValidations(conditions[i]);
shortValidations += shortValids;
}
//
bool isLong = IsLong(signal.type);
//
// Reading Required Informations ...
XPosition positions[];
int positionsCount = mTrader.GetPositions(positions);
if (!IsValidSize(positionsCount))
{
return;
}
//
int longs = 0;
double longVolumes = 0;
double longProfits = 0;
//
int shorts = 0;
double shortVolumes = 0;
double shortProfits = 0;
//
// Retrieve Required Informations of Positions ...
CountPositions(
positions,
longs,
longProfits,
longVolumes,
shorts,
shortProfits,
shortVolumes //
);
//
longVolumes = NormalizeDouble(longVolumes, 2);
shortVolumes = NormalizeDouble(shortVolumes, 2);
//
// Select Signal for Execution ...
bool canSelect =
//
((isLong &&
longProfits > 0 &&
bullishScore > 20)
//
||
//
(!isLong &&
shortProfits > 0 &&
bearishScore > 0))
//
&&
//
longVolumes == shortVolumes
//
;
if (canSelect)
{
//
// Here we Can do Signals SL TP Manipulations ...
signal.tp = 0;
signal.sl = 0;
//
XSignal signals[];
AddRef(
signal,
signals //
);
//
// Add new Signal Info ...
mTradeHandler.Add(
signal,
pushers,
volumeOSC,
bullishSigns,
bearishSigns,
bullishScore,
bearishScore,
conditions[0],
conditions[1],
conditions[2],
conditions[3],
conditions[4] //
);
//
EQMExecuteSignals(signals);
//
return;
}
//
canSelect =
//
((isLong && shortProfits > 0) ||
(!isLong && longProfits > 0))
//
&&
//
longVolumes == shortVolumes
//
;
if (canSelect)
{
//
// Generate Opposit Signal ...
//
signal.tp = 0;
signal.sl = 0;
//
XSignal oppositSignal;
bool isGenerated = signal.GenerateOpposit(
oppositSignal //
);
//
if (isGenerated)
{
//
XSignal signals[];
AddRef(
oppositSignal,
signals //
);
//
// Add new Signal Info ...
mTradeHandler.Add(
oppositSignal,
pushers,
volumeOSC,
bullishSigns,
bearishSigns,
bullishScore,
bearishScore,
conditions[0],
conditions[1],
conditions[2],
conditions[3],
conditions[4] //
);
//
EQMExecuteSignals(signals);
//
return;
}
}
// TODO: Implement it ...
}
//