5171 lines
108 KiB
Plaintext
5171 lines
108 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 Helper Class Library
|
|
// ----------------------------------------------
|
|
// Name: XCX121Helper
|
|
// Description: provides all Indicator
|
|
// Helper 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.x-helper.class.mq5"
|
|
|
|
//
|
|
// Definitions ...
|
|
enum ENUM_X121_BUFFERS
|
|
{
|
|
//
|
|
// Main Buffers ...
|
|
X121_PEAKS_LINE = 0,
|
|
X121_VALES_LINE = 1,
|
|
X121_SAR_LINE = 2,
|
|
X121_ATR_UPPER_LINE = 3,
|
|
X121_ATR_LOWER_LINE = 4,
|
|
X121_VWAP_FAST_LINE = 5,
|
|
X121_VWAP_MID_LINE = 7,
|
|
X121_VWAP_SLOW_LINE = 9,
|
|
X121_DON_OPEN_UPPER_LINE = 11,
|
|
X121_DON_OPEN_LOWER_LINE = 12,
|
|
X121_DON_HIGH_UPPER_LINE = 13,
|
|
X121_DON_HIGH_LOWER_LINE = 14,
|
|
X121_DON_LOW_UPPER_LINE = 15,
|
|
X121_DON_LOW_LOWER_LINE = 16,
|
|
X121_DON_CLOSE_UPPER_LINE = 17,
|
|
X121_DON_CLOSE_LOWER_LINE = 18,
|
|
X121_FIB_LEVEL_1_LINE = 19,
|
|
X121_FIB_LEVEL_2_LINE = 20,
|
|
X121_FIB_LEVEL_3_LINE = 21,
|
|
X121_FIB_LEVEL_4_LINE = 22,
|
|
X121_FIB_LEVEL_5_LINE = 23,
|
|
//
|
|
// Data Buffers ...
|
|
//
|
|
// XPV Data ...
|
|
X121_CURRENT_HH_LINE = 24,
|
|
X121_CURRENT_LL_LINE = 25,
|
|
X121_SHORT_HH_LINE = 26,
|
|
X121_SHORT_LL_LINE = 27,
|
|
X121_MEDIUM_HH_LINE = 28,
|
|
X121_MEDIUM_LL_LINE = 29,
|
|
X121_LONG_HH_LINE = 30,
|
|
X121_LONG_LL_LINE = 31,
|
|
X121_HIND_HH_LINE = 32,
|
|
X121_HIND_LL_LINE = 33,
|
|
//
|
|
// VWAP Data ...
|
|
X121_VWAP_VOLUME_LINE = 34,
|
|
X121_VWAP_PRICE_LINE = 35,
|
|
X121_VWAP_FAST_STATE_LINE = 36,
|
|
X121_VWAP_MID_STATE_LINE = 37,
|
|
X121_VWAP_SLOW_STATE_LINE = 38,
|
|
//
|
|
// ATR ...
|
|
X121_ATR_LINE = 39,
|
|
X121_ATR_UPPER_RAW_LINE = 40,
|
|
X121_ATR_LOWER_RAW_LINE = 41,
|
|
};
|
|
|
|
//
|
|
enum ENUM_XVWAP_STATES
|
|
{
|
|
//
|
|
XVWAP_STATE_BULLISH = 1,
|
|
XVWAP_STATE_BEARISH = 2,
|
|
XVWAP_STATE_NEUTURAL = 3,
|
|
};
|
|
|
|
//
|
|
// Inputs ...
|
|
struct X121Inputs
|
|
{
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
// Cycles ...
|
|
|
|
//
|
|
// Short ...
|
|
ENUM_X_PERIOD_METHOD scMethod; // How to Find Period
|
|
ENUM_TIMEFRAMES scPeriod; // Time Period
|
|
|
|
//
|
|
// Medium ...
|
|
ENUM_X_PERIOD_METHOD mcMethod; // How to Find Period
|
|
ENUM_TIMEFRAMES mcPeriod; // Time Period
|
|
|
|
//
|
|
// Long ...
|
|
ENUM_X_PERIOD_METHOD lcMethod; // How to Find Period
|
|
ENUM_TIMEFRAMES lcPeriod; // Time Period
|
|
|
|
//
|
|
// Hind ...
|
|
ENUM_X_PERIOD_METHOD hcMethod; // How to Find Period
|
|
ENUM_TIMEFRAMES hcPeriod; // Time Period
|
|
|
|
//
|
|
// Boundary Detection ...
|
|
ENUM_SERIESMODE hhMode; // Highest High Calculation Method
|
|
ENUM_SERIESMODE llMode; // Lowest Low Calculation Method
|
|
|
|
//
|
|
// Parabolic Sar Detection ...
|
|
double sarStep; // Step
|
|
double sarMax; // Maximum
|
|
|
|
//
|
|
// RSI ...
|
|
int rsiLength; // RSI Length
|
|
double rsiOverSoldLevel; // RSI Over Sold Level
|
|
double rsiOverBoughtLevel; // RSI Over Bought Level
|
|
|
|
//
|
|
// Atr Detection ...
|
|
int atrLength; // Length
|
|
double atrMultiplier; // Multiplier
|
|
ENUM_APPLIED_PRICE atrUpperAppliedTo; // Upper Zone Applied To
|
|
ENUM_APPLIED_PRICE atrLowerAppliedTo; // Lower Zone Applied To
|
|
ENUM_X_MA_METHOD atrSmoothingMode; // Smoothing Method
|
|
|
|
//
|
|
// VWap Detection ...
|
|
int vwapFastLength; // Fast Length
|
|
int vwapMidLength; // Mid Length
|
|
int vwapSlowLength; // Slow Length
|
|
ENUM_APPLIED_PRICE vwapAppliedTo; // Applied To
|
|
|
|
//
|
|
// Donchain Detection ...
|
|
int donchainLength; // Donchain Length
|
|
|
|
//
|
|
// Fibonacci ...
|
|
double fiboLevel1; // Fibio 1st Level
|
|
double fiboLevel2; // Fibio 2st Level
|
|
double fiboLevel3; // Fibio 3rd Level
|
|
double fiboLevel4; // Fibio 4th Level
|
|
double fiboLevel5; // Fibio 5th Level
|
|
|
|
//
|
|
// Presentation ...
|
|
|
|
//
|
|
int startCalculationForLastBars; // Calculate Last n Bars
|
|
|
|
//
|
|
int sarArrowCode; // Parabolic Sar Arrow Code
|
|
int peaksArrowCode; // Peaks Arrow Code
|
|
int valesArrowCode; // Vales Arrow Code
|
|
|
|
//
|
|
// Global ...
|
|
bool showSar; // Show Parabolic Sar
|
|
bool showAtr; // Show Atr
|
|
bool showPeaks; // Show Peaks
|
|
bool showVales; // Show Vales
|
|
bool showVWap; // Show VWap
|
|
bool showDonchain; // Show Donchain
|
|
|
|
//
|
|
// Fibonachi Presentation ...
|
|
bool showFibo1Levels; // Show Fibo 1st Level
|
|
bool showFibo2Levels; // Show Fibo 2nd Level
|
|
bool showFibo3Levels; // Show Fibo 3rd Level
|
|
bool showFibo4Levels; // Show Fibo 4th Level
|
|
bool showFibo5Levels; // Show Fibo 5th Level
|
|
|
|
//
|
|
// Atr Presentation ...
|
|
bool showAtrUpper; // Show Upper Zone
|
|
bool showAtrLower; // Show Lower Zone
|
|
|
|
//
|
|
// VWap Presentation ...
|
|
bool showVWapFast; // Show VWap Fast
|
|
bool showVWapMedium; // Show VWap Medium
|
|
bool showVWapSlow; // Show VWap Slow
|
|
|
|
//
|
|
// Donchain Presentation ...
|
|
|
|
//
|
|
bool showUpper; // Show Upper Band
|
|
bool showLower; // Show Lower Band
|
|
|
|
//
|
|
bool showOpen; // Show Open
|
|
bool showHigh; // Show High
|
|
bool showClose; // Show Close
|
|
bool showLow; // Show Low
|
|
|
|
//
|
|
// Constructor ...
|
|
X121Inputs()
|
|
{
|
|
Clean();
|
|
}
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
/**
|
|
* Cleaning Up ...
|
|
*/
|
|
void Clean()
|
|
{
|
|
//
|
|
// Cycles ...
|
|
|
|
//
|
|
// Short ...
|
|
scMethod = X_PERIOD_NOTHING;
|
|
scPeriod = NULL;
|
|
|
|
//
|
|
// Medium ...
|
|
mcMethod = X_PERIOD_NOTHING;
|
|
mcPeriod = NULL;
|
|
|
|
//
|
|
// Long ...
|
|
lcMethod = X_PERIOD_NOTHING;
|
|
lcPeriod = NULL;
|
|
|
|
//
|
|
// Hind ...
|
|
hcMethod = X_PERIOD_NOTHING;
|
|
hcPeriod = NULL;
|
|
|
|
//
|
|
// Boundary Detection ...
|
|
hhMode = MODE_HIGH;
|
|
llMode = MODE_LOW;
|
|
|
|
//
|
|
// RSI ...
|
|
rsiLength = 0;
|
|
rsiOverSoldLevel = 0;
|
|
rsiOverBoughtLevel = 0;
|
|
|
|
//
|
|
// Paraboli Sar Detection ...
|
|
sarStep = 0;
|
|
sarMax = 0;
|
|
|
|
//
|
|
// Atr Detection ...
|
|
atrLength = 0; // Length
|
|
atrMultiplier = 0; // Multiplier
|
|
atrUpperAppliedTo = PRICE_HIGH; // Upper Zone Applied To
|
|
atrLowerAppliedTo = PRICE_LOW; // Lower Zone Applied To
|
|
atrSmoothingMode = X_MA_MODE_NONE; // Smoothing Method
|
|
|
|
//
|
|
// VWap Detection ...
|
|
vwapFastLength = 0;
|
|
vwapMidLength = 0;
|
|
vwapSlowLength = 0;
|
|
vwapAppliedTo = PRICE_CLOSE;
|
|
|
|
//
|
|
// Donchain Detection ...
|
|
donchainLength = 0;
|
|
|
|
//
|
|
// Fibonacci ...
|
|
fiboLevel1 = 0;
|
|
fiboLevel2 = 0;
|
|
fiboLevel3 = 0;
|
|
fiboLevel4 = 0;
|
|
fiboLevel5 = 0;
|
|
|
|
//
|
|
// Presentation ...
|
|
|
|
//
|
|
startCalculationForLastBars = 0;
|
|
|
|
//
|
|
sarArrowCode = 0;
|
|
peaksArrowCode = 0;
|
|
valesArrowCode = 0;
|
|
|
|
//
|
|
// Globals ...
|
|
showSar = false;
|
|
showAtr = false;
|
|
showPeaks = false;
|
|
showVales = false;
|
|
showVWap = false;
|
|
showDonchain = false;
|
|
|
|
//
|
|
// Fibonachi Presentation ...
|
|
showFibo1Levels = false;
|
|
showFibo2Levels = false;
|
|
showFibo3Levels = false;
|
|
showFibo4Levels = false;
|
|
showFibo5Levels = false;
|
|
|
|
//
|
|
// Atr Presentation ...
|
|
showAtrUpper = false; // Show Upper Zone
|
|
showAtrLower = false; // Show Lower Zone
|
|
|
|
//
|
|
// VWap Presentation ...
|
|
showVWapFast = false;
|
|
showVWapMedium = false;
|
|
showVWapSlow = false;
|
|
|
|
//
|
|
// Donchain Presentation ...
|
|
|
|
//
|
|
showUpper = false;
|
|
showLower = false;
|
|
|
|
//
|
|
showOpen = false;
|
|
showHigh = false;
|
|
showClose = false;
|
|
showLow = false;
|
|
}
|
|
|
|
/**
|
|
* Set Default Values ...
|
|
*/
|
|
void Default()
|
|
{
|
|
//
|
|
// Cycles ...
|
|
|
|
//
|
|
// Short ...
|
|
scMethod = X_PERIOD_AUTO;
|
|
scPeriod = NULL;
|
|
|
|
//
|
|
// Medium ...
|
|
mcMethod = X_PERIOD_AUTO;
|
|
mcPeriod = NULL;
|
|
|
|
//
|
|
// Long ...
|
|
lcMethod = X_PERIOD_AUTO;
|
|
lcPeriod = NULL;
|
|
|
|
//
|
|
// Hind ...
|
|
hcMethod = X_PERIOD_AUTO;
|
|
hcPeriod = NULL;
|
|
|
|
//
|
|
// Boundary Detection ...
|
|
hhMode = MODE_HIGH;
|
|
llMode = MODE_LOW;
|
|
|
|
//
|
|
// RSI ...
|
|
rsiLength = 14;
|
|
rsiOverSoldLevel = 30;
|
|
rsiOverBoughtLevel = 70;
|
|
|
|
//
|
|
// Paraboli Sar Detection ...
|
|
sarStep = 0.02;
|
|
sarMax = 0.2;
|
|
|
|
//
|
|
// Atr Detection ...
|
|
atrLength = 14; // Length
|
|
atrMultiplier = 1; // Multiplier
|
|
atrUpperAppliedTo = PRICE_HIGH; // Upper Zone Applied To
|
|
atrLowerAppliedTo = PRICE_LOW; // Lower Zone Applied To
|
|
atrSmoothingMode = X_MA_MODE_EMA; // Smoothing Method
|
|
|
|
//
|
|
// VWap Detection ...
|
|
vwapFastLength = 20;
|
|
vwapMidLength = 40;
|
|
vwapSlowLength = 60;
|
|
vwapAppliedTo = PRICE_CLOSE;
|
|
|
|
//
|
|
// Donchain Detection ...
|
|
donchainLength = 40;
|
|
|
|
//
|
|
// Fibonacci ...
|
|
fiboLevel1 = 0.236;
|
|
fiboLevel2 = 0.382;
|
|
fiboLevel3 = 0.5;
|
|
fiboLevel4 = 0.618;
|
|
fiboLevel5 = 0.764;
|
|
|
|
//
|
|
// Presentation ...
|
|
|
|
//
|
|
startCalculationForLastBars = 1500;
|
|
|
|
//
|
|
sarArrowCode = 159;
|
|
peaksArrowCode = 159;
|
|
valesArrowCode = 159;
|
|
|
|
//
|
|
// Globals ...
|
|
showSar = true;
|
|
showAtr = true;
|
|
showPeaks = true;
|
|
showVales = true;
|
|
showVWap = true;
|
|
showDonchain = true;
|
|
|
|
//
|
|
// Fibonachi Presentation ...
|
|
showFibo1Levels = false;
|
|
showFibo2Levels = false;
|
|
showFibo3Levels = true;
|
|
showFibo4Levels = false;
|
|
showFibo5Levels = false;
|
|
|
|
//
|
|
// Atr Presentation ...
|
|
showAtrUpper = true; // Show Upper Zone
|
|
showAtrLower = true; // Show Lower Zone
|
|
|
|
//
|
|
// VWap Presentation ...
|
|
showVWapFast = true;
|
|
showVWapMedium = true;
|
|
showVWapSlow = true;
|
|
|
|
//
|
|
// Donchain Presentation ...
|
|
|
|
//
|
|
showUpper = true;
|
|
showLower = true;
|
|
|
|
//
|
|
showOpen = true;
|
|
showHigh = false;
|
|
showClose = true;
|
|
showLow = false;
|
|
}
|
|
|
|
/**
|
|
* Validate ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool IsValid()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
//
|
|
// RSI ...
|
|
rsiLength > 0 &&
|
|
rsiOverSoldLevel > 0 &&
|
|
rsiOverBoughtLevel > 0 &&
|
|
rsiOverSoldLevel < rsiOverBoughtLevel &&
|
|
// PSAR ...
|
|
sarMax > 0 &&
|
|
sarStep > 0 &&
|
|
sarMax > sarStep &&
|
|
//
|
|
// ATR ...
|
|
atrLength > 0 &&
|
|
atrMultiplier > 0 &&
|
|
//
|
|
// XDON ...
|
|
donchainLength > 0 &&
|
|
//
|
|
// VWAP ...
|
|
vwapFastLength > 2 &&
|
|
vwapMidLength > vwapFastLength &&
|
|
vwapSlowLength > vwapMidLength &&
|
|
//
|
|
// XPV ...
|
|
(IsValid(scMethod, scPeriod) &&
|
|
IsValid(mcMethod, mcPeriod) &&
|
|
IsValid(lcMethod, lcPeriod) &&
|
|
IsValid(hcMethod, hcPeriod))
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Extract Max Input Length ...
|
|
*
|
|
* @return ( int )
|
|
*/
|
|
int Max()
|
|
{
|
|
//
|
|
int result = 0;
|
|
|
|
//
|
|
// VWAP ...
|
|
result = MathMax(result, vwapFastLength);
|
|
result = MathMax(result, vwapFastLength);
|
|
result = MathMax(result, vwapMidLength);
|
|
|
|
//
|
|
// ATR ...
|
|
result = MathMax(result, atrLength);
|
|
result = MathMax(result, rsiLength);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
};
|
|
|
|
//
|
|
// Conditions ...
|
|
struct X121Conditions
|
|
{
|
|
//
|
|
// Common ...
|
|
string symbol;
|
|
ENUM_TIMEFRAMES period;
|
|
datetime time;
|
|
|
|
//
|
|
// Buffers ...
|
|
double peaksBuffer[];
|
|
double valesBuffer[];
|
|
double sarBuffer[];
|
|
double atrUpperBuffer[];
|
|
double atrLowerBuffer[];
|
|
double vwapFastBuffer[];
|
|
double vwapMidBuffer[];
|
|
double vwapSlowBuffer[];
|
|
double donOpenUpperBuffer[];
|
|
double donOpenLowerBuffer[];
|
|
double donCloseUpperBuffer[];
|
|
double donCloseLowerBuffer[];
|
|
double donHighUpperBuffer[];
|
|
double donHighLowerBuffer[];
|
|
double donLowUpperBuffer[];
|
|
double donLowLowerBuffer[];
|
|
double fl1Buffer[];
|
|
double fl2Buffer[];
|
|
double fl3Buffer[];
|
|
double fl4Buffer[];
|
|
double fl5Buffer[];
|
|
double cHHBuffer[];
|
|
double cLLBuffer[];
|
|
double sHHBuffer[];
|
|
double sLLBuffer[];
|
|
double mHHBuffer[];
|
|
double mLLBuffer[];
|
|
double lHHBuffer[];
|
|
double lLLBuffer[];
|
|
double hHHBuffer[];
|
|
double hLLBuffer[];
|
|
double atrBuffer[];
|
|
double atrUpperRawBuffer[];
|
|
double atrLowerRawBuffer[];
|
|
double vwapVolumeBuffer[];
|
|
double vwapPriceBuffer[];
|
|
double vwapFastStateBuffer[];
|
|
double vwapMidStateBuffer[];
|
|
double vwapSlowStateBuffer[];
|
|
double rsiBuffer[];
|
|
|
|
//
|
|
// Conditions ...
|
|
|
|
//
|
|
// XRSI ...
|
|
|
|
//
|
|
bool isRSIOverBought;
|
|
bool isRSICrossedOverOverBought;
|
|
bool isRSICrossedUnderOverBought;
|
|
|
|
//
|
|
bool isRSIOverSold;
|
|
bool isRSICrossedUnderOverSold;
|
|
bool isRSICrossedOverOverSold;
|
|
|
|
//
|
|
// XSAR ...
|
|
|
|
//
|
|
bool isSarBullish;
|
|
bool isSarBearish;
|
|
|
|
//
|
|
bool isSarSwitchedToBullish;
|
|
bool isSarSwitchedToBearish;
|
|
|
|
//
|
|
// XPV ...
|
|
|
|
//
|
|
bool isNewPeak;
|
|
bool isNewPeakOverLast;
|
|
bool isNewPeakUnderLast;
|
|
|
|
//
|
|
bool isNewVale;
|
|
bool isNewValeOverLast;
|
|
bool isNewValeUnderLast;
|
|
|
|
//
|
|
// XVWAP ...
|
|
|
|
//
|
|
bool isVWapFastBullish;
|
|
bool isVWapFastBearish;
|
|
bool isVWapFastNeutural;
|
|
|
|
//
|
|
bool isVWapMidBullish;
|
|
bool isVWapMidBearish;
|
|
bool isVWapMidNeutural;
|
|
|
|
//
|
|
bool isVWapSlowBullish;
|
|
bool isVWapSlowBearish;
|
|
bool isVWapSlowNeutural;
|
|
|
|
//
|
|
bool isVWapFastOverMid;
|
|
bool isVWapMidOverSlow;
|
|
|
|
//
|
|
bool isVWapFastUnderMid;
|
|
bool isVWapMidUnderSlow;
|
|
|
|
//
|
|
bool isVWapBullishState;
|
|
bool isVWapBearishState;
|
|
bool isVWapNeuturalState;
|
|
|
|
//
|
|
bool isVWapBullishOrdered;
|
|
bool isVWapBearishOrdered;
|
|
|
|
//
|
|
bool isVWapSwitchedToBullishOrdered;
|
|
bool isVWapSwitchedToBearishOrdered;
|
|
|
|
//
|
|
bool isVWapSwitchedToBullishState;
|
|
bool isVWapSwitchedToBearishState;
|
|
bool isVWapSwitchedToNeuturalState;
|
|
|
|
//
|
|
// XDON ...
|
|
|
|
//
|
|
// bool isCloseLower
|
|
|
|
//
|
|
// XFIBONACCI ...
|
|
|
|
//
|
|
bool isOerFib1;
|
|
bool isOerFib2;
|
|
bool isOerFib3;
|
|
bool isOerFib4;
|
|
bool isOerFib5;
|
|
|
|
//
|
|
bool isUnderFib1;
|
|
bool isUnderFib2;
|
|
bool isUnderFib3;
|
|
bool isUnderFib4;
|
|
bool isUnderFib5;
|
|
|
|
//
|
|
bool isCloseOerFib1;
|
|
bool isCloseOerFib2;
|
|
bool isCloseOerFib3;
|
|
bool isCloseOerFib4;
|
|
bool isCloseOerFib5;
|
|
|
|
//
|
|
bool isCloseUnderFib1;
|
|
bool isCloseUnderFib2;
|
|
bool isCloseUnderFib3;
|
|
bool isCloseUnderFib4;
|
|
bool isCloseUnderFib5;
|
|
|
|
//
|
|
// Constructor ...
|
|
X121Conditions()
|
|
{
|
|
Clean();
|
|
}
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
/**
|
|
* Cleaning Up ...
|
|
*/
|
|
void Clean()
|
|
{
|
|
//
|
|
// Commons ...
|
|
symbol = NULL;
|
|
period = NULL;
|
|
time = NULL;
|
|
|
|
//
|
|
// Buffers ...
|
|
|
|
//
|
|
Clean(peaksBuffer);
|
|
Clean(valesBuffer);
|
|
Clean(sarBuffer);
|
|
Clean(atrUpperBuffer);
|
|
Clean(atrLowerBuffer);
|
|
Clean(vwapFastBuffer);
|
|
Clean(vwapMidBuffer);
|
|
Clean(vwapSlowBuffer);
|
|
Clean(donOpenUpperBuffer);
|
|
Clean(donOpenLowerBuffer);
|
|
Clean(donCloseUpperBuffer);
|
|
Clean(donCloseLowerBuffer);
|
|
Clean(donHighUpperBuffer);
|
|
Clean(donHighLowerBuffer);
|
|
Clean(donLowUpperBuffer);
|
|
Clean(donLowLowerBuffer);
|
|
Clean(fl1Buffer);
|
|
Clean(fl2Buffer);
|
|
Clean(fl3Buffer);
|
|
Clean(fl4Buffer);
|
|
Clean(fl5Buffer);
|
|
Clean(cHHBuffer);
|
|
Clean(cLLBuffer);
|
|
Clean(sHHBuffer);
|
|
Clean(sLLBuffer);
|
|
Clean(mHHBuffer);
|
|
Clean(mLLBuffer);
|
|
Clean(lHHBuffer);
|
|
Clean(lLLBuffer);
|
|
Clean(hHHBuffer);
|
|
Clean(hLLBuffer);
|
|
Clean(atrBuffer);
|
|
Clean(atrUpperRawBuffer);
|
|
Clean(atrLowerRawBuffer);
|
|
Clean(vwapVolumeBuffer);
|
|
Clean(vwapPriceBuffer);
|
|
Clean(vwapFastStateBuffer);
|
|
Clean(vwapMidStateBuffer);
|
|
Clean(vwapSlowStateBuffer);
|
|
Clean(rsiBuffer);
|
|
|
|
//
|
|
ArraySetAsSeries(peaksBuffer, true);
|
|
ArraySetAsSeries(valesBuffer, true);
|
|
ArraySetAsSeries(sarBuffer, true);
|
|
ArraySetAsSeries(atrUpperBuffer, true);
|
|
ArraySetAsSeries(atrLowerBuffer, true);
|
|
ArraySetAsSeries(vwapFastBuffer, true);
|
|
ArraySetAsSeries(vwapMidBuffer, true);
|
|
ArraySetAsSeries(vwapSlowBuffer, true);
|
|
ArraySetAsSeries(donOpenUpperBuffer, true);
|
|
ArraySetAsSeries(donOpenLowerBuffer, true);
|
|
ArraySetAsSeries(donCloseUpperBuffer, true);
|
|
ArraySetAsSeries(donCloseLowerBuffer, true);
|
|
ArraySetAsSeries(donHighUpperBuffer, true);
|
|
ArraySetAsSeries(donHighLowerBuffer, true);
|
|
ArraySetAsSeries(donLowUpperBuffer, true);
|
|
ArraySetAsSeries(donLowLowerBuffer, true);
|
|
ArraySetAsSeries(fl1Buffer, true);
|
|
ArraySetAsSeries(fl2Buffer, true);
|
|
ArraySetAsSeries(fl3Buffer, true);
|
|
ArraySetAsSeries(fl4Buffer, true);
|
|
ArraySetAsSeries(fl5Buffer, true);
|
|
ArraySetAsSeries(cHHBuffer, true);
|
|
ArraySetAsSeries(cLLBuffer, true);
|
|
ArraySetAsSeries(sHHBuffer, true);
|
|
ArraySetAsSeries(sLLBuffer, true);
|
|
ArraySetAsSeries(mHHBuffer, true);
|
|
ArraySetAsSeries(mLLBuffer, true);
|
|
ArraySetAsSeries(lHHBuffer, true);
|
|
ArraySetAsSeries(lLLBuffer, true);
|
|
ArraySetAsSeries(hHHBuffer, true);
|
|
ArraySetAsSeries(hLLBuffer, true);
|
|
ArraySetAsSeries(atrBuffer, true);
|
|
ArraySetAsSeries(atrUpperRawBuffer, true);
|
|
ArraySetAsSeries(atrLowerRawBuffer, true);
|
|
ArraySetAsSeries(vwapVolumeBuffer, true);
|
|
ArraySetAsSeries(vwapPriceBuffer, true);
|
|
ArraySetAsSeries(vwapFastStateBuffer, true);
|
|
ArraySetAsSeries(vwapMidStateBuffer, true);
|
|
ArraySetAsSeries(vwapSlowStateBuffer, true);
|
|
ArraySetAsSeries(rsiBuffer, true);
|
|
|
|
//
|
|
// Conditions ...
|
|
|
|
//
|
|
// XRSI ...
|
|
|
|
//
|
|
isRSIOverBought = false;
|
|
isRSICrossedUnderOverBought = false;
|
|
isRSICrossedOverOverBought = false;
|
|
|
|
//
|
|
isRSIOverSold = false;
|
|
isRSICrossedOverOverSold = false;
|
|
isRSICrossedUnderOverSold = false;
|
|
|
|
//
|
|
// XSAR ...
|
|
|
|
//
|
|
isSarBullish = false;
|
|
isSarBearish = false;
|
|
|
|
//
|
|
isSarSwitchedToBullish = false;
|
|
isSarSwitchedToBearish = false;
|
|
|
|
//
|
|
// XPV ...
|
|
|
|
//
|
|
isNewPeak = false;
|
|
isNewPeakOverLast = false;
|
|
isNewPeakUnderLast = false;
|
|
|
|
//
|
|
isNewVale = false;
|
|
isNewValeOverLast = false;
|
|
isNewValeUnderLast = false;
|
|
|
|
//
|
|
// XVWAP ...
|
|
|
|
//
|
|
isVWapFastBullish = false;
|
|
isVWapFastBearish = false;
|
|
isVWapFastNeutural = false;
|
|
|
|
//
|
|
isVWapMidBullish = false;
|
|
isVWapMidBearish = false;
|
|
isVWapMidNeutural = false;
|
|
|
|
//
|
|
isVWapSlowBullish = false;
|
|
isVWapSlowBearish = false;
|
|
isVWapSlowNeutural = false;
|
|
|
|
//
|
|
isVWapFastOverMid = false;
|
|
isVWapMidOverSlow = false;
|
|
|
|
//
|
|
isVWapFastUnderMid = false;
|
|
isVWapMidUnderSlow = false;
|
|
|
|
//
|
|
isVWapBullishState = false;
|
|
isVWapBearishState = false;
|
|
isVWapNeuturalState = false;
|
|
|
|
//
|
|
isVWapBullishOrdered = false;
|
|
isVWapBearishOrdered = false;
|
|
|
|
//
|
|
isVWapSwitchedToBullishOrdered = false;
|
|
isVWapSwitchedToBearishOrdered = false;
|
|
|
|
//
|
|
isVWapSwitchedToBullishState = false;
|
|
isVWapSwitchedToBearishState = false;
|
|
isVWapSwitchedToNeuturalState = false;
|
|
|
|
//
|
|
// XDON ...
|
|
|
|
//
|
|
// XFIBONACCI ...
|
|
|
|
//
|
|
isOerFib1 = false;
|
|
isOerFib2 = false;
|
|
isOerFib3 = false;
|
|
isOerFib4 = false;
|
|
isOerFib5 = false;
|
|
|
|
//
|
|
isUnderFib1 = false;
|
|
isUnderFib2 = false;
|
|
isUnderFib3 = false;
|
|
isUnderFib4 = false;
|
|
isUnderFib5 = false;
|
|
|
|
//
|
|
isCloseOerFib1 = false;
|
|
isCloseOerFib2 = false;
|
|
isCloseOerFib3 = false;
|
|
isCloseOerFib4 = false;
|
|
isCloseOerFib5 = false;
|
|
|
|
//
|
|
isCloseUnderFib1 = false;
|
|
isCloseUnderFib2 = false;
|
|
isCloseUnderFib3 = false;
|
|
isCloseUnderFib4 = false;
|
|
isCloseUnderFib5 = false;
|
|
}
|
|
|
|
/**
|
|
* Generate Conditions Scores ...
|
|
*
|
|
* @param bullishScore: Double, Directional Scores Reference ...
|
|
* @param bearishScore: Double, Directional Scores Reference ...
|
|
*/
|
|
void GenerateScore(
|
|
double &bullishScore,
|
|
double &bearishScore //
|
|
)
|
|
{
|
|
//
|
|
bullishScore = 0;
|
|
bearishScore = 0;
|
|
|
|
//
|
|
// TODO: Implement if Required ...
|
|
}
|
|
|
|
/**
|
|
* Generate Summary String for Represent Conditions State ...
|
|
*
|
|
* @param onlyCommons: Boolean, Just Generate Only Commons Conditions ...
|
|
* @param onlyConditions: Boolean, Just Generate Only Conditions ...
|
|
* @param includeScores: Boolean, Attach Scores Representations on Result ...
|
|
* @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ...
|
|
* @param separator: String, Separate Lines ...
|
|
*
|
|
* @return ( string )
|
|
*/
|
|
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 //
|
|
);
|
|
|
|
//
|
|
// TODO: Implement this if required ...
|
|
string conditionsStr =
|
|
//
|
|
// XSAR ...
|
|
ToString("isSarBullish", isSarBullish, ignoreFalseConditions, separator) +
|
|
ToString("isSarBearish", isSarBearish, ignoreFalseConditions, separator) +
|
|
ToString("isSarSwitchedToBullish", isSarSwitchedToBullish, ignoreFalseConditions, separator) +
|
|
ToString("isSarSwitchedToBearish", isSarSwitchedToBearish, ignoreFalseConditions, separator) +
|
|
//
|
|
// XPV ...
|
|
ToString("isNewPeak", isNewPeak, ignoreFalseConditions, separator) +
|
|
ToString("isNewPeakOverLast", isNewPeakOverLast, ignoreFalseConditions, separator) +
|
|
ToString("isNewPeakUnderLast", isNewPeakUnderLast, ignoreFalseConditions, separator) +
|
|
ToString("isNewVale", isNewVale, ignoreFalseConditions, separator) +
|
|
ToString("isNewValeOverLast", isNewValeOverLast, ignoreFalseConditions, separator) +
|
|
ToString("isNewValeUnderLast", isNewValeUnderLast, ignoreFalseConditions, separator) +
|
|
//
|
|
// XVWAP ...
|
|
ToString("isVWapFastBullish", isVWapFastBullish, ignoreFalseConditions, separator) +
|
|
ToString("isVWapFastBearish", isVWapFastBearish, ignoreFalseConditions, separator) +
|
|
ToString("isVWapFastNeutural", isVWapFastNeutural, ignoreFalseConditions, separator) +
|
|
ToString("isVWapMidBullish", isVWapMidBullish, ignoreFalseConditions, separator) +
|
|
ToString("isVWapMidBearish", isVWapMidBearish, ignoreFalseConditions, separator) +
|
|
ToString("isVWapMidNeutural", isVWapMidNeutural, ignoreFalseConditions, separator) +
|
|
ToString("isVWapSlowBullish", isVWapSlowBullish, ignoreFalseConditions, separator) +
|
|
ToString("isVWapSlowBearish", isVWapSlowBearish, ignoreFalseConditions, separator) +
|
|
ToString("isVWapSlowNeutural", isVWapSlowNeutural, ignoreFalseConditions, separator) +
|
|
ToString("isVWapFastOverMid", isVWapFastOverMid, ignoreFalseConditions, separator) +
|
|
ToString("isVWapMidOverSlow", isVWapMidOverSlow, ignoreFalseConditions, separator) +
|
|
ToString("isVWapFastUnderMid", isVWapFastUnderMid, ignoreFalseConditions, separator) +
|
|
ToString("isVWapMidUnderSlow", isVWapMidUnderSlow, ignoreFalseConditions, separator) +
|
|
ToString("isVWapBullishState", isVWapBullishState, ignoreFalseConditions, separator) +
|
|
ToString("isVWapBearishState", isVWapBearishState, ignoreFalseConditions, separator) +
|
|
ToString("isVWapNeuturalState", isVWapNeuturalState, ignoreFalseConditions, separator) +
|
|
ToString("isVWapBullishOrdered", isVWapBullishOrdered, ignoreFalseConditions, separator) +
|
|
ToString("isVWapBearishOrdered", isVWapBearishOrdered, ignoreFalseConditions, separator) +
|
|
ToString("isVWapSwitchedToBullishOrdered", isVWapSwitchedToBullishOrdered, ignoreFalseConditions, separator) +
|
|
ToString("isVWapSwitchedToBearishOrdered", isVWapSwitchedToBearishOrdered, ignoreFalseConditions, separator) +
|
|
ToString("isVWapSwitchedToBullishState", isVWapSwitchedToBullishState, ignoreFalseConditions, separator) +
|
|
ToString("isVWapSwitchedToBearishState", isVWapSwitchedToBearishState, ignoreFalseConditions, separator) +
|
|
ToString("isVWapSwitchedToNeuturalState", isVWapSwitchedToNeuturalState, ignoreFalseConditions, separator) +
|
|
//
|
|
// XFIBONACCI ...
|
|
ToString("isOerFib1", isOerFib1, ignoreFalseConditions, separator) +
|
|
ToString("isOerFib2", isOerFib2, ignoreFalseConditions, separator) +
|
|
ToString("isOerFib3", isOerFib3, ignoreFalseConditions, separator) +
|
|
ToString("isOerFib4", isOerFib4, ignoreFalseConditions, separator) +
|
|
ToString("isOerFib5", isOerFib5, ignoreFalseConditions, separator) +
|
|
ToString("isUnderFib1", isUnderFib1, ignoreFalseConditions, separator) +
|
|
ToString("isUnderFib2", isUnderFib2, ignoreFalseConditions, separator) +
|
|
ToString("isUnderFib3", isUnderFib3, ignoreFalseConditions, separator) +
|
|
ToString("isUnderFib4", isUnderFib4, ignoreFalseConditions, separator) +
|
|
ToString("isUnderFib5", isUnderFib5, ignoreFalseConditions, separator) +
|
|
ToString("isCloseOerFib1", isCloseOerFib1, ignoreFalseConditions, separator) +
|
|
ToString("isCloseOerFib2", isCloseOerFib2, ignoreFalseConditions, separator) +
|
|
ToString("isCloseOerFib3", isCloseOerFib3, ignoreFalseConditions, separator) +
|
|
ToString("isCloseOerFib4", isCloseOerFib4, ignoreFalseConditions, separator) +
|
|
ToString("isCloseOerFib5", isCloseOerFib5, ignoreFalseConditions, separator) +
|
|
ToString("isCloseUnderFib1", isCloseUnderFib1, ignoreFalseConditions, separator) +
|
|
ToString("isCloseUnderFib2", isCloseUnderFib2, ignoreFalseConditions, separator) +
|
|
ToString("isCloseUnderFib3", isCloseUnderFib3, ignoreFalseConditions, separator) +
|
|
ToString("isCloseUnderFib4", isCloseUnderFib4, ignoreFalseConditions, separator) +
|
|
ToString("isCloseUnderFib5", isCloseUnderFib5, ignoreFalseConditions, separator) +
|
|
//
|
|
""
|
|
//
|
|
;
|
|
|
|
//
|
|
result =
|
|
//
|
|
"[" + GetTag() + "]" + separator +
|
|
(onlyConditions
|
|
? ""
|
|
: commonStr) +
|
|
(!includeScores
|
|
? ""
|
|
: scoresStr) +
|
|
" " + separator +
|
|
(onlyCommons
|
|
? ""
|
|
: conditionsStr) +
|
|
""
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Retrieve nique Tag Identifier ...
|
|
*
|
|
* @return ( string )
|
|
*/
|
|
string GetTag()
|
|
{
|
|
return GetTypeName(this);
|
|
}
|
|
|
|
//
|
|
};
|
|
|
|
//
|
|
// Implementation ...
|
|
|
|
class XCX121Helper : public XCBaseHelper
|
|
{
|
|
//
|
|
public:
|
|
//
|
|
|
|
//
|
|
// Constructors ...
|
|
XCX121Helper()
|
|
: XCBaseHelper(_Symbol, _Period)
|
|
{
|
|
}
|
|
|
|
//
|
|
// Deconstructor ...
|
|
~XCX121Helper()
|
|
{
|
|
IndicatorRelease(mRSIHandler);
|
|
}
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
/**
|
|
* Initialize Indicator Helper ...
|
|
*
|
|
* @param symbol: String, Symbol ...
|
|
* @param period: ENUM_TIMEFRAMES member, Period ...
|
|
* @param inputs: X121Inputs instance, Indicator Inputs ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool Init(
|
|
string symbol, // Trading Symbol
|
|
ENUM_TIMEFRAMES period, // Trading Period
|
|
X121Inputs &inputs // Inputs
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
mSymbol = symbol;
|
|
mPeriod = period;
|
|
|
|
//
|
|
// Validate Inputs ...
|
|
result = inputs.IsValid();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
mInputs = inputs;
|
|
|
|
//
|
|
// Setting Arrays As Series ...
|
|
ArraySetAsSeries(peaksBuffer, true);
|
|
ArraySetAsSeries(valesBuffer, true);
|
|
ArraySetAsSeries(sarBuffer, true);
|
|
ArraySetAsSeries(atrUpperBuffer, true);
|
|
ArraySetAsSeries(atrLowerBuffer, true);
|
|
ArraySetAsSeries(vwapFastBuffer, true);
|
|
ArraySetAsSeries(vwapMidBuffer, true);
|
|
ArraySetAsSeries(vwapSlowBuffer, true);
|
|
ArraySetAsSeries(donOpenUpperBuffer, true);
|
|
ArraySetAsSeries(donOpenLowerBuffer, true);
|
|
ArraySetAsSeries(donCloseUpperBuffer, true);
|
|
ArraySetAsSeries(donCloseLowerBuffer, true);
|
|
ArraySetAsSeries(donHighUpperBuffer, true);
|
|
ArraySetAsSeries(donHighLowerBuffer, true);
|
|
ArraySetAsSeries(donLowUpperBuffer, true);
|
|
ArraySetAsSeries(donLowLowerBuffer, true);
|
|
ArraySetAsSeries(fl1Buffer, true);
|
|
ArraySetAsSeries(fl2Buffer, true);
|
|
ArraySetAsSeries(fl3Buffer, true);
|
|
ArraySetAsSeries(fl4Buffer, true);
|
|
ArraySetAsSeries(fl5Buffer, true);
|
|
ArraySetAsSeries(cHHBuffer, true);
|
|
ArraySetAsSeries(cLLBuffer, true);
|
|
ArraySetAsSeries(sHHBuffer, true);
|
|
ArraySetAsSeries(sLLBuffer, true);
|
|
ArraySetAsSeries(mHHBuffer, true);
|
|
ArraySetAsSeries(mLLBuffer, true);
|
|
ArraySetAsSeries(lHHBuffer, true);
|
|
ArraySetAsSeries(lLLBuffer, true);
|
|
ArraySetAsSeries(hHHBuffer, true);
|
|
ArraySetAsSeries(hLLBuffer, true);
|
|
ArraySetAsSeries(atrBuffer, true);
|
|
ArraySetAsSeries(atrUpperRawBuffer, true);
|
|
ArraySetAsSeries(atrLowerRawBuffer, true);
|
|
ArraySetAsSeries(vwapVolumeBuffer, true);
|
|
ArraySetAsSeries(vwapPriceBuffer, true);
|
|
ArraySetAsSeries(vwapFastStateBuffer, true);
|
|
ArraySetAsSeries(vwapMidStateBuffer, true);
|
|
ArraySetAsSeries(vwapSlowStateBuffer, true);
|
|
ArraySetAsSeries(rsiBuffer, true);
|
|
|
|
//
|
|
mHandler = iCustom(
|
|
mSymbol,
|
|
mPeriod,
|
|
"x-saherelm.x121",
|
|
//
|
|
// Inputs ...
|
|
//
|
|
// Cycles ...
|
|
"",
|
|
//
|
|
// Short ...
|
|
"",
|
|
mInputs.scMethod,
|
|
mInputs.scPeriod,
|
|
//
|
|
// Medium ...
|
|
"",
|
|
mInputs.mcMethod,
|
|
mInputs.mcPeriod,
|
|
//
|
|
// Long ...
|
|
"",
|
|
mInputs.lcMethod,
|
|
mInputs.lcPeriod,
|
|
//
|
|
// Hind ...
|
|
"",
|
|
mInputs.hcMethod,
|
|
mInputs.hcPeriod,
|
|
//
|
|
// Boundary Detection ...
|
|
"",
|
|
mInputs.hhMode,
|
|
mInputs.llMode,
|
|
//
|
|
// Parabolic Sar Detection ...
|
|
"",
|
|
mInputs.sarStep,
|
|
mInputs.sarMax,
|
|
//
|
|
// Atr Detection ...
|
|
"",
|
|
mInputs.atrLength,
|
|
mInputs.atrMultiplier,
|
|
mInputs.atrUpperAppliedTo,
|
|
mInputs.atrLowerAppliedTo,
|
|
mInputs.atrSmoothingMode,
|
|
//
|
|
// VWap Detection ...
|
|
"",
|
|
mInputs.vwapFastLength,
|
|
mInputs.vwapMidLength,
|
|
mInputs.vwapSlowLength,
|
|
mInputs.vwapAppliedTo,
|
|
//
|
|
// Donchain Detection ...
|
|
"",
|
|
mInputs.donchainLength,
|
|
//
|
|
// Presentation ...
|
|
"",
|
|
mInputs.startCalculationForLastBars,
|
|
//
|
|
// Commons ...
|
|
mInputs.showSar,
|
|
mInputs.showAtr,
|
|
mInputs.showPeaks,
|
|
mInputs.showVales,
|
|
mInputs.showVWap,
|
|
mInputs.showDonchain,
|
|
//
|
|
// Fibonachi Presentation ...
|
|
"",
|
|
mInputs.showFibo1Levels,
|
|
mInputs.showFibo2Levels,
|
|
mInputs.showFibo3Levels,
|
|
mInputs.showFibo4Levels,
|
|
mInputs.showFibo5Levels,
|
|
//
|
|
// Atr Presentation ...
|
|
"",
|
|
mInputs.showAtrUpper,
|
|
mInputs.showAtrLower,
|
|
//
|
|
// VWap Presentation ...
|
|
"",
|
|
mInputs.showVWapFast,
|
|
mInputs.showVWapMedium,
|
|
mInputs.showVWapSlow,
|
|
//
|
|
// Donchain Presentation ...
|
|
"",
|
|
mInputs.showUpper,
|
|
mInputs.showLower,
|
|
mInputs.showOpen,
|
|
mInputs.showHigh,
|
|
mInputs.showClose,
|
|
mInputs.showLow
|
|
//
|
|
// Non Important Inpust ...
|
|
//
|
|
// Fibonacci ...
|
|
// "",
|
|
// mInputs.fiboLevel1,
|
|
// mInputs.fiboLevel2,
|
|
// mInputs.fiboLevel3,
|
|
// mInputs.fiboLevel4,
|
|
// mInputs.fiboLevel5,
|
|
// //
|
|
// mInputs.sarArrowCode,
|
|
// mInputs.peaksArrowCode,
|
|
// mInputs.valesArrowCode
|
|
//
|
|
);
|
|
result = mHandler != INVALID_HANDLE;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
mRSIHandler = iRSI(
|
|
symbol,
|
|
period,
|
|
mInputs.rsiLength,
|
|
PRICE_CLOSE //
|
|
);
|
|
result = mRSIHandler != INVALID_HANDLE;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Retrieve Current Indicator Configs ...
|
|
*
|
|
* @return ( Inputs )
|
|
*/
|
|
X121Inputs GetInputs()
|
|
{
|
|
return mInputs;
|
|
}
|
|
|
|
/**
|
|
* Set New Indicator Inputs ...
|
|
*
|
|
* @param inputs: X121Inputs instance, Indicator Inputs ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool SetInputs(
|
|
X121Inputs &inputs // Configs
|
|
)
|
|
{
|
|
//
|
|
return Init(
|
|
mSymbol,
|
|
mPeriod,
|
|
inputs
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// Implement Value Getters ...
|
|
|
|
//
|
|
// XRSI ...
|
|
|
|
//
|
|
double GetRSI(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(rsiBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return rsiBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyRSI(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
rsiBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// SAR ...
|
|
|
|
//
|
|
double GetSar(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(sarBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return sarBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopySar(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
sarBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// ATR ...
|
|
|
|
//
|
|
// Common ...
|
|
|
|
//
|
|
double GetAtr(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(atrBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return atrBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyAtr(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
atrBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
double GetAtrUpper(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(atrUpperBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return atrUpperBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyAtrUpper(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
atrUpperBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
double GetAtrUpperRaw(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(atrUpperRawBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return atrUpperRawBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyAtrUpperRaw(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
atrUpperRawBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
double GetAtrLower(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(atrLowerBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return atrLowerBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyAtrLower(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
atrLowerBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
double GetAtrLowerRaw(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(atrLowerRawBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return atrLowerRawBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyAtrLowerRaw(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
atrLowerRawBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// PV ...
|
|
|
|
//
|
|
// PEAKS ...
|
|
|
|
//
|
|
double GetPeak(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(peaksBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return peaksBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyPeak(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
peaksBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// VALES ...
|
|
|
|
//
|
|
double GetVale(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(valesBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return valesBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyVale(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
valesBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
//
|
|
//
|
|
|
|
//
|
|
double GetHigherPeak(
|
|
double peak, // Peak Source
|
|
int barIndex = 0, // Bar Index
|
|
int loopback = 576 // Max Allowed Loopback
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
if (loopback < 576)
|
|
{
|
|
loopback = 576;
|
|
}
|
|
|
|
//
|
|
if (peak <= 0)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double iValue = 0;
|
|
int index = barIndex;
|
|
bool canContinue = true;
|
|
while (canContinue)
|
|
{
|
|
//
|
|
iValue = GetPeak(index);
|
|
if (iValue > peak)
|
|
{
|
|
//
|
|
result = iValue;
|
|
break;
|
|
}
|
|
|
|
//
|
|
canContinue = index < barIndex + loopback;
|
|
index++;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double GetLowerPeak(
|
|
double peak, // Peak Source
|
|
int barIndex = 0, // Bar Index
|
|
int loopback = 576 // Max Allowed Loopback
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
if (loopback < 576)
|
|
{
|
|
loopback = 576;
|
|
}
|
|
|
|
//
|
|
if (peak <= 0)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double iValue = 0;
|
|
int index = barIndex;
|
|
bool canContinue = true;
|
|
while (canContinue)
|
|
{
|
|
//
|
|
iValue = GetPeak(index);
|
|
if (iValue < peak)
|
|
{
|
|
//
|
|
result = iValue;
|
|
break;
|
|
}
|
|
|
|
//
|
|
canContinue = index < barIndex + loopback;
|
|
index++;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double GetHigherVale(
|
|
double vale, // Vale Source
|
|
int barIndex = 0, // Bar Index
|
|
int loopback = 576 // Max Allowed Loopback
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
if (loopback < 576)
|
|
{
|
|
loopback = 576;
|
|
}
|
|
|
|
//
|
|
if (vale <= 0)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double iValue = 0;
|
|
int index = barIndex;
|
|
bool canContinue = true;
|
|
while (canContinue)
|
|
{
|
|
//
|
|
iValue = GetVale(index);
|
|
if (iValue > vale)
|
|
{
|
|
//
|
|
result = iValue;
|
|
break;
|
|
}
|
|
|
|
//
|
|
canContinue = index > barIndex + loopback;
|
|
index++;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double GetLowerVale(
|
|
double vale, // Vale Source
|
|
int barIndex = 0, // Bar Index
|
|
int loopback = 576 // Max Allowed Loopback
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
if (loopback < 576)
|
|
{
|
|
loopback = 576;
|
|
}
|
|
|
|
//
|
|
if (vale <= 0)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double iValue = 0;
|
|
int index = barIndex;
|
|
bool canContinue = true;
|
|
while (canContinue)
|
|
{
|
|
//
|
|
iValue = GetVale(index);
|
|
if (iValue < vale)
|
|
{
|
|
//
|
|
result = iValue;
|
|
break;
|
|
}
|
|
|
|
//
|
|
canContinue = index > barIndex + loopback;
|
|
index++;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
//
|
|
//
|
|
|
|
//
|
|
double GetLowestPeak(
|
|
int barIndex,
|
|
int &index,
|
|
double &vale,
|
|
int loopback = 576 //
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
index = -1;
|
|
vale = 0;
|
|
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
if (loopback < 576)
|
|
{
|
|
loopback = 576;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
for (int i = 0; i < barIndex + loopback; i++)
|
|
{
|
|
//
|
|
double iPeak = GetPeak(i);
|
|
if (iPeak == 0)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
if (iPeak > 0 && (result == 0 ||
|
|
result >= iPeak))
|
|
{
|
|
//
|
|
index = i;
|
|
result = iPeak;
|
|
vale = GetVale(index);
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double GetHighestPeak(
|
|
int barIndex,
|
|
int &index,
|
|
double &vale,
|
|
int loopback = 576 //
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
index = -1;
|
|
vale = 0;
|
|
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
if (loopback < 576)
|
|
{
|
|
loopback = 576;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
for (int i = 0; i < barIndex + loopback; i++)
|
|
{
|
|
//
|
|
double iPeak = GetPeak(i);
|
|
if (iPeak == 0)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
if (iPeak > 0 && (result == 0 ||
|
|
result <= iPeak))
|
|
{
|
|
//
|
|
index = i;
|
|
result = iPeak;
|
|
vale = GetVale(index);
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double GetLowestVale(
|
|
int barIndex,
|
|
int &index,
|
|
double &peak,
|
|
int loopback = 576 //
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
index = -1;
|
|
peak = 0;
|
|
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
if (loopback < 576)
|
|
{
|
|
loopback = 576;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
for (int i = 0; i < barIndex + loopback; i++)
|
|
{
|
|
//
|
|
double iPeak = GetVale(i);
|
|
if (iPeak == 0)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
if (iPeak > 0 && (result == 0 ||
|
|
result >= iPeak))
|
|
{
|
|
//
|
|
index = i;
|
|
result = iPeak;
|
|
peak = GetPeak(index);
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double GetHighestVale(
|
|
int barIndex,
|
|
int &index,
|
|
double &peak,
|
|
int loopback = 576 //
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
index = -1;
|
|
peak = 0;
|
|
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
if (loopback < 576)
|
|
{
|
|
loopback = 576;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
for (int i = 0; i < barIndex + loopback; i++)
|
|
{
|
|
//
|
|
double iPeak = GetVale(i);
|
|
if (iPeak == 0)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
if (iPeak > 0 && (result == 0 ||
|
|
result <= iPeak))
|
|
{
|
|
//
|
|
index = i;
|
|
result = iPeak;
|
|
peak = GetPeak(index);
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// CURRENT ...
|
|
|
|
//
|
|
// HH ...
|
|
|
|
//
|
|
double GetCHH(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(cHHBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return cHHBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyCHH(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
cHHBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LL ...
|
|
|
|
//
|
|
double GetCLL(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(cLLBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return cLLBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyCLL(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
cLLBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// SHORT ...
|
|
|
|
//
|
|
// HH ...
|
|
|
|
//
|
|
double GetSHH(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(sHHBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return sHHBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopySHH(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
sHHBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LL ...
|
|
|
|
//
|
|
double GetSLL(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(sLLBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return sLLBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopySLL(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
sLLBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// MEDIUM ...
|
|
|
|
//
|
|
// HH ...
|
|
|
|
//
|
|
double GetMHH(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(mHHBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return mHHBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyMHH(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
mHHBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LL ...
|
|
|
|
//
|
|
double GetMLL(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(mLLBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return mLLBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyMLL(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
mLLBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LONG ...
|
|
|
|
//
|
|
// HH ...
|
|
|
|
//
|
|
double GetLHH(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(lHHBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return lHHBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyLHH(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
lHHBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LL ...
|
|
|
|
//
|
|
double GetLLL(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(lLLBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return lLLBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyLLL(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
lLLBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// HIND ...
|
|
|
|
//
|
|
// HH ...
|
|
|
|
//
|
|
double GetHHH(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(hHHBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return hHHBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyHHH(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
hHHBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LL ...
|
|
|
|
//
|
|
double GetHLL(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(hLLBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return hLLBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyHLL(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
hLLBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// VWAP ...
|
|
|
|
//
|
|
// FAST ...
|
|
|
|
//
|
|
double GetVWapFast(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(vwapFastBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return vwapFastBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyVWapFast(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
vwapFastBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// STATE FAST ...
|
|
|
|
//
|
|
double GetVWapFastState(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(vwapFastStateBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return vwapFastStateBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyVWapFastState(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
vwapFastStateBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// MID ...
|
|
|
|
//
|
|
double GetVWapMid(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(vwapMidBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return vwapMidBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyVWapMid(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
vwapMidBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// STATE MID ...
|
|
|
|
//
|
|
double GetVWapMidState(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(vwapMidStateBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return vwapMidStateBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyVWapMidState(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
vwapMidStateBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// SLOW ...
|
|
|
|
//
|
|
double GetVWapSlowBuffer(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(vwapSlowBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return vwapSlowBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyVWapSlow(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
vwapSlowBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// STATE SLOW ...
|
|
|
|
//
|
|
double GetVWapSlowState(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(vwapSlowStateBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return vwapSlowStateBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyVWapSlowState(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
vwapSlowStateBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// VOLUME ...
|
|
|
|
//
|
|
double GetVWapVolume(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(vwapVolumeBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return vwapVolumeBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyVWapVolume(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
vwapVolumeBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// PRICE ...
|
|
|
|
//
|
|
double GetVWapPrice(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(vwapPriceBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return vwapPriceBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyVWapPrice(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
vwapPriceBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// Converts to State ...
|
|
ENUM_XVWAP_STATES ToVWAPState(double value)
|
|
{
|
|
//
|
|
ENUM_XVWAP_STATES result =
|
|
value == 1
|
|
? XVWAP_STATE_BULLISH
|
|
: value == 2
|
|
? XVWAP_STATE_BEARISH
|
|
: XVWAP_STATE_NEUTURAL;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
bool IsVWAPBullish(double value)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = ToVWAPState(value) == XVWAP_STATE_BULLISH;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
bool IsVWAPBearish(double value)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = ToVWAPState(value) == XVWAP_STATE_BEARISH;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
bool IsVWAPNeutural(double value)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = ToVWAPState(value) == XVWAP_STATE_NEUTURAL;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// XDON ...
|
|
|
|
//
|
|
// OPEN ...
|
|
|
|
//
|
|
// UPPER ...
|
|
|
|
//
|
|
double GetDonOpenUpper(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(donOpenUpperBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return donOpenUpperBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyDonOpenUpper(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
donOpenUpperBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LOWER ...
|
|
|
|
//
|
|
double GetDonOpenLower(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(donOpenLowerBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return donOpenLowerBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyDonOpenLower(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
donOpenLowerBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// CLOSE ...
|
|
|
|
//
|
|
// UPPER ...
|
|
|
|
//
|
|
double GetDonCloseUpper(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(donCloseUpperBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return donCloseUpperBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyDonCloseUpper(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
donCloseUpperBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LOWER ...
|
|
|
|
//
|
|
double GetDonCloseLower(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(donCloseLowerBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return donCloseLowerBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyDonCloseLower(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
donCloseLowerBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// HIGH ...
|
|
|
|
//
|
|
// UPPER ...
|
|
|
|
//
|
|
double GetDonHighUpper(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(donHighUpperBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return donHighUpperBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyDonHighUpper(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
donHighUpperBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LOWER ...
|
|
|
|
//
|
|
double GetDonHighLower(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(donHighLowerBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return donHighLowerBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyDonHighLower(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
donHighLowerBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LOW ...
|
|
|
|
//
|
|
// UPPER ...
|
|
|
|
//
|
|
double GetDonLowUpper(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(donLowUpperBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return donLowUpperBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyDonLowUpper(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
donLowUpperBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LOWER ...
|
|
|
|
//
|
|
double GetDonLoweLower(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(donLowLowerBuffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return donLowLowerBuffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyDonLoweLower(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // Force To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
donLowLowerBuffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// FIBONACCHI ...
|
|
|
|
//
|
|
// LEVEL 1 ...
|
|
|
|
//
|
|
double GetFiboLevel1(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(fl1Buffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return fl1Buffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyFiboLevel1(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // FiboLevel To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
fl1Buffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LEVEL 2 ...
|
|
|
|
//
|
|
double GetFiboLevel2(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(fl2Buffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return fl2Buffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyFiboLevel2(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // FiboLevel To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
fl2Buffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LEVEL 3 ...
|
|
|
|
//
|
|
double GetFiboLevel3(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(fl3Buffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return fl3Buffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyFiboLevel3(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // FiboLevel To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
fl3Buffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LEVEL 4 ...
|
|
|
|
//
|
|
double GetFiboLevel4(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(fl4Buffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return fl4Buffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyFiboLevel4(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // FiboLevel To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
fl4Buffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// LEVEL 5 ...
|
|
|
|
//
|
|
double GetFiboLevel5(
|
|
int barIndex // Bar Index
|
|
)
|
|
{
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
Calculate();
|
|
|
|
//
|
|
int count = ArraySize(fl5Buffer);
|
|
if (barIndex >= count)
|
|
{
|
|
barIndex = count - 1;
|
|
}
|
|
|
|
//
|
|
return fl5Buffer[barIndex];
|
|
}
|
|
|
|
//
|
|
int CopyFiboLevel5(
|
|
int start, // Start
|
|
int count, // Number of Items for read
|
|
double &buffer[], // Dest Buffer
|
|
bool forceClean = true // FiboLevel To Clean buffer
|
|
)
|
|
{
|
|
//
|
|
// Update Calculations ...
|
|
Calculate();
|
|
|
|
//
|
|
// Copy Items ...
|
|
return Copy(
|
|
start,
|
|
count,
|
|
fl5Buffer,
|
|
buffer,
|
|
forceClean
|
|
//
|
|
);
|
|
}
|
|
|
|
//
|
|
// Conditions Generation ...
|
|
|
|
bool GetConditions(
|
|
X121Conditions &conditions, //
|
|
int barIndex = 0, //
|
|
int loopback = 5 //
|
|
)
|
|
{
|
|
//
|
|
bool result = true;
|
|
|
|
//
|
|
if (loopback < 5)
|
|
{
|
|
loopback = 5;
|
|
}
|
|
|
|
//
|
|
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;
|
|
|
|
//
|
|
XOHCL zBar;
|
|
result = zBar.Init(
|
|
mSymbol,
|
|
mPeriod,
|
|
zIndex //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
XOHCL cBar;
|
|
result = cBar.Init(
|
|
mSymbol,
|
|
mPeriod,
|
|
cIndex //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
XOHCL pBar;
|
|
result = pBar.Init(
|
|
mSymbol,
|
|
mPeriod,
|
|
pIndex //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Buffers ...
|
|
|
|
//
|
|
CopyRSI(
|
|
zIndex,
|
|
loopback,
|
|
conditions.rsiBuffer //
|
|
);
|
|
|
|
//
|
|
CopySar(
|
|
zIndex,
|
|
loopback,
|
|
conditions.sarBuffer //
|
|
);
|
|
|
|
//
|
|
CopyAtr(
|
|
zIndex,
|
|
loopback,
|
|
conditions.atrBuffer //
|
|
);
|
|
|
|
//
|
|
CopyAtrUpper(
|
|
zIndex,
|
|
loopback,
|
|
conditions.atrUpperBuffer //
|
|
);
|
|
|
|
//
|
|
CopyAtrUpperRaw(
|
|
zIndex,
|
|
loopback,
|
|
conditions.atrUpperRawBuffer //
|
|
);
|
|
|
|
//
|
|
CopyAtrLower(
|
|
zIndex,
|
|
loopback,
|
|
conditions.atrLowerBuffer //
|
|
);
|
|
|
|
//
|
|
CopyAtrLowerRaw(
|
|
zIndex,
|
|
loopback,
|
|
conditions.atrLowerRawBuffer //
|
|
);
|
|
|
|
//
|
|
CopyPeak(
|
|
zIndex,
|
|
loopback,
|
|
conditions.peaksBuffer //
|
|
);
|
|
|
|
//
|
|
CopyVale(
|
|
zIndex,
|
|
loopback,
|
|
conditions.valesBuffer //
|
|
);
|
|
|
|
//
|
|
CopyCHH(
|
|
zIndex,
|
|
loopback,
|
|
conditions.cHHBuffer //
|
|
);
|
|
|
|
//
|
|
CopyCLL(
|
|
zIndex,
|
|
loopback,
|
|
conditions.cLLBuffer //
|
|
);
|
|
|
|
//
|
|
CopySHH(
|
|
zIndex,
|
|
loopback,
|
|
conditions.sHHBuffer //
|
|
);
|
|
|
|
//
|
|
CopySLL(
|
|
zIndex,
|
|
loopback,
|
|
conditions.sLLBuffer //
|
|
);
|
|
|
|
//
|
|
CopyMHH(
|
|
zIndex,
|
|
loopback,
|
|
conditions.mHHBuffer //
|
|
);
|
|
|
|
//
|
|
CopyMLL(
|
|
zIndex,
|
|
loopback,
|
|
conditions.mLLBuffer //
|
|
);
|
|
|
|
//
|
|
CopyLHH(
|
|
zIndex,
|
|
loopback,
|
|
conditions.lHHBuffer //
|
|
);
|
|
|
|
//
|
|
CopyLLL(
|
|
zIndex,
|
|
loopback,
|
|
conditions.lLLBuffer //
|
|
);
|
|
|
|
//
|
|
CopyHHH(
|
|
zIndex,
|
|
loopback,
|
|
conditions.hHHBuffer //
|
|
);
|
|
|
|
//
|
|
CopyHLL(
|
|
zIndex,
|
|
loopback,
|
|
conditions.hLLBuffer //
|
|
);
|
|
|
|
//
|
|
CopyVWapFast(
|
|
zIndex,
|
|
loopback,
|
|
conditions.vwapFastBuffer //
|
|
);
|
|
|
|
//
|
|
CopyVWapFastState(
|
|
zIndex,
|
|
loopback,
|
|
conditions.vwapFastStateBuffer //
|
|
);
|
|
|
|
//
|
|
CopyVWapMid(
|
|
zIndex,
|
|
loopback,
|
|
conditions.vwapMidBuffer //
|
|
);
|
|
|
|
//
|
|
CopyVWapMidState(
|
|
zIndex,
|
|
loopback,
|
|
conditions.vwapMidStateBuffer //
|
|
);
|
|
|
|
//
|
|
CopyVWapSlow(
|
|
zIndex,
|
|
loopback,
|
|
conditions.vwapSlowBuffer //
|
|
);
|
|
|
|
//
|
|
CopyVWapSlowState(
|
|
zIndex,
|
|
loopback,
|
|
conditions.vwapSlowStateBuffer //
|
|
);
|
|
|
|
//
|
|
CopyVWapVolume(
|
|
zIndex,
|
|
loopback,
|
|
conditions.vwapVolumeBuffer //
|
|
);
|
|
|
|
//
|
|
CopyVWapPrice(
|
|
zIndex,
|
|
loopback,
|
|
conditions.vwapPriceBuffer //
|
|
);
|
|
|
|
//
|
|
CopyDonOpenUpper(
|
|
zIndex,
|
|
loopback,
|
|
conditions.donOpenUpperBuffer //
|
|
);
|
|
|
|
//
|
|
CopyDonOpenLower(
|
|
zIndex,
|
|
loopback,
|
|
conditions.donOpenLowerBuffer //
|
|
);
|
|
|
|
//
|
|
CopyDonCloseUpper(
|
|
zIndex,
|
|
loopback,
|
|
conditions.donCloseUpperBuffer //
|
|
);
|
|
|
|
//
|
|
CopyDonCloseLower(
|
|
zIndex,
|
|
loopback,
|
|
conditions.donCloseLowerBuffer //
|
|
);
|
|
|
|
//
|
|
CopyDonHighUpper(
|
|
zIndex,
|
|
loopback,
|
|
conditions.donHighUpperBuffer //
|
|
);
|
|
|
|
//
|
|
CopyDonHighLower(
|
|
zIndex,
|
|
loopback,
|
|
conditions.donHighLowerBuffer //
|
|
);
|
|
|
|
//
|
|
CopyDonLowUpper(
|
|
zIndex,
|
|
loopback,
|
|
conditions.donLowUpperBuffer //
|
|
);
|
|
|
|
//
|
|
CopyDonLoweLower(
|
|
zIndex,
|
|
loopback,
|
|
conditions.donLowLowerBuffer //
|
|
);
|
|
|
|
//
|
|
CopyFiboLevel1(
|
|
zIndex,
|
|
loopback,
|
|
conditions.fl1Buffer //
|
|
);
|
|
|
|
//
|
|
CopyFiboLevel2(
|
|
zIndex,
|
|
loopback,
|
|
conditions.fl2Buffer //
|
|
);
|
|
|
|
//
|
|
CopyFiboLevel3(
|
|
zIndex,
|
|
loopback,
|
|
conditions.fl3Buffer //
|
|
);
|
|
|
|
//
|
|
CopyFiboLevel4(
|
|
zIndex,
|
|
loopback,
|
|
conditions.fl4Buffer //
|
|
);
|
|
|
|
//
|
|
CopyFiboLevel5(
|
|
zIndex,
|
|
loopback,
|
|
conditions.fl5Buffer //
|
|
);
|
|
|
|
//
|
|
// Conditions ...
|
|
|
|
//
|
|
int cIDX = 1;
|
|
int pIDX = cIDX + 1;
|
|
|
|
//
|
|
// XRSI ...
|
|
|
|
//
|
|
bool isRSIOverBought = conditions.rsiBuffer[cIDX] > mInputs.rsiOverBoughtLevel;
|
|
bool isRSIOverBoughtPrev = conditions.rsiBuffer[pIDX] > mInputs.rsiOverBoughtLevel;
|
|
|
|
//
|
|
bool isRSICrossedOverOverBought = isRSIOverBought &&
|
|
!isRSIOverBoughtPrev;
|
|
bool isRSICrossedUnderOverBought = !isRSIOverBought &&
|
|
isRSIOverBoughtPrev;
|
|
|
|
//
|
|
bool isRSIOverSold = conditions.rsiBuffer[cIDX] < mInputs.rsiOverSoldLevel;
|
|
bool isRSIOverSoldPrev = conditions.rsiBuffer[pIDX] < mInputs.rsiOverSoldLevel;
|
|
|
|
//
|
|
bool isRSICrossedUnderOverSold = isRSIOverSold &&
|
|
!isRSIOverSoldPrev;
|
|
bool isRSICrossedOverOverSold = !isRSIOverSold &&
|
|
isRSIOverSoldPrev;
|
|
|
|
//
|
|
// XSAR ...
|
|
|
|
//
|
|
bool isSarBullish = conditions.sarBuffer[cIDX] < cBar.low;
|
|
bool isSarBullishPrev = conditions.sarBuffer[pIDX] < pBar.low;
|
|
|
|
//
|
|
bool isSarBearish = conditions.sarBuffer[cIDX] > cBar.high;
|
|
bool isSarBearishPrev = conditions.sarBuffer[pIDX] > pBar.high;
|
|
|
|
//
|
|
bool isSarSwitchedToBullish = isSarBullish &&
|
|
!isSarBullishPrev;
|
|
bool isSarSwitchedToBearish = isSarBearish &&
|
|
!isSarBearishPrev;
|
|
|
|
//
|
|
// XPV ...
|
|
|
|
//
|
|
bool isNewPeak = conditions.peaksBuffer[cIDX] != conditions.peaksBuffer[pIDX];
|
|
bool isNewPeakOverLast = isNewPeak &&
|
|
conditions.peaksBuffer[cIDX] > conditions.peaksBuffer[pIDX];
|
|
bool isNewPeakUnderLast = isNewPeak &&
|
|
conditions.peaksBuffer[cIDX] < conditions.peaksBuffer[pIDX];
|
|
|
|
//
|
|
bool isNewVale = conditions.valesBuffer[cIDX] != conditions.valesBuffer[pIDX];
|
|
bool isNewValeOverLast = isNewVale &&
|
|
conditions.valesBuffer[cIDX] > conditions.valesBuffer[pIDX];
|
|
bool isNewValeUnderLast = isNewVale &&
|
|
conditions.valesBuffer[cIDX] < conditions.valesBuffer[pIDX];
|
|
|
|
//
|
|
// XVWAP ...
|
|
|
|
//
|
|
bool isVWapFastBullish = IsVWAPBullish(conditions.vwapFastStateBuffer[cIDX]);
|
|
bool isVWapFastBullishPrev = IsVWAPBullish(conditions.vwapFastStateBuffer[pIDX]);
|
|
|
|
//
|
|
bool isVWapFastBearish = IsVWAPBearish(conditions.vwapFastStateBuffer[cIDX]);
|
|
bool isVWapFastBearishPrev = IsVWAPBearish(conditions.vwapFastStateBuffer[pIDX]);
|
|
|
|
//
|
|
bool isVWapFastNeutural = IsVWAPNeutural(conditions.vwapFastStateBuffer[cIDX]);
|
|
bool isVWapFastNeuturalPrev = IsVWAPNeutural(conditions.vwapFastStateBuffer[pIDX]);
|
|
|
|
//
|
|
bool isVWapMidBullish = IsVWAPBullish(conditions.vwapMidStateBuffer[cIDX]);
|
|
bool isVWapMidBullishPrev = IsVWAPBullish(conditions.vwapMidStateBuffer[pIDX]);
|
|
|
|
//
|
|
bool isVWapMidBearish = IsVWAPBearish(conditions.vwapMidStateBuffer[cIDX]);
|
|
bool isVWapMidBearishPrev = IsVWAPBearish(conditions.vwapMidStateBuffer[pIDX]);
|
|
|
|
//
|
|
bool isVWapMidNeutural = IsVWAPNeutural(conditions.vwapMidStateBuffer[cIDX]);
|
|
bool isVWapMidNeuturalPrev = IsVWAPNeutural(conditions.vwapMidStateBuffer[pIDX]);
|
|
|
|
//
|
|
bool isVWapSlowBullish = IsVWAPBullish(conditions.vwapSlowStateBuffer[cIDX]);
|
|
bool isVWapSlowBullishPrev = IsVWAPBullish(conditions.vwapSlowStateBuffer[pIDX]);
|
|
|
|
//
|
|
bool isVWapSlowBearish = IsVWAPBearish(conditions.vwapSlowStateBuffer[cIDX]);
|
|
bool isVWapSlowBearishPrev = IsVWAPBearish(conditions.vwapSlowStateBuffer[pIDX]);
|
|
|
|
//
|
|
bool isVWapSlowNeutural = IsVWAPNeutural(conditions.vwapSlowStateBuffer[cIDX]);
|
|
bool isVWapSlowNeuturalPrev = IsVWAPNeutural(conditions.vwapSlowStateBuffer[pIDX]);
|
|
|
|
//
|
|
bool isVWapFastOverMid = conditions.vwapFastBuffer[cIDX] > conditions.vwapMidBuffer[cIDX];
|
|
bool isVWapFastOverMidPrev = conditions.vwapFastBuffer[pIDX] > conditions.vwapMidBuffer[pIDX];
|
|
|
|
//
|
|
bool isVWapMidOverSlow = conditions.vwapMidBuffer[cIDX] > conditions.vwapSlowBuffer[cIDX];
|
|
bool isVWapMidOverSlowPrev = conditions.vwapMidBuffer[pIDX] > conditions.vwapSlowBuffer[pIDX];
|
|
|
|
//
|
|
bool isVWapFastUnderMid = conditions.vwapFastBuffer[cIDX] < conditions.vwapMidBuffer[cIDX];
|
|
bool isVWapFastUnderMidPrev = conditions.vwapFastBuffer[pIDX] < conditions.vwapMidBuffer[pIDX];
|
|
|
|
//
|
|
bool isVWapMidUnderSlow = conditions.vwapMidBuffer[cIDX] < conditions.vwapSlowBuffer[cIDX];
|
|
bool isVWapMidUnderSlowPrev = conditions.vwapMidBuffer[pIDX] < conditions.vwapSlowBuffer[pIDX];
|
|
|
|
//
|
|
bool isVWapBullishState = isVWapFastBullish &&
|
|
isVWapMidBullish &&
|
|
isVWapSlowBullish;
|
|
bool isVWapBullishStatePrev = isVWapFastBullishPrev &&
|
|
isVWapMidBullishPrev &&
|
|
isVWapSlowBullishPrev;
|
|
|
|
//
|
|
bool isVWapBearishState = isVWapFastBearish &&
|
|
isVWapMidBearish &&
|
|
isVWapSlowBearish;
|
|
bool isVWapBearishStatePrev = isVWapFastBearishPrev &&
|
|
isVWapMidBearishPrev &&
|
|
isVWapSlowBearishPrev;
|
|
|
|
//
|
|
bool isVWapNeuturalState = isVWapFastNeutural &&
|
|
isVWapMidNeutural &&
|
|
isVWapSlowNeutural;
|
|
bool isVWapNeuturalStatePrev = isVWapFastNeuturalPrev &&
|
|
isVWapMidNeuturalPrev &&
|
|
isVWapSlowNeuturalPrev;
|
|
|
|
//
|
|
bool isVWapBullishOrdered = isVWapFastOverMid &&
|
|
isVWapMidOverSlow;
|
|
bool isVWapBullishOrderedPrev = isVWapFastOverMidPrev &&
|
|
isVWapMidOverSlowPrev;
|
|
|
|
//
|
|
bool isVWapBearishOrdered = isVWapFastUnderMid &&
|
|
isVWapMidUnderSlow;
|
|
bool isVWapBearishOrderedPrev = isVWapFastUnderMidPrev &&
|
|
isVWapMidUnderSlowPrev;
|
|
|
|
//
|
|
bool isVWapSwitchedToBullishOrdered = isVWapBullishOrdered &&
|
|
!isVWapBullishOrderedPrev;
|
|
bool isVWapSwitchedToBearishOrdered = isVWapBearishOrdered &&
|
|
!isVWapBearishOrderedPrev;
|
|
|
|
//
|
|
bool isVWapSwitchedToBullishState = isVWapBullishState &&
|
|
!isVWapBullishStatePrev;
|
|
bool isVWapSwitchedToBearishState = isVWapBearishState &&
|
|
!isVWapBearishStatePrev;
|
|
bool isVWapSwitchedToNeuturalState = isVWapNeuturalState &&
|
|
!isVWapNeuturalStatePrev;
|
|
|
|
//
|
|
// XDON ...
|
|
|
|
//
|
|
// XFIBONACCI ...
|
|
|
|
//
|
|
bool isOerFib1 = cBar.low > conditions.fl1Buffer[cIDX];
|
|
bool isOerFib2 = cBar.low > conditions.fl2Buffer[cIDX];
|
|
bool isOerFib3 = cBar.low > conditions.fl3Buffer[cIDX];
|
|
bool isOerFib4 = cBar.low > conditions.fl4Buffer[cIDX];
|
|
bool isOerFib5 = cBar.low > conditions.fl5Buffer[cIDX];
|
|
|
|
//
|
|
bool isUnderFib1 = cBar.high < conditions.fl1Buffer[cIDX];
|
|
bool isUnderFib2 = cBar.high < conditions.fl2Buffer[cIDX];
|
|
bool isUnderFib3 = cBar.high < conditions.fl3Buffer[cIDX];
|
|
bool isUnderFib4 = cBar.high < conditions.fl4Buffer[cIDX];
|
|
bool isUnderFib5 = cBar.high < conditions.fl5Buffer[cIDX];
|
|
|
|
//
|
|
bool isCloseOerFib1 = cBar.close > conditions.fl1Buffer[cIDX];
|
|
bool isCloseOerFib2 = cBar.close > conditions.fl2Buffer[cIDX];
|
|
bool isCloseOerFib3 = cBar.close > conditions.fl3Buffer[cIDX];
|
|
bool isCloseOerFib4 = cBar.close > conditions.fl4Buffer[cIDX];
|
|
bool isCloseOerFib5 = cBar.close > conditions.fl5Buffer[cIDX];
|
|
|
|
//
|
|
bool isCloseUnderFib1 = cBar.close < conditions.fl1Buffer[cIDX];
|
|
bool isCloseUnderFib2 = cBar.close < conditions.fl2Buffer[cIDX];
|
|
bool isCloseUnderFib3 = cBar.close < conditions.fl3Buffer[cIDX];
|
|
bool isCloseUnderFib4 = cBar.close < conditions.fl4Buffer[cIDX];
|
|
bool isCloseUnderFib5 = cBar.close < conditions.fl5Buffer[cIDX];
|
|
|
|
//
|
|
|
|
//
|
|
// Set ...
|
|
conditions.isRSIOverBought = isRSIOverBought;
|
|
conditions.isRSICrossedOverOverBought = isRSICrossedOverOverBought;
|
|
conditions.isRSICrossedUnderOverBought = isRSICrossedUnderOverBought;
|
|
conditions.isRSIOverSold = isRSIOverSold;
|
|
conditions.isRSICrossedUnderOverSold = isRSICrossedUnderOverSold;
|
|
conditions.isRSICrossedOverOverSold = isRSICrossedOverOverSold;
|
|
conditions.isSarBullish = isSarBullish;
|
|
conditions.isSarBearish = isSarBearish;
|
|
conditions.isSarSwitchedToBullish = isSarSwitchedToBullish;
|
|
conditions.isSarSwitchedToBearish = isSarSwitchedToBearish;
|
|
conditions.isNewPeak = isNewPeak;
|
|
conditions.isNewPeakOverLast = isNewPeakOverLast;
|
|
conditions.isNewPeakUnderLast = isNewPeakUnderLast;
|
|
conditions.isNewVale = isNewVale;
|
|
conditions.isNewValeOverLast = isNewValeOverLast;
|
|
conditions.isNewValeUnderLast = isNewValeUnderLast;
|
|
conditions.isVWapFastBullish = isVWapFastBullish;
|
|
conditions.isVWapFastBearish = isVWapFastBearish;
|
|
conditions.isVWapFastNeutural = isVWapFastNeutural;
|
|
conditions.isVWapMidBullish = isVWapMidBullish;
|
|
conditions.isVWapMidBearish = isVWapMidBearish;
|
|
conditions.isVWapMidNeutural = isVWapMidNeutural;
|
|
conditions.isVWapSlowBullish = isVWapSlowBullish;
|
|
conditions.isVWapSlowBearish = isVWapSlowBearish;
|
|
conditions.isVWapSlowNeutural = isVWapSlowNeutural;
|
|
conditions.isVWapFastOverMid = isVWapFastOverMid;
|
|
conditions.isVWapMidOverSlow = isVWapMidOverSlow;
|
|
conditions.isVWapFastUnderMid = isVWapFastUnderMid;
|
|
conditions.isVWapMidUnderSlow = isVWapMidUnderSlow;
|
|
conditions.isVWapBullishState = isVWapBullishState;
|
|
conditions.isVWapBearishState = isVWapBearishState;
|
|
conditions.isVWapNeuturalState = isVWapNeuturalState;
|
|
conditions.isVWapBullishOrdered = isVWapBullishOrdered;
|
|
conditions.isVWapBearishOrdered = isVWapBearishOrdered;
|
|
conditions.isVWapSwitchedToBullishOrdered = isVWapSwitchedToBullishOrdered;
|
|
conditions.isVWapSwitchedToBearishOrdered = isVWapSwitchedToBearishOrdered;
|
|
conditions.isVWapSwitchedToBullishState = isVWapSwitchedToBullishState;
|
|
conditions.isVWapSwitchedToBearishState = isVWapSwitchedToBearishState;
|
|
conditions.isVWapSwitchedToNeuturalState = isVWapSwitchedToNeuturalState;
|
|
conditions.isOerFib1 = isOerFib1;
|
|
conditions.isOerFib2 = isOerFib2;
|
|
conditions.isOerFib3 = isOerFib3;
|
|
conditions.isOerFib4 = isOerFib4;
|
|
conditions.isOerFib5 = isOerFib5;
|
|
conditions.isUnderFib1 = isUnderFib1;
|
|
conditions.isUnderFib2 = isUnderFib2;
|
|
conditions.isUnderFib3 = isUnderFib3;
|
|
conditions.isUnderFib4 = isUnderFib4;
|
|
conditions.isUnderFib5 = isUnderFib5;
|
|
conditions.isCloseOerFib1 = isCloseOerFib1;
|
|
conditions.isCloseOerFib2 = isCloseOerFib2;
|
|
conditions.isCloseOerFib3 = isCloseOerFib3;
|
|
conditions.isCloseOerFib4 = isCloseOerFib4;
|
|
conditions.isCloseOerFib5 = isCloseOerFib5;
|
|
conditions.isCloseUnderFib1 = isCloseUnderFib1;
|
|
conditions.isCloseUnderFib2 = isCloseUnderFib2;
|
|
conditions.isCloseUnderFib3 = isCloseUnderFib3;
|
|
conditions.isCloseUnderFib4 = isCloseUnderFib4;
|
|
conditions.isCloseUnderFib5 = isCloseUnderFib5;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
protected:
|
|
//
|
|
|
|
//
|
|
private:
|
|
//
|
|
// Props ...
|
|
X121Inputs mInputs; // Inputs ...
|
|
|
|
//
|
|
// Buffers ...
|
|
|
|
//
|
|
int mRSIHandler; // RSI Handler ...
|
|
|
|
//
|
|
// Buffers ...
|
|
double peaksBuffer[];
|
|
double valesBuffer[];
|
|
double sarBuffer[];
|
|
double atrUpperBuffer[];
|
|
double atrLowerBuffer[];
|
|
double vwapFastBuffer[];
|
|
double vwapMidBuffer[];
|
|
double vwapSlowBuffer[];
|
|
double donOpenUpperBuffer[];
|
|
double donOpenLowerBuffer[];
|
|
double donCloseUpperBuffer[];
|
|
double donCloseLowerBuffer[];
|
|
double donHighUpperBuffer[];
|
|
double donHighLowerBuffer[];
|
|
double donLowUpperBuffer[];
|
|
double donLowLowerBuffer[];
|
|
double fl1Buffer[];
|
|
double fl2Buffer[];
|
|
double fl3Buffer[];
|
|
double fl4Buffer[];
|
|
double fl5Buffer[];
|
|
double cHHBuffer[];
|
|
double cLLBuffer[];
|
|
double sHHBuffer[];
|
|
double sLLBuffer[];
|
|
double mHHBuffer[];
|
|
double mLLBuffer[];
|
|
double lHHBuffer[];
|
|
double lLLBuffer[];
|
|
double hHHBuffer[];
|
|
double hLLBuffer[];
|
|
double atrBuffer[];
|
|
double atrUpperRawBuffer[];
|
|
double atrLowerRawBuffer[];
|
|
double vwapVolumeBuffer[];
|
|
double vwapPriceBuffer[];
|
|
double vwapFastStateBuffer[];
|
|
double vwapMidStateBuffer[];
|
|
double vwapSlowStateBuffer[];
|
|
double rsiBuffer[];
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
/**
|
|
* Calculate Buffers ...
|
|
*/
|
|
void Calculate()
|
|
{
|
|
//
|
|
int totalBars = CountBars();
|
|
if (totalBars > 1000)
|
|
{
|
|
totalBars = 1000;
|
|
}
|
|
|
|
//
|
|
// Buffers ...
|
|
|
|
//
|
|
// RSI ...
|
|
CopyBuffer(
|
|
mRSIHandler,
|
|
0,
|
|
0,
|
|
totalBars,
|
|
rsiBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// XSAR ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_SAR_LINE,
|
|
0,
|
|
totalBars,
|
|
sarBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// ATR ...
|
|
|
|
//
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_ATR_UPPER_LINE,
|
|
0,
|
|
totalBars,
|
|
atrUpperBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_ATR_LOWER_LINE,
|
|
0,
|
|
totalBars,
|
|
atrLowerBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_ATR_LINE,
|
|
0,
|
|
totalBars,
|
|
atrBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_ATR_UPPER_RAW_LINE,
|
|
0,
|
|
totalBars,
|
|
atrUpperRawBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_ATR_LOWER_RAW_LINE,
|
|
0,
|
|
totalBars,
|
|
atrLowerRawBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// XPV ...
|
|
|
|
//
|
|
// PEAKS ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_PEAKS_LINE,
|
|
0,
|
|
totalBars,
|
|
peaksBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// VALES ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_VALES_LINE,
|
|
0,
|
|
totalBars,
|
|
valesBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// CURRENT ...
|
|
|
|
//
|
|
// HH ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_CURRENT_HH_LINE,
|
|
0,
|
|
totalBars,
|
|
cHHBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// LL ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_CURRENT_LL_LINE,
|
|
0,
|
|
totalBars,
|
|
cLLBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// SHORT ...
|
|
|
|
//
|
|
// HH ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_SHORT_HH_LINE,
|
|
0,
|
|
totalBars,
|
|
sHHBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// LL ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_SHORT_LL_LINE,
|
|
0,
|
|
totalBars,
|
|
sLLBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// MEDIUM ...
|
|
|
|
//
|
|
// HH ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_MEDIUM_HH_LINE,
|
|
0,
|
|
totalBars,
|
|
mHHBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// LL ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_MEDIUM_LL_LINE,
|
|
0,
|
|
totalBars,
|
|
mLLBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// LONG ...
|
|
|
|
//
|
|
// HH ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_LONG_HH_LINE,
|
|
0,
|
|
totalBars,
|
|
lHHBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// LL ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_LONG_LL_LINE,
|
|
0,
|
|
totalBars,
|
|
lLLBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// HIND ...
|
|
|
|
//
|
|
// HH ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_HIND_HH_LINE,
|
|
0,
|
|
totalBars,
|
|
hHHBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// LL ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_HIND_LL_LINE,
|
|
0,
|
|
totalBars,
|
|
hLLBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// XVWAP ...
|
|
|
|
//
|
|
// FAST ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_VWAP_FAST_LINE,
|
|
0,
|
|
totalBars,
|
|
vwapFastBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// FAST STATE ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_VWAP_FAST_STATE_LINE,
|
|
0,
|
|
totalBars,
|
|
vwapFastStateBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// MID ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_VWAP_MID_LINE,
|
|
0,
|
|
totalBars,
|
|
vwapMidBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// MID STATE ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_VWAP_MID_STATE_LINE,
|
|
0,
|
|
totalBars,
|
|
vwapMidStateBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// SLOW ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_VWAP_SLOW_LINE,
|
|
0,
|
|
totalBars,
|
|
vwapSlowBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// SLOW STATE ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_VWAP_SLOW_STATE_LINE,
|
|
0,
|
|
totalBars,
|
|
vwapSlowStateBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// VOLUME ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_VWAP_VOLUME_LINE,
|
|
0,
|
|
totalBars,
|
|
vwapVolumeBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// PRICE ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_VWAP_PRICE_LINE,
|
|
0,
|
|
totalBars,
|
|
vwapPriceBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// FIBONACCI ...
|
|
|
|
//
|
|
// LEVEL 1 ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_FIB_LEVEL_1_LINE,
|
|
0,
|
|
totalBars,
|
|
fl1Buffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// LEVEL 2 ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_FIB_LEVEL_2_LINE,
|
|
0,
|
|
totalBars,
|
|
fl2Buffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// LEVEL 3 ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_FIB_LEVEL_3_LINE,
|
|
0,
|
|
totalBars,
|
|
fl3Buffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// LEVEL 4 ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_FIB_LEVEL_4_LINE,
|
|
0,
|
|
totalBars,
|
|
fl4Buffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// LEVEL 5 ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_FIB_LEVEL_5_LINE,
|
|
0,
|
|
totalBars,
|
|
fl5Buffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// XDON ...
|
|
|
|
//
|
|
// OPEN ...
|
|
|
|
//
|
|
// Upper ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_DON_OPEN_UPPER_LINE,
|
|
0,
|
|
totalBars,
|
|
donOpenUpperBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// Lower ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_DON_OPEN_LOWER_LINE,
|
|
0,
|
|
totalBars,
|
|
donOpenLowerBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// CLOSE ...
|
|
|
|
//
|
|
// Upper ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_DON_CLOSE_UPPER_LINE,
|
|
0,
|
|
totalBars,
|
|
donCloseUpperBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// Lower ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_DON_CLOSE_LOWER_LINE,
|
|
0,
|
|
totalBars,
|
|
donCloseLowerBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// HIGH ...
|
|
|
|
//
|
|
// Upper ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_DON_HIGH_UPPER_LINE,
|
|
0,
|
|
totalBars,
|
|
donHighUpperBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// Lower ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_DON_HIGH_LOWER_LINE,
|
|
0,
|
|
totalBars,
|
|
donHighLowerBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// LOW ...
|
|
|
|
//
|
|
// Upper ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_DON_LOW_UPPER_LINE,
|
|
0,
|
|
totalBars,
|
|
donLowUpperBuffer
|
|
//
|
|
);
|
|
|
|
//
|
|
// Lower ...
|
|
CopyBuffer(
|
|
mHandler,
|
|
X121_DON_LOW_LOWER_LINE,
|
|
0,
|
|
totalBars,
|
|
donLowLowerBuffer
|
|
//
|
|
);
|
|
}
|
|
};
|
|
|
|
// |