This commit is contained in:
2025-05-09 13:06:11 +03:30
parent bffe99a008
commit edd8141c40
+311 -186
View File
@@ -35,9 +35,30 @@
//
// Common ...
input group "Common";
input long eaMagicNumber = 78692110; // Magic Number
input int eaSlippage = 10; // Slippgae
input string eaLogSuffix = ""; // Log Suffix
input long eaMagicNumber = 78692110; // Magic Number
input int eaSlippage = 10; // Slippgae
input string eaLogSuffix = ""; // Log Suffix
input ENUM_TIMEFRAMES eaAnalysisPeriod = PERIOD_H1; // Analysis Period
//
// Symbols ...
//
// -------------------------------------------------------
// eaSymbols:
// ----------
// - if EMPTY use Current Symbol;
// - for Multi Symbol use Comma Separated Symbols:
// EURUSDb,XAUUSDb
//
// eaSymbolSessions:
// ------------------
// - if EMPTY use WHOLE Times;
// - for each Symbol use Comma Separated:
// (Name,[hh:mm],[hh:mm]),
// -------------------------------------------------------
input group "Symbols";
input string eaSymbols = "EURUSDb,XAUUSDb"; // Symbols Description
input string eaSymbolSessions = "()"; // Symbols Sessions
//
// Volume ...
@@ -60,8 +81,6 @@ input ENUM_XCAEA_TRADE_RESTRICTION_PERIOD eaRestrictionsPeriod = XCAEA_TRADE_RES
input int eaMaxAllowedTPs = 2; // Max Allowed TP(s) per Day
input int eaMaxAllowedSLs = 2; // Max Allowed SL(s) per Day
input int eaMaxAllowedTrades = 3; // Max Allowed Trades per Day
input string eaSessionStartTime = ""; // Trade Start Time
input string eaSessionEndTime = ""; // Trade End Time
input int eaMaxAllowedPositions = 5; // Max Allowed Same Time Trades
input double eaMaxAllowedSpread = 25; // Max Allowed Spread For Trade
input double eaMaxAllowedDrawdownFactor = 0.3; // Max Allowed DrawDown for Trade
@@ -97,7 +116,7 @@ XCTrade *eaTrade;
XSignal eaSignal;
XCVolume *eaVolume;
XTimeTracker eaTimeTracker;
XCXCAEASignaller *eaSignaller;
XCXCAEASignaller *eaSignallers[];
XCXCAEATradeManager *eaTradeManager;
XCAEAStrategyConditions eaConditions;
@@ -159,19 +178,27 @@ void OnDeinit(const int reason)
// REASON_CLOSE 9 Terminal closed
//
eaSignaller.DeInit();
//
ZeroMemory(eaAlert);
ZeroMemory(eaTrade);
ZeroMemory(eaVolume);
ZeroMemory(eaSignaller);
//
eaSignal.Clean();
eaConditions.Clean();
eaTimeTracker.Clean();
//
int count = ArraySize(eaSignallers);
for (int i = 0; i < count; i++)
{
//
eaSignallers[i].DeInit();
ZeroMemory(eaSignallers[i]);
}
Clean(eaSignallers);
//
DestroyTimer();
}
@@ -199,6 +226,7 @@ void OnTick()
//
double r2r = 4;
string provider = "XCAEA";
datetime cTime = TimeCurrent();
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
@@ -207,191 +235,204 @@ void OnTick()
bool hasShort = false;
//
// Start Calculations ...
//
// Retrieve Common Data ...
string symbol = eaSignaller.GetSymbol();
ENUM_TIMEFRAMES period = eaSignaller.GetPeriod();
//
datetime cTime = TimeCurrent();
//
// Required Value For SL/TP Calculations ...
double points = GetPoints(symbol);
double pip = GetPipPrice(symbol);
double pip2 = 2 * pip;
//
has = eaSignaller.DetectSignalSetup(
r2r,
300 // Max Allowed SL Distance ...
);
if (has)
{
//
count = eaSignaller
.AddConditionsIfNotExists();
//
eaSignaller.mConditions.Clean();
}
//
// Check Setuped Conditions Exists ...
count = ArraySize(eaSignaller.mConditionsCollection);
has = IsValidSize(count);
// Checking Signallers ...
has = HasChild(eaSignallers);
if (!has)
{
return;
}
//
for (int i = 0; i < count; i++)
int signallersCount = ArraySize(eaSignallers);
for (int is = 0; is < signallersCount; is++)
{
//
has = eaSignaller
.DetectSignalTrigger(eaSignaller
.mConditionsCollection[i]);
// Start Calculations ...
//
// If Triggered ...
// Retrieve Common Data ...
string symbol = eaSignallers[is].GetSymbol();
ENUM_TIMEFRAMES period = eaSignallers[is].GetPeriod();
//
// Required Value For SL/TP Calculations ...
double points = GetPoints(symbol);
double pip = GetPipPrice(symbol);
double pip2 = 2 * pip;
//
// Detect Signal Setups ...
has = eaSignallers[is].DetectSignalSetup(
r2r,
300 // Max Allowed SL Distance ...
);
if (has)
{
//
idx = i;
eaConditions = eaSignaller.mConditionsCollection[i];
break;
count = eaSignallers[is]
.AddConditionsIfNotExists();
//
eaSignallers[is].mConditions.Clean();
}
//
// Check Condition Validation ...
has = eaSignaller.mConditionsCollection[i].IsValid() &&
eaSignaller.mConditionsCollection[i].IsSetuped();
// Check Setuped Conditions Exists ...
count = ArraySize(eaSignallers[is].mConditionsCollection);
has = IsValidSize(count);
if (!has)
{
idx = i;
continue;
}
}
//
// Remove Setuped Condition if provided IDX ...
has = IsValidIndex(idx);
if (has)
{
//
ArrayRemove(
eaSignaller.mConditionsCollection,
idx,
1 //
// Loop through Setuped Conditions for
// Validating or Looking up Triggers ...
for (int i = 0; i < count; i++)
{
//
// Check Signal Triggered or not ...
has = eaSignallers[is]
.DetectSignalTrigger(eaSignallers[is]
.mConditionsCollection[i]);
//
// If Triggered ...
if (has)
{
//
idx = i;
eaConditions = eaSignallers[is].mConditionsCollection[i];
break;
}
//
// Check Condition Validation ...
has = eaSignallers[is].mConditionsCollection[i].IsValid() &&
eaSignallers[is].mConditionsCollection[i].IsSetuped();
if (!has)
{
idx = i;
}
}
//
// Remove Setuped Condition if provided IDX ...
has = IsValidIndex(idx);
if (has)
{
//
ArrayRemove(
eaSignallers[is].mConditionsCollection,
idx,
1 //
);
}
//
// Check EA Conditions is Valid or not ...
has = eaConditions.IsSetuped() &&
eaConditions.CanTrigger();
if (!has)
{
//
eaSignal.Clean();
eaConditions.Clean();
//
continue;
}
//
// Setting Time to Conditions ...
eaConditions.time = cTime;
has = ToPositionType(
type,
eaConditions.type //
);
}
if (!has)
{
//
eaSignal.Clean();
eaConditions.Clean();
//
continue;
}
//
// Check EA Conditions is Valid or not ...
has = eaConditions.IsSetuped() &&
eaConditions.CanTrigger();
if (!has)
{
//
eaConditions.Clean();
return;
}
// Checking Trigger Direction ...
hasLong = eaConditions.HasBullishSignal();
hasShort = eaConditions.HasBearishSignal();
has = hasLong ||
hasShort;
if (!has)
{
//
eaSignal.Clean();
eaConditions.Clean();
//
continue;
}
//
// Preparing Signal ...
eaSignal.mode = mode;
eaSignal.type = type;
eaSignal.entry = GetEntry(
eaConditions.symbol,
eaConditions.dir //
);
eaSignal.provider = provider;
eaSignal.sl = eaConditions.sl;
eaSignal.tp = eaConditions.tp;
eaSignal.volume = X_MIN_VOLUME;
eaSignal.time = eaConditions.time;
eaSignal.symbol = eaConditions.symbol;
eaSignal.period = eaConditions.period;
eaSignal.partialCloseOnTPLevel = eaConditions.partialCloseOnTPLevel;
eaSignal.partialCloseMultiplier = eaConditions.partialCloseMultiplier;
//
Copy(
eaConditions.targets,
eaSignal.targets //
);
//
// Validate Signal ...
has = eaSignal.IsValid();
if (!has)
{
//
eaSignal.Clean();
eaConditions.Clean();
//
continue;
}
//
// Handle Volume Management ...
double iVolume = eaVolume.CalculateVolume(eaSignal);
if (iVolume > X_MIN_VOLUME &&
iVolume != eaSignal.volume)
{
eaSignal.volume = iVolume;
}
//
// Execute Signal ...
has = eaTradeManager.Execute(
eaSignal,
eaConditions //
);
//
// Setting Time to Conditions ...
eaConditions.time = cTime;
has = ToPositionType(
type,
eaConditions.type //
);
if (!has)
{
//
eaSignal.Clean();
eaConditions.Clean();
//
return;
}
//
// Checking Trigger Direction ...
hasLong = eaConditions.HasBullishSignal();
hasShort = eaConditions.HasBearishSignal();
has = hasLong ||
hasShort;
if (!has)
{
//
eaSignal.Clean();
eaConditions.Clean();
//
return;
}
//
// Preparing Signal ...
//
eaSignal.mode = mode;
eaSignal.type = type;
eaSignal.entry = GetEntry(
eaConditions.symbol,
eaConditions.dir //
);
eaSignal.provider = provider;
eaSignal.sl = eaConditions.sl;
eaSignal.tp = eaConditions.tp;
eaSignal.volume = X_MIN_VOLUME;
eaSignal.time = eaConditions.time;
eaSignal.symbol = eaConditions.symbol;
eaSignal.period = eaConditions.period;
eaSignal.partialCloseOnTPLevel = eaConditions.partialCloseOnTPLevel;
eaSignal.partialCloseMultiplier = eaConditions.partialCloseMultiplier;
//
Copy(
eaConditions.targets,
eaSignal.targets //
);
//
has = eaSignal.IsValid();
if (!has)
{
//
eaSignal.Clean();
eaConditions.Clean();
return;
}
//
// Handle Volume Management ...
double iVolume = eaVolume.CalculateVolume(eaSignal);
if (iVolume > X_MIN_VOLUME &&
iVolume != eaSignal.volume)
{
eaSignal.volume = iVolume;
}
//
// Draw Signal ...
//
// Execute Signal ...
//
// eaSignal.sl = 0;
has = eaTradeManager.Execute(
eaSignal,
eaConditions //
);
//
eaSignal.Clean();
eaConditions.Clean();
}
//
@@ -673,32 +714,116 @@ void InitRequirements()
eaMaxAllowedTrades //
);
//
InitSymbolSessions();
//
}
/**
* Initial Symbols and Active Sessions of EA ...
*/
void InitSymbolSessions()
{
//
string symbols[];
string sessions[];
string iSymbol = NULL;
XCXCAEASignaller *iSignaller;
//
// Parse Symbols ...
int symbolsCount = 0;
bool isMultiSymbol = IsValid(eaSymbols);
if (isMultiSymbol)
{
//
symbolsCount = SplitContent(
symbols,
eaSymbols //
);
isMultiSymbol = IsValidSize(symbolsCount);
}
if (!isMultiSymbol)
{
//
Add(
_Symbol,
symbols //
);
//
symbolsCount = 1;
}
//
// Parse Sessions ...
int sessionsCount = 0;
bool hasSession = IsValid(eaSymbolSessions);
if (hasSession)
{
//
sessionsCount = SplitContent(
sessions,
eaSymbolSessions //
);
}
//
// Setting Up Symbols ...
//
for (int i = 0; i < symbolsCount; i++)
{
//
iSymbol = symbols[i];
//
// EA Signaller ...
iSignaller = new XCXCAEASignaller(
iSymbol,
_Period,
eaAnalysisPeriod // Analysing Period ...
);
//
Add(
iSignaller,
eaSignallers //
);
//
ZeroMemory(iSignaller);
}
//
// Setting Up Sessions ...
if (hasSession)
{
//
}
//
// Setting Sessions ...
eaTradeManager
.SetTradeSession(
_Symbol,
"01:30", // Start ...
"14:25", // End ...
"XSaherSession" // Name ...
);
eaTradeManager
.SetTradeSession(
_Symbol,
"19:30", // Start ...
"11:30", // End ...
"XSaherSession" // Name ...
);
//
// EA Signaller ...
eaSignaller = new XCXCAEASignaller(
_Symbol,
_Period,
PERIOD_H1 // Analysing Period ...
);
// eaTradeManager
// .SetTradeSession(
// _Symbol,
// "01:30", // Start ...
// "14:25", // End ...
// "XSaherSession" // Name ...
// );
// eaTradeManager
// .SetTradeSession(
// _Symbol,
// "19:30", // Start ...
// "11:30", // End ...
// "XSaherSession" // Name ...
// );
//
Clean(symbols);
Clean(sessions);
ZeroMemory(iSignaller);
}
/**