last works on create X121Setup ...
This commit is contained in:
@@ -0,0 +1,678 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// ----------------------------------------------
|
||||
// Name: XADXTD
|
||||
// Description: provides Indicator implementation
|
||||
// requirements ...
|
||||
//
|
||||
//
|
||||
// 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
|
||||
|
||||
//
|
||||
// Imports ...
|
||||
#include "../Classes/x-saherelm.base.class.mq5"
|
||||
|
||||
//
|
||||
// Indicator Buffers ...
|
||||
enum ENUM_XADXTD_BUFFERS
|
||||
{
|
||||
XADXTD_STRENGTH_LINE = 0, // Strenght Buffer ...
|
||||
XADXTD_BULL_LINE = 1, // Bull Buffer ...
|
||||
XADXTD_BEAR_LINE = 2, // Bear Buffer ...
|
||||
};
|
||||
|
||||
//
|
||||
string GetTitle(ENUM_XADXTD_BUFFERS bufferLine)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
switch (bufferLine)
|
||||
{
|
||||
//
|
||||
case XADXTD_STRENGTH_LINE:
|
||||
result = "XStrength";
|
||||
break;
|
||||
|
||||
//
|
||||
case XADXTD_BULL_LINE:
|
||||
result = "XBull";
|
||||
break;
|
||||
|
||||
//
|
||||
case XADXTD_BEAR_LINE:
|
||||
result = "XBear";
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// XADXTD Indicator Inputs ...
|
||||
struct XADXTDInputs
|
||||
{
|
||||
//
|
||||
// Props ...
|
||||
string version;
|
||||
|
||||
//
|
||||
// Market ...
|
||||
|
||||
//
|
||||
int length; // Length
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
XADXTDInputs()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// Initial Inputs ...
|
||||
bool Init(
|
||||
int _length = 21 // Length
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
this.length = _length;
|
||||
|
||||
//
|
||||
result = IsValid();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup ...
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
length = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Default ...
|
||||
void Default()
|
||||
{
|
||||
//
|
||||
length = 21;
|
||||
}
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
bool IsValid()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
length > 0
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Retrieve Max Length ...
|
||||
int Max()
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
int values[1] = {
|
||||
length //
|
||||
};
|
||||
|
||||
//
|
||||
result = GetMax(values);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Define Conditions ...
|
||||
struct XADXTDConditions
|
||||
{
|
||||
//
|
||||
// Common ...
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
datetime time;
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
double strength[];
|
||||
double bullp[];
|
||||
double bearp[];
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
bool isStrong;
|
||||
bool isBullish;
|
||||
bool isBearish;
|
||||
bool isSwitchedToBullish;
|
||||
bool isSwitchedToBearish;
|
||||
bool isStrongSwitchedToBullish;
|
||||
bool isStrongSwitchedToBearish;
|
||||
|
||||
//
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
Clean(strength);
|
||||
Clean(bullp);
|
||||
Clean(bearp);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(strength, true);
|
||||
ArraySetAsSeries(bullp, true);
|
||||
ArraySetAsSeries(bearp, true);
|
||||
|
||||
//
|
||||
isStrong = false;
|
||||
isBullish = false;
|
||||
isBearish = false;
|
||||
isSwitchedToBullish = false;
|
||||
isSwitchedToBearish = false;
|
||||
isStrongSwitchedToBullish = false;
|
||||
isStrongSwitchedToBearish = false;
|
||||
}
|
||||
|
||||
//
|
||||
void GenerateScore(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
bullishScore = 0;
|
||||
bearishScore = 0;
|
||||
|
||||
//
|
||||
if (isBullish)
|
||||
{
|
||||
//
|
||||
bullishScore++;
|
||||
if (isStrong)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
}
|
||||
if (isBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
if (isStrong)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
if (isSwitchedToBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
if (isStrong)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
}
|
||||
if (isSwitchedToBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
if (isStrong)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
if (isStrongSwitchedToBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isStrongSwitchedToBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateSummary(
|
||||
bool onlyCommons = false,
|
||||
bool onlyConditions = false,
|
||||
bool includeScores = true,
|
||||
bool ignoreFalseConditions = true,
|
||||
string separator = "\n" //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
string scoresStr =
|
||||
//
|
||||
"Scores: " + separator +
|
||||
"---------------" + separator +
|
||||
"Bullish: " + ToString(bullishScore) + separator +
|
||||
"Bearish: " + ToString(bearishScore) + separator +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
string commonStr = GenerateSpecifiedCommonSummary(
|
||||
this,
|
||||
separator,
|
||||
includeScores //
|
||||
);
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
ToString("isStrong", isStrong, ignoreFalseConditions, separator) +
|
||||
ToString("isBullish", isBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isBearish", isBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isSwitchedToBullish", isSwitchedToBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isSwitchedToBearish", isSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isStrongSwitchedToBullish", isStrongSwitchedToBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isStrongSwitchedToBearish", isStrongSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
"[" + GetTag() + "]" + separator +
|
||||
(onlyConditions
|
||||
? ""
|
||||
: commonStr) +
|
||||
(!includeScores
|
||||
? ""
|
||||
: scoresStr) +
|
||||
" " + separator +
|
||||
(onlyCommons
|
||||
? ""
|
||||
: conditionsStr) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetTag()
|
||||
{
|
||||
return "XADXTD";
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Indicator Class ...
|
||||
|
||||
class XSCXADXTDHelper : public XSCBase
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
// Constructor(s) ...
|
||||
void XSCXADXTDHelper(
|
||||
string symbol, // Trading Symbol
|
||||
ENUM_TIMEFRAMES period // Trading TimeFrame
|
||||
)
|
||||
{
|
||||
//
|
||||
mSymbol = symbol;
|
||||
mPeriod = period;
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
void ~XSCXADXTDHelper() {}
|
||||
|
||||
//
|
||||
// Initialize Indicator ...
|
||||
bool Init(
|
||||
XADXTDInputs &inputs // Indicator Properties
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = inputs.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Set Inputs ...
|
||||
this.mInputs = inputs;
|
||||
|
||||
//
|
||||
// Validate Indicator State ...
|
||||
result = this.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = DefineBuffers();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
handler = iADX(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
mInputs.length //
|
||||
);
|
||||
result = handler != INVALID_HANDLE;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XADXTDInputs GetInputs()
|
||||
{
|
||||
return mInputs;
|
||||
}
|
||||
|
||||
//
|
||||
bool SetInputs(
|
||||
XADXTDInputs &inputs // Indicator Properties
|
||||
)
|
||||
{
|
||||
return Init(inputs);
|
||||
}
|
||||
|
||||
//
|
||||
// Get Tag ...
|
||||
string GetTag()
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
result = GetToken();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Get Token ...
|
||||
string GetToken()
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
result = GetSpecificToken(this);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetSymbol()
|
||||
{
|
||||
return mSymbol;
|
||||
}
|
||||
|
||||
//
|
||||
ENUM_TIMEFRAMES GetPeriod()
|
||||
{
|
||||
return mPeriod;
|
||||
}
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
bool IsValid()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
mInputs.IsValid() &&
|
||||
IsSpecifiedValid(mPeriod) &&
|
||||
IsSpecifiedValid(mSymbol)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// De Initialize Class ...
|
||||
void DeInit(int reason)
|
||||
{
|
||||
//
|
||||
IndicatorRelease(handler);
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
int CopyData(
|
||||
ENUM_XADXTD_BUFFERS line,
|
||||
double &dest[],
|
||||
int start = 0,
|
||||
int count = 1 //
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
int mLine = -1;
|
||||
switch (line)
|
||||
{
|
||||
//
|
||||
case XADXTD_STRENGTH_LINE:
|
||||
mLine = MAIN_LINE;
|
||||
break;
|
||||
|
||||
//
|
||||
case XADXTD_BULL_LINE:
|
||||
mLine = PLUSDI_LINE;
|
||||
break;
|
||||
|
||||
//
|
||||
case XADXTD_BEAR_LINE:
|
||||
mLine = MINUSDI_LINE;
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
if (mLine == -1 || handler == INVALID_HANDLE)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = CopyBuffer(
|
||||
handler,
|
||||
mLine,
|
||||
start,
|
||||
count,
|
||||
dest //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool GetConditions(
|
||||
XADXTDConditions &conditions, //
|
||||
int barIndex = 0, //
|
||||
int loopback = 3 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = true;
|
||||
|
||||
//
|
||||
if (loopback < 3)
|
||||
{
|
||||
loopback = 3;
|
||||
}
|
||||
|
||||
//
|
||||
conditions.Clean();
|
||||
|
||||
//
|
||||
conditions.symbol = mSymbol;
|
||||
conditions.period = mPeriod;
|
||||
conditions.time = TimeCurrent();
|
||||
|
||||
//
|
||||
int zIndex = barIndex;
|
||||
int cIndex = zIndex + 1;
|
||||
int pIndex = cIndex + 1;
|
||||
int ppIndex = pIndex + 1;
|
||||
|
||||
//
|
||||
CopyData(
|
||||
XADXTD_STRENGTH_LINE,
|
||||
conditions.strength,
|
||||
zIndex,
|
||||
loopback //
|
||||
);
|
||||
CopyData(
|
||||
XADXTD_BULL_LINE,
|
||||
conditions.bullp,
|
||||
zIndex,
|
||||
loopback //
|
||||
);
|
||||
CopyData(
|
||||
XADXTD_BEAR_LINE,
|
||||
conditions.bearp,
|
||||
zIndex,
|
||||
loopback //
|
||||
);
|
||||
|
||||
//
|
||||
// Calculate Conditions ...
|
||||
|
||||
//
|
||||
bool isStrong = conditions.strength[cIndex] >= 20;
|
||||
|
||||
//
|
||||
bool isBullish = conditions.bullp[cIndex] > conditions.bearp[cIndex];
|
||||
bool isBearish = conditions.bearp[cIndex] > conditions.bullp[cIndex];
|
||||
|
||||
//
|
||||
bool isBullishPrev = conditions.bullp[pIndex] > conditions.bearp[pIndex];
|
||||
bool isBearishPrev = conditions.bearp[pIndex] > conditions.bullp[pIndex];
|
||||
|
||||
//
|
||||
bool isSwitchedToBullish = isBullish &&
|
||||
!isBullishPrev;
|
||||
bool isSwitchedToBearish = isBearish &&
|
||||
!isBearishPrev;
|
||||
|
||||
//
|
||||
bool isStrongSwitchedToBullish = isStrong &&
|
||||
isSwitchedToBullish;
|
||||
bool isStrongSwitchedToBearish = isStrong &&
|
||||
isSwitchedToBearish;
|
||||
|
||||
//
|
||||
conditions.isStrong = isStrong;
|
||||
conditions.isBullish = isBullish;
|
||||
conditions.isBearish = isBearish;
|
||||
conditions.isSwitchedToBullish = isSwitchedToBullish;
|
||||
conditions.isSwitchedToBearish = isSwitchedToBearish;
|
||||
conditions.isStrongSwitchedToBullish = isStrongSwitchedToBullish;
|
||||
conditions.isStrongSwitchedToBearish = isStrongSwitchedToBearish;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
// Props ...
|
||||
int handler;
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
bool DefineBuffers()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = true;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
//
|
||||
// Props ...
|
||||
//
|
||||
string mSymbol; // Symbol
|
||||
ENUM_TIMEFRAMES mPeriod; // TimeFrame
|
||||
|
||||
//
|
||||
XADXTDInputs mInputs; // Properties
|
||||
};
|
||||
|
||||
//
|
||||
@@ -122,6 +122,143 @@ struct XASCTInputs
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Define Conditions ...
|
||||
struct XASCTConditions
|
||||
{
|
||||
//
|
||||
// Common ...
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
datetime time;
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
double longSignal[];
|
||||
double shortSignal[];
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
bool isLongSignal;
|
||||
bool isShortSignal;
|
||||
|
||||
//
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
Clean(longSignal);
|
||||
Clean(shortSignal);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(longSignal, true);
|
||||
ArraySetAsSeries(shortSignal, true);
|
||||
|
||||
//
|
||||
isLongSignal = false;
|
||||
isShortSignal = false;
|
||||
}
|
||||
|
||||
//
|
||||
void GenerateScore(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
bullishScore = 0;
|
||||
bearishScore = 0;
|
||||
|
||||
//
|
||||
if (isLongSignal)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
|
||||
//
|
||||
if (isShortSignal)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateSummary(
|
||||
bool onlyCommons = false,
|
||||
bool onlyConditions = false,
|
||||
bool includeScores = true,
|
||||
bool ignoreFalseConditions = true,
|
||||
string separator = "\n" //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
string scoresStr =
|
||||
//
|
||||
"Scores: " + separator +
|
||||
"---------------" + separator +
|
||||
"Bullish: " + ToString(bullishScore) + separator +
|
||||
"Bearish: " + ToString(bearishScore) + separator +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
string commonStr = GenerateSpecifiedCommonSummary(
|
||||
this,
|
||||
separator,
|
||||
includeScores //
|
||||
);
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
ToString("isLongSignal", isLongSignal, ignoreFalseConditions, separator) +
|
||||
ToString("isShortSignal", isShortSignal, ignoreFalseConditions, separator) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
"[" + GetTag() + "]" + separator +
|
||||
(onlyConditions
|
||||
? ""
|
||||
: commonStr) +
|
||||
(!includeScores
|
||||
? ""
|
||||
: scoresStr) +
|
||||
" " + separator +
|
||||
(onlyCommons
|
||||
? ""
|
||||
: conditionsStr) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetTag()
|
||||
{
|
||||
return "XASCT";
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Class ...
|
||||
class XSCXASCTHelper : public XSCBaseHelper
|
||||
@@ -325,6 +462,66 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
bool GetConditions(
|
||||
XASCTConditions &conditions, //
|
||||
int barIndex = 0, //
|
||||
int loopback = 3 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = true;
|
||||
|
||||
//
|
||||
if (loopback < 3)
|
||||
{
|
||||
loopback = 3;
|
||||
}
|
||||
|
||||
//
|
||||
conditions.Clean();
|
||||
|
||||
//
|
||||
conditions.symbol = mSymbol;
|
||||
conditions.period = mPeriod;
|
||||
conditions.time = TimeCurrent();
|
||||
|
||||
//
|
||||
int zIndex = barIndex;
|
||||
int cIndex = zIndex + 1;
|
||||
int pIndex = cIndex + 1;
|
||||
int ppIndex = pIndex + 1;
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
|
||||
//
|
||||
CopyLong(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.longSignal //
|
||||
);
|
||||
CopyShort(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.shortSignal //
|
||||
);
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
bool isLongSignal = NotEmptyZero(conditions.longSignal[cIndex]);
|
||||
bool isShortSignal = NotEmptyZero(conditions.shortSignal[cIndex]);
|
||||
|
||||
//
|
||||
conditions.isLongSignal = isLongSignal;
|
||||
conditions.isShortSignal = isShortSignal;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
|
||||
@@ -150,6 +150,191 @@ struct XCHEInputs
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Define Conditions ...
|
||||
struct XCHEConditions
|
||||
{
|
||||
//
|
||||
// Common ...
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
datetime time;
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
double long1[];
|
||||
double long2[];
|
||||
double short1[];
|
||||
double short2[];
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
bool isBullish;
|
||||
bool isBearish;
|
||||
bool isStrongBullish;
|
||||
bool isStrongBearish;
|
||||
bool isSwitchedToBullish;
|
||||
bool isSwitchedToBearish;
|
||||
bool isStrongSwitchedToBullish;
|
||||
bool isStrongSwitchedToBearish;
|
||||
|
||||
//
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
Clean(long1);
|
||||
Clean(long2);
|
||||
Clean(short1);
|
||||
Clean(short2);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(long1, true);
|
||||
ArraySetAsSeries(long2, true);
|
||||
ArraySetAsSeries(short1, true);
|
||||
ArraySetAsSeries(short2, true);
|
||||
|
||||
//
|
||||
isBullish = false;
|
||||
isBearish = false;
|
||||
isStrongBullish = false;
|
||||
isStrongBearish = false;
|
||||
isSwitchedToBullish = false;
|
||||
isSwitchedToBearish = false;
|
||||
isStrongSwitchedToBullish = false;
|
||||
isStrongSwitchedToBearish = false;
|
||||
}
|
||||
|
||||
//
|
||||
void GenerateScore(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
bullishScore = 0;
|
||||
bearishScore = 0;
|
||||
|
||||
//
|
||||
if (isBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isStrongBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isSwitchedToBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isStrongSwitchedToBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
|
||||
//
|
||||
if (isBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isStrongBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isSwitchedToBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isStrongSwitchedToBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateSummary(
|
||||
bool onlyCommons = false,
|
||||
bool onlyConditions = false,
|
||||
bool includeScores = true,
|
||||
bool ignoreFalseConditions = true,
|
||||
string separator = "\n" //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
string scoresStr =
|
||||
//
|
||||
"Scores: " + separator +
|
||||
"---------------" + separator +
|
||||
"Bullish: " + ToString(bullishScore) + separator +
|
||||
"Bearish: " + ToString(bearishScore) + separator +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
string commonStr = GenerateSpecifiedCommonSummary(
|
||||
this,
|
||||
separator,
|
||||
includeScores //
|
||||
);
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
ToString("isBullish", isBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isBearish", isBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isStrongBullish", isStrongBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isStrongBearish", isStrongBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isSwitchedToBullish", isSwitchedToBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isSwitchedToBearish", isSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isStrongSwitchedToBullish", isStrongSwitchedToBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isStrongSwitchedToBearish", isStrongSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
"[" + GetTag() + "]" + separator +
|
||||
(onlyConditions
|
||||
? ""
|
||||
: commonStr) +
|
||||
(!includeScores
|
||||
? ""
|
||||
: scoresStr) +
|
||||
" " + separator +
|
||||
(onlyCommons
|
||||
? ""
|
||||
: conditionsStr) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetTag()
|
||||
{
|
||||
return "XCHE";
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Class ...
|
||||
class XSCXCHEHelper : public XSCBaseHelper
|
||||
@@ -435,6 +620,110 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
bool GetConditions(
|
||||
XCHEConditions &conditions, //
|
||||
int barIndex = 0, //
|
||||
int loopback = 3 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = true;
|
||||
|
||||
//
|
||||
if (loopback < 3)
|
||||
{
|
||||
loopback = 3;
|
||||
}
|
||||
|
||||
//
|
||||
conditions.Clean();
|
||||
|
||||
//
|
||||
conditions.symbol = mSymbol;
|
||||
conditions.period = mPeriod;
|
||||
conditions.time = TimeCurrent();
|
||||
|
||||
//
|
||||
int zIndex = barIndex;
|
||||
int cIndex = zIndex + 1;
|
||||
int pIndex = cIndex + 1;
|
||||
int ppIndex = pIndex + 1;
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
|
||||
//
|
||||
CopyLongExit1(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.long1 //
|
||||
);
|
||||
CopyLongExit2(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.long2 //
|
||||
);
|
||||
CopyShortExit1(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.short1 //
|
||||
);
|
||||
CopyShortExit2(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.short2 //
|
||||
);
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
bool isBullish = NotEmptyZero(conditions.long1[cIndex]);
|
||||
bool isBearish = NotEmptyZero(conditions.short1[cIndex]);
|
||||
|
||||
//
|
||||
bool isBullishPrev = NotEmptyZero(conditions.long1[pIndex]);
|
||||
bool isBearishPrev = NotEmptyZero(conditions.short1[pIndex]);
|
||||
|
||||
//
|
||||
bool isStrongBullish = isBullish &&
|
||||
NotEmptyZero(conditions.long2[cIndex]);
|
||||
bool isStrongBearish = isBearish &&
|
||||
NotEmptyZero(conditions.short2[cIndex]);
|
||||
|
||||
//
|
||||
bool isStrongBullishPrev = isBullishPrev &&
|
||||
NotEmptyZero(conditions.long2[pIndex]);
|
||||
bool isStrongBearishPrev = isBearishPrev &&
|
||||
NotEmptyZero(conditions.short2[pIndex]);
|
||||
|
||||
//
|
||||
bool isSwitchedToBullish = isBullish &&
|
||||
!isBullishPrev;
|
||||
bool isSwitchedToBearish = isBearish &&
|
||||
!isBearishPrev;
|
||||
|
||||
//
|
||||
bool isStrongSwitchedToBullish = isStrongBullish &&
|
||||
!isStrongBullishPrev;
|
||||
bool isStrongSwitchedToBearish = isStrongBearish &&
|
||||
!isStrongBearishPrev;
|
||||
|
||||
//
|
||||
conditions.isBullish = isBullish;
|
||||
conditions.isBearish = isBearish;
|
||||
conditions.isStrongBullish = isStrongBullish;
|
||||
conditions.isStrongBearish = isStrongBearish;
|
||||
conditions.isSwitchedToBullish = isSwitchedToBullish;
|
||||
conditions.isSwitchedToBearish = isSwitchedToBearish;
|
||||
conditions.isStrongSwitchedToBullish = isStrongSwitchedToBullish;
|
||||
conditions.isStrongSwitchedToBearish = isStrongSwitchedToBearish;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
|
||||
@@ -129,6 +129,194 @@ struct XHKInputs
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Define Conditions ...
|
||||
struct XHKConditions
|
||||
{
|
||||
//
|
||||
// Common ...
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
datetime time;
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
XOHCL hkBar[];
|
||||
XOHCL smHKBar[];
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
bool isHKBullish;
|
||||
bool isHKBearish;
|
||||
bool isHKSwitchedToBullish;
|
||||
bool isHKSwitchedToBearish;
|
||||
|
||||
//
|
||||
bool isSMHKBullish;
|
||||
bool isSMHKBearish;
|
||||
bool isSMHKSwitchedToBullish;
|
||||
bool isSMHKSwitchedToBearish;
|
||||
|
||||
//
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
Clean(hkBar);
|
||||
Clean(smHKBar);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(hkBar, true);
|
||||
ArraySetAsSeries(smHKBar, true);
|
||||
|
||||
//
|
||||
isHKBullish = false;
|
||||
isHKBearish = false;
|
||||
isHKSwitchedToBullish = false;
|
||||
isHKSwitchedToBearish = false;
|
||||
|
||||
//
|
||||
isSMHKBullish = false;
|
||||
isSMHKBearish = false;
|
||||
isSMHKSwitchedToBullish = false;
|
||||
isSMHKSwitchedToBearish = false;
|
||||
}
|
||||
|
||||
//
|
||||
void GenerateScore(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
bullishScore = 0;
|
||||
bearishScore = 0;
|
||||
|
||||
//
|
||||
if (isHKBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isHKSwitchedToBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
|
||||
//
|
||||
if (isHKBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isHKSwitchedToBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
|
||||
//
|
||||
if (isSMHKBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isSMHKSwitchedToBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
|
||||
//
|
||||
if (isSMHKBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isSMHKSwitchedToBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateSummary(
|
||||
bool onlyCommons = false,
|
||||
bool onlyConditions = false,
|
||||
bool includeScores = true,
|
||||
bool ignoreFalseConditions = true,
|
||||
string separator = "\n" //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
string scoresStr =
|
||||
//
|
||||
"Scores: " + separator +
|
||||
"---------------" + separator +
|
||||
"Bullish: " + ToString(bullishScore) + separator +
|
||||
"Bearish: " + ToString(bearishScore) + separator +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
string commonStr = GenerateSpecifiedCommonSummary(
|
||||
this,
|
||||
separator,
|
||||
includeScores //
|
||||
);
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
ToString("isHKBullish", isHKBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isHKSwitchedToBullish", isHKSwitchedToBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isHKBearish", isHKBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isHKSwitchedToBearish", isHKSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||
//
|
||||
ToString("isSMHKBullish", isSMHKBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isSMHKSwitchedToBullish", isSMHKSwitchedToBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isSMHKBearish", isSMHKBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isSMHKSwitchedToBearish", isSMHKSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
"[" + GetTag() + "]" + separator +
|
||||
(onlyConditions
|
||||
? ""
|
||||
: commonStr) +
|
||||
(!includeScores
|
||||
? ""
|
||||
: scoresStr) +
|
||||
" " + separator +
|
||||
(onlyCommons
|
||||
? ""
|
||||
: conditionsStr) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetTag()
|
||||
{
|
||||
return "XHK";
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Class ...
|
||||
class XSCXHKHelper : public XSCBaseHelper
|
||||
@@ -886,6 +1074,97 @@ public:
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool GetConditions(
|
||||
XHKConditions &conditions, //
|
||||
int barIndex = 0, //
|
||||
int loopback = 3 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = true;
|
||||
|
||||
//
|
||||
if (loopback < 3)
|
||||
{
|
||||
loopback = 3;
|
||||
}
|
||||
|
||||
//
|
||||
conditions.Clean();
|
||||
|
||||
//
|
||||
conditions.symbol = mSymbol;
|
||||
conditions.period = mPeriod;
|
||||
conditions.time = TimeCurrent();
|
||||
|
||||
//
|
||||
int zIndex = barIndex;
|
||||
int cIndex = zIndex + 1;
|
||||
int pIndex = cIndex + 1;
|
||||
int ppIndex = pIndex + 1;
|
||||
|
||||
//
|
||||
CopyAsOHCL(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.hkBar //
|
||||
);
|
||||
CopySMAsOHCL(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.smHKBar //
|
||||
);
|
||||
|
||||
//
|
||||
// Calculate Conditions ...
|
||||
|
||||
//
|
||||
bool isHKBullish = conditions.hkBar[cIndex].IsBullish();
|
||||
bool isHKBullishPrev = conditions.hkBar[pIndex].IsBullish();
|
||||
|
||||
//
|
||||
bool isHKSwitchedToBullish = isHKBullish &&
|
||||
!isHKBullishPrev;
|
||||
|
||||
//
|
||||
bool isHKBearish = conditions.hkBar[cIndex].IsBearish();
|
||||
bool isHKBearishPrev = conditions.hkBar[pIndex].IsBearish();
|
||||
|
||||
//
|
||||
bool isHKSwitchedToBearish = isHKBearish &&
|
||||
!isHKBearishPrev;
|
||||
|
||||
//
|
||||
bool isSMHKBullish = conditions.smHKBar[cIndex].IsBullish();
|
||||
bool isSMHKBullishPrev = conditions.smHKBar[pIndex].IsBullish();
|
||||
|
||||
//
|
||||
bool isSMHKSwitchedToBullish = isSMHKBullish &&
|
||||
!isSMHKBullishPrev;
|
||||
|
||||
//
|
||||
bool isSMHKBearish = conditions.smHKBar[cIndex].IsBearish();
|
||||
bool isSMHKBearishPrev = conditions.smHKBar[pIndex].IsBearish();
|
||||
|
||||
//
|
||||
bool isSMHKSwitchedToBearish = isSMHKBearish &&
|
||||
!isSMHKBearishPrev;
|
||||
|
||||
//
|
||||
conditions.isHKBullish = isHKBullish;
|
||||
conditions.isHKSwitchedToBullish = isHKSwitchedToBullish;
|
||||
conditions.isHKBearish = isHKBearish;
|
||||
conditions.isHKSwitchedToBearish = isHKSwitchedToBearish;
|
||||
conditions.isSMHKBullish = isSMHKBullish;
|
||||
conditions.isSMHKSwitchedToBullish = isSMHKSwitchedToBullish;
|
||||
conditions.isSMHKBearish = isSMHKBearish;
|
||||
conditions.isSMHKSwitchedToBearish = isSMHKSwitchedToBearish;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
|
||||
@@ -140,6 +140,185 @@ struct XHULLInputs
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Define Conditions ...
|
||||
struct XHULLConditions
|
||||
{
|
||||
//
|
||||
// Common ...
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
datetime time;
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
double up[];
|
||||
double down[];
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
bool isBullish;
|
||||
bool isBearish;
|
||||
bool isUpBullish;
|
||||
bool isUpBearish;
|
||||
bool isDownBullish;
|
||||
bool isDownBearish;
|
||||
bool isSwitchedToBullish;
|
||||
bool isSwitchedToBearish;
|
||||
|
||||
//
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
Clean(up);
|
||||
Clean(down);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(up, true);
|
||||
ArraySetAsSeries(down, true);
|
||||
|
||||
//
|
||||
isBullish = false;
|
||||
isBearish = false;
|
||||
isUpBullish = false;
|
||||
isUpBearish = false;
|
||||
isDownBullish = false;
|
||||
isDownBearish = false;
|
||||
isSwitchedToBullish = false;
|
||||
isSwitchedToBearish = false;
|
||||
}
|
||||
|
||||
//
|
||||
void GenerateScore(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
bullishScore = 0;
|
||||
bearishScore = 0;
|
||||
|
||||
//
|
||||
if (isBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isUpBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isDownBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isSwitchedToBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
|
||||
//
|
||||
if (isBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isUpBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isDownBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isSwitchedToBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateSummary(
|
||||
bool onlyCommons = false,
|
||||
bool onlyConditions = false,
|
||||
bool includeScores = true,
|
||||
bool ignoreFalseConditions = true,
|
||||
string separator = "\n" //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
string scoresStr =
|
||||
//
|
||||
"Scores: " + separator +
|
||||
"---------------" + separator +
|
||||
"Bullish: " + ToString(bullishScore) + separator +
|
||||
"Bearish: " + ToString(bearishScore) + separator +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
string commonStr = GenerateSpecifiedCommonSummary(
|
||||
this,
|
||||
separator,
|
||||
includeScores //
|
||||
);
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
ToString("isBullish", isBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isBearish", isBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isUpBullish", isUpBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isUpBearish", isUpBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isDownBullish", isDownBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isDownBearish", isDownBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isSwitchedToBullish", isSwitchedToBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isSwitchedToBearish", isSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
"[" + GetTag() + "]" + separator +
|
||||
(onlyConditions
|
||||
? ""
|
||||
: commonStr) +
|
||||
(!includeScores
|
||||
? ""
|
||||
: scoresStr) +
|
||||
" " + separator +
|
||||
(onlyCommons
|
||||
? ""
|
||||
: conditionsStr) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetTag()
|
||||
{
|
||||
return "XHULL";
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Class ...
|
||||
class XSCXHULLHelper : public XSCBaseHelper
|
||||
@@ -165,7 +344,7 @@ public:
|
||||
bool Init(
|
||||
string symbol, // Trading Symbol
|
||||
ENUM_TIMEFRAMES period, // Trading Period
|
||||
XHULLInputs &inputs // Inputs
|
||||
XHULLInputs &inputs // Inputs
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -346,6 +525,99 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
bool GetConditions(
|
||||
XHULLConditions &conditions, //
|
||||
int barIndex = 0, //
|
||||
int loopback = 4 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = true;
|
||||
|
||||
//
|
||||
if (loopback < 4)
|
||||
{
|
||||
loopback = 4;
|
||||
}
|
||||
|
||||
//
|
||||
conditions.Clean();
|
||||
|
||||
//
|
||||
conditions.symbol = mSymbol;
|
||||
conditions.period = mPeriod;
|
||||
conditions.time = TimeCurrent();
|
||||
|
||||
//
|
||||
int zIndex = barIndex;
|
||||
int cIndex = zIndex + 1;
|
||||
int pIndex = cIndex + 1;
|
||||
int ppIndex = pIndex + 1;
|
||||
|
||||
//
|
||||
CopyUp(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.up //
|
||||
);
|
||||
CopyDown(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.down //
|
||||
);
|
||||
|
||||
//
|
||||
// Calculate Conditions ...
|
||||
|
||||
//
|
||||
bool isUpBullish = conditions.up[cIndex] > conditions.up[pIndex];
|
||||
bool isUpBearish = conditions.up[cIndex] < conditions.up[pIndex];
|
||||
|
||||
//
|
||||
bool isUpBullishPrev = conditions.up[pIndex] > conditions.up[ppIndex];
|
||||
bool isUpBearishPrev = conditions.up[pIndex] < conditions.up[ppIndex];
|
||||
|
||||
//
|
||||
bool isDownBullish = conditions.down[cIndex] > conditions.down[pIndex];
|
||||
bool isDownBearish = conditions.down[cIndex] < conditions.down[pIndex];
|
||||
|
||||
//
|
||||
bool isDownBullishPrev = conditions.down[pIndex] > conditions.down[ppIndex];
|
||||
bool isDownBearishPrev = conditions.down[pIndex] < conditions.down[ppIndex];
|
||||
|
||||
//
|
||||
bool isBullish = isUpBullish &&
|
||||
isDownBullish;
|
||||
bool isBearish = isUpBearish &&
|
||||
isDownBearish;
|
||||
|
||||
//
|
||||
bool isBullishPrev = isUpBullishPrev &&
|
||||
isDownBullishPrev;
|
||||
bool isBearishPrev = isUpBearishPrev &&
|
||||
isDownBearishPrev;
|
||||
|
||||
//
|
||||
bool isSwitchedToBullish = isBullish &&
|
||||
!isBullishPrev;
|
||||
bool isSwitchedToBearish = isBearish &&
|
||||
!isBearishPrev;
|
||||
|
||||
//
|
||||
conditions.isBullish = isBullish;
|
||||
conditions.isBearish = isBearish;
|
||||
conditions.isUpBullish = isUpBullish;
|
||||
conditions.isUpBearish = isUpBearish;
|
||||
conditions.isDownBullish = isDownBullish;
|
||||
conditions.isDownBearish = isDownBearish;
|
||||
conditions.isSwitchedToBullish = isSwitchedToBullish;
|
||||
conditions.isSwitchedToBearish = isSwitchedToBearish;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
|
||||
@@ -190,6 +190,568 @@ struct XICHInputs
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Define Conditions ...
|
||||
struct XICHConditions
|
||||
{
|
||||
//
|
||||
// Common ...
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
datetime time;
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
double tenkanSen[];
|
||||
double kijunSen[];
|
||||
double chikouSpan[];
|
||||
double senkouSpanA[];
|
||||
double senkouSpanB[];
|
||||
double futureSenkouSpanA[];
|
||||
double futureSenkouSpanB[];
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
bool isClosedOverKijunSen;
|
||||
bool isClosedUnderKijunSen;
|
||||
bool isTenkanSenOverKijunSen;
|
||||
bool isTenkanSenUnderKijunSen;
|
||||
bool isTenkanSenCrossedOverKijunSen;
|
||||
bool isTenkanSenCrossedUnderKijunSen;
|
||||
|
||||
//
|
||||
bool isSenkouSpanAOverB;
|
||||
bool isSenkouSpanAUnderB;
|
||||
bool isSenkouSpanAOverLast;
|
||||
bool isSenkouSpanAUnderLast;
|
||||
bool isFutureSenkouSpanAOverB;
|
||||
bool isFutureSenkouSpanAUnderB;
|
||||
bool isFutureSenkouSpanAOverLast;
|
||||
bool isFutureSenkouSpanAUnderLast;
|
||||
|
||||
//
|
||||
bool isSenkouSpanACrossedOverB;
|
||||
bool isSenkouSpanACrossedUnderB;
|
||||
bool isSenkouSpanACrossedOverLast;
|
||||
bool isSenkouSpanACrossedUnderLast;
|
||||
bool isFutureSenkouSpanACrossedOverB;
|
||||
bool isFutureSenkouSpanACrossedUnderB;
|
||||
bool isFutureSenkouSpanACrossedOverLast;
|
||||
bool isFutureSenkouSpanACrossedUnderLast;
|
||||
|
||||
//
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
Clean(tenkanSen);
|
||||
Clean(kijunSen);
|
||||
Clean(chikouSpan);
|
||||
Clean(senkouSpanA);
|
||||
Clean(senkouSpanB);
|
||||
Clean(futureSenkouSpanA);
|
||||
Clean(futureSenkouSpanB);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(tenkanSen, true);
|
||||
ArraySetAsSeries(kijunSen, true);
|
||||
ArraySetAsSeries(chikouSpan, true);
|
||||
ArraySetAsSeries(senkouSpanA, true);
|
||||
ArraySetAsSeries(senkouSpanB, true);
|
||||
ArraySetAsSeries(futureSenkouSpanA, true);
|
||||
ArraySetAsSeries(futureSenkouSpanB, true);
|
||||
|
||||
//
|
||||
isClosedOverKijunSen = false;
|
||||
isClosedUnderKijunSen = false;
|
||||
isTenkanSenOverKijunSen = false;
|
||||
isTenkanSenUnderKijunSen = false;
|
||||
isTenkanSenCrossedOverKijunSen = false;
|
||||
isTenkanSenCrossedUnderKijunSen = false;
|
||||
|
||||
//
|
||||
isSenkouSpanAOverB = false;
|
||||
isSenkouSpanAUnderB = false;
|
||||
isSenkouSpanAOverLast = false;
|
||||
isSenkouSpanAUnderLast = false;
|
||||
isFutureSenkouSpanAOverB = false;
|
||||
isFutureSenkouSpanAUnderB = false;
|
||||
isFutureSenkouSpanAOverLast = false;
|
||||
isFutureSenkouSpanAUnderLast = false;
|
||||
|
||||
//
|
||||
isSenkouSpanACrossedOverB = false;
|
||||
isSenkouSpanACrossedUnderB = false;
|
||||
isSenkouSpanACrossedOverLast = false;
|
||||
isSenkouSpanACrossedUnderLast = false;
|
||||
isFutureSenkouSpanACrossedOverB = false;
|
||||
isFutureSenkouSpanACrossedUnderB = false;
|
||||
isFutureSenkouSpanACrossedOverLast = false;
|
||||
isFutureSenkouSpanACrossedUnderLast = false;
|
||||
}
|
||||
|
||||
//
|
||||
void GenerateScore(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
bullishScore = 0;
|
||||
bearishScore = 0;
|
||||
|
||||
//
|
||||
if (isClosedOverKijunSen)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isTenkanSenOverKijunSen)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isTenkanSenCrossedOverKijunSen)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isSenkouSpanAOverB)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isSenkouSpanAOverLast)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isFutureSenkouSpanAOverB)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isFutureSenkouSpanAOverLast)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isSenkouSpanACrossedOverB)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isSenkouSpanACrossedOverLast)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isFutureSenkouSpanACrossedOverB)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isFutureSenkouSpanACrossedOverLast)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
|
||||
//
|
||||
if (isClosedUnderKijunSen)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isTenkanSenUnderKijunSen)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isTenkanSenCrossedUnderKijunSen)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isSenkouSpanAUnderB)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isSenkouSpanAUnderLast)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isFutureSenkouSpanAUnderB)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isFutureSenkouSpanAUnderLast)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isSenkouSpanACrossedUnderB)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isSenkouSpanACrossedUnderLast)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isFutureSenkouSpanACrossedUnderB)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isFutureSenkouSpanACrossedUnderLast)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateSummary(
|
||||
bool onlyCommons = false,
|
||||
bool onlyConditions = false,
|
||||
bool includeScores = true,
|
||||
bool ignoreFalseConditions = true,
|
||||
string separator = "\n" //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
string scoresStr =
|
||||
//
|
||||
"Scores: " + separator +
|
||||
"---------------" + separator +
|
||||
"Bullish: " + ToString(bullishScore) + separator +
|
||||
"Bearish: " + ToString(bearishScore) + separator +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
string commonStr = GenerateSpecifiedCommonSummary(
|
||||
this,
|
||||
separator,
|
||||
includeScores //
|
||||
);
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
ToString("isClosedOverKijunSen", isClosedOverKijunSen, ignoreFalseConditions, separator) +
|
||||
ToString("isClosedUnderKijunSen", isClosedUnderKijunSen, ignoreFalseConditions, separator) +
|
||||
ToString("isTenkanSenOverKijunSen", isTenkanSenOverKijunSen, ignoreFalseConditions, separator) +
|
||||
ToString("isTenkanSenUnderKijunSen", isTenkanSenUnderKijunSen, ignoreFalseConditions, separator) +
|
||||
ToString("isTenkanSenCrossedOverKijunSen", isTenkanSenCrossedOverKijunSen, ignoreFalseConditions, separator) +
|
||||
ToString("isTenkanSenCrossedUnderKijunSen", isTenkanSenCrossedUnderKijunSen, ignoreFalseConditions, separator) +
|
||||
//
|
||||
ToString("isSenkouSpanAOverB", isSenkouSpanAOverB, ignoreFalseConditions, separator) +
|
||||
ToString("isSenkouSpanAUnderB", isSenkouSpanAUnderB, ignoreFalseConditions, separator) +
|
||||
ToString("isSenkouSpanAOverLast", isSenkouSpanAOverLast, ignoreFalseConditions, separator) +
|
||||
ToString("isSenkouSpanAUnderLast", isSenkouSpanAUnderLast, ignoreFalseConditions, separator) +
|
||||
ToString("isFutureSenkouSpanAOverB", isFutureSenkouSpanAOverB, ignoreFalseConditions, separator) +
|
||||
ToString("isFutureSenkouSpanAUnderB", isFutureSenkouSpanAUnderB, ignoreFalseConditions, separator) +
|
||||
ToString("isFutureSenkouSpanAOverLast", isFutureSenkouSpanAOverLast, ignoreFalseConditions, separator) +
|
||||
ToString("isFutureSenkouSpanAUnderLast", isFutureSenkouSpanAUnderLast, ignoreFalseConditions, separator) +
|
||||
//
|
||||
ToString("isSenkouSpanACrossedOverB", isSenkouSpanACrossedOverB, ignoreFalseConditions, separator) +
|
||||
ToString("isSenkouSpanACrossedUnderB", isSenkouSpanACrossedUnderB, ignoreFalseConditions, separator) +
|
||||
ToString("isSenkouSpanACrossedOverLast", isSenkouSpanACrossedOverLast, ignoreFalseConditions, separator) +
|
||||
ToString("isSenkouSpanACrossedUnderLast", isSenkouSpanACrossedUnderLast, ignoreFalseConditions, separator) +
|
||||
ToString("isFutureSenkouSpanACrossedOverB", isFutureSenkouSpanACrossedOverB, ignoreFalseConditions, separator) +
|
||||
ToString("isFutureSenkouSpanACrossedUnderB", isFutureSenkouSpanACrossedUnderB, ignoreFalseConditions, separator) +
|
||||
ToString("isFutureSenkouSpanACrossedOverLast", isFutureSenkouSpanACrossedOverLast, ignoreFalseConditions, separator) +
|
||||
ToString("isFutureSenkouSpanACrossedUnderLast", isFutureSenkouSpanACrossedUnderLast, ignoreFalseConditions, separator) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
"[" + GetTag() + "]" + separator +
|
||||
(onlyConditions
|
||||
? ""
|
||||
: commonStr) +
|
||||
(!includeScores
|
||||
? ""
|
||||
: scoresStr) +
|
||||
" " + separator +
|
||||
(onlyCommons
|
||||
? ""
|
||||
: conditionsStr) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetTag()
|
||||
{
|
||||
return "XICH";
|
||||
}
|
||||
|
||||
//
|
||||
bool HasLongConditions()
|
||||
{
|
||||
//
|
||||
bool result;
|
||||
|
||||
//
|
||||
int zIndex = 0;
|
||||
int cIndex = zIndex + 1;
|
||||
int pIndex = cIndex + 1;
|
||||
|
||||
//
|
||||
XOHCL cBar;
|
||||
result = cBar.Init(
|
||||
symbol,
|
||||
period,
|
||||
cIndex //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL pBar;
|
||||
result = pBar.Init(
|
||||
symbol,
|
||||
period,
|
||||
pIndex //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool isCloseOverSenkouSpanA = cBar.close > senkouSpanA[cIndex];
|
||||
|
||||
//
|
||||
bool isBaseBullish = isCloseOverSenkouSpanA &&
|
||||
isSenkouSpanAOverB &&
|
||||
isSenkouSpanAOverLast;
|
||||
|
||||
//
|
||||
bool isKijunSenOverSenkouSpanA = kijunSen[cIndex] > senkouSpanA[cIndex];
|
||||
|
||||
//
|
||||
bool isCloseOverTenkanSen = cBar.close > tenkanSen[cIndex];
|
||||
|
||||
//
|
||||
bool isPriceCloseCrossedUpTenkanSen = pBar.close <= tenkanSen[pIndex] &&
|
||||
cBar.close > tenkanSen[cIndex];
|
||||
|
||||
//
|
||||
double cKumoUpper = MathMax(senkouSpanA[cIndex], senkouSpanB[cIndex]);
|
||||
double pKumoUpper = MathMax(senkouSpanA[pIndex], senkouSpanB[pIndex]);
|
||||
|
||||
//
|
||||
double cKumoLower = MathMin(senkouSpanA[cIndex], senkouSpanB[cIndex]);
|
||||
double pKumoLower = MathMin(senkouSpanA[pIndex], senkouSpanB[pIndex]);
|
||||
|
||||
//
|
||||
bool isTenkanSenOverKumo = tenkanSen[cIndex] > cKumoUpper;
|
||||
bool isTenkanSenOverKumoPrev = tenkanSen[pIndex] > pKumoUpper;
|
||||
|
||||
//
|
||||
bool isTenkanSenUnderKumo = tenkanSen[cIndex] < cKumoLower;
|
||||
bool isTenkanSenUnderKumoPrev = tenkanSen[pIndex] < pKumoLower;
|
||||
|
||||
//
|
||||
bool isTenkanSenCrossedOverKumo = isTenkanSenOverKumo &&
|
||||
!isTenkanSenOverKumoPrev;
|
||||
|
||||
//
|
||||
bool isTenkanSenCrossedUnderKumo = isTenkanSenUnderKumo &&
|
||||
!isTenkanSenUnderKumoPrev;
|
||||
|
||||
//
|
||||
bool condition1 =
|
||||
isBaseBullish &&
|
||||
isCloseOverTenkanSen &&
|
||||
isKijunSenOverSenkouSpanA &&
|
||||
isTenkanSenCrossedOverKijunSen;
|
||||
|
||||
//
|
||||
bool condition2 =
|
||||
isBaseBullish &&
|
||||
isCloseOverTenkanSen &&
|
||||
isKijunSenOverSenkouSpanA &&
|
||||
isTenkanSenOverKijunSen &&
|
||||
isSenkouSpanACrossedOverB;
|
||||
|
||||
//
|
||||
bool condition3 =
|
||||
isBaseBullish &&
|
||||
isKijunSenOverSenkouSpanA &&
|
||||
isPriceCloseCrossedUpTenkanSen &&
|
||||
isTenkanSenOverKijunSen;
|
||||
|
||||
//
|
||||
bool condition4 =
|
||||
isCloseOverTenkanSen &&
|
||||
isTenkanSenCrossedOverKumo &&
|
||||
isTenkanSenOverKijunSen &&
|
||||
isFutureSenkouSpanAOverB &&
|
||||
isFutureSenkouSpanAOverLast;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
condition1
|
||||
//
|
||||
||
|
||||
//
|
||||
condition2
|
||||
//
|
||||
||
|
||||
//
|
||||
condition3
|
||||
//
|
||||
||
|
||||
//
|
||||
condition4
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool HasShortConditions()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
int zIndex = 0;
|
||||
int cIndex = zIndex + 1;
|
||||
int pIndex = cIndex + 1;
|
||||
|
||||
//
|
||||
XOHCL cBar;
|
||||
result = cBar.Init(
|
||||
symbol,
|
||||
period,
|
||||
cIndex //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL pBar;
|
||||
result = pBar.Init(
|
||||
symbol,
|
||||
period,
|
||||
pIndex //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool isCloseUnderSenkouSpanB = cBar.close < senkouSpanB[cIndex];
|
||||
|
||||
//
|
||||
bool isBaseBearish = isCloseUnderSenkouSpanB &&
|
||||
isSenkouSpanAUnderB &&
|
||||
isSenkouSpanAUnderLast;
|
||||
|
||||
//
|
||||
bool isKijunSenUnderSenkouSpanB = kijunSen[cIndex] < senkouSpanB[cIndex];
|
||||
|
||||
//
|
||||
bool isCloseUnderTenkanSen = cBar.close < tenkanSen[cIndex];
|
||||
|
||||
//
|
||||
bool isPriceCloseCrossedDownTenkanSen = pBar.close >= tenkanSen[pIndex] &&
|
||||
cBar.close < tenkanSen[cIndex];
|
||||
|
||||
//
|
||||
double cKumoUpper = MathMax(senkouSpanA[cIndex], senkouSpanB[cIndex]);
|
||||
double pKumoUpper = MathMax(senkouSpanA[pIndex], senkouSpanB[pIndex]);
|
||||
|
||||
//
|
||||
double cKumoLower = MathMin(senkouSpanA[cIndex], senkouSpanB[cIndex]);
|
||||
double pKumoLower = MathMin(senkouSpanA[pIndex], senkouSpanB[pIndex]);
|
||||
|
||||
//
|
||||
bool isTenkanSenOverKumo = tenkanSen[cIndex] > cKumoUpper;
|
||||
bool isTenkanSenOverKumoPrev = tenkanSen[pIndex] > pKumoUpper;
|
||||
|
||||
//
|
||||
bool isTenkanSenUnderKumo = tenkanSen[cIndex] < cKumoLower;
|
||||
bool isTenkanSenUnderKumoPrev = tenkanSen[pIndex] < pKumoLower;
|
||||
|
||||
//
|
||||
bool isTenkanSenCrossedOverKumo = isTenkanSenOverKumo &&
|
||||
!isTenkanSenOverKumoPrev;
|
||||
|
||||
//
|
||||
bool isTenkanSenCrossedUnderKumo = isTenkanSenUnderKumo &&
|
||||
!isTenkanSenUnderKumoPrev;
|
||||
|
||||
//
|
||||
bool condition1 =
|
||||
isBaseBearish &&
|
||||
isCloseUnderTenkanSen &&
|
||||
isKijunSenUnderSenkouSpanB &&
|
||||
isTenkanSenCrossedUnderKijunSen;
|
||||
|
||||
//
|
||||
bool condition2 =
|
||||
isBaseBearish &&
|
||||
isCloseUnderTenkanSen &&
|
||||
isKijunSenUnderSenkouSpanB &&
|
||||
isTenkanSenUnderKijunSen &&
|
||||
isSenkouSpanACrossedUnderB;
|
||||
|
||||
//
|
||||
bool condition3 =
|
||||
isBaseBearish &&
|
||||
isKijunSenUnderSenkouSpanB &&
|
||||
isPriceCloseCrossedDownTenkanSen &&
|
||||
isTenkanSenUnderKijunSen;
|
||||
|
||||
//
|
||||
bool condition4 =
|
||||
isCloseUnderTenkanSen &&
|
||||
isTenkanSenCrossedUnderKumo &&
|
||||
isTenkanSenUnderKijunSen &&
|
||||
isFutureSenkouSpanAUnderB &&
|
||||
isFutureSenkouSpanAUnderLast;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
condition1
|
||||
|
||||
||
|
||||
//
|
||||
condition2
|
||||
//
|
||||
||
|
||||
//
|
||||
condition3
|
||||
//
|
||||
||
|
||||
//
|
||||
condition4
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Class ...
|
||||
class XSCXICHHelper : public XSCBaseHelper
|
||||
@@ -703,6 +1265,190 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
bool GetConditions(
|
||||
XICHConditions &conditions, //
|
||||
int barIndex = 0, //
|
||||
int loopback = 4 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = true;
|
||||
|
||||
//
|
||||
if (loopback < 4)
|
||||
{
|
||||
loopback = 4;
|
||||
}
|
||||
|
||||
//
|
||||
conditions.Clean();
|
||||
|
||||
//
|
||||
conditions.symbol = mSymbol;
|
||||
conditions.period = mPeriod;
|
||||
conditions.time = TimeCurrent();
|
||||
|
||||
//
|
||||
int zIndex = barIndex;
|
||||
int cIndex = zIndex + 1;
|
||||
int pIndex = cIndex + 1;
|
||||
int ppIndex = pIndex + 1;
|
||||
|
||||
//
|
||||
CopyTenkanSen(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.tenkanSen //
|
||||
);
|
||||
CopyKijunSen(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.kijunSen //
|
||||
);
|
||||
CopyChikouSpan(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.chikouSpan //
|
||||
);
|
||||
CopySenkouSpanA(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.senkouSpanA //
|
||||
);
|
||||
CopySenkouSpanB(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.senkouSpanB //
|
||||
);
|
||||
CopyFutureSenkouSpanA(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.futureSenkouSpanA //
|
||||
);
|
||||
CopyFutureSenkouSpanB(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.futureSenkouSpanB //
|
||||
);
|
||||
|
||||
//
|
||||
// Calculate Conditions ...
|
||||
|
||||
//
|
||||
XOHCL cBar;
|
||||
result = cBar.Init(
|
||||
_Symbol,
|
||||
_Period,
|
||||
cIndex //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool isClosedOverKijunSen = cBar.close > conditions.kijunSen[cIndex];
|
||||
bool isClosedUnderKijunSen = cBar.close < conditions.kijunSen[cIndex];
|
||||
|
||||
//
|
||||
bool isTenkanSenOverKijunSen = conditions.tenkanSen[cIndex] > conditions.kijunSen[cIndex];
|
||||
bool isTenkanSenUnderKijunSen = conditions.tenkanSen[cIndex] < conditions.kijunSen[cIndex];
|
||||
|
||||
//
|
||||
bool isTenkanSenOverKijunSenPrev = conditions.tenkanSen[pIndex] > conditions.kijunSen[pIndex];
|
||||
bool isTenkanSenUnderKijunSenPrev = conditions.tenkanSen[pIndex] < conditions.kijunSen[pIndex];
|
||||
|
||||
//
|
||||
bool isTenkanSenCrossedOverKijunSen = isTenkanSenOverKijunSen &&
|
||||
!isTenkanSenOverKijunSenPrev;
|
||||
bool isTenkanSenCrossedUnderKijunSen = isTenkanSenUnderKijunSen &&
|
||||
!isTenkanSenUnderKijunSenPrev;
|
||||
|
||||
//
|
||||
bool isSenkouSpanAOverB = conditions.senkouSpanA[cIndex] > conditions.senkouSpanB[cIndex];
|
||||
bool isSenkouSpanAUnderB = conditions.senkouSpanA[cIndex] < conditions.senkouSpanB[cIndex];
|
||||
|
||||
//
|
||||
bool isSenkouSpanAOverBPrev = conditions.senkouSpanA[pIndex] > conditions.senkouSpanB[pIndex];
|
||||
bool isSenkouSpanAUnderBPrev = conditions.senkouSpanA[pIndex] < conditions.senkouSpanB[pIndex];
|
||||
|
||||
//
|
||||
bool isSenkouSpanAOverLast = conditions.senkouSpanA[cIndex] > conditions.senkouSpanA[pIndex];
|
||||
bool isSenkouSpanAUnderLast = conditions.senkouSpanA[cIndex] < conditions.senkouSpanA[pIndex];
|
||||
|
||||
//
|
||||
bool isSenkouSpanAOverLastPrev = conditions.senkouSpanA[pIndex] > conditions.senkouSpanA[ppIndex];
|
||||
bool isSenkouSpanAUnderLastPrev = conditions.senkouSpanA[pIndex] < conditions.senkouSpanA[ppIndex];
|
||||
|
||||
//
|
||||
bool isFutureSenkouSpanAOverB = conditions.futureSenkouSpanA[cIndex] > conditions.futureSenkouSpanB[cIndex];
|
||||
bool isFutureSenkouSpanAUnderB = conditions.futureSenkouSpanA[cIndex] < conditions.futureSenkouSpanB[cIndex];
|
||||
|
||||
//
|
||||
bool isFutureSenkouSpanAOverBPrev = conditions.futureSenkouSpanA[pIndex] > conditions.futureSenkouSpanB[pIndex];
|
||||
bool isFutureSenkouSpanAUnderBPrev = conditions.futureSenkouSpanA[pIndex] < conditions.futureSenkouSpanB[pIndex];
|
||||
|
||||
//
|
||||
bool isFutureSenkouSpanAOverLast = conditions.futureSenkouSpanA[cIndex] > conditions.futureSenkouSpanA[pIndex];
|
||||
bool isFutureSenkouSpanAUnderLast = conditions.futureSenkouSpanA[cIndex] < conditions.futureSenkouSpanA[pIndex];
|
||||
|
||||
//
|
||||
bool isFutureSenkouSpanAOverLastPrev = conditions.futureSenkouSpanA[pIndex] > conditions.futureSenkouSpanA[ppIndex];
|
||||
bool isFutureSenkouSpanAUnderLastPrev = conditions.futureSenkouSpanA[pIndex] < conditions.futureSenkouSpanA[ppIndex];
|
||||
|
||||
//
|
||||
bool isSenkouSpanACrossedOverB = isSenkouSpanAOverB &&
|
||||
!isSenkouSpanAOverBPrev;
|
||||
bool isSenkouSpanACrossedUnderB = isSenkouSpanAUnderB &&
|
||||
!isSenkouSpanAUnderBPrev;
|
||||
|
||||
//
|
||||
bool isSenkouSpanACrossedOverLast = isSenkouSpanAOverLast &
|
||||
!isSenkouSpanAOverLastPrev;
|
||||
bool isSenkouSpanACrossedUnderLast = isSenkouSpanAUnderLast &&
|
||||
!isSenkouSpanAUnderLastPrev;
|
||||
|
||||
//
|
||||
bool isFutureSenkouSpanACrossedOverB = isFutureSenkouSpanAOverB &&
|
||||
!isFutureSenkouSpanAOverBPrev;
|
||||
bool isFutureSenkouSpanACrossedUnderB = isFutureSenkouSpanAUnderB &&
|
||||
!isFutureSenkouSpanAUnderBPrev;
|
||||
|
||||
//
|
||||
bool isFutureSenkouSpanACrossedOverLast = isFutureSenkouSpanAOverLast &&
|
||||
!isFutureSenkouSpanAOverLastPrev;
|
||||
bool isFutureSenkouSpanACrossedUnderLast = isFutureSenkouSpanAUnderLast &&
|
||||
!isFutureSenkouSpanAUnderLastPrev;
|
||||
|
||||
//
|
||||
conditions.isClosedOverKijunSen = isClosedOverKijunSen;
|
||||
conditions.isClosedUnderKijunSen = isClosedUnderKijunSen;
|
||||
conditions.isTenkanSenOverKijunSen = isTenkanSenOverKijunSen;
|
||||
conditions.isTenkanSenUnderKijunSen = isTenkanSenUnderKijunSen;
|
||||
conditions.isTenkanSenCrossedOverKijunSen = isTenkanSenCrossedOverKijunSen;
|
||||
conditions.isTenkanSenCrossedUnderKijunSen = isTenkanSenCrossedUnderKijunSen;
|
||||
conditions.isSenkouSpanAOverB = isSenkouSpanAOverB;
|
||||
conditions.isSenkouSpanAUnderB = isSenkouSpanAUnderB;
|
||||
conditions.isSenkouSpanAOverLast = isSenkouSpanAOverLast;
|
||||
conditions.isSenkouSpanAUnderLast = isSenkouSpanAUnderLast;
|
||||
conditions.isFutureSenkouSpanAOverB = isFutureSenkouSpanAOverB;
|
||||
conditions.isFutureSenkouSpanAUnderB = isFutureSenkouSpanAUnderB;
|
||||
conditions.isFutureSenkouSpanAOverLast = isFutureSenkouSpanAOverLast;
|
||||
conditions.isFutureSenkouSpanAUnderLast = isFutureSenkouSpanAUnderLast;
|
||||
conditions.isSenkouSpanACrossedOverB = isSenkouSpanACrossedOverB;
|
||||
conditions.isSenkouSpanACrossedUnderB = isSenkouSpanACrossedUnderB;
|
||||
conditions.isSenkouSpanACrossedOverLast = isSenkouSpanACrossedOverLast;
|
||||
conditions.isSenkouSpanACrossedUnderLast = isSenkouSpanACrossedUnderLast;
|
||||
conditions.isFutureSenkouSpanACrossedOverB = isFutureSenkouSpanACrossedOverB;
|
||||
conditions.isFutureSenkouSpanACrossedUnderB = isFutureSenkouSpanACrossedUnderB;
|
||||
conditions.isFutureSenkouSpanACrossedOverLast = isFutureSenkouSpanACrossedOverLast;
|
||||
conditions.isFutureSenkouSpanACrossedUnderLast = isFutureSenkouSpanACrossedUnderLast;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -284,6 +284,159 @@ struct XMRBInputs
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Define Conditions ...
|
||||
struct XMRBConditions
|
||||
{
|
||||
//
|
||||
// Common ...
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
datetime time;
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
|
||||
//
|
||||
double fast[];
|
||||
double slow[];
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
bool isFastOverSlow;
|
||||
bool isFastUnderSlow;
|
||||
bool isFastCrossedOverSlow;
|
||||
bool isFastCrossedUnderSlow;
|
||||
|
||||
//
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
Clean(fast);
|
||||
Clean(slow);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(fast, true);
|
||||
ArraySetAsSeries(slow, true);
|
||||
|
||||
//
|
||||
isFastOverSlow = false;
|
||||
isFastUnderSlow = false;
|
||||
isFastCrossedOverSlow = false;
|
||||
isFastCrossedUnderSlow = false;
|
||||
}
|
||||
|
||||
//
|
||||
void GenerateScore(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
bullishScore = 0;
|
||||
bearishScore = 0;
|
||||
|
||||
//
|
||||
if (isFastOverSlow)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isFastCrossedOverSlow)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
|
||||
//
|
||||
if (isFastUnderSlow)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isFastCrossedUnderSlow)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateSummary(
|
||||
bool onlyCommons = false,
|
||||
bool onlyConditions = false,
|
||||
bool includeScores = true,
|
||||
bool ignoreFalseConditions = true,
|
||||
string separator = "\n" //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
string scoresStr =
|
||||
//
|
||||
"Scores: " + separator +
|
||||
"---------------" + separator +
|
||||
"Bullish: " + ToString(bullishScore) + separator +
|
||||
"Bearish: " + ToString(bearishScore) + separator +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
string commonStr = GenerateSpecifiedCommonSummary(
|
||||
this,
|
||||
separator,
|
||||
includeScores //
|
||||
);
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
ToString("isFastOverSlow", isFastOverSlow, ignoreFalseConditions, separator) +
|
||||
ToString("isFastUnderSlow", isFastUnderSlow, ignoreFalseConditions, separator) +
|
||||
ToString("isFastCrossedOverSlow", isFastCrossedOverSlow, ignoreFalseConditions, separator) +
|
||||
ToString("isFastCrossedUnderSlow", isFastCrossedUnderSlow, ignoreFalseConditions, separator) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
"[" + GetTag() + "]" + separator +
|
||||
(onlyConditions
|
||||
? ""
|
||||
: commonStr) +
|
||||
(!includeScores
|
||||
? ""
|
||||
: scoresStr) +
|
||||
" " + separator +
|
||||
(onlyCommons
|
||||
? ""
|
||||
: conditionsStr) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetTag()
|
||||
{
|
||||
return "XMRB";
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Class ...
|
||||
class XSCXMRBHelper : public XSCBaseHelper
|
||||
@@ -1196,6 +1349,74 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
bool GetConditions(
|
||||
XMRBConditions &conditions, //
|
||||
int barIndex = 0, //
|
||||
int loopback = 3 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = true;
|
||||
|
||||
//
|
||||
if (loopback < 3)
|
||||
{
|
||||
loopback = 3;
|
||||
}
|
||||
|
||||
//
|
||||
conditions.Clean();
|
||||
|
||||
//
|
||||
conditions.symbol = mSymbol;
|
||||
conditions.period = mPeriod;
|
||||
conditions.time = TimeCurrent();
|
||||
|
||||
//
|
||||
int zIndex = barIndex;
|
||||
int cIndex = zIndex + 1;
|
||||
int pIndex = cIndex + 1;
|
||||
int ppIndex = pIndex + 1;
|
||||
|
||||
//
|
||||
CopyFast(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.fast //
|
||||
);
|
||||
CopySlow(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.slow //
|
||||
);
|
||||
|
||||
//
|
||||
// Calculate Conditions ...
|
||||
|
||||
//
|
||||
bool isFastOverSlow = conditions.fast[cIndex] > conditions.slow[cIndex];
|
||||
bool isFastUnderSlow = conditions.fast[cIndex] < conditions.slow[cIndex];
|
||||
|
||||
//
|
||||
bool isFastOverSlowPrev = conditions.fast[pIndex] > conditions.slow[pIndex];
|
||||
bool isFastUnderSlowPrev = conditions.fast[pIndex] < conditions.slow[pIndex];
|
||||
|
||||
//
|
||||
bool isFastCrossedOverSlow = isFastOverSlow &&
|
||||
!isFastOverSlowPrev;
|
||||
bool isFastCrossedUnderSlow = isFastUnderSlow &&
|
||||
!isFastUnderSlowPrev;
|
||||
|
||||
//
|
||||
conditions.isFastOverSlow = isFastOverSlow;
|
||||
conditions.isFastUnderSlow = isFastUnderSlow;
|
||||
conditions.isFastCrossedOverSlow = isFastCrossedOverSlow;
|
||||
conditions.isFastCrossedUnderSlow = isFastCrossedUnderSlow;
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
|
||||
@@ -140,6 +140,157 @@ struct XSSLCInputs
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Define Conditions ...
|
||||
struct XSSLCConditions
|
||||
{
|
||||
//
|
||||
// Common ...
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
datetime time;
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
double up[];
|
||||
double down[];
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
bool isBullish;
|
||||
bool isBearish;
|
||||
bool isSwitchedToBullish;
|
||||
bool isSwitchedToBearish;
|
||||
|
||||
//
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
Clean(up);
|
||||
Clean(down);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(up, true);
|
||||
ArraySetAsSeries(down, true);
|
||||
|
||||
//
|
||||
isBullish = false;
|
||||
isBearish = false;
|
||||
isSwitchedToBullish = false;
|
||||
isSwitchedToBearish = false;
|
||||
}
|
||||
|
||||
//
|
||||
void GenerateScore(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
bullishScore = 0;
|
||||
bearishScore = 0;
|
||||
|
||||
//
|
||||
if (isBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isSwitchedToBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
|
||||
//
|
||||
if (isBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isSwitchedToBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateSummary(
|
||||
bool onlyCommons = false,
|
||||
bool onlyConditions = false,
|
||||
bool includeScores = true,
|
||||
bool ignoreFalseConditions = true,
|
||||
string separator = "\n" //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
string scoresStr =
|
||||
//
|
||||
"Scores: " + separator +
|
||||
"---------------" + separator +
|
||||
"Bullish: " + ToString(bullishScore) + separator +
|
||||
"Bearish: " + ToString(bearishScore) + separator +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
string commonStr = GenerateSpecifiedCommonSummary(
|
||||
this,
|
||||
separator,
|
||||
includeScores //
|
||||
);
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
ToString("isBullish", isBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isBearish", isBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isSwitchedToBullish", isSwitchedToBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isSwitchedToBearish", isSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
"[" + GetTag() + "]" + separator +
|
||||
(onlyConditions
|
||||
? ""
|
||||
: commonStr) +
|
||||
(!includeScores
|
||||
? ""
|
||||
: scoresStr) +
|
||||
" " + separator +
|
||||
(onlyCommons
|
||||
? ""
|
||||
: conditionsStr) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetTag()
|
||||
{
|
||||
return "XSSLC";
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Class ...
|
||||
class XSCXSSLCHelper : public XSCBaseHelper
|
||||
@@ -355,6 +506,75 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
bool GetConditions(
|
||||
XSSLCConditions &conditions, //
|
||||
int barIndex = 0, //
|
||||
int loopback = 3 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = true;
|
||||
|
||||
//
|
||||
if (loopback < 3)
|
||||
{
|
||||
loopback = 3;
|
||||
}
|
||||
|
||||
//
|
||||
conditions.Clean();
|
||||
|
||||
//
|
||||
conditions.symbol = mSymbol;
|
||||
conditions.period = mPeriod;
|
||||
conditions.time = TimeCurrent();
|
||||
|
||||
//
|
||||
int zIndex = barIndex;
|
||||
int cIndex = zIndex + 1;
|
||||
int pIndex = cIndex + 1;
|
||||
int ppIndex = pIndex + 1;
|
||||
|
||||
//
|
||||
CopyUp(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.up //
|
||||
);
|
||||
CopyDown(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.down //
|
||||
);
|
||||
|
||||
//
|
||||
// Calculate Conditions ...
|
||||
|
||||
//
|
||||
bool isBullish = conditions.up[cIndex] > conditions.down[cIndex];
|
||||
bool isBearish = conditions.up[cIndex] < conditions.down[cIndex];
|
||||
|
||||
//
|
||||
bool isBullishPrev = conditions.up[pIndex] > conditions.down[pIndex];
|
||||
bool isBearishPrev = conditions.up[pIndex] < conditions.down[pIndex];
|
||||
|
||||
//
|
||||
bool isSwitchedToBullish = isBullish &&
|
||||
!isBullishPrev;
|
||||
bool isSwitchedToBearish = isBearish &&
|
||||
!isBearishPrev;
|
||||
|
||||
//
|
||||
conditions.isBullish = isBullish;
|
||||
conditions.isBearish = isBearish;
|
||||
conditions.isSwitchedToBullish = isSwitchedToBullish;
|
||||
conditions.isSwitchedToBearish = isSwitchedToBearish;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
|
||||
@@ -129,6 +129,157 @@ struct XSTRInputs
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Define Conditions ...
|
||||
struct XSTRConditions
|
||||
{
|
||||
//
|
||||
// Common ...
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
datetime time;
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
double trend[];
|
||||
double state[];
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
bool isTrendBullish;
|
||||
bool isTrendBearish;
|
||||
bool isTrendSwitchedToBullish;
|
||||
bool isTrendSwitchedToBearish;
|
||||
|
||||
//
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
Clean(trend);
|
||||
Clean(state);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(trend, true);
|
||||
ArraySetAsSeries(state, true);
|
||||
|
||||
//
|
||||
isTrendBullish = false;
|
||||
isTrendBearish = false;
|
||||
isTrendSwitchedToBullish = false;
|
||||
isTrendSwitchedToBearish = false;
|
||||
}
|
||||
|
||||
//
|
||||
void GenerateScore(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
bullishScore = 0;
|
||||
bearishScore = 0;
|
||||
|
||||
//
|
||||
if (isTrendBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isTrendSwitchedToBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
|
||||
//
|
||||
if (isTrendBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isTrendSwitchedToBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateSummary(
|
||||
bool onlyCommons = false,
|
||||
bool onlyConditions = false,
|
||||
bool includeScores = true,
|
||||
bool ignoreFalseConditions = true,
|
||||
string separator = "\n" //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
string scoresStr =
|
||||
//
|
||||
"Scores: " + separator +
|
||||
"---------------" + separator +
|
||||
"Bullish: " + ToString(bullishScore) + separator +
|
||||
"Bearish: " + ToString(bearishScore) + separator +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
string commonStr = GenerateSpecifiedCommonSummary(
|
||||
this,
|
||||
separator,
|
||||
includeScores //
|
||||
);
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
ToString("isTrendBullish", isTrendBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isTrendBearish", isTrendBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isTrendSwitchedToBullish", isTrendSwitchedToBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isTrendSwitchedToBearish", isTrendSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
"[" + GetTag() + "]" + separator +
|
||||
(onlyConditions
|
||||
? ""
|
||||
: commonStr) +
|
||||
(!includeScores
|
||||
? ""
|
||||
: scoresStr) +
|
||||
" " + separator +
|
||||
(onlyCommons
|
||||
? ""
|
||||
: conditionsStr) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetTag()
|
||||
{
|
||||
return "XSTR";
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Class ...
|
||||
class XSCXSTRHelper : public XSCBaseHelper
|
||||
@@ -154,7 +305,7 @@ public:
|
||||
bool Init(
|
||||
string symbol, // Trading Symbol
|
||||
ENUM_TIMEFRAMES period, // Trading Period
|
||||
XSTRInputs &inputs // Inputs
|
||||
XSTRInputs &inputs // Inputs
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -367,6 +518,75 @@ public:
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool GetConditions(
|
||||
XSTRConditions &conditions, //
|
||||
int barIndex = 0, //
|
||||
int loopback = 3 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = true;
|
||||
|
||||
//
|
||||
if (loopback < 3)
|
||||
{
|
||||
loopback = 3;
|
||||
}
|
||||
|
||||
//
|
||||
conditions.Clean();
|
||||
|
||||
//
|
||||
conditions.symbol = mSymbol;
|
||||
conditions.period = mPeriod;
|
||||
conditions.time = TimeCurrent();
|
||||
|
||||
//
|
||||
int zIndex = barIndex;
|
||||
int cIndex = zIndex + 1;
|
||||
int pIndex = cIndex + 1;
|
||||
int ppIndex = pIndex + 1;
|
||||
|
||||
//
|
||||
CopyTrend(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.trend //
|
||||
);
|
||||
CopyState(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.state //
|
||||
);
|
||||
|
||||
//
|
||||
// Calculate Conditions ...
|
||||
|
||||
//
|
||||
bool isTrendBullish = IsBullish(conditions.state[cIndex]);
|
||||
bool isTrendBearish = IsBearish(conditions.state[cIndex]);
|
||||
|
||||
//
|
||||
bool isTrendBullishPrev = IsBullish(conditions.state[pIndex]);
|
||||
bool isTrendBearishPrev = IsBearish(conditions.state[pIndex]);
|
||||
|
||||
//
|
||||
bool isTrendSwitchedToBullish = isTrendBullish &&
|
||||
!isTrendBullishPrev;
|
||||
bool isTrendSwitchedToBearish = isTrendBearish &&
|
||||
!isTrendBearishPrev;
|
||||
|
||||
//
|
||||
conditions.isTrendBullish = isTrendBullish;
|
||||
conditions.isTrendBearish = isTrendBearish;
|
||||
conditions.isTrendSwitchedToBullish = isTrendSwitchedToBullish;
|
||||
conditions.isTrendSwitchedToBearish = isTrendSwitchedToBearish;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
|
||||
@@ -137,6 +137,157 @@ struct XTDInputs
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Define Conditions ...
|
||||
struct XTDConditions
|
||||
{
|
||||
//
|
||||
// Common ...
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
datetime time;
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
double bullish[];
|
||||
double bearish[];
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
bool isBullish;
|
||||
bool isBearish;
|
||||
bool isSwitchedToBullish;
|
||||
bool isSwitchedToBearish;
|
||||
|
||||
//
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
Clean(bullish);
|
||||
Clean(bearish);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(bullish, true);
|
||||
ArraySetAsSeries(bearish, true);
|
||||
|
||||
//
|
||||
isBullish = false;
|
||||
isBearish = false;
|
||||
isSwitchedToBullish = false;
|
||||
isSwitchedToBearish = false;
|
||||
}
|
||||
|
||||
//
|
||||
void GenerateScore(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
bullishScore = 0;
|
||||
bearishScore = 0;
|
||||
|
||||
//
|
||||
if (isBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isSwitchedToBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
|
||||
//
|
||||
if (isBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
if (isSwitchedToBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateSummary(
|
||||
bool onlyCommons = false,
|
||||
bool onlyConditions = false,
|
||||
bool includeScores = true,
|
||||
bool ignoreFalseConditions = true,
|
||||
string separator = "\n" //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
string scoresStr =
|
||||
//
|
||||
"Scores: " + separator +
|
||||
"---------------" + separator +
|
||||
"Bullish: " + ToString(bullishScore) + separator +
|
||||
"Bearish: " + ToString(bearishScore) + separator +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
string commonStr = GenerateSpecifiedCommonSummary(
|
||||
this,
|
||||
separator,
|
||||
includeScores //
|
||||
);
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
ToString("isBullish", isBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isBearish", isBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isSwitchedToBullish", isSwitchedToBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isSwitchedToBearish", isSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
"[" + GetTag() + "]" + separator +
|
||||
(onlyConditions
|
||||
? ""
|
||||
: commonStr) +
|
||||
(!includeScores
|
||||
? ""
|
||||
: scoresStr) +
|
||||
" " + separator +
|
||||
(onlyCommons
|
||||
? ""
|
||||
: conditionsStr) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetTag()
|
||||
{
|
||||
return "XTD";
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Class ...
|
||||
class XSCXTDHelper : public XSCBaseHelper
|
||||
@@ -162,7 +313,7 @@ public:
|
||||
bool Init(
|
||||
string symbol, // Trading Symbol
|
||||
ENUM_TIMEFRAMES period, // Trading Period
|
||||
XTDInputs &inputs // Inputs
|
||||
XTDInputs &inputs // Inputs
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -393,6 +544,75 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
bool GetConditions(
|
||||
XTDConditions &conditions, //
|
||||
int barIndex = 0, //
|
||||
int loopback = 3 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = true;
|
||||
|
||||
//
|
||||
if (loopback < 3)
|
||||
{
|
||||
loopback = 3;
|
||||
}
|
||||
|
||||
//
|
||||
conditions.Clean();
|
||||
|
||||
//
|
||||
conditions.symbol = mSymbol;
|
||||
conditions.period = mPeriod;
|
||||
conditions.time = TimeCurrent();
|
||||
|
||||
//
|
||||
int zIndex = barIndex;
|
||||
int cIndex = zIndex + 1;
|
||||
int pIndex = cIndex + 1;
|
||||
int ppIndex = pIndex + 1;
|
||||
|
||||
//
|
||||
CopyBullish(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.bullish //
|
||||
);
|
||||
CopyBearish(
|
||||
zIndex,
|
||||
loopback,
|
||||
conditions.bearish //
|
||||
);
|
||||
|
||||
//
|
||||
// Calculate Conditions ...
|
||||
|
||||
//
|
||||
bool isBullish = conditions.bullish[cIndex] > conditions.bearish[cIndex];
|
||||
bool isBearish = conditions.bullish[cIndex] < conditions.bearish[cIndex];
|
||||
|
||||
//
|
||||
bool isBullishPrev = conditions.bullish[pIndex] > conditions.bearish[pIndex];
|
||||
bool isBearishPrev = conditions.bullish[pIndex] < conditions.bearish[pIndex];
|
||||
|
||||
//
|
||||
bool isSwitchedToBullish = isBullish &&
|
||||
!isBullishPrev;
|
||||
bool isSwitchedToBearish = isBearish &&
|
||||
!isBearishPrev;
|
||||
|
||||
//
|
||||
conditions.isBullish = isBullish;
|
||||
conditions.isBearish = isBearish;
|
||||
conditions.isSwitchedToBullish = isSwitchedToBullish;
|
||||
conditions.isSwitchedToBearish = isSwitchedToBearish;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
|
||||
Reference in New Issue
Block a user