532 lines
15 KiB
Plaintext
532 lines
15 KiB
Plaintext
|
|
//
|
|
// Find Max InDD Position ...
|
|
XPosition positions[];
|
|
int positionsCount = mTrader.GetInDrawdownPositions(
|
|
positions,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
X_POSITION_SELECT_MAX //
|
|
);
|
|
if (positionsCount <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
XPosition maxInDP = positions[0];
|
|
string symbol = maxInDP.symbol;
|
|
ENUM_TIMEFRAMES period = maxInDP.period;
|
|
|
|
//
|
|
X121ProviderDescriptor maxInDPDescriptor;
|
|
int descriptorsCount = CountDescriptors();
|
|
if (descriptorsCount <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Find Provider ...
|
|
for (int i = 0; i < descriptorsCount; i++)
|
|
{
|
|
//
|
|
X121ProviderDescriptor iDescriptor = mDescriptors[i];
|
|
|
|
//
|
|
if (iDescriptor.symbol == symbol &&
|
|
iDescriptor.period == period)
|
|
{
|
|
//
|
|
maxInDPDescriptor = iDescriptor;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
double longEntry = GetEntry(symbol, POSITION_TYPE_BUY);
|
|
double shortEntry = GetEntry(symbol, POSITION_TYPE_SELL);
|
|
|
|
//
|
|
XOHCLSupRes longSupRes;
|
|
maxInDPDescriptor
|
|
.provider
|
|
.GenerateLongSupRes(
|
|
longSupRes //
|
|
);
|
|
|
|
//
|
|
XOHCLSupRes shortSupRes;
|
|
maxInDPDescriptor
|
|
.provider
|
|
.GenerateShortSupRes(
|
|
shortSupRes //
|
|
);
|
|
|
|
//
|
|
XProfitTrack track;
|
|
GetProfitTrack(
|
|
track //
|
|
);
|
|
|
|
//
|
|
bool isLongIncreasing = IsProfitTrackFieldIncreasing(
|
|
X_PROFIT_TRACK_LONGS_PROFIT,
|
|
0,
|
|
30 //
|
|
);
|
|
|
|
//
|
|
bool isLongDecresing = IsProfitTrackFieldDecreasing(
|
|
X_PROFIT_TRACK_LONGS_PROFIT,
|
|
0,
|
|
30 //
|
|
);
|
|
|
|
//
|
|
bool isShortIncreasing = IsProfitTrackFieldIncreasing(
|
|
X_PROFIT_TRACK_SHORTS_PROFIT,
|
|
0,
|
|
30 //
|
|
);
|
|
|
|
//
|
|
bool isShortDecresing = IsProfitTrackFieldDecreasing(
|
|
X_PROFIT_TRACK_SHORTS_PROFIT,
|
|
0,
|
|
30 //
|
|
);
|
|
|
|
//
|
|
XSignal sSignal;
|
|
bool isValidSignal = false;
|
|
if (track.shortsProfit < track.longsProfit)
|
|
{
|
|
//
|
|
// Find Long ...
|
|
isValidSignal = sSignal.PrepareMarketLong(
|
|
symbol,
|
|
"EQM",
|
|
period,
|
|
longEntry,
|
|
track.shortsVolume,
|
|
X_SIGNAL_USE_NOTHING,
|
|
0, //; longSupRes.sup[0],
|
|
0 //; longSupRes.res[0] //
|
|
);
|
|
}
|
|
else if (track.longsProfit < track.shortsProfit)
|
|
{
|
|
//
|
|
// Find Short ...
|
|
isValidSignal = sSignal.PrepareMarketShort(
|
|
symbol,
|
|
"EQM",
|
|
period,
|
|
shortEntry,
|
|
track.shortsVolume,
|
|
X_SIGNAL_USE_NOTHING,
|
|
0, // shortSupRes.res[0],
|
|
0 // shortSupRes.sup[0] //
|
|
);
|
|
}
|
|
|
|
//
|
|
if (isValidSignal)
|
|
{
|
|
//
|
|
ENUM_X_SIGNAL_EXECUTION_RESULT sState;
|
|
bool isExecuted = mTrader.ExecuteSignal(
|
|
sSignal,
|
|
sState,
|
|
ORDER_TIME_GTC,
|
|
NULL,
|
|
false // Ignore Policy Checking ...
|
|
);
|
|
|
|
//
|
|
if (isExecuted)
|
|
{
|
|
//
|
|
string message = "EQM Executed Support Signal for: " + symbol + ", On: " + ToString(period);
|
|
|
|
//
|
|
mAlert.Alert(message);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////
|
|
|
|
|
|
// else
|
|
// {
|
|
// //
|
|
// // not First Signal ...
|
|
|
|
// //
|
|
// // Calculate Provider Specified Open Positions Profit ...
|
|
// double profits = CalculatePositionsProfit(positions);
|
|
// if (profits > 0)
|
|
// {
|
|
|
|
// //
|
|
// AddRef(
|
|
// iSignal,
|
|
// signals //
|
|
// );
|
|
|
|
// // //
|
|
// // // Find Max In Profit of Same Position ...
|
|
// // Clean(positions);
|
|
// // positionsCount = mTrader.GetInProfitPositions(
|
|
// // positions,
|
|
// // iSignal.symbol,
|
|
// // iSignal.provider,
|
|
// // NULL, // All Periods ...
|
|
// // iSignal.type,
|
|
// // X_POSITION_SELECT_MAX // Max In Profit ...
|
|
// // );
|
|
// // if (positionsCount <= 0)
|
|
// // {
|
|
// // continue;
|
|
// // }
|
|
|
|
// // //
|
|
// // string comment = "EQM Close Max Profit ...";
|
|
// // bool isClosed = mTrader.Close(
|
|
// // positions[0].ticket,
|
|
// // comment //
|
|
// // );
|
|
// // if (isClosed)
|
|
// // {
|
|
// // //
|
|
// // RemoveTrail(positions[0].ticket);
|
|
|
|
// // //
|
|
// // string message = "EQM Close Max In Profit (" + ToString(positions[0].ticket) + ") for new Signal ...";
|
|
|
|
// // //
|
|
// // mAlert.Alert(message);
|
|
|
|
// // //
|
|
// // AddRef(
|
|
// // iSignal,
|
|
// // signals //
|
|
// // );
|
|
|
|
// // //
|
|
// // continue;
|
|
// // }
|
|
// }
|
|
// else
|
|
// {
|
|
// // //
|
|
// // // Find Max In Profit of Same Position ...
|
|
// // Clean(positions);
|
|
// // positionsCount = mTrader.GetInProfitPositions(
|
|
// // positions,
|
|
// // iSignal.symbol,
|
|
// // iSignal.provider,
|
|
// // NULL, // All Periods ...
|
|
// // iSignal.type,
|
|
// // X_POSITION_SELECT_MAX // Max In Profit ...
|
|
// // );
|
|
// // if (positionsCount <= 0)
|
|
// // {
|
|
// // continue;
|
|
// // }
|
|
|
|
// // //
|
|
// // string comment = "EQM Close Max Profit ...";
|
|
// // bool isClosed = mTrader.Close(
|
|
// // positions[0].ticket,
|
|
// // comment //
|
|
// // );
|
|
// // if (isClosed)
|
|
// // {
|
|
// // //
|
|
// // RemoveTrail(positions[0].ticket);
|
|
|
|
// // //
|
|
// // string message = "EQM Close Max In Profit (" + ToString(positions[0].ticket) + ") for new Signal ...";
|
|
|
|
// // //
|
|
// // mAlert.Alert(message);
|
|
|
|
// // //
|
|
// // AddRef(
|
|
// // iSignal,
|
|
// // signals //
|
|
// // );
|
|
|
|
// // //
|
|
// // continue;
|
|
// // }
|
|
// }
|
|
// }
|
|
|
|
|
|
////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
double bullishScore = mBullishScore[0];
|
|
double bullishMin100 = GetBullishScoreMin(0, 100);
|
|
double bullishMax100 = GetBullishScoreMax(0, 100);
|
|
double bullish9AVG = GetBullishScoreAverage(0, 9);
|
|
double bullish17AVG = GetBullishScoreAverage(0, 17);
|
|
double bullish26AVG = GetBullishScoreAverage(0, 26);
|
|
|
|
//
|
|
double bearishScore = mBearishScore[0];
|
|
|
|
//
|
|
bool isScorePassed = IsScorePassedForLong();
|
|
|
|
//
|
|
bool isRSIinOverSell =
|
|
//
|
|
mConditions.cMarketConditions.isRSIUnder30 &&
|
|
mConditions.cMarketConditions.isRVILongStart &&
|
|
mConditions.cMarketConditions.isCCIUnderNegativeHundred
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isBullishOverAVGs =
|
|
//
|
|
ArraySize(mBullishScore) > 100 &&
|
|
bullishScore > mBullishScore[1] &&
|
|
bullishScore > bearishScore &&
|
|
bullishScore > bullish9AVG &&
|
|
bullishScore > bullish17AVG &&
|
|
bullishScore > bullish26AVG
|
|
//
|
|
;
|
|
|
|
//
|
|
result =
|
|
//
|
|
isRSIinOverSell
|
|
// &&
|
|
// isBullishOverAVGs
|
|
//
|
|
;
|
|
|
|
//
|
|
// result = result && isScorePassed;
|
|
|
|
//
|
|
if (result)
|
|
{
|
|
sl = GetMinVales();
|
|
}
|
|
|
|
//
|
|
double bearishScore = mBearishScore[0];
|
|
double bearishMin100 = GetBearishScoreMin(0, 100);
|
|
double bearishMax100 = GetBearishScoreMax(0, 100);
|
|
double bearish9AVG = GetBearishScoreAverage(0, 9);
|
|
double bearish17AVG = GetBearishScoreAverage(0, 17);
|
|
double bearish26AVG = GetBearishScoreAverage(0, 26);
|
|
|
|
//
|
|
double bullishScore = mBullishScore[0];
|
|
|
|
//
|
|
bool isBearishOverAVGs =
|
|
//
|
|
ArraySize(mBearishScore) > 100 &&
|
|
bearishScore > mBearishScore[1] &&
|
|
bearishScore > bullishScore &&
|
|
bearishScore > bearish9AVG &&
|
|
bearishScore > bearish17AVG &&
|
|
bearishScore > bearish26AVG
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isScorePassed = IsScorePassedForShort();
|
|
|
|
//
|
|
bool isRSIOverBaought =
|
|
mConditions.cMarketConditions.isRSIOver70 &&
|
|
mConditions.cMarketConditions.isRVIShortStart &&
|
|
mConditions.cMarketConditions.isCCIOverPositiveHundred;
|
|
|
|
//
|
|
result =
|
|
//
|
|
isRSIOverBaought
|
|
// &&
|
|
// isBearishOverAVGs
|
|
//
|
|
;
|
|
|
|
//
|
|
// result = result && isScorePassed;
|
|
|
|
//
|
|
if (result)
|
|
{
|
|
sl = GetMaxPeaks();
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////
|
|
|
|
//
|
|
bool isCICHLong =
|
|
//
|
|
(mConditions.cMarketConditions.isSenkouSpanAOverB &&
|
|
mConditions.cMarketConditions.isCloseOverKijunSen &&
|
|
mConditions.cMarketConditions.isSenkouSpanAOverLast &&
|
|
mConditions.cMarketConditions.isTenkanSenCrossedOverKijunSen)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isSICHLong =
|
|
//
|
|
(mConditions.sMarketConditions.isSenkouSpanAOverB &&
|
|
mConditions.sMarketConditions.isCloseOverKijunSen &&
|
|
mConditions.sMarketConditions.isSenkouSpanAOverLast &&
|
|
mConditions.sMarketConditions.isTenkanSenCrossedOverKijunSen)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isMICHLong =
|
|
//
|
|
(mConditions.mMarketConditions.isSenkouSpanAOverB &&
|
|
mConditions.mMarketConditions.isCloseOverKijunSen &&
|
|
mConditions.mMarketConditions.isSenkouSpanAOverLast &&
|
|
mConditions.mMarketConditions.isTenkanSenCrossedOverKijunSen)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isLICHLong =
|
|
//
|
|
(mConditions.lMarketConditions.isSenkouSpanAOverB &&
|
|
mConditions.lMarketConditions.isCloseOverKijunSen &&
|
|
mConditions.lMarketConditions.isSenkouSpanAOverLast &&
|
|
mConditions.lMarketConditions.isTenkanSenCrossedOverKijunSen)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isHICHLong =
|
|
//
|
|
(mConditions.hMarketConditions.isSenkouSpanAOverB &&
|
|
mConditions.hMarketConditions.isCloseOverKijunSen &&
|
|
mConditions.hMarketConditions.isSenkouSpanAOverLast &&
|
|
mConditions.hMarketConditions.isTenkanSenCrossedOverKijunSen)
|
|
//
|
|
;
|
|
|
|
//
|
|
result =
|
|
// //
|
|
// isCICHLong
|
|
// //
|
|
// ||
|
|
//
|
|
isSICHLong
|
|
//
|
|
||
|
|
//
|
|
isMICHLong
|
|
//
|
|
||
|
|
//
|
|
isLICHLong
|
|
//
|
|
||
|
|
//
|
|
isHICHLong
|
|
//
|
|
;
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//
|
|
bool isCICHShort =
|
|
//
|
|
(mConditions.cMarketConditions.isSenkouSpanAUnderB &&
|
|
mConditions.cMarketConditions.isCloseUnderKijunSen &&
|
|
mConditions.cMarketConditions.isSenkouSpanAUnderLast &&
|
|
mConditions.cMarketConditions.isTenkanSenCrossedUnderKijunSen)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isSICHShort =
|
|
//
|
|
(mConditions.sMarketConditions.isSenkouSpanAUnderB &&
|
|
mConditions.sMarketConditions.isCloseUnderKijunSen &&
|
|
mConditions.sMarketConditions.isSenkouSpanAUnderLast &&
|
|
mConditions.sMarketConditions.isTenkanSenCrossedUnderKijunSen)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isMICHShort =
|
|
//
|
|
(mConditions.mMarketConditions.isSenkouSpanAUnderB &&
|
|
mConditions.mMarketConditions.isCloseUnderKijunSen &&
|
|
mConditions.mMarketConditions.isSenkouSpanAUnderLast &&
|
|
mConditions.mMarketConditions.isTenkanSenCrossedUnderKijunSen)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isLICHShort =
|
|
//
|
|
(mConditions.lMarketConditions.isSenkouSpanAUnderB &&
|
|
mConditions.lMarketConditions.isCloseUnderKijunSen &&
|
|
mConditions.lMarketConditions.isSenkouSpanAUnderLast &&
|
|
mConditions.lMarketConditions.isTenkanSenCrossedUnderKijunSen)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isHICHShort =
|
|
//
|
|
(mConditions.hMarketConditions.isSenkouSpanAUnderB &&
|
|
mConditions.hMarketConditions.isCloseUnderKijunSen &&
|
|
mConditions.hMarketConditions.isSenkouSpanAUnderLast &&
|
|
mConditions.hMarketConditions.isTenkanSenCrossedUnderKijunSen)
|
|
//
|
|
;
|
|
|
|
//
|
|
result =
|
|
// //
|
|
// isCICHShort
|
|
// //
|
|
// ||
|
|
//
|
|
isSICHShort
|
|
//
|
|
||
|
|
//
|
|
isMICHShort
|
|
//
|
|
||
|
|
//
|
|
isLICHShort
|
|
//
|
|
||
|
|
//
|
|
isHICHShort
|
|
//
|
|
;
|
|
|