2712 lines
64 KiB
Plaintext
2712 lines
64 KiB
Plaintext
///////////////////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 XEU5 Signal Provider Indicators Library
|
|
// ----------------------------------------------------------------
|
|
//
|
|
// Maintainer:
|
|
// ------------
|
|
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
|
//
|
|
//////////////////////////////////////////////////////
|
|
//
|
|
// Global Properties ...
|
|
#property library
|
|
#property copyright "Copyright 2023, SaherElm IT Center"
|
|
#property link "https://www.saherelm.ir"
|
|
#property version "1.00"
|
|
#property strict
|
|
|
|
//
|
|
// Include Provider Inputs ...
|
|
#include "x-saherelm.xeu5.provider.inputs.lib.mq5";
|
|
|
|
//
|
|
// START Define Enums ...
|
|
//
|
|
|
|
//
|
|
// Represent Market Conditions ...
|
|
struct XEU5_MARKET_CONDITIONS
|
|
{
|
|
//
|
|
// XTM ...
|
|
bool isXTMPeak;
|
|
bool isXTMVale;
|
|
bool isXTMBullish;
|
|
bool isXTMBearish;
|
|
bool isXTMNeutural;
|
|
bool isXTMEndBullish;
|
|
bool isXTMEndBearish;
|
|
bool isXTMStartBullish;
|
|
bool isXTMStartBearish;
|
|
bool isXTMEndBullishByNeutural;
|
|
bool isXTMEndBearishByNeutural;
|
|
bool isXTMStartBullishAfterNeutural;
|
|
bool isXTMStartBearishAfterNeutural;
|
|
|
|
//
|
|
// XLH ...
|
|
bool isXLHHHIncreased;
|
|
bool isXLHHHDecreased;
|
|
bool isXLHLLIncreased;
|
|
bool isXLHLLDecreased;
|
|
bool isXLHLowAttachedLL;
|
|
bool isXLHHighAttachedHH;
|
|
bool isXLHHHSameInLength;
|
|
bool isXLHLLSameInLength;
|
|
bool isXLHPriceOverSignal;
|
|
bool isXLHPriceUnderSignal;
|
|
bool isXLHPriceInSignalRange;
|
|
bool isXLHPriceCrossedOverSignal;
|
|
bool isXLHPriceCrossedUnderSignal;
|
|
|
|
//
|
|
// XTD ...
|
|
bool isXTDSignalPeak;
|
|
bool isXTDSignalVale;
|
|
bool isXTDBullishPeak;
|
|
bool isXTDBullishVale;
|
|
bool isXTDBearishPeak;
|
|
bool isXTDBearishVale;
|
|
bool isXTDBullOverBear;
|
|
bool isXTDBullUnderBear;
|
|
bool isXTDSignalOverBear;
|
|
bool isXTDSignalUnderBear;
|
|
bool isXTDBullCrossedOverBear;
|
|
bool isXTDBullCrossedUnderBear;
|
|
bool isXTDSignalCrossedOverBear;
|
|
bool isXTDSignalCrossedUnderBear;
|
|
|
|
//
|
|
// XRSI ...
|
|
bool isXRSIPeak;
|
|
bool isXRSIVale;
|
|
bool isXRSICrossedOverLongExit;
|
|
bool isXRSICrossedOverLongEntry;
|
|
bool isXRSICrossedUnderShortExit;
|
|
bool isXRSICrossedUnderShortEntry;
|
|
|
|
//
|
|
// XOBD ...
|
|
bool isXOBDSwingLow;
|
|
bool isXOBDSwingHigh;
|
|
|
|
//
|
|
// XCHLH ...
|
|
//
|
|
bool isXCHLHSameHHs;
|
|
bool isXCHLHSameLLs;
|
|
//
|
|
bool isXCHLHSCMCHHSame;
|
|
bool isXCHLHSCMCLLSame;
|
|
//
|
|
bool isXCHLHSCLCHHSame;
|
|
bool isXCHLHSCLCLLSame;
|
|
//
|
|
bool isXCHLHMCLCHHSame;
|
|
bool isXCHLHMCLCLLSame;
|
|
//
|
|
bool isXCHLHMCOnTopOfLC;
|
|
bool isXCHLHMCInBottomOfLC;
|
|
|
|
//
|
|
// XCHMA ...
|
|
//
|
|
bool isXCHMASCOverMax;
|
|
bool isXCHMASCOverMin;
|
|
bool isXCHMASCUnderMax;
|
|
bool isXCHMASCUnderMin;
|
|
//
|
|
bool isXCHMASCCrossedOverMax;
|
|
bool isXCHMASCCrossedUnderMax;
|
|
bool isXCHMASCCrossedOverMin;
|
|
bool isXCHMASCCrossedUnderMin;
|
|
//
|
|
bool isXCHMASCPeak;
|
|
bool isXCHMASCVale;
|
|
bool isXCHMASCTrendsUp;
|
|
bool isXCHMASCTrendsDown;
|
|
bool isXCHMASCFastOverSlow;
|
|
bool isXCHMASCFastUnderSlow;
|
|
bool isXCHMASCFastCrossedOverSlow;
|
|
bool isXCHMASCFastCrossedUnderSlow;
|
|
//
|
|
bool isXCHMAMCPeak;
|
|
bool isXCHMAMCVale;
|
|
bool isXCHMAMCTrendsUp;
|
|
bool isXCHMAMCTrendsDown;
|
|
bool isXCHMAMCFastOverSlow;
|
|
bool isXCHMAMCFastUnderSlow;
|
|
bool isXCHMAMCFastCrossedOverSlow;
|
|
bool isXCHMAMCFastCrossedUnderSlow;
|
|
//
|
|
bool isXCHMALCPeak;
|
|
bool isXCHMALCVale;
|
|
bool isXCHMALCTrendsUp;
|
|
bool isXCHMALCTrendsDown;
|
|
bool isXCHMALCFastOverSlow;
|
|
bool isXCHMALCFastUnderSlow;
|
|
bool isXCHMALCFastCrossedOverSlow;
|
|
bool isXCHMALCFastCrossedUnderSlow;
|
|
};
|
|
|
|
//
|
|
enum ENUM_XEU5_SIGNAL_PROVIDERS
|
|
{
|
|
XTD,
|
|
XRSI,
|
|
XCHMA_CYCLES_CROSSES,
|
|
XLH_ATTACHED_SWINGS,
|
|
XCHMA_CYCLE_MIN_MAX_OVER,
|
|
XCHMA_CYCLE_MIN_MAX_UNDER,
|
|
};
|
|
|
|
//
|
|
// Signal Additional Info ...
|
|
struct XEU5_SIGNAL
|
|
{
|
|
double tp;
|
|
double sl;
|
|
int signalPusher;
|
|
};
|
|
|
|
//
|
|
// END Define Enums ...
|
|
//
|
|
|
|
//
|
|
// Imports all Indicators Helper here ...
|
|
input group "XEU5 Provider Indicators";
|
|
//
|
|
#include "..\Helpers\x-saherelm.xtm.indicator.helper.lib.mq5";
|
|
#include "..\Helpers\x-saherelm.xlh.indicator.helper.lib.mq5";
|
|
#include "..\Helpers\x-saherelm.xtd.oscillator.helper.lib.mq5";
|
|
#include "..\Helpers\x-saherelm.xobd.indicator.helper.lib.mq5";
|
|
#include "..\Helpers\x-saherelm.xrsi.oscillator.helper.lib.mq5";
|
|
#include "..\Helpers\x-saherelm.xchlh.oscillator.helper.lib.mq5";
|
|
#include "..\Helpers\x-saherelm.xchma.oscillator.helper.lib.mq5";
|
|
|
|
//
|
|
// TODO: Remove this ...
|
|
int tdLongSignals = 0;
|
|
int tdShortSignals = 0;
|
|
int rsiLongSignals = 0;
|
|
int rsiShortSignals = 0;
|
|
int lhAttachedLongSignals = 0;
|
|
int lhAttachedShortSignals = 0;
|
|
int chmaCyclesCrossLongSignals = 0;
|
|
int chmaCyclesCrossShortSignals = 0;
|
|
int chmaCyclesMinMaxOverLongSignals = 0;
|
|
int chmaCyclesMinMaxOverShortSignals = 0;
|
|
int chmaCyclesMinMaxUnderLongSignals = 0;
|
|
int chmaCyclesMinMaxUnderShortSignals = 0;
|
|
|
|
//
|
|
int xEU5MaxLengthOfInputs = 0;
|
|
int xEU5CalculatedBars = 0;
|
|
|
|
//
|
|
// Here we Define some Global Market Variables to Analyse MArket Conditions
|
|
// using them at each time ...
|
|
XEU5_MARKET_CONDITIONS conditions = {};
|
|
|
|
//
|
|
// Init Indicators ...
|
|
bool XEU5InitIndicators()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Check and Calculate Max Length in Inputs ...
|
|
//
|
|
|
|
//
|
|
// XTM ...
|
|
xEU5MaxLengthOfInputs = MathMax(
|
|
xTMMaPeriod,
|
|
xEU5NumberOfItemsPerTick);
|
|
|
|
//
|
|
// XLH ...
|
|
xEU5MaxLengthOfInputs = MathMax(
|
|
xLHLength,
|
|
xEU5NumberOfItemsPerTick);
|
|
|
|
//
|
|
// XTD ...
|
|
xEU5MaxLengthOfInputs = MathMax(
|
|
xTDLength,
|
|
xEU5MaxLengthOfInputs);
|
|
|
|
//
|
|
// XRSI ...
|
|
xEU5MaxLengthOfInputs = MathMax(
|
|
xRSILength,
|
|
xEU5MaxLengthOfInputs);
|
|
|
|
//
|
|
// XOBD ...
|
|
xEU5MaxLengthOfInputs = MathMax(
|
|
xOBDLength,
|
|
xEU5MaxLengthOfInputs);
|
|
|
|
//
|
|
// XCHLH ...
|
|
xEU5MaxLengthOfInputs = MathMax(
|
|
xCHLHLcLength,
|
|
xEU5MaxLengthOfInputs);
|
|
xEU5MaxLengthOfInputs = MathMax(
|
|
xCHLHMcLength,
|
|
xEU5MaxLengthOfInputs);
|
|
xEU5MaxLengthOfInputs = MathMax(
|
|
xCHLHScLength,
|
|
xEU5MaxLengthOfInputs);
|
|
|
|
//
|
|
// XCHMA ...
|
|
xEU5MaxLengthOfInputs = MathMax(
|
|
xCHMAScFastLength,
|
|
xEU5MaxLengthOfInputs);
|
|
xEU5MaxLengthOfInputs = MathMax(
|
|
xCHMAScSlowLength,
|
|
xEU5MaxLengthOfInputs);
|
|
xEU5MaxLengthOfInputs = MathMax(
|
|
xCHMAMcFastLength,
|
|
xEU5MaxLengthOfInputs);
|
|
xEU5MaxLengthOfInputs = MathMax(
|
|
xCHMAMcSlowLength,
|
|
xEU5MaxLengthOfInputs);
|
|
xEU5MaxLengthOfInputs = MathMax(
|
|
xCHMALcFastLength,
|
|
xEU5MaxLengthOfInputs);
|
|
xEU5MaxLengthOfInputs = MathMax(
|
|
xCHMALcSlowLength,
|
|
xEU5MaxLengthOfInputs);
|
|
|
|
//
|
|
// Initialize Indicator/Oscillator Handlers ...
|
|
ResetLastError();
|
|
|
|
//
|
|
// XTM Init ...
|
|
result = XTMInitHandlers();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XLH Init ...
|
|
result = XLHInitHandlers();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XTD Init ...
|
|
result = XTDInitHandlers();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XRSI Init ...
|
|
result = XRSIInitHandlers();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XOBD Init ...
|
|
result = XOBDInitHandlers();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XCLH Init ...
|
|
result = XCHLHInitHandlers();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XCHMA Init ...
|
|
result = XCHMAInitHandlers();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = true;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Release Indicators ...
|
|
void XEU5ReleaseIndicators()
|
|
{
|
|
//
|
|
// Release Handlers ...
|
|
XTMReleaseHandlers();
|
|
XLHReleaseHandlers();
|
|
XTDReleaseHandlers();
|
|
XRSIReleaseHandlers();
|
|
XOBDReleaseHandlers();
|
|
XCHMAReleaseHandlers();
|
|
XCHLHReleaseHandlers();
|
|
|
|
//
|
|
// TODO: Remove this ...
|
|
LogMessage(
|
|
//
|
|
"Provided Signals: " +
|
|
"\nXRSI: \n" +
|
|
"Longs: " + (string)rsiLongSignals + "\n" +
|
|
"Shorts: " + (string)rsiShortSignals + "\n" +
|
|
"\nLHAttached: \n" +
|
|
"Longs: " + (string)lhAttachedLongSignals + "\n" +
|
|
"Shorts: " + (string)lhAttachedShortSignals + "\n" +
|
|
"\nXTD: \n" +
|
|
"Longs: " + (string)tdLongSignals + "\n" +
|
|
"Shorts: " + (string)tdShortSignals + "\n" +
|
|
"\nCHMA Cycles Cross: \n" +
|
|
"Longs: " + (string)chmaCyclesCrossLongSignals + "\n" +
|
|
"Shorts: " + (string)chmaCyclesCrossShortSignals + "\n" +
|
|
"\nCHMA Over Max: \n" +
|
|
"Longs: " + (string)chmaCyclesMinMaxOverLongSignals + "\n" +
|
|
"Shorts: " + (string)chmaCyclesMinMaxOverShortSignals + "\n" +
|
|
"\nCHMA Under Min: \n" +
|
|
"Longs: " + (string)chmaCyclesMinMaxUnderLongSignals + "\n" +
|
|
"Shorts: " + (string)chmaCyclesMinMaxUnderShortSignals + "\n"
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// Handle Reading Buffers ...
|
|
void XEU5HandleReadingBuffers()
|
|
{
|
|
//
|
|
// Reading Calculated Bars for a Simple Handler ...
|
|
xEU5CalculatedBars = BarsCalculated(xTMHandler);
|
|
|
|
//
|
|
// Read Indicators Buffers ...
|
|
XTMReadBuffers(xEU5NumberOfItemsPerTick);
|
|
XLHReadBuffers(xEU5NumberOfItemsPerTick);
|
|
XTDReadBuffers(xEU5NumberOfItemsPerTick);
|
|
XRSIReadBuffers(xEU5NumberOfItemsPerTick);
|
|
XOBDReadBuffers(xEU5NumberOfItemsPerTick);
|
|
XCHMAReadBuffers(xEU5NumberOfItemsPerTick);
|
|
XCHLHReadBuffers(xEU5NumberOfItemsPerTick);
|
|
|
|
//
|
|
XEU5ReadConditions();
|
|
}
|
|
|
|
//
|
|
//
|
|
// START Combination Functions ...
|
|
//
|
|
//
|
|
|
|
//
|
|
// Can Open Long Trade ...
|
|
// this is a Function will Check all market Conditions and get all
|
|
// Strategy requirement Verifications for Long Signals ...
|
|
bool XEU5CanOpenLongTrade(
|
|
XEU5_SIGNAL &info // Retrieve Signal Additional Info on this Object
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
bool hasSignal = XEU5HasLongSignal(info);
|
|
|
|
//
|
|
result =
|
|
//
|
|
hasSignal
|
|
//
|
|
;
|
|
|
|
//
|
|
// TODO: Remove this On Production ...
|
|
if (result)
|
|
{
|
|
XEU5ClearConditions();
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Can Close Long Trade ...
|
|
// this is a Function will Check all market Conditions and get all
|
|
// Strategy requirement Verifications for Long Signals ...
|
|
bool XEU5CanCloseLongTrade()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// XEU5_SIGNAL info = {};
|
|
// result = XEU5HasShortSignal(info);
|
|
|
|
// //
|
|
// result =
|
|
// //
|
|
// (
|
|
// //
|
|
// XCHMAIsSCFastUnderSlow(1) &&
|
|
// XCHMAIsMCFastUnderSlow(1) &&
|
|
// XCHMAIsLCFastUnderSlow(1)
|
|
// //
|
|
// )
|
|
// //
|
|
// &&
|
|
// //
|
|
// !(
|
|
// //
|
|
// XCHMAIsSCFastUnderSlow(2) &&
|
|
// XCHMAIsMCFastUnderSlow(2) &&
|
|
// XCHMAIsLCFastUnderSlow(2)
|
|
// //
|
|
// )
|
|
// //
|
|
// ;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Can Open Short Trade ...
|
|
// this is a Function will Check all market Conditions and get all
|
|
// Strategy requirement Verifications for Short Signals ...
|
|
bool XEU5CanOpenShortTrade(
|
|
XEU5_SIGNAL &info // Retrieve Signal Additional Info on this Object
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
bool hasSignal = XEU5HasShortSignal(info);
|
|
|
|
//
|
|
result =
|
|
//
|
|
hasSignal
|
|
//
|
|
;
|
|
|
|
//
|
|
// TODO: Remove this On Production ...
|
|
if (result)
|
|
{
|
|
XEU5ClearConditions();
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Can Close Short Trade ...
|
|
// this is a Function will Check all market Conditions and get all
|
|
// Strategy requirement Verifications for Short Signals ...
|
|
bool XEU5CanCloseShortTrade()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
XEU5_SIGNAL info = {};
|
|
// result = XEU5HasLongSignal(info);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
//
|
|
// END Combination Functions ...
|
|
//
|
|
//
|
|
|
|
//
|
|
//
|
|
// START Combination Signaling ...
|
|
//
|
|
//
|
|
|
|
//
|
|
// Read All Globally Required Conditions ...
|
|
void XEU5ReadConditions()
|
|
{
|
|
//
|
|
XEU5ClearConditions();
|
|
|
|
//
|
|
conditions = XEU5GenerateMarketConditions(1);
|
|
|
|
//
|
|
datetime time = iTime(_Symbol, _Period, 1);
|
|
}
|
|
|
|
//
|
|
// Cleanup Conditions ...
|
|
void XEU5ClearConditions()
|
|
{
|
|
//
|
|
XEU5_MARKET_CONDITIONS mConditions = {};
|
|
|
|
//
|
|
conditions = mConditions;
|
|
}
|
|
|
|
//
|
|
// Generate Merket Conditions for Specified Bar Index ...
|
|
XEU5_MARKET_CONDITIONS XEU5GenerateMarketConditions(
|
|
int bar_index = 1 // Specified Bar Index ...
|
|
)
|
|
{
|
|
//
|
|
XEU5_MARKET_CONDITIONS mConditions = {};
|
|
|
|
//
|
|
// XTM ...
|
|
mConditions.isXTMPeak = XTMIsPeak(bar_index);
|
|
mConditions.isXTMVale = XTMIsVale(bar_index);
|
|
mConditions.isXTMBullish = XTMIsBullish(bar_index);
|
|
mConditions.isXTMBearish = XTMIsBearish(bar_index);
|
|
mConditions.isXTMNeutural = XTMIsNeutural(bar_index);
|
|
mConditions.isXTMEndBullish = XTMIsEndBullish(bar_index);
|
|
mConditions.isXTMEndBearish = XTMIsEndBearish(bar_index);
|
|
mConditions.isXTMStartBullish = XTMIsStartBullish(bar_index);
|
|
mConditions.isXTMStartBearish = XTMIsStartBearish(bar_index);
|
|
mConditions.isXTMEndBullishByNeutural = XTMIsEndBullishByNeutural(bar_index);
|
|
mConditions.isXTMEndBearishByNeutural = XTMIsEndBearishByNeutural(bar_index);
|
|
mConditions.isXTMStartBullishAfterNeutural = XTMIsStartBullishAfterNeutural(bar_index);
|
|
mConditions.isXTMStartBearishAfterNeutural = XTMIsStartBearishAfterNeutural(bar_index);
|
|
|
|
//
|
|
// XLH ...
|
|
mConditions.isXLHHHIncreased = XLHIsHHIncreased(bar_index);
|
|
mConditions.isXLHHHDecreased = XLHIsHHDecreased(bar_index);
|
|
mConditions.isXLHLLIncreased = XLHIsLLIncreased(bar_index);
|
|
mConditions.isXLHLLDecreased = XLHIsLLDecreased(bar_index);
|
|
mConditions.isXLHLowAttachedLL = XLHIsLowAttachedLL(bar_index);
|
|
mConditions.isXLHHighAttachedHH = XLHIsHighAttachedHH(bar_index);
|
|
mConditions.isXLHHHSameInLength = XLHIsHHSameInLength(bar_index);
|
|
mConditions.isXLHLLSameInLength = XLHIsLLSameInLength(bar_index);
|
|
mConditions.isXLHPriceOverSignal = XLHIsPriceOverSignal(bar_index);
|
|
mConditions.isXLHPriceUnderSignal = XLHIsPriceUnderSignal(bar_index);
|
|
mConditions.isXLHPriceInSignalRange = XLHIsPriceInSignalRange(bar_index);
|
|
mConditions.isXLHPriceCrossedOverSignal = XLHIsPriceCrossedOverSignal(bar_index);
|
|
mConditions.isXLHPriceCrossedUnderSignal = XLHIsPriceCrossedUnderSignal(bar_index);
|
|
|
|
//
|
|
// XTD ...
|
|
mConditions.isXTDSignalPeak = XTDIsSignalPeak(bar_index);
|
|
mConditions.isXTDSignalVale = XTDIsSignalVale(bar_index);
|
|
mConditions.isXTDBullishPeak = XTDIsBullishPeak(bar_index);
|
|
mConditions.isXTDBullishVale = XTDIsBullishVale(bar_index);
|
|
mConditions.isXTDBearishPeak = XTDIsBearishPeak(bar_index);
|
|
mConditions.isXTDBearishVale = XTDIsBearishVale(bar_index);
|
|
mConditions.isXTDBullOverBear = XTDIsBullOverBear(bar_index);
|
|
mConditions.isXTDBullUnderBear = XTDIsBullUnderBear(bar_index);
|
|
mConditions.isXTDSignalOverBear = XTDIsSignalOverBear(bar_index);
|
|
mConditions.isXTDSignalUnderBear = XTDIsSignalUnderBear(bar_index);
|
|
mConditions.isXTDBullCrossedOverBear = XTDIsBullCrossedOverBear(bar_index);
|
|
mConditions.isXTDBullCrossedUnderBear = XTDIsBullCrossedUnderBear(bar_index);
|
|
mConditions.isXTDSignalCrossedOverBear = XTDIsSignalCrossedOverBear(bar_index);
|
|
mConditions.isXTDSignalCrossedUnderBear = XTDIsSignalCrossedUnderBear(bar_index);
|
|
|
|
//
|
|
// XRSI ...
|
|
mConditions.isXRSIPeak = XRSIIsPeak(bar_index);
|
|
mConditions.isXRSIVale = XRSIIsVale(bar_index);
|
|
mConditions.isXRSICrossedOverLongExit = XRSIIsCrossedOverLongExit(bar_index);
|
|
mConditions.isXRSICrossedOverLongEntry = XRSIIsCrossedOverLongEntry(bar_index);
|
|
mConditions.isXRSICrossedUnderShortExit = XRSIIsCrossedUnderShortExit(bar_index);
|
|
mConditions.isXRSICrossedUnderShortEntry = XRSIIsCrossedUnderShortEntry(bar_index);
|
|
|
|
//
|
|
// XOBD ...
|
|
mConditions.isXOBDSwingLow = XOBDIsSwingLow(bar_index);
|
|
mConditions.isXOBDSwingHigh = XOBDIsSwingHigh(bar_index);
|
|
|
|
//
|
|
// XCHLH ...
|
|
//
|
|
mConditions.isXCHLHSameHHs = XCHLHIsSameHHs(bar_index);
|
|
mConditions.isXCHLHSameLLs = XCHLHIsSameLLs(bar_index);
|
|
//
|
|
mConditions.isXCHLHSCMCHHSame = XCHLHIsMCSCHasSameHH(bar_index);
|
|
mConditions.isXCHLHSCMCLLSame = XCHLHIsMCSCHasSameLL(bar_index);
|
|
//
|
|
mConditions.isXCHLHSCLCHHSame = XCHLHIsLCSCHasSameHH(bar_index);
|
|
mConditions.isXCHLHSCLCLLSame = XCHLHIsLCSCHasSameLL(bar_index);
|
|
//
|
|
mConditions.isXCHLHMCLCHHSame = XCHLHIsLCMCHasSameHH(bar_index);
|
|
mConditions.isXCHLHMCLCLLSame = XCHLHIsLCMCHasSameLL(bar_index);
|
|
//
|
|
mConditions.isXCHLHMCOnTopOfLC = XCHLHIsMCOnTopOfLC(bar_index);
|
|
mConditions.isXCHLHMCInBottomOfLC = XCHLHIsMCInBottomOfLC(bar_index);
|
|
|
|
//
|
|
// XCHMA ...
|
|
//
|
|
mConditions.isXCHMASCOverMax = XCHMAIsSCOverMax(bar_index);
|
|
mConditions.isXCHMASCOverMin = XCHMAIsSCOverMin(bar_index);
|
|
mConditions.isXCHMASCUnderMax = XCHMAIsSCUnderMax(bar_index);
|
|
mConditions.isXCHMASCUnderMin = XCHMAIsSCUnderMin(bar_index);
|
|
//
|
|
mConditions.isXCHMASCCrossedOverMax = XCHMAIsSCCrossedOverMax(bar_index);
|
|
mConditions.isXCHMASCCrossedUnderMax = XCHMAIsSCCrossedUnderMax(bar_index);
|
|
mConditions.isXCHMASCCrossedOverMin = XCHMAIsSCCrossedOverMin(bar_index);
|
|
mConditions.isXCHMASCCrossedUnderMin = XCHMAIsSCCrossedUnderMin(bar_index);
|
|
//
|
|
mConditions.isXCHMASCPeak = XCHMAIsSCPeak(bar_index);
|
|
mConditions.isXCHMASCVale = XCHMAIsSCVale(bar_index);
|
|
mConditions.isXCHMASCTrendsUp = XCHMAIsSCTrendsUp(bar_index);
|
|
mConditions.isXCHMASCTrendsDown = XCHMAIsSCTrendsDown(bar_index);
|
|
mConditions.isXCHMASCFastOverSlow = XCHMAIsSCFastOverSlow(bar_index);
|
|
mConditions.isXCHMASCFastUnderSlow = XCHMAIsSCFastUnderSlow(bar_index);
|
|
mConditions.isXCHMASCFastCrossedOverSlow = XCHMAIsSCFastCrossedOverSlow(bar_index);
|
|
mConditions.isXCHMASCFastCrossedUnderSlow = XCHMAIsSCFastCrossedUnderSlow(bar_index);
|
|
//
|
|
mConditions.isXCHMAMCPeak = XCHMAIsMCPeak(bar_index);
|
|
mConditions.isXCHMAMCVale = XCHMAIsMCVale(bar_index);
|
|
mConditions.isXCHMAMCTrendsUp = XCHMAIsMCTrendsUp(bar_index);
|
|
mConditions.isXCHMAMCTrendsDown = XCHMAIsMCTrendsDown(bar_index);
|
|
mConditions.isXCHMAMCFastOverSlow = XCHMAIsMCFastOverSlow(bar_index);
|
|
mConditions.isXCHMAMCFastUnderSlow = XCHMAIsMCFastUnderSlow(bar_index);
|
|
mConditions.isXCHMAMCFastCrossedOverSlow = XCHMAIsMCFastCrossedOverSlow(bar_index);
|
|
mConditions.isXCHMAMCFastCrossedUnderSlow = XCHMAIsMCFastCrossedUnderSlow(bar_index);
|
|
//
|
|
mConditions.isXCHMALCPeak = XCHMAIsLCPeak(bar_index);
|
|
mConditions.isXCHMALCVale = XCHMAIsLCVale(bar_index);
|
|
mConditions.isXCHMALCTrendsUp = XCHMAIsLCTrendsUp(bar_index);
|
|
mConditions.isXCHMALCTrendsDown = XCHMAIsLCTrendsDown(bar_index);
|
|
mConditions.isXCHMALCFastOverSlow = XCHMAIsLCFastOverSlow(bar_index);
|
|
mConditions.isXCHMALCFastUnderSlow = XCHMAIsLCFastUnderSlow(bar_index);
|
|
mConditions.isXCHMALCFastCrossedOverSlow = XCHMAIsLCFastCrossedOverSlow(bar_index);
|
|
mConditions.isXCHMALCFastCrossedUnderSlow = XCHMAIsLCFastCrossedUnderSlow(bar_index);
|
|
|
|
//
|
|
return mConditions;
|
|
}
|
|
|
|
//
|
|
// Converts Market Conditions to Specific String Representation ...
|
|
string XEU5GetConditionsString(
|
|
XEU5_MARKET_CONDITIONS &condition, // Specify Conditiond
|
|
string separator = ",", // Specify Separator
|
|
bool ignoreFalses = true // Ignore False Conditions
|
|
)
|
|
{
|
|
//
|
|
XEU5_MARKET_CONDITIONS mConditions = {};
|
|
|
|
//
|
|
mConditions = condition;
|
|
|
|
//
|
|
string result = "\n";
|
|
|
|
//
|
|
// XOBD ...
|
|
result +=
|
|
"| XOBD |" + separator;
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXOBDSwingLow))
|
|
{
|
|
result += "isXOBDSwingLow: " + (string)mConditions.isXOBDSwingLow + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXOBDSwingHigh))
|
|
{
|
|
result += "isXOBDSwingHigh: " + (string)mConditions.isXOBDSwingHigh + separator;
|
|
}
|
|
|
|
//
|
|
// Separator ...
|
|
result += separator;
|
|
|
|
//
|
|
// XTM ...
|
|
result +=
|
|
"| XTM |" + separator;
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTMPeak))
|
|
{
|
|
result += "isXTMPeak: " + (string)mConditions.isXTMPeak + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTMVale))
|
|
{
|
|
result += "isXTMVale: " + (string)mConditions.isXTMVale + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTMStartBullish))
|
|
{
|
|
result += "isXTMStartBullish: " + (string)mConditions.isXTMStartBullish + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTMStartBullishAfterNeutural))
|
|
{
|
|
result += "isXTMStartBullishAfterNeutural: " + (string)mConditions.isXTMStartBullishAfterNeutural + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTMBullish))
|
|
{
|
|
result += "isXTMBullish: " + (string)mConditions.isXTMBullish + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTMEndBullish))
|
|
{
|
|
result += "isXTMEndBullish: " + (string)mConditions.isXTMEndBullish + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTMEndBullishByNeutural))
|
|
{
|
|
result += "isXTMEndBullishByNeutural: " + (string)mConditions.isXTMEndBullishByNeutural + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTMStartBearish))
|
|
{
|
|
result += "isXTMStartBearish: " + (string)mConditions.isXTMStartBearish + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTMStartBearishAfterNeutural))
|
|
{
|
|
result += "isXTMStartBearishAfterNeutural: " + (string)mConditions.isXTMStartBearishAfterNeutural + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTMBearish))
|
|
{
|
|
result += "isXTMBearish: " + (string)mConditions.isXTMBearish + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTMEndBearish))
|
|
{
|
|
result += "isXTMEndBearish: " + (string)mConditions.isXTMEndBearish + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTMEndBearishByNeutural))
|
|
{
|
|
result += "isXTMEndBearishByNeutural: " + (string)mConditions.isXTMEndBearishByNeutural + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTMNeutural))
|
|
{
|
|
result += "isXTMNeutural: " + (string)mConditions.isXTMNeutural + separator;
|
|
}
|
|
|
|
//
|
|
// Separator ...
|
|
result += separator;
|
|
|
|
//
|
|
// XTD ...
|
|
result +=
|
|
"| XTD |" + separator;
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTDSignalPeak))
|
|
{
|
|
result += "isXTDSignalPeak: " + (string)mConditions.isXTDSignalPeak + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTDSignalVale))
|
|
{
|
|
result += "isXTDSignalVale: " + (string)mConditions.isXTDSignalVale + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTDBullishPeak))
|
|
{
|
|
result += "isXTDBullishPeak: " + (string)mConditions.isXTDBullishPeak + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTDBullishVale))
|
|
{
|
|
result += "isXTDBullishVale: " + (string)mConditions.isXTDBullishVale + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTDBearishPeak))
|
|
{
|
|
result += "isXTDBearishPeak: " + (string)mConditions.isXTDBearishPeak + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTDBearishVale))
|
|
{
|
|
result += "isXTDBearishVale: " + (string)mConditions.isXTDBearishVale + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTDBullOverBear))
|
|
{
|
|
result += "isXTDBullOverBear: " + (string)mConditions.isXTDBullOverBear + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTDBullUnderBear))
|
|
{
|
|
result += "isXTDBullUnderBear: " + (string)mConditions.isXTDBullUnderBear + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTDSignalOverBear))
|
|
{
|
|
result += "isXTDSignalOverBear: " + (string)mConditions.isXTDSignalOverBear + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTDSignalUnderBear))
|
|
{
|
|
result += "isXTDSignalUnderBear: " + (string)mConditions.isXTDSignalUnderBear + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTDBullCrossedOverBear))
|
|
{
|
|
result += "isXTDBullCrossedOverBear: " + (string)mConditions.isXTDBullCrossedOverBear + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTDBullCrossedUnderBear))
|
|
{
|
|
result += "isXTDBullCrossedUnderBear: " + (string)mConditions.isXTDBullCrossedUnderBear + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTDSignalCrossedOverBear))
|
|
{
|
|
result += "isXTDSignalCrossedOverBear: " + (string)mConditions.isXTDSignalCrossedOverBear + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXTDSignalCrossedUnderBear))
|
|
{
|
|
result += "isXTDSignalCrossedUnderBear: " + (string)mConditions.isXTDSignalCrossedUnderBear + separator;
|
|
}
|
|
|
|
//
|
|
// Separator ...
|
|
result += separator;
|
|
|
|
//
|
|
// XLH ...
|
|
result +=
|
|
"| XLH |" + separator;
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXLHHHIncreased))
|
|
{
|
|
result += "isXLHHHIncreased: " + (string)mConditions.isXLHHHIncreased + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXLHHHDecreased))
|
|
{
|
|
result += "isXLHHHDecreased: " + (string)mConditions.isXLHHHDecreased + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXLHLLIncreased))
|
|
{
|
|
result += "isXLHLLIncreased: " + (string)mConditions.isXLHLLIncreased + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXLHLLDecreased))
|
|
{
|
|
result += "isXLHLLDecreased: " + (string)mConditions.isXLHLLDecreased + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXLHHighAttachedHH))
|
|
{
|
|
result += "isXLHHighAttachedHH: " + (string)mConditions.isXLHHighAttachedHH + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXLHLowAttachedLL))
|
|
{
|
|
result += "isXLHLowAttachedLL: " + (string)mConditions.isXLHLowAttachedLL + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXLHHHSameInLength))
|
|
{
|
|
result += "isXLHHHSameInLength: " + (string)mConditions.isXLHHHSameInLength + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXLHLLSameInLength))
|
|
{
|
|
result += "isXLHLLSameInLength: " + (string)mConditions.isXLHLLSameInLength + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXLHPriceCrossedOverSignal))
|
|
{
|
|
result += "isXLHPriceCrossedOverSignal: " + (string)mConditions.isXLHPriceCrossedOverSignal + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXLHPriceOverSignal))
|
|
{
|
|
result += "isXLHPriceOverSignal: " + (string)mConditions.isXLHPriceOverSignal + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXLHPriceCrossedUnderSignal))
|
|
{
|
|
result += "isXLHPriceCrossedUnderSignal: " + (string)mConditions.isXLHPriceCrossedUnderSignal + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXLHPriceUnderSignal))
|
|
{
|
|
result += "isXLHPriceUnderSignal: " + (string)mConditions.isXLHPriceUnderSignal + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXLHPriceInSignalRange))
|
|
{
|
|
result += "isXLHPriceInSignalRange: " + (string)mConditions.isXLHPriceInSignalRange + separator;
|
|
}
|
|
|
|
//
|
|
// Separator ...
|
|
result += separator;
|
|
|
|
//
|
|
// XRSI ...
|
|
result +=
|
|
"| XRSI |" + separator;
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXRSIPeak))
|
|
{
|
|
result += "isXRSIPeak: " + (string)mConditions.isXRSIPeak + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXRSIVale))
|
|
{
|
|
result += "isXRSIVale: " + (string)mConditions.isXRSIVale + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXRSICrossedOverLongExit))
|
|
{
|
|
result += "isXRSICrossedOverLongExit: " + (string)mConditions.isXRSICrossedOverLongExit + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXRSICrossedOverLongEntry))
|
|
{
|
|
result += "isXRSICrossedOverLongEntry: " + (string)mConditions.isXRSICrossedOverLongEntry + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXRSICrossedUnderShortExit))
|
|
{
|
|
result += "isXRSICrossedUnderShortExit: " + (string)mConditions.isXRSICrossedUnderShortExit + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXRSICrossedUnderShortEntry))
|
|
{
|
|
result += "isXRSICrossedUnderShortEntry: " + (string)mConditions.isXRSICrossedUnderShortEntry + separator;
|
|
}
|
|
|
|
//
|
|
// Separator ...
|
|
result += separator;
|
|
|
|
//
|
|
// XCHLH ...
|
|
result +=
|
|
"| XCHLH |" + separator;
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHLHSameHHs))
|
|
{
|
|
result += "isXCHLHSameHHs: " + (string)mConditions.isXCHLHSameHHs + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHLHSameLLs))
|
|
{
|
|
result += "isXCHLHSameLLs: " + (string)mConditions.isXCHLHSameLLs + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHLHSCMCHHSame))
|
|
{
|
|
result += "isXCHLHSCMCHHSame: " + (string)mConditions.isXCHLHSCMCHHSame + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHLHSCMCLLSame))
|
|
{
|
|
result += "isXCHLHSCMCLLSame: " + (string)mConditions.isXCHLHSCMCLLSame + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHLHSCLCHHSame))
|
|
{
|
|
result += "isXCHLHSCLCHHSame: " + (string)mConditions.isXCHLHSCLCHHSame + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHLHSCLCLLSame))
|
|
{
|
|
result += "isXCHLHSCLCLLSame: " + (string)mConditions.isXCHLHSCLCLLSame + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHLHMCLCHHSame))
|
|
{
|
|
result += "isXCHLHMCLCHHSame: " + (string)mConditions.isXCHLHMCLCHHSame + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHLHMCLCLLSame))
|
|
{
|
|
result += "isXCHLHMCLCLLSame: " + (string)mConditions.isXCHLHMCLCLLSame + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHLHMCOnTopOfLC))
|
|
{
|
|
result += "isXCHLHMCOnTopOfLC: " + (string)mConditions.isXCHLHMCOnTopOfLC + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHLHMCInBottomOfLC))
|
|
{
|
|
result += "isXCHLHMCInBottomOfLC: " + (string)mConditions.isXCHLHMCInBottomOfLC + separator;
|
|
}
|
|
|
|
//
|
|
// Separator ...
|
|
result += separator;
|
|
|
|
//
|
|
// XCHMA ...
|
|
result +=
|
|
"| XCHMA |" + separator;
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCOverMax))
|
|
{
|
|
result += "isXCHMASCOverMax: " + (string)mConditions.isXCHMASCOverMax + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCOverMin))
|
|
{
|
|
result += "isXCHMASCOverMin: " + (string)mConditions.isXCHMASCOverMin + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCUnderMax))
|
|
{
|
|
result += "isXCHMASCUnderMax: " + (string)mConditions.isXCHMASCUnderMax + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCUnderMin))
|
|
{
|
|
result += "isXCHMASCUnderMin: " + (string)mConditions.isXCHMASCUnderMin + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCCrossedOverMax))
|
|
{
|
|
result += "isXCHMASCCrossedOverMax: " + (string)mConditions.isXCHMASCCrossedOverMax + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCCrossedUnderMax))
|
|
{
|
|
result += "isXCHMASCCrossedUnderMax: " + (string)mConditions.isXCHMASCCrossedUnderMax + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCCrossedOverMin))
|
|
{
|
|
result += "isXCHMASCCrossedOverMin: " + (string)mConditions.isXCHMASCCrossedOverMin + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCCrossedUnderMin))
|
|
{
|
|
result += "isXCHMASCCrossedUnderMin: " + (string)mConditions.isXCHMASCCrossedUnderMin + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCPeak))
|
|
{
|
|
result += "isXCHMASCPeak: " + (string)mConditions.isXCHMASCPeak + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCVale))
|
|
{
|
|
result += "isXCHMASCVale: " + (string)mConditions.isXCHMASCVale + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCTrendsUp))
|
|
{
|
|
result += "isXCHMASCTrendsUp: " + (string)mConditions.isXCHMASCTrendsUp + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCTrendsDown))
|
|
{
|
|
result += "isXCHMASCTrendsDown: " + (string)mConditions.isXCHMASCTrendsDown + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCFastOverSlow))
|
|
{
|
|
result += "isXCHMASCFastOverSlow: " + (string)mConditions.isXCHMASCFastOverSlow + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCFastUnderSlow))
|
|
{
|
|
result += "isXCHMASCFastUnderSlow: " + (string)mConditions.isXCHMASCFastUnderSlow + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCFastCrossedOverSlow))
|
|
{
|
|
result += "isXCHMASCFastCrossedOverSlow: " + (string)mConditions.isXCHMASCFastCrossedOverSlow + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMASCFastCrossedUnderSlow))
|
|
{
|
|
result += "isXCHMASCFastCrossedUnderSlow: " + (string)mConditions.isXCHMASCFastCrossedUnderSlow + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMAMCPeak))
|
|
{
|
|
result += "isXCHMAMCPeak: " + (string)mConditions.isXCHMAMCPeak + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMAMCVale))
|
|
{
|
|
result += "isXCHMAMCVale: " + (string)mConditions.isXCHMAMCVale + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMAMCTrendsUp))
|
|
{
|
|
result += "isXCHMAMCTrendsUp: " + (string)mConditions.isXCHMAMCTrendsUp + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMAMCTrendsDown))
|
|
{
|
|
result += "isXCHMAMCTrendsDown: " + (string)mConditions.isXCHMAMCTrendsDown + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMAMCFastOverSlow))
|
|
{
|
|
result += "isXCHMAMCFastOverSlow: " + (string)mConditions.isXCHMAMCFastOverSlow + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMAMCFastUnderSlow))
|
|
{
|
|
result += "isXCHMAMCFastUnderSlow: " + (string)mConditions.isXCHMAMCFastUnderSlow + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMAMCFastCrossedOverSlow))
|
|
{
|
|
result += "isXCHMAMCFastCrossedOverSlow: " + (string)mConditions.isXCHMAMCFastCrossedOverSlow + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMAMCFastCrossedUnderSlow))
|
|
{
|
|
result += "isXCHMAMCFastCrossedUnderSlow: " + (string)mConditions.isXCHMAMCFastCrossedUnderSlow + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMALCPeak))
|
|
{
|
|
result += "isXCHMALCPeak: " + (string)mConditions.isXCHMALCPeak + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMALCVale))
|
|
{
|
|
result += "isXCHMALCVale: " + (string)mConditions.isXCHMALCVale + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMALCTrendsUp))
|
|
{
|
|
result += "isXCHMALCTrendsUp: " + (string)mConditions.isXCHMALCTrendsUp + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMALCTrendsDown))
|
|
{
|
|
result += "isXCHMALCTrendsDown: " + (string)mConditions.isXCHMALCTrendsDown + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMALCFastOverSlow))
|
|
{
|
|
result += "isXCHMALCFastOverSlow: " + (string)mConditions.isXCHMALCFastOverSlow + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMALCFastUnderSlow))
|
|
{
|
|
result += "isXCHMALCFastUnderSlow: " + (string)mConditions.isXCHMALCFastUnderSlow + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMALCFastCrossedOverSlow))
|
|
{
|
|
result += "isXCHMALCFastCrossedOverSlow: " + (string)mConditions.isXCHMALCFastCrossedOverSlow + separator;
|
|
}
|
|
|
|
//
|
|
if (
|
|
!ignoreFalses ||
|
|
(ignoreFalses && mConditions.isXCHMALCFastCrossedUnderSlow))
|
|
{
|
|
result += "isXCHMALCFastCrossedUnderSlow: " + (string)mConditions.isXCHMALCFastCrossedUnderSlow + separator;
|
|
}
|
|
|
|
//
|
|
// Separator ...
|
|
result += separator;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Market Conditions by Combination of Power of All tools for LONGs ...
|
|
bool XEU5HasLongSignal(
|
|
XEU5_SIGNAL &info // Retrieve Signal Additional Info on this Object
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
// //
|
|
// // XCHMA Over Max ...
|
|
// bool chmaSCOverMaxSignal = XEU5XCHMAMaxOverHasLongSignal();
|
|
// if (chmaSCOverMaxSignal)
|
|
// {
|
|
// //
|
|
// info.signalPusher++;
|
|
|
|
// //
|
|
// chmaCyclesMinMaxOverLongSignals++;
|
|
|
|
// //
|
|
// LogMessage("Provider: " + EnumToString(XCHMA_CYCLE_MIN_MAX_OVER));
|
|
// }
|
|
|
|
// //
|
|
// // XCHMA Over Min ...
|
|
// bool chmaSCOverMinSignal = XEU5XCHMAMinOverHasLongSignal();
|
|
// if (chmaSCOverMinSignal)
|
|
// {
|
|
// //
|
|
// info.signalPusher++;
|
|
|
|
// //
|
|
// chmaCyclesMinMaxUnderLongSignals++;
|
|
|
|
// //
|
|
// LogMessage("Provider: " + EnumToString(XCHMA_CYCLE_MIN_MAX_UNDER));
|
|
// }
|
|
|
|
// //
|
|
// // XCHMA Cycles Crosses ...
|
|
// bool chmaCrossingOversSignal = XEU5XCHMACyclesCrossesHasLongSignal();
|
|
// if (chmaCrossingOversSignal)
|
|
// {
|
|
// //
|
|
// info.signalPusher++;
|
|
|
|
// //
|
|
// chmaCyclesCrossLongSignals++;
|
|
|
|
// //
|
|
// LogMessage("Provider: " + EnumToString(XCHMA_CYCLES_CROSSES));
|
|
// }
|
|
|
|
// //
|
|
// // XLH ...
|
|
// bool lhAttachedSignal = XEU5XLHHasLongSignal();
|
|
// if (lhAttachedSignal)
|
|
// {
|
|
// //
|
|
// info.signalPusher++;
|
|
|
|
// //
|
|
// lhAttachedLongSignals++;
|
|
|
|
// //
|
|
// LogMessage("Provider: " + EnumToString(XLH_ATTACHED_SWINGS));
|
|
// }
|
|
|
|
// //
|
|
// // XRSI ...
|
|
// bool rsiSignal = XEU5XRSIHasLongSignal();
|
|
// if (rsiSignal)
|
|
// {
|
|
// //
|
|
// info.signalPusher++;
|
|
|
|
// //
|
|
// rsiLongSignals++;
|
|
|
|
// //
|
|
// LogMessage("Provider: " + EnumToString(XRSI));
|
|
// }
|
|
|
|
// //
|
|
// // XTD ...
|
|
// bool tdSignal = XEU5XTDHasLongSignal();
|
|
// if (tdSignal)
|
|
// {
|
|
// //
|
|
// info.signalPusher++;
|
|
|
|
// //
|
|
// tdLongSignals++;
|
|
|
|
// //
|
|
// LogMessage("Provider: " + EnumToString(XTD));
|
|
// }
|
|
|
|
// //
|
|
// result =
|
|
// //
|
|
// chmaSCOverMinSignal
|
|
// //
|
|
// ||
|
|
// //
|
|
// chmaSCOverMaxSignal
|
|
// //
|
|
// ||
|
|
// //
|
|
// chmaCrossingOversSignal
|
|
// //
|
|
// ||
|
|
// //
|
|
// lhAttachedSignal
|
|
// //
|
|
// ||
|
|
// //
|
|
// rsiSignal
|
|
// //
|
|
// ||
|
|
// //
|
|
// tdSignal
|
|
// //
|
|
// ;
|
|
|
|
//
|
|
if (result)
|
|
{
|
|
//
|
|
// TODO: Remove This for Production ...
|
|
string msg = XEU5GetConditionsString(conditions, "\n");
|
|
LogMessage(msg);
|
|
|
|
//
|
|
LogMessage("Signal Pusher: " + (string)info.signalPusher);
|
|
|
|
// //
|
|
// LogMessage("isMCOverLC: " + (string)isMCOverLC);
|
|
// LogMessage("isMCUnderLC: " + (string)isMCUnderLC);
|
|
// LogMessage("isLCOverMC: " + (string)isLCOverMC);
|
|
// LogMessage("isLCUndrMC: " + (string)isLCUndrMC);
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Market Conditions by Combination of Power of All tools for SHORTs ...
|
|
bool XEU5HasShortSignal(
|
|
XEU5_SIGNAL &info // Retrieve Signal Additional Info on this Object
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// XCHMA Over Max ...
|
|
bool chmaSCOverMaxSignal = XEU5XCHMAMaxOverHasShortSignal();
|
|
if (chmaSCOverMaxSignal)
|
|
{
|
|
//
|
|
info.signalPusher++;
|
|
|
|
//
|
|
chmaCyclesMinMaxOverShortSignals++;
|
|
|
|
//
|
|
LogMessage("Provider: " + EnumToString(XCHMA_CYCLE_MIN_MAX_OVER));
|
|
}
|
|
|
|
//
|
|
// XCHMA Over Min ...
|
|
bool chmaSCOverMinSignal = XEU5XCHMAMinOverHasShortSignal();
|
|
if (chmaSCOverMinSignal)
|
|
{
|
|
//
|
|
info.signalPusher++;
|
|
|
|
//
|
|
chmaCyclesMinMaxUnderShortSignals++;
|
|
|
|
//
|
|
LogMessage("Provider: " + EnumToString(XCHMA_CYCLE_MIN_MAX_UNDER));
|
|
}
|
|
|
|
//
|
|
// XCHMA Cycles Crosses ...
|
|
bool chmaCrossingOversSignal = XEU5XCHMACyclesCrossesHasShortSignal();
|
|
if (chmaCrossingOversSignal)
|
|
{
|
|
//
|
|
info.signalPusher++;
|
|
|
|
//
|
|
chmaCyclesCrossShortSignals++;
|
|
|
|
//
|
|
LogMessage("Provider: " + EnumToString(XCHMA_CYCLES_CROSSES));
|
|
}
|
|
|
|
//
|
|
// XLH ...
|
|
bool lhAttachedSignal = XEU5XLHHasShortSignal();
|
|
if (lhAttachedSignal)
|
|
{
|
|
//
|
|
info.signalPusher++;
|
|
|
|
//
|
|
lhAttachedShortSignals++;
|
|
|
|
//
|
|
LogMessage("Provider: " + EnumToString(XLH_ATTACHED_SWINGS));
|
|
}
|
|
|
|
//
|
|
// XRSI ...
|
|
bool rsiSignal = XEU5XRSIHasShortSignal();
|
|
if (rsiSignal)
|
|
{
|
|
//
|
|
info.signalPusher++;
|
|
|
|
//
|
|
rsiShortSignals++;
|
|
|
|
//
|
|
LogMessage("Provider: " + EnumToString(XRSI));
|
|
}
|
|
|
|
//
|
|
// XTD ...
|
|
bool tdSignal = XEU5XTDHasShortSignal();
|
|
if (tdSignal)
|
|
{
|
|
//
|
|
info.signalPusher++;
|
|
|
|
//
|
|
tdShortSignals++;
|
|
|
|
//
|
|
LogMessage("Provider: " + EnumToString(XTD));
|
|
}
|
|
|
|
//
|
|
result =
|
|
// //
|
|
// chmaSCOverMinSignal
|
|
// //
|
|
// ||
|
|
// //
|
|
// chmaSCOverMaxSignal
|
|
// //
|
|
// ||
|
|
// //
|
|
// chmaCrossingOversSignal
|
|
// //
|
|
// ||
|
|
// //
|
|
// lhAttachedSignal
|
|
// //
|
|
// ||
|
|
//
|
|
rsiSignal
|
|
//
|
|
// ||
|
|
// //
|
|
// tdSignal
|
|
//
|
|
;
|
|
|
|
//
|
|
if (result)
|
|
{
|
|
//
|
|
// TODO: Remove This for Production ...
|
|
string msg = XEU5GetConditionsString(conditions, "\n");
|
|
LogMessage(msg);
|
|
|
|
//
|
|
LogMessage("Signal Pusher: " + (string)info.signalPusher);
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
//
|
|
// END Combination Signaling ...
|
|
//
|
|
//
|
|
|
|
//
|
|
// START Signal Providers ...
|
|
//
|
|
|
|
//
|
|
// XTD Long ...
|
|
bool XEU5XTDHasLongSignal()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
result =
|
|
//
|
|
conditions.isXTDSignalCrossedOverBear &&
|
|
//
|
|
!conditions.isXLHHighAttachedHH &&
|
|
!conditions.isXLHPriceInSignalRange &&
|
|
//
|
|
!conditions.isXCHMAMCPeak &&
|
|
!conditions.isXCHMALCPeak &&
|
|
!conditions.isXCHMAMCFastUnderSlow &&
|
|
!conditions.isXCHMALCFastUnderSlow &&
|
|
!conditions.isXCHMAMCFastCrossedUnderSlow &&
|
|
!conditions.isXCHMALCFastCrossedUnderSlow
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMASCOverMax &&
|
|
conditions.isXCHMASCUnderMax
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHLHSameHHs &&
|
|
conditions.isXLHPriceOverSignal
|
|
//
|
|
)
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XTD Short ...
|
|
bool XEU5XTDHasShortSignal()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
//
|
|
conditions.isXTDSignalCrossedUnderBear
|
|
//
|
|
&&
|
|
//
|
|
!conditions.isXLHLowAttachedLL &&
|
|
!conditions.isXLHPriceInSignalRange &&
|
|
//
|
|
!conditions.isXCHMAMCVale &&
|
|
!conditions.isXCHMALCVale &&
|
|
!conditions.isXCHMAMCFastOverSlow &&
|
|
!conditions.isXCHMALCFastOverSlow &&
|
|
!conditions.isXCHMAMCFastCrossedOverSlow &&
|
|
!conditions.isXCHMALCFastCrossedOverSlow
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMASCTrendsDown &&
|
|
conditions.isXCHMAMCTrendsDown &&
|
|
conditions.isXCHMALCTrendsDown &&
|
|
conditions.isXCHMASCFastUnderSlow &&
|
|
conditions.isXCHMAMCFastUnderSlow &&
|
|
conditions.isXCHMALCFastUnderSlow
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMAMCPeak &&
|
|
conditions.isXCHMALCPeak &&
|
|
conditions.isXCHMAMCTrendsDown &&
|
|
conditions.isXCHMALCTrendsDown &&
|
|
conditions.isXCHMALCFastUnderSlow &&
|
|
conditions.isXCHMAMCFastUnderSlow
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMAMCPeak &&
|
|
conditions.isXLHHHSameInLength &&
|
|
conditions.isXLHLLSameInLength &&
|
|
conditions.isXCHMAMCTrendsDown &&
|
|
conditions.isXCHMAMCFastUnderSlow
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
!(
|
|
//
|
|
conditions.isXCHMASCOverMin &&
|
|
conditions.isXCHMASCUnderMin
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
!(
|
|
//
|
|
conditions.isXCHMASCUnderMax &&
|
|
conditions.isXCHMASCUnderMin &&
|
|
conditions.isXLHHHSameInLength &&
|
|
conditions.isXLHLLSameInLength &&
|
|
conditions.isXCHMALCTrendsDown &&
|
|
conditions.isXLHPriceOverSignal &&
|
|
conditions.isXCHMALCFastUnderSlow
|
|
//
|
|
)
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XRSI Long ...
|
|
bool XEU5XRSIHasLongSignal()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
//
|
|
conditions.isXRSICrossedOverLongEntry &&
|
|
xRSIBuffer[3] < xRSILongEntryValue
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXTMVale &&
|
|
conditions.isXCHMASCFastUnderSlow
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMASCOverMin &&
|
|
conditions.isXCHMASCUnderMin
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMASCUnderMin
|
|
? !(
|
|
//
|
|
conditions.isXCHMASCTrendsUp &&
|
|
conditions.isXCHMASCFastUnderSlow
|
|
//
|
|
) &&
|
|
!(
|
|
//
|
|
conditions.isXTMVale &&
|
|
conditions.isXCHMAMCVale &&
|
|
conditions.isXCHMAMCTrendsUp &&
|
|
conditions.isXCHMAMCFastUnderSlow
|
|
//
|
|
)
|
|
: true
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMASCVale ||
|
|
conditions.isXCHMASCFastCrossedUnderSlow
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMAMCFastOverSlow
|
|
? !conditions.isXCHMAMCTrendsDown
|
|
: true
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXTMVale &&
|
|
conditions.isXCHMAMCVale &&
|
|
conditions.isXCHMALCPeak
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMASCUnderMin
|
|
? !(
|
|
//
|
|
conditions.isXTMVale &&
|
|
conditions.isXTDBearishVale &&
|
|
conditions.isXLHHHSameInLength &&
|
|
conditions.isXLHLLSameInLength
|
|
//
|
|
)
|
|
: true
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMALCPeak &&
|
|
conditions.isXCHMAMCVale &&
|
|
conditions.isXLHHHDecreased &&
|
|
conditions.isXLHHHSameInLength &&
|
|
conditions.isXLHLLSameInLength
|
|
//
|
|
)
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XRSI Short ...
|
|
bool XEU5XRSIHasShortSignal()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
//
|
|
conditions.isXRSICrossedUnderShortEntry &&
|
|
xRSIBuffer[3] > xRSIShortEntryValue &&
|
|
!conditions.isXOBDSwingHigh
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMASCPeak &&
|
|
conditions.isXCHMAMCPeak &&
|
|
conditions.isXCHMALCPeak
|
|
//
|
|
)
|
|
//
|
|
||
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMAMCPeak &&
|
|
conditions.isXCHMALCPeak
|
|
//
|
|
)
|
|
//
|
|
||
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMASCPeak &&
|
|
conditions.isXCHMAMCPeak
|
|
//
|
|
)
|
|
//
|
|
||
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMAMCTrendsDown &&
|
|
conditions.isXCHMALCTrendsDown &&
|
|
conditions.isXCHMAMCFastUnderSlow &&
|
|
conditions.isXCHMALCFastUnderSlow
|
|
//
|
|
)
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMAMCPeak &&
|
|
conditions.isXCHLHSameHHs &&
|
|
conditions.isXCHMASCTrendsUp &&
|
|
conditions.isXCHMAMCTrendsUp &&
|
|
conditions.isXCHMASCFastOverSlow &&
|
|
conditions.isXCHMAMCFastOverSlow
|
|
//
|
|
)
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XLH Long ...
|
|
bool XEU5XLHHasLongSignal()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
double entry = GetEntry(X_SIGNAL_LONG);
|
|
XEU5_MARKET_CONDITIONS conditions2 = XEU5GenerateMarketConditions(2);
|
|
|
|
//
|
|
result =
|
|
//
|
|
conditions2.isXOBDSwingLow &&
|
|
conditions2.isXLHLowAttachedLL &&
|
|
xLHLLBuffer[1] >= xLHLLBuffer[2] &&
|
|
//
|
|
(
|
|
//
|
|
conditions.isXLHPriceUnderSignal
|
|
? entry < xLHSignalBuffer[1]
|
|
: true
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMASCOverMin &&
|
|
conditions.isXCHMASCUnderMin
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMASCOverMin &&
|
|
conditions.isXCHMASCUnderMax &&
|
|
conditions.isXCHMASCFastUnderSlow
|
|
? !(
|
|
//
|
|
conditions.isXCHMAMCTrendsDown &&
|
|
conditions.isXCHMAMCFastOverSlow &&
|
|
conditions.isXCHMALCTrendsDown &&
|
|
conditions.isXCHMALCFastOverSlow
|
|
//
|
|
)
|
|
: true
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXTMVale &&
|
|
conditions.isXTDBullUnderBear &&
|
|
conditions.isXLHLLDecreased &&
|
|
conditions.isXCHMASCVale &&
|
|
conditions.isXCHMAMCVale &&
|
|
conditions.isXCHMALCVale
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMASCUnderMin
|
|
? !(
|
|
//
|
|
conditions.isXCHMAMCVale &&
|
|
conditions.isXCHMALCVale
|
|
//
|
|
)
|
|
: true
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMASCUnderMin &&
|
|
conditions.isXCHMASCFastUnderSlow &&
|
|
conditions.isXCHMAMCFastUnderSlow &&
|
|
conditions.isXCHMALCFastUnderSlow
|
|
? !conditions.isXCHMASCTrendsUp
|
|
: true
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXTMVale &&
|
|
conditions.isXLHHHDecreased &&
|
|
conditions.isXCHLHSameLLs &&
|
|
conditions.isXCHMASCOverMin &&
|
|
conditions.isXCHMASCUnderMax &&
|
|
conditions.isXCHMAMCVale &&
|
|
conditions.isXCHMAMCTrendsUp &&
|
|
conditions.isXCHMAMCFastUnderSlow
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMAMCVale &&
|
|
conditions.isXCHMALCPeak &&
|
|
conditions.isXCHMALCFastOverSlow &&
|
|
conditions.isXCHMAMCFastUnderSlow
|
|
//
|
|
)
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XLH Short ...
|
|
bool XEU5XLHHasShortSignal()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XCHMA Max Over Long ...
|
|
bool XEU5XCHMAMaxOverHasLongSignal()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Required Data ...
|
|
double entry = GetEntry(X_SIGNAL_LONG);
|
|
double nearHH = GetHighestHigh(3, 1);
|
|
double nearLL = GetLowestLow(3, 1);
|
|
|
|
//
|
|
ENUM_XCHMA_CYCLES cycles[];
|
|
Add(
|
|
X_XCHMA_CYCLE_MEDIUM,
|
|
cycles);
|
|
Add(
|
|
X_XCHMA_CYCLE_LONG,
|
|
cycles);
|
|
|
|
//
|
|
double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles);
|
|
double xCHMANonSCMin2 = XCHMAGetCyclesMinValue(2, cycles);
|
|
|
|
//
|
|
double xCHMANonSCMax3 = XCHMAGetCyclesMaxValue(3, cycles);
|
|
double xCHMANonSCMin3 = XCHMAGetCyclesMinValue(3, cycles);
|
|
|
|
//
|
|
result =
|
|
//
|
|
conditions.isXCHMASCCrossedOverMax &&
|
|
xCHMAScFastBuffer[2] < xCHMANonSCMax2 &&
|
|
xCHMAScSlowBuffer[2] < xCHMANonSCMax2 &&
|
|
MathAbs(xCHMANonSCMax2 - xCHMAScFastBuffer[2]) > MathAbs(xCHMAScFastBuffer[2] - xCHMAScSlowBuffer[2]) &&
|
|
MathAbs(xCHMANonSCMax2 - xCHMAScSlowBuffer[2]) > MathAbs(xCHMAScFastBuffer[2] - xCHMAScSlowBuffer[2])
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXLHPriceInSignalRange &&
|
|
conditions.isXLHHighAttachedHH
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMAMCPeak &&
|
|
conditions.isXCHMALCPeak
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHLHSameHHs &&
|
|
conditions.isXCHMALCTrendsDown &&
|
|
conditions.isXLHHighAttachedHH &&
|
|
conditions.isXCHMALCFastUnderSlow
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHLHSCMCHHSame &&
|
|
conditions.isXCHLHMCOnTopOfLC &&
|
|
conditions.isXLHHighAttachedHH &&
|
|
conditions.isXLHLLSameInLength
|
|
? entry < nearHH
|
|
: true
|
|
//
|
|
)
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XCHMA Max Over Short ...
|
|
bool XEU5XCHMAMaxOverHasShortSignal()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XCHMA Min Under Long ...
|
|
bool XEU5XCHMAMinOverHasLongSignal()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Required Data ...
|
|
double entry = GetEntry(X_SIGNAL_LONG);
|
|
double nearHH = GetHighestHigh(3, 1);
|
|
double nearLL = GetLowestLow(3, 1);
|
|
|
|
//
|
|
ENUM_XCHMA_CYCLES cycles[];
|
|
Add(
|
|
X_XCHMA_CYCLE_MEDIUM,
|
|
cycles);
|
|
Add(
|
|
X_XCHMA_CYCLE_LONG,
|
|
cycles);
|
|
|
|
//
|
|
double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles);
|
|
double xCHMANonSCMin2 = XCHMAGetCyclesMinValue(2, cycles);
|
|
|
|
//
|
|
double xCHMANonSCMax3 = XCHMAGetCyclesMaxValue(3, cycles);
|
|
double xCHMANonSCMin3 = XCHMAGetCyclesMinValue(3, cycles);
|
|
|
|
//
|
|
result =
|
|
//
|
|
conditions.isXCHMASCCrossedOverMin &&
|
|
xCHMAScFastBuffer[2] < xCHMANonSCMin2 &&
|
|
xCHMAScSlowBuffer[2] < xCHMANonSCMin2 &&
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMASCOverMin &&
|
|
conditions.isXCHMASCUnderMax
|
|
? !(
|
|
//
|
|
XCHMAGetCycleMaxValue(1, X_XCHMA_CYCLE_MEDIUM) < XCHMAGetCycleMaxValue(1, X_XCHMA_CYCLE_LONG) &&
|
|
XCHMAGetCycleMinValue(1, X_XCHMA_CYCLE_MEDIUM) > XCHMAGetCycleMinValue(1, X_XCHMA_CYCLE_LONG)
|
|
//
|
|
)
|
|
: true
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMALCVale &&
|
|
conditions.isXLHHighAttachedHH
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMALCVale &&
|
|
conditions.isXCHMAMCTrendsDown &&
|
|
conditions.isXCHMAMCFastOverSlow &&
|
|
conditions.isXCHMALCFastUnderSlow
|
|
? !conditions.isXLHPriceInSignalRange
|
|
: true
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHLHSCMCHHSame &&
|
|
conditions.isXLHHighAttachedHH &&
|
|
conditions.isXLHPriceOverSignal
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMALCVale &&
|
|
conditions.isXCHMAMCTrendsDown &&
|
|
conditions.isXCHMALCTrendsDown &&
|
|
conditions.isXCHMAMCFastUnderSlow &&
|
|
conditions.isXCHMALCFastUnderSlow
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMAMCVale &&
|
|
conditions.isXCHMALCVale &&
|
|
conditions.isXCHMAMCTrendsDown &&
|
|
conditions.isXCHMALCTrendsDown
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXTDBullOverBear &&
|
|
conditions.isXCHLHSCMCHHSame &&
|
|
conditions.isXCHLHSCMCLLSame &&
|
|
conditions.isXRSICrossedOverLongExit
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXLHHHSameInLength &&
|
|
conditions.isXLHLLSameInLength &&
|
|
conditions.isXCHMAMCTrendsDown &&
|
|
conditions.isXCHMALCTrendsDown &&
|
|
conditions.isXCHMAMCFastOverSlow &&
|
|
conditions.isXCHMALCFastUnderSlow
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXTDBearishVale &&
|
|
conditions.isXTDBullOverBear &&
|
|
conditions.isXLHHHSameInLength &&
|
|
conditions.isXLHLLSameInLength &&
|
|
conditions.isXCHMAMCTrendsDown &&
|
|
conditions.isXCHMAMCFastOverSlow &&
|
|
conditions.isXCHMALCVale &&
|
|
conditions.isXCHMALCTrendsDown &&
|
|
conditions.isXCHMALCFastUnderSlow
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMAMCTrendsDown &&
|
|
conditions.isXCHMALCTrendsDown &&
|
|
conditions.isXCHMAMCFastOverSlow &&
|
|
conditions.isXCHMALCFastOverSlow
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
!(
|
|
//
|
|
conditions.isXCHMALCVale &&
|
|
conditions.isXCHMAMCTrendsDown &&
|
|
conditions.isXCHMALCTrendsDown &&
|
|
conditions.isXCHMAMCFastOverSlow &&
|
|
conditions.isXCHMALCFastUnderSlow
|
|
//
|
|
)
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XCHMA Min Over Short ...
|
|
bool XEU5XCHMAMinOverHasShortSignal()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XCHMA Cycles Crosses Long ...
|
|
bool XEU5XCHMACyclesCrossesHasLongSignal()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Required Data ...
|
|
double entry = GetEntry(X_SIGNAL_LONG);
|
|
double nearHH = GetHighestHigh(3, 1);
|
|
double nearLL = GetLowestLow(3, 1);
|
|
|
|
//
|
|
bool isSharpChanged = IsSharpIncreasedChanged(
|
|
5,
|
|
1,
|
|
xTMMaBuffer);
|
|
|
|
//
|
|
bool isCandleSharpChanged = IsSharpIncreasedChanged(
|
|
5,
|
|
1,
|
|
PRICE_CLOSE);
|
|
|
|
//
|
|
ENUM_XCHMA_CYCLES cycles[];
|
|
Add(
|
|
X_XCHMA_CYCLE_MEDIUM,
|
|
cycles);
|
|
Add(
|
|
X_XCHMA_CYCLE_LONG,
|
|
cycles);
|
|
|
|
//
|
|
double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles);
|
|
double xCHMANonSCMin2 = XCHMAGetCyclesMinValue(2, cycles);
|
|
|
|
//
|
|
double xCHMANonSCMax3 = XCHMAGetCyclesMaxValue(3, cycles);
|
|
double xCHMANonSCMin3 = XCHMAGetCyclesMinValue(3, cycles);
|
|
|
|
//
|
|
result =
|
|
//
|
|
xCHMAScFastBuffer[1] > xCHMAScSlowBuffer[1] &&
|
|
xCHMAMcFastBuffer[1] > xCHMAMcSlowBuffer[1] &&
|
|
xCHMALcFastBuffer[1] > xCHMALcSlowBuffer[1] &&
|
|
//
|
|
xCHMAScFastBuffer[2] > xCHMAScSlowBuffer[2] &&
|
|
xCHMAMcFastBuffer[2] > xCHMAMcSlowBuffer[2] &&
|
|
xCHMALcFastBuffer[2] > xCHMALcSlowBuffer[2] &&
|
|
//
|
|
!(
|
|
//
|
|
xCHMAScFastBuffer[3] > xCHMAScSlowBuffer[3] &&
|
|
xCHMAMcFastBuffer[3] > xCHMAMcSlowBuffer[3] &&
|
|
xCHMALcFastBuffer[3] > xCHMALcSlowBuffer[3]
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
(
|
|
//
|
|
XCHMAIsSCFastCrossedOverSlow(2)
|
|
? XCHMAGetSCTrendPower(1) <= (XCHMAGetSCTrendPower(2) * 2)
|
|
: true
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMASCOverMax
|
|
? XCHMAGetSCTrendPower(2) <= (xCHMANonSCMax2 - xCHMANonSCMin2)
|
|
: true
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!conditions.isXCHMAMCTrendsDown
|
|
//
|
|
&&
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMASCCrossedOverMax || conditions.isXLHPriceOverSignal
|
|
? !isCandleSharpChanged
|
|
: true
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
!(
|
|
//
|
|
conditions.isXCHMAMCPeak &&
|
|
conditions.isXCHMALCPeak
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
(
|
|
//
|
|
conditions.isXLHHighAttachedHH &&
|
|
conditions.isXLHHHSameInLength &&
|
|
conditions.isXLHLLSameInLength
|
|
? entry < nearHH
|
|
: true
|
|
//
|
|
)
|
|
//
|
|
&&
|
|
//
|
|
(
|
|
//
|
|
conditions.isXCHMASCOverMax &&
|
|
conditions.isXCHMASCFastOverSlow
|
|
? !conditions.isXCHMASCTrendsDown
|
|
: true)
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XCHMA Cycles Crosses Short ...
|
|
bool XEU5XCHMACyclesCrossesHasShortSignal()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// END Signal Providers ...
|
|
// |