182 lines
3.1 KiB
Plaintext
182 lines
3.1 KiB
Plaintext
|
|
//
|
|
// Find Reversal Position Type ...
|
|
ENUM_POSITION_TYPE GetSupportPositionType(ENUM_POSITION_TYPE type)
|
|
{
|
|
//
|
|
ENUM_POSITION_TYPE result = POSITION_TYPE_BUY;
|
|
|
|
//
|
|
if (type == POSITION_TYPE_BUY)
|
|
{
|
|
result = POSITION_TYPE_SELL;
|
|
}
|
|
else
|
|
{
|
|
result = POSITION_TYPE_BUY;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check a Position Has Supportable or not ...
|
|
bool IsSupportablePosition(XPosition &position)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
if (StringLen(position.comment) <= 0)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
int supStrPos = StringFind(
|
|
position.comment,
|
|
mSupportPrefix + "(");
|
|
|
|
//
|
|
result = supStrPos < 0;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check a Position has Support Position or not ...
|
|
bool HasSupportPosition(XPosition &position)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
int positionsCount = xEATrade.PositionsCount();
|
|
|
|
//
|
|
if (positionsCount <= 0 ||
|
|
position.ticket == 0 ||
|
|
StringLen(position.comment) <= 0)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
string supCommentStr = mSupportPrefix + "(" + (string)position.ticket + ")";
|
|
|
|
//
|
|
XPosition positions[];
|
|
xEATrade.GetPositions(positions);
|
|
|
|
//
|
|
for (int i = 0; i < positionsCount; i++)
|
|
{
|
|
//
|
|
XPosition iPosition = positions[i];
|
|
|
|
//
|
|
int supCommentPos = StringFind(
|
|
iPosition.comment,
|
|
supCommentStr);
|
|
|
|
//
|
|
result = supCommentPos >= 0;
|
|
if (result)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Open a Support Position based on Exists ...
|
|
void OpenSupportPosition(XPosition &position)
|
|
{
|
|
//
|
|
bool isSupportable = IsSupportablePosition(position);
|
|
if (!isSupportable)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
bool hasSupport = HasSupportPosition(position);
|
|
if (hasSupport)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
ENUM_POSITION_TYPE type = GetSupportPositionType(position.type);
|
|
double entry = GetEntry(
|
|
position.symbol,
|
|
type);
|
|
|
|
//
|
|
bool isLong = IsLong(type);
|
|
|
|
//
|
|
double tpPrice = PipsToPrice(
|
|
position.symbol,
|
|
10);
|
|
double slPrice = PipsToPrice(
|
|
position.symbol,
|
|
5);
|
|
|
|
//
|
|
double tp = 0;
|
|
// isLong
|
|
// ? entry + tpPrice
|
|
// : entry - tpPrice;
|
|
|
|
//
|
|
double sl = 0;
|
|
// isLong
|
|
// ? entry - slPrice
|
|
// : entry + slPrice;
|
|
|
|
//
|
|
string comment = mSupportPrefix + "(" + (string)position.ticket + ")";
|
|
|
|
//
|
|
bool isPositionOpen = false;
|
|
//
|
|
// Open Signal Position ...
|
|
if (isLong)
|
|
{
|
|
//
|
|
isPositionOpen = xEATrade.Buy(
|
|
position.symbol,
|
|
position.period,
|
|
position.volume,
|
|
entry,
|
|
sl,
|
|
tp,
|
|
comment);
|
|
}
|
|
else
|
|
{
|
|
//
|
|
isPositionOpen = xEATrade.Sell(
|
|
position.symbol,
|
|
position.period,
|
|
position.volume,
|
|
entry,
|
|
sl,
|
|
tp,
|
|
comment);
|
|
}
|
|
|
|
//
|
|
if (isPositionOpen)
|
|
{
|
|
//
|
|
LogMessage("Open Support Psition for: " + position.comment);
|
|
}
|
|
}
|