last ...
This commit is contained in:
@@ -138,3 +138,338 @@
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
//
|
||||
// XPosition Pack ...
|
||||
|
||||
//
|
||||
// Extract specific Positions Pack ...
|
||||
// in this senario there is no need to Position exists itself ...
|
||||
bool GetPositionPack(
|
||||
ulong ticket, // Specified Positions Ticket
|
||||
string symbol, // Specified Position Symbol
|
||||
ENUM_TIMEFRAMES period, // Specified Position Period
|
||||
XPositionPack &pack // Hold Result
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
pack.Clean();
|
||||
|
||||
//
|
||||
XPosition position;
|
||||
bool hasPosition = GetPosition(
|
||||
ticket,
|
||||
position
|
||||
//
|
||||
);
|
||||
if (hasPosition)
|
||||
{
|
||||
pack.position = position;
|
||||
}
|
||||
|
||||
//
|
||||
XOrder supportOrders[];
|
||||
XPosition supportPositions[];
|
||||
|
||||
//
|
||||
XOrder orders[];
|
||||
GetOrders(
|
||||
orders,
|
||||
symbol, // Specified Symbol
|
||||
NULL, // All Providers
|
||||
period, // Specified Period
|
||||
NULL, // All Types
|
||||
ORDER_STATE_PLACED, // Just UnTriggered Orders
|
||||
true // Filter by Magic
|
||||
);
|
||||
int ordersCount = ArraySize(orders);
|
||||
|
||||
//
|
||||
// Select Orders ...
|
||||
if (ordersCount > 0)
|
||||
{
|
||||
//
|
||||
for (int i = 0; i < ordersCount; i++)
|
||||
{
|
||||
//
|
||||
XOrder iOrder = orders[i];
|
||||
|
||||
//
|
||||
// Retrieve Order Supported Ticket ...
|
||||
ulong parentTicket = ExtractSupportedTicket(iOrder.comment);
|
||||
if (NotEmpty(parentTicket) && parentTicket == ticket)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
iOrder,
|
||||
supportOrders
|
||||
//
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
int supportOrdersCount = ArraySize(supportOrders);
|
||||
if (supportOrdersCount > 0)
|
||||
{
|
||||
//
|
||||
pack.supportOrdersCount = supportOrdersCount;
|
||||
|
||||
//
|
||||
Copy(
|
||||
supportOrders,
|
||||
pack.supportOrders);
|
||||
}
|
||||
|
||||
//
|
||||
XPosition positions[];
|
||||
GetPositions(
|
||||
positions,
|
||||
symbol, // Specified Symbol ...
|
||||
NULL, // All Providers ...
|
||||
period // Specified Period ...
|
||||
);
|
||||
int positionsCount = ArraySize(positions);
|
||||
|
||||
//
|
||||
// Select Positions ...
|
||||
if (positionsCount > 0)
|
||||
{
|
||||
//
|
||||
for (int i = 0; i < positionsCount; i++)
|
||||
{
|
||||
//
|
||||
XPosition iPosition = positions[i];
|
||||
|
||||
//
|
||||
ulong parentTicket = ExtractSupportedTicket(iPosition.comment);
|
||||
if (NotEmpty(parentTicket) && parentTicket == ticket)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
iPosition,
|
||||
supportPositions
|
||||
//
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
int supportPositionsCount = ArraySize(supportPositions);
|
||||
if (supportPositionsCount > 0)
|
||||
{
|
||||
//
|
||||
pack.supportPositionsCount = supportPositionsCount;
|
||||
|
||||
//
|
||||
Copy(
|
||||
supportPositions,
|
||||
pack.supportPositions);
|
||||
}
|
||||
|
||||
//
|
||||
result = pack.IsValid();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Close Position Pack ...
|
||||
bool ClosePositionPack(
|
||||
XPositionPack &pack, // Specified Position Pack
|
||||
string comment, // Specified Close Comment
|
||||
bool inProfit = false, // if it's true only close Pack if in profit
|
||||
double minProfitPerTrade = 0, // Min Profit based On Volume Factor ...
|
||||
double minProfitPerVolumeFactor = 0 // Min Volume Factor ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
ulong ticket = pack.ticket;
|
||||
|
||||
//
|
||||
XPosition positions[];
|
||||
|
||||
//
|
||||
XPosition pPosition;
|
||||
result = GetPosition(
|
||||
ticket,
|
||||
pPosition //
|
||||
);
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
pPosition,
|
||||
positions //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
if (pack.supportPositionsCount > 0)
|
||||
{
|
||||
//
|
||||
for (int i = 0; i < pack.supportPositionsCount; i++)
|
||||
{
|
||||
//
|
||||
XPosition iPosition = pack.supportPositions[i];
|
||||
|
||||
//
|
||||
AddRef(
|
||||
iPosition,
|
||||
positions //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Force Close ...
|
||||
if (!inProfit)
|
||||
{
|
||||
//
|
||||
int closed = Close(
|
||||
positions,
|
||||
comment //
|
||||
);
|
||||
|
||||
//
|
||||
int cancelled = 0;
|
||||
if (pack.supportOrdersCount > 0)
|
||||
{
|
||||
cancelled = CancelOrders(pack.supportOrders);
|
||||
}
|
||||
|
||||
//
|
||||
result = (closed + cancelled) == (pack.supportPositionsCount + pack.supportOrdersCount + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
bool canHedge = SpecifiedIsPositionsReadyForHedge(
|
||||
positions,
|
||||
minProfitPerTrade,
|
||||
minProfitPerVolumeFactor //
|
||||
);
|
||||
if (canHedge)
|
||||
{
|
||||
//
|
||||
int closed = Close(
|
||||
positions,
|
||||
comment //
|
||||
);
|
||||
|
||||
//
|
||||
int cancelled = 0;
|
||||
if (pack.supportOrdersCount > 0)
|
||||
{
|
||||
cancelled = CancelOrders(pack.supportOrders);
|
||||
}
|
||||
|
||||
//
|
||||
result = (closed + cancelled) == (pack.supportPositionsCount + pack.supportOrdersCount + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
bool ClosePositionPack(
|
||||
ulong ticket, // Specified Position Pack
|
||||
string symbol, // Specified Position Symbol
|
||||
ENUM_TIMEFRAMES period, // Specified Position Period
|
||||
string comment, // Specified Close Comment
|
||||
bool inProfit = false, // if it's true only close Pack if in profit
|
||||
double minProfitPerTrade = 0, // Min Profit based On Volume Factor ...
|
||||
double minProfitPerVolumeFactor = 0 // Min Volume Factor ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
XPositionPack pack;
|
||||
result = GetPositionPack(
|
||||
ticket,
|
||||
symbol,
|
||||
period,
|
||||
pack //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = ClosePositionPack(
|
||||
pack,
|
||||
comment,
|
||||
inProfit,
|
||||
minProfitPerTrade,
|
||||
minProfitPerVolumeFactor //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Close Positions Pack ...
|
||||
int ClosePositionsPack(
|
||||
XPosition &positions[], // Positions ...
|
||||
string comment, // Specified Close Comment
|
||||
bool inProfit = false, // if it's true only close Pack if in profit
|
||||
double minProfitPerTrade = 0, // Min Profit based On Volume Factor ...
|
||||
double minProfitPerVolumeFactor = 0 // Min Volume Factor ...
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
int positionsCount = ArraySize(positions);
|
||||
if (positionsCount <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < positionsCount; i++)
|
||||
{
|
||||
//
|
||||
XPosition iPosition = positions[i];
|
||||
|
||||
//
|
||||
bool isClosed = ClosePositionPack(
|
||||
iPosition.ticket,
|
||||
iPosition.symbol,
|
||||
iPosition.period,
|
||||
comment,
|
||||
inProfit,
|
||||
minProfitPerTrade,
|
||||
minProfitPerVolumeFactor //
|
||||
);
|
||||
if (isClosed)
|
||||
{
|
||||
result++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user