228 lines
5.3 KiB
Plaintext
228 lines
5.3 KiB
Plaintext
|
|
//
|
|
// Close All Open Positions when Profit Summary is Reached ...
|
|
void HandleGridHedge()
|
|
{
|
|
//
|
|
int openPositionsCount = xEATrade.PositionsCount();
|
|
if (openPositionsCount <= 1 ||
|
|
xEAMinProfitPerOpenPositionForHedging <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
double requiredProfitForHedging = xEAMinProfitPerOpenPositionForHedging * openPositionsCount;
|
|
double accountProfit = xEATrade.GetPositionsProfit();
|
|
if (accountProfit > 0 || MathAbs(accountProfit) < requiredProfitForHedging)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
string comment = "Close since Grid Hedging ...";
|
|
xEATrade.CloseAllPositions(comment);
|
|
|
|
//
|
|
string msg = "Grid Hedging in Loss: " + (string)accountProfit;
|
|
LogMessage(msg);
|
|
}
|
|
|
|
//
|
|
// Close All Open Positions when Profit Summary is Reached ...
|
|
void HandlePyramidHedge()
|
|
{
|
|
//
|
|
int openPositionsCount = xEATrade.PositionsCount();
|
|
if (openPositionsCount <= 1 ||
|
|
xEAMinProfitPerOpenPositionForHedging <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
double requiredProfitForHedging = xEAMinProfitPerOpenPositionForHedging * openPositionsCount;
|
|
double accountProfit = xEATrade.GetPositionsProfit();
|
|
if (accountProfit < requiredProfitForHedging)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
string comment = "Close since Pyramid Hedging ...";
|
|
xEATrade.CloseAllPositions(comment);
|
|
|
|
//
|
|
string msg = "Pyramid Hedging in Profit: " + (string)accountProfit;
|
|
LogMessage(msg);
|
|
}
|
|
|
|
//
|
|
// Force Close Signals ...
|
|
void HandleForceClosing()
|
|
{
|
|
//
|
|
int positionsCount = xEATrade.PositionsCount();
|
|
int ordersCount = xEATrade.OrdersCount();
|
|
if (positionsCount <= 0 || ordersCount <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
X121ForceClose results[];
|
|
xEAProvider.CanForceCloseShortSignals(results);
|
|
int resultsCount = ArraySize(results);
|
|
if (resultsCount <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
for (int i = 0; i < resultsCount; i++)
|
|
{
|
|
//
|
|
X121ForceClose iForceClose = results[i];
|
|
if (!iForceClose.force)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
//
|
|
XPosition iPositions[];
|
|
xEATrade.GetPositions(
|
|
iPositions,
|
|
iForceClose.symbol,
|
|
iForceClose.period);
|
|
int iPositionsCount = ArraySize(iPositions);
|
|
if (iPositionsCount > 0)
|
|
{
|
|
//
|
|
for (int j = 0; j < iPositionsCount; j++)
|
|
{
|
|
//
|
|
XPosition jPosition = iPositions[j];
|
|
bool isLong = IsLong(jPosition.type);
|
|
if (isLong)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
//
|
|
ENUM_X121_SIGNAL_PROVIDERS jProvider = ExtractProvider(jPosition);
|
|
string jProviderStr = ToString(jProvider);
|
|
if (jProviderStr != iForceClose.provider)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
//
|
|
string comment = "Force Close Signals ...";
|
|
bool isClosed = xEATrade.Close(jPosition.ticket, comment);
|
|
if (isClosed)
|
|
{
|
|
//
|
|
string msg = "Position (" + (string)jPosition.ticket + ") Closed Due Force Event ...";
|
|
LogMessage(msg);
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
XOrder iOrders[];
|
|
xEATrade.GetOrders(
|
|
iOrders,
|
|
iForceClose.symbol,
|
|
iForceClose.period,
|
|
ORDER_STATE_PLACED);
|
|
int iOrdersCount = ArraySize(iOrders);
|
|
if (iOrdersCount > 0)
|
|
{
|
|
//
|
|
bool isCanceled = xEATrade.CancelOrders(iOrders);
|
|
if (isCanceled)
|
|
{
|
|
//
|
|
string msg = "(" + (string)ordersCount + ") Canceled due Cycle Change ...";
|
|
|
|
//
|
|
LogMessage(msg);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Close a Position and it's Support Due to Profit ...
|
|
void HandleHedgeSupports()
|
|
{
|
|
//
|
|
int positionsCount = xEATrade.PositionsCount();
|
|
if (positionsCount <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
XPosition positions[];
|
|
xEATrade.GetPositions(
|
|
positions);
|
|
positionsCount = ArraySize(positions);
|
|
if (positionsCount <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
for (int i = 0; i < positionsCount; i++)
|
|
{
|
|
//
|
|
XPosition iPosition = positions[i];
|
|
|
|
//
|
|
bool hasSupport = xEATrade.HasSupport(iPosition.ticket);
|
|
if (!hasSupport)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
//
|
|
bool isClosed = xEATrade.ClosePositionAndSupports(
|
|
iPosition.ticket);
|
|
if (isClosed)
|
|
{
|
|
//
|
|
string msg = "Position and Supports Closed ...";
|
|
LogMessage(msg);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Delete Specific Order of Support if Exists ...
|
|
ulong positionId = deal.positionId;
|
|
|
|
//
|
|
XOrder supports[];
|
|
bool hasSupport = xEATrade.GetSupportOrders(
|
|
positionId,
|
|
supports,
|
|
NULL,
|
|
NULL,
|
|
ORDER_STATE_PLACED);
|
|
if (hasSupport)
|
|
{
|
|
//
|
|
bool isCanceled = xEATrade.CancelOrders(supports);
|
|
|
|
//
|
|
if (isCanceled)
|
|
{
|
|
//
|
|
string msg = "Close all Supports of (" + (string)positionId + ") Due to it's TakeProfit Event ...";
|
|
LogMessage(msg);
|
|
}
|
|
}
|