backup workspace ...
This commit is contained in:
@@ -0,0 +1,380 @@
|
||||
|
||||
//
|
||||
// Generate SL Support Signal ...
|
||||
bool GenerateSLSupportSignal(
|
||||
XSignal &signal, // Holds Result ....
|
||||
ulong ticket, // Specific Position Ticket ...
|
||||
double slGapPoint = 10, // Which Distance to SL for Enabling Signal ...
|
||||
double volumeMultiplier = 2 // Support Signals Volume Multiplier ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
int count = CountPositions();
|
||||
if (count <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool hasSupport = HasSupport(ticket);
|
||||
if (hasSupport)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XPosition position;
|
||||
result = GetPosition(
|
||||
position,
|
||||
ticket);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool isLong =
|
||||
IsLong(position.type);
|
||||
|
||||
//
|
||||
string symbol = position.symbol;
|
||||
ENUM_TIMEFRAMES period = ExtractPositionPeriod(position.comment);
|
||||
double volume = position.volume * volumeMultiplier;
|
||||
volume = NormalizeVolume(
|
||||
volume,
|
||||
symbol);
|
||||
|
||||
ENUM_POSITION_TYPE type = isLong
|
||||
? POSITION_TYPE_SELL
|
||||
: POSITION_TYPE_BUY;
|
||||
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_STOP;
|
||||
|
||||
//
|
||||
double slGapPrice = PointToPrice(
|
||||
symbol,
|
||||
slGapPoint);
|
||||
double riskPrice = MathAbs(position.entry - position.sl);
|
||||
|
||||
//
|
||||
double entry =
|
||||
isLong
|
||||
? position.sl + slGapPrice
|
||||
: position.sl - slGapPrice;
|
||||
entry = NormalizePrice(entry, symbol);
|
||||
|
||||
//
|
||||
double sl =
|
||||
isLong
|
||||
? entry + riskPrice
|
||||
: entry - riskPrice;
|
||||
sl = NormalizePrice(sl, symbol);
|
||||
|
||||
//
|
||||
double tp =
|
||||
isLong
|
||||
? entry - riskPrice
|
||||
: entry + riskPrice;
|
||||
tp = NormalizePrice(tp, symbol);
|
||||
|
||||
//
|
||||
signal.sl = sl;
|
||||
signal.tp = tp;
|
||||
signal.type = type;
|
||||
signal.mode = mode;
|
||||
signal.entry = entry;
|
||||
signal.volume = volume;
|
||||
signal.symbol = symbol;
|
||||
signal.period = period;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Find an Specific Position Has Support Signal Or not ...
|
||||
bool HasSupport(ulong ticket)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
int count = CountPositions();
|
||||
if (count <= 1)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XPosition position;
|
||||
result = GetPosition(
|
||||
position,
|
||||
ticket);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XPosition positions[];
|
||||
GetPositions(positions);
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
XPosition iPosition = positions[i];
|
||||
|
||||
//
|
||||
string supportTicketStr = ExtractParentTicketOfSupport(iPosition.comment);
|
||||
if (StringLen(supportTicketStr) == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
ulong parentTicket = (ulong)supportTicketStr;
|
||||
|
||||
//
|
||||
result =
|
||||
parentTicket == ticket &&
|
||||
iPosition.ticket != parentTicket;
|
||||
if (result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Get All Support Positions for Specific Position ...
|
||||
bool GetSupportPositions(
|
||||
ulong ticket, // Parent Position Ticket
|
||||
XPosition &supports[] // Holds Result ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
Clean(supports);
|
||||
|
||||
//
|
||||
int count = CountPositions();
|
||||
if (count <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XPosition parentPosition;
|
||||
bool positionExist = GetPosition(
|
||||
parentPosition,
|
||||
ticket);
|
||||
if (!positionExist)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool hasSupport = HasSupport(ticket);
|
||||
if (!hasSupport)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XPosition positions[];
|
||||
GetPositions(positions);
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
XPosition iPosition = positions[i];
|
||||
|
||||
//
|
||||
if (iPosition.ticket == ticket)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
string pTicketStr = ExtractParentTicketOfSupport(iPosition.comment);
|
||||
if (StringLen(pTicketStr) <= 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
ulong pTicket = (ulong)pTicketStr;
|
||||
if (pTicket != ticket)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
Add(
|
||||
iPosition,
|
||||
supports);
|
||||
}
|
||||
|
||||
//
|
||||
result = ArraySize(supports) > 0;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool GetSupportOrders(
|
||||
ulong ticket, // Parent Position Ticket
|
||||
XOrder &supports[], // Holds Result ...
|
||||
string symbol, // Trading Symbol ...
|
||||
ENUM_TIMEFRAMES period, // Trading TimeFrame ...
|
||||
ENUM_ORDER_STATE state = NULL // Order State ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
Clean(supports);
|
||||
|
||||
//
|
||||
XOrder orders[];
|
||||
GetOrders(
|
||||
orders,
|
||||
symbol,
|
||||
period,
|
||||
state);
|
||||
int ordersCount = ArraySize(orders);
|
||||
result = ordersCount > 0;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < ordersCount; i++)
|
||||
{
|
||||
//
|
||||
XOrder iOrder = orders[i];
|
||||
|
||||
//
|
||||
string pTicketStr = ExtractParentTicketOfSupport(iOrder.comment);
|
||||
if (StringLen(pTicketStr) == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
ulong pTicket = (ulong)pTicketStr;
|
||||
if (pTicket != ticket)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
Add(
|
||||
iOrder,
|
||||
supports);
|
||||
}
|
||||
|
||||
//
|
||||
result = ArraySize(supports) > 0;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Close a Position and it's Supports on a Profit ...
|
||||
bool ClosePositionAndSupports(
|
||||
ulong ticket, // Position Ticket
|
||||
double minProfit = 4 // Minimum Profit For Closing
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (minProfit <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int count = CountPositions();
|
||||
if (count <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XPosition position;
|
||||
bool isExist = GetPosition(
|
||||
position,
|
||||
ticket);
|
||||
if (!isExist)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool hasSupport = HasSupport(ticket);
|
||||
if (!hasSupport)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XPosition supports[];
|
||||
hasSupport = GetSupportPositions(
|
||||
ticket,
|
||||
supports);
|
||||
int supportsCount = ArraySize(supports);
|
||||
if (!hasSupport || supportsCount <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double profitSummary = 0;
|
||||
for (int i = 0; i < supportsCount; i++)
|
||||
{
|
||||
//
|
||||
XPosition iSupport = supports[i];
|
||||
|
||||
//
|
||||
profitSummary += iSupport.profit;
|
||||
}
|
||||
|
||||
//
|
||||
result = profitSummary > 0 && profitSummary >= minProfit;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
Add(
|
||||
position,
|
||||
supports);
|
||||
|
||||
//
|
||||
string comment = "Close Position (" + (string)ticket + ") and it's Supports in Profit: " + (string)profitSummary + " ...";
|
||||
ClosePositions(
|
||||
supports,
|
||||
comment);
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
LogMessage(comment);
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user