Initial Commit ...

This commit is contained in:
2024-01-25 04:09:42 +03:30
commit b2037e07eb
1991 changed files with 668083 additions and 0 deletions
+236
View File
@@ -0,0 +1,236 @@
//
// Handle Indirectional Supports ...
void XEU5HandleIndirectionalSupport()
{
//
// Disable Indirections ...
if (!xEU5EnableIndirectionalSupportTrades)
{
return;
}
//
XSignal signals[];
xEU5Trader.GetSignals(
signals);
int signalsCount = ArraySize(signals);
if (signalsCount <= 0)
{
return;
}
//
// Loop Through Open Positions ...
for (int i = 0; i < signalsCount; i++)
{
//
// Retrieve i Signal ...
XSignal iSignal = signals[i];
//
// Generate iSignals Default Comment ...
string iDefComment = xEU5Trader.GenerateSignalComment(iSignal);
//
// Check Trade is Main Trade or not ...
bool isMainTrade = iSignal.comment == iDefComment;
if (!isMainTrade)
{
continue;
}
//
// Check Trade Age Bigger Than 5 and Smaller Than 10 candle ...
int iSignalAge = xEU5Trader.GetSignalAge(iSignal);
bool isAgeVerified = iSignalAge >= 5; // && iSignalAge < 145;
if (!isAgeVerified)
{
continue;
}
//
// Has InDD Before ...
string comment = XEU5GenerateIndirectionalSupportComment(iSignal.ticket);
XSignal inDDs[];
xEU5Trader.FilterSignals(
inDDs,
comment);
int inDDsCount = ArraySize(inDDs);
bool hasInDD = inDDsCount >= 1;
if (hasInDD)
{
continue;
}
//
// Check iSignal doesn't have sl ...
bool isSLPassed = iSignal.sl <= 0;
if (!isSLPassed)
{
continue;
}
//
bool isILong = iSignal.type == X_SIGNAL_LONG;
double exitPrice = GetExit(
iSignal.symbol,
iSignal.type);
//
// Check Trade Profit isNegative and Has Enough Price Distance ...
double priceDistance = PipsToPrice(10);
double iSignalHitPrice = isILong
? iSignal.entry - priceDistance
: iSignal.entry + priceDistance;
bool isPriceDistanceReached = isILong
? exitPrice <= iSignalHitPrice
: exitPrice >= iSignalHitPrice;
if (!isPriceDistanceReached)
{
continue;
}
//
// Generate Requirements for Indirectional Support Trade ...
string symbol = iSignal.symbol;
ulong magic = iSignal.magicNumber;
datetime time = iTime(iSignal.symbol, _Period, 0);
ENUM_X_SIGNAL_TYPE type = xEU5Trader.GetSignalIndirectionType(iSignal);
//
bool isLong = type == X_SIGNAL_LONG;
double entry = GetEntry(
symbol,
type);
double spread = GetSpread(iSignal.symbol);
//
double risk = PipsToPrice(2);
double reward = PipsToPrice(xEU5RiskFreeStepInPips); // PipsToPrice(xEU5RiskFreeStepInPips); // xEU5MinReward;
double riskFreeRate = xEU5RiskFreeRate;
double riskFreeStep = xEU5RiskFreeStepInPips;
double volume = xEU5StaticVolume; // iSignal.volume;
//
double sl = 0;
// isLong
// ? (entry - risk) - spread
// : (entry + risk) + spread;
double tp = isLong
? entry + reward
: entry - reward;
//
// Generate Indirectional Support Signal ...
XSignal inDSSignal = {};
inDSSignal.tp = tp;
inDSSignal.sl = sl;
inDSSignal.type = type;
inDSSignal.time = time;
inDSSignal.entry = entry;
inDSSignal.symbol = symbol;
inDSSignal.volume = volume;
inDSSignal.comment = comment;
inDSSignal.magicNumber = magic;
inDSSignal.riskFreeRate = riskFreeRate;
inDSSignal.riskFreeStep = riskFreeStep;
//
// Check Generated Signal Validation ...
bool isInDSignalValid = IsValid(inDSSignal, xEU5MagicNumber);
if (!isInDSignalValid)
{
continue;
}
//
// Execute Signal ...
ENUM_EXECUTION_SIGNAL_RESULT executionResult = xEU5Trader.ExecuteSignal(
inDSSignal,
false, // Ignore TP/SL Virtuals ...
true, // Ignore Number of Trades ...
true // Check Account Conditions ...
);
bool isExecuted = executionResult == X_TRADER_SUCCEED_EXECUTION;
if (isExecuted)
{
//
// TODO: Alert this ...
LogMessage("InDirectional Support Trade Executed for: " + (string)iSignal.ticket);
}
else
{
//
// TODO: Alert this ...
LogMessage("Error in Executing Indirectional Support Trade for: " + (string)iSignal.ticket + "\n" + GetSignalExecutionError(executionResult));
}
}
}
//
// Generate Comment ...
string XEU5GenerateIndirectionalSupportComment(ulong ticket)
{
//
string result = "";
//
result += XEU5_INDIRECTION_SUPPORT_ID + "(" + (string)ticket + ")";
//
return result;
}
//
// Check a Comment is Indirectional or not ...
bool XEU5IsIndirectionalSupport(string comment)
{
//
bool result = false;
//
// Validate Args ...
if (StringLen(comment) <= 0)
{
return result;
}
//
int pos = StringFind(
comment,
XEU5_INDIRECTION_SUPPORT_ID);
result = pos >= 0;
//
return result;
}
//
// Retrieve Parent Position Ticket ...
ulong XEU5GetIndirectionalParentTicket(string comment)
{
//
ulong result = -1;
//
// Validate Arg ...
if (!XEU5IsIndirectionalSupport(comment))
{
return result;
}
//
// Parent ...
string ticketStr = ExtractString(
comment,
XEU5_INDIRECTION_SUPPORT_ID + "(",
")");
if (StringLen(ticketStr) > 0)
{
result = (ulong)ticketStr;
}
//
return result;
}