1215 lines
30 KiB
Plaintext
1215 lines
30 KiB
Plaintext
/////////////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 X121_PPSR Pivot Points Indicator
|
|
// ---------------------------------------------------------
|
|
// Name: X121_PPSR
|
|
// Description: Pivot Points
|
|
// Market Analysor ...
|
|
//
|
|
//
|
|
// Maintainer:
|
|
// ------------
|
|
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
|
//
|
|
//////////////////////////////////////////////////////
|
|
//
|
|
// Global Properties ...
|
|
#property copyright "Copyright 2023, SaherElm IT Center"
|
|
#property link "https://saherelm.ir"
|
|
#property version "1.00"
|
|
#property description "SaherElm X121_PPSR Indicator"
|
|
#property strict
|
|
|
|
//
|
|
// START Constants ...
|
|
//
|
|
|
|
//
|
|
// Indicator Short Name ...
|
|
#define ShortName "X121_PPSR"
|
|
|
|
//
|
|
// XPERIOD Calculation Method ...
|
|
// USED For Multiple Time Frames ...
|
|
enum ENUM_X_PERIOD_METHOD
|
|
{
|
|
//
|
|
X_PERIOD_NOTHING,
|
|
//
|
|
X_PERIOD_AUTO,
|
|
//
|
|
X_PERIOD_MANUALLY
|
|
};
|
|
|
|
//
|
|
// END Constants ...
|
|
//
|
|
|
|
//
|
|
// START Inputs ...
|
|
//
|
|
|
|
//
|
|
input group "Level 1";
|
|
input ENUM_X_PERIOD_METHOD l1Method = X_PERIOD_AUTO; // How to Find Period
|
|
input ENUM_TIMEFRAMES l1Period = NULL; // Time Period
|
|
input ENUM_SERIESMODE l1HHMode = MODE_HIGH; // Highest High Calculation Method
|
|
input ENUM_SERIESMODE l1LLMode = MODE_LOW; // Lowest Low Calculation Method
|
|
|
|
//
|
|
input group "Level 2";
|
|
input ENUM_X_PERIOD_METHOD l2Method = X_PERIOD_AUTO; // How to Find Period
|
|
input ENUM_TIMEFRAMES l2Period = NULL; // Time Period
|
|
input ENUM_SERIESMODE l2HHMode = MODE_HIGH; // Highest High Calculation Method
|
|
input ENUM_SERIESMODE l2LLMode = MODE_LOW; // Lowest Low Calculation Method
|
|
|
|
//
|
|
input group "Level 3";
|
|
input ENUM_X_PERIOD_METHOD l3Method = X_PERIOD_AUTO; // How to Find Period
|
|
input ENUM_TIMEFRAMES l3Period = NULL; // Time Period
|
|
input ENUM_SERIESMODE l3HHMode = MODE_HIGH; // Highest High Calculation Method
|
|
input ENUM_SERIESMODE l3LLMode = MODE_LOW; // Lowest Low Calculation Method
|
|
|
|
//
|
|
input group "Level 4";
|
|
input ENUM_X_PERIOD_METHOD l4Method = X_PERIOD_AUTO; // How to Find Period
|
|
input ENUM_TIMEFRAMES l4Period = NULL; // Time Period
|
|
input ENUM_SERIESMODE l4HHMode = MODE_HIGH; // Highest High Calculation Method
|
|
input ENUM_SERIESMODE l4LLMode = MODE_LOW; // Lowest Low Calculation Method
|
|
|
|
//
|
|
input group "Presentation";
|
|
|
|
//
|
|
input group "Support and Resistace Levels";
|
|
input bool showSRLevel1 = true; // Show Level 1
|
|
input bool showSRLevel2 = true; // Show Level 2
|
|
input bool showSRLevel3 = true; // Show Level 3
|
|
input bool showSRLevel4 = true; // Show Level 4
|
|
|
|
//
|
|
input group "Pivot Point Levels";
|
|
input bool showPPLevel1 = true; // Show Level 1 Pivots
|
|
input bool showPPLevel2 = true; // Show Level 2 Pivots
|
|
input bool showPPLevel3 = true; // Show Level 3 Pivots
|
|
input bool showPPLevel4 = true; // Show Level 4 Pivots
|
|
|
|
//
|
|
// END Inputs ...
|
|
//
|
|
|
|
//
|
|
// START Includes and Imports ...
|
|
//
|
|
|
|
//
|
|
// Includes Logging Library ...
|
|
#include "../Libraries/x-saherelm.log.lib.mq5"
|
|
|
|
//
|
|
// Includes Common Library ...
|
|
#include "../Libraries/x-saherelm.common.lib.mq5"
|
|
|
|
//
|
|
// END Includes and Imports ...
|
|
//
|
|
|
|
//
|
|
// START Buffers ...
|
|
//
|
|
#property indicator_chart_window
|
|
|
|
//
|
|
#property indicator_buffers 24
|
|
#property indicator_plots 24
|
|
|
|
//
|
|
// PLOTTED Buffers ...
|
|
|
|
//
|
|
// LEVEL 1 ...
|
|
|
|
//
|
|
// RESISTANCE ...
|
|
|
|
//
|
|
#define l1RBufferIndex 0
|
|
double l1RBuffer[];
|
|
|
|
//
|
|
#property indicator_label1 "X121_PPSR L1 R"
|
|
#property indicator_type1 DRAW_LINE
|
|
#property indicator_color1 clrGoldenrod
|
|
#property indicator_style1 STYLE_DOT
|
|
#property indicator_width1 1
|
|
|
|
//
|
|
#define l1R1BufferIndex 1
|
|
double l1R1Buffer[];
|
|
|
|
//
|
|
#property indicator_label2 "X121_PPSR L1 R1"
|
|
#property indicator_type2 DRAW_LINE
|
|
#property indicator_color2 clrGoldenrod
|
|
#property indicator_style2 STYLE_DOT
|
|
#property indicator_width2 1
|
|
|
|
//
|
|
#define l1R2BufferIndex 2
|
|
double l1R2Buffer[];
|
|
|
|
//
|
|
#property indicator_label3 "X121_PPSR L1 R2"
|
|
#property indicator_type3 DRAW_LINE
|
|
#property indicator_color3 clrGoldenrod
|
|
#property indicator_style3 STYLE_DOT
|
|
#property indicator_width3 1
|
|
|
|
//
|
|
// SUPPORT ...
|
|
|
|
//
|
|
#define l1SBufferIndex 3
|
|
double l1SBuffer[];
|
|
|
|
//
|
|
#property indicator_label4 "X121_PPSR L1 S"
|
|
#property indicator_type4 DRAW_LINE
|
|
#property indicator_color4 clrLightGreen
|
|
#property indicator_style4 STYLE_DOT
|
|
#property indicator_width4 1
|
|
|
|
//
|
|
#define l1S1BufferIndex 4
|
|
double l1S1Buffer[];
|
|
|
|
//
|
|
#property indicator_label5 "X121_PPSR L1 S1"
|
|
#property indicator_type5 DRAW_LINE
|
|
#property indicator_color5 clrLightGreen
|
|
#property indicator_style5 STYLE_DOT
|
|
#property indicator_width5 1
|
|
|
|
//
|
|
#define l1S2BufferIndex 5
|
|
double l1S2Buffer[];
|
|
|
|
//
|
|
#property indicator_label6 "X121_PPSR L1 S2"
|
|
#property indicator_type6 DRAW_LINE
|
|
#property indicator_color6 clrLightGreen
|
|
#property indicator_style6 STYLE_DOT
|
|
#property indicator_width6 1
|
|
|
|
//
|
|
// LEVEL 2 ...
|
|
|
|
//
|
|
// RESISTANCE ...
|
|
|
|
//
|
|
#define l2RBufferIndex 6
|
|
double l2RBuffer[];
|
|
|
|
//
|
|
#property indicator_label7 "X121_PPSR L2 R"
|
|
#property indicator_type7 DRAW_LINE
|
|
#property indicator_color7 clrGoldenrod
|
|
#property indicator_style7 STYLE_DOT
|
|
#property indicator_width7 1
|
|
|
|
//
|
|
#define l2R1BufferIndex 7
|
|
double l2R1Buffer[];
|
|
|
|
//
|
|
#property indicator_label8 "X121_PPSR L2 R2"
|
|
#property indicator_type8 DRAW_LINE
|
|
#property indicator_color8 clrGoldenrod
|
|
#property indicator_style8 STYLE_DOT
|
|
#property indicator_width8 1
|
|
|
|
//
|
|
#define l2R2BufferIndex 8
|
|
double l2R2Buffer[];
|
|
|
|
//
|
|
#property indicator_label9 "X121_PPSR L2 R2"
|
|
#property indicator_type9 DRAW_LINE
|
|
#property indicator_color9 clrGoldenrod
|
|
#property indicator_style9 STYLE_DOT
|
|
#property indicator_width9 1
|
|
|
|
//
|
|
// SUPPORT ...
|
|
|
|
//
|
|
#define l2SBufferIndex 9
|
|
double l2SBuffer[];
|
|
|
|
//
|
|
#property indicator_label10 "X121_PPSR L2 S"
|
|
#property indicator_type10 DRAW_LINE
|
|
#property indicator_color10 clrLightGreen
|
|
#property indicator_style10 STYLE_DOT
|
|
#property indicator_width10 1
|
|
|
|
//
|
|
#define l2S1BufferIndex 10
|
|
double l2S1Buffer[];
|
|
|
|
//
|
|
#property indicator_label11 "X121_PPSR L2 S1"
|
|
#property indicator_type11 DRAW_LINE
|
|
#property indicator_color11 clrLightGreen
|
|
#property indicator_style11 STYLE_DOT
|
|
#property indicator_width11 1
|
|
|
|
//
|
|
#define l2S2BufferIndex 11
|
|
double l2S2Buffer[];
|
|
|
|
//
|
|
#property indicator_label12 "X121_PPSR L2 S2"
|
|
#property indicator_type12 DRAW_LINE
|
|
#property indicator_color12 clrLightGreen
|
|
#property indicator_style12 STYLE_DOT
|
|
#property indicator_width12 1
|
|
|
|
//
|
|
// LEVEL 3 ...
|
|
|
|
//
|
|
// RESISTANCE ...
|
|
|
|
//
|
|
#define l3RBufferIndex 12
|
|
double l3RBuffer[];
|
|
|
|
//
|
|
#property indicator_label13 "X121_PPSR L3 R"
|
|
#property indicator_type13 DRAW_LINE
|
|
#property indicator_color13 clrGoldenrod
|
|
#property indicator_style13 STYLE_DOT
|
|
#property indicator_width13 1
|
|
|
|
//
|
|
#define l3R1BufferIndex 13
|
|
double l3R1Buffer[];
|
|
|
|
//
|
|
#property indicator_label14 "X121_PPSR L3 R1"
|
|
#property indicator_type14 DRAW_LINE
|
|
#property indicator_color14 clrGoldenrod
|
|
#property indicator_style14 STYLE_DOT
|
|
#property indicator_width14 1
|
|
|
|
//
|
|
#define l3R2BufferIndex 14
|
|
double l3R2Buffer[];
|
|
|
|
//
|
|
#property indicator_label15 "X121_PPSR L3 R2"
|
|
#property indicator_type15 DRAW_LINE
|
|
#property indicator_color15 clrGoldenrod
|
|
#property indicator_style15 STYLE_DOT
|
|
#property indicator_width15 1
|
|
|
|
//
|
|
// SUPPORT ...
|
|
|
|
//
|
|
#define l3SBufferIndex 15
|
|
double l3SBuffer[];
|
|
|
|
//
|
|
#property indicator_label16 "X121_PPSR L3 S"
|
|
#property indicator_type16 DRAW_LINE
|
|
#property indicator_color16 clrLightGreen
|
|
#property indicator_style16 STYLE_DOT
|
|
#property indicator_width16 1
|
|
|
|
//
|
|
#define l3S1BufferIndex 16
|
|
double l3S1Buffer[];
|
|
|
|
//
|
|
#property indicator_label17 "X121_PPSR L3 S1"
|
|
#property indicator_type17 DRAW_LINE
|
|
#property indicator_color17 clrLightGreen
|
|
#property indicator_style17 STYLE_DOT
|
|
#property indicator_width17 1
|
|
|
|
//
|
|
#define l3S2BufferIndex 17
|
|
double l3S2Buffer[];
|
|
|
|
//
|
|
#property indicator_label18 "X121_PPSR L3 S2"
|
|
#property indicator_type18 DRAW_LINE
|
|
#property indicator_color18 clrLightGreen
|
|
#property indicator_style18 STYLE_DOT
|
|
#property indicator_width18 1
|
|
|
|
//
|
|
// LEVEL 4 ...
|
|
|
|
//
|
|
// RESISTANCE ...
|
|
|
|
//
|
|
#define l4RBufferIndex 18
|
|
double l4RBuffer[];
|
|
|
|
//
|
|
#property indicator_label19 "X121_PPSR L4 R"
|
|
#property indicator_type19 DRAW_LINE
|
|
#property indicator_color19 clrGoldenrod
|
|
#property indicator_style19 STYLE_DOT
|
|
#property indicator_width19 1
|
|
|
|
//
|
|
#define l4R1BufferIndex 19
|
|
double l4R1Buffer[];
|
|
|
|
//
|
|
#property indicator_label20 "X121_PPSR L4 R1"
|
|
#property indicator_type20 DRAW_LINE
|
|
#property indicator_color20 clrGoldenrod
|
|
#property indicator_style20 STYLE_DOT
|
|
#property indicator_width20 1
|
|
|
|
//
|
|
#define l4R2BufferIndex 20
|
|
double l4R2Buffer[];
|
|
|
|
//
|
|
#property indicator_label21 "X121_PPSR L4 R2"
|
|
#property indicator_type21 DRAW_LINE
|
|
#property indicator_color21 clrGoldenrod
|
|
#property indicator_style21 STYLE_DOT
|
|
#property indicator_width21 1
|
|
|
|
//
|
|
// SUPPORT ...
|
|
|
|
//
|
|
#define l4SBufferIndex 21
|
|
double l4SBuffer[];
|
|
|
|
//
|
|
#property indicator_label22 "X121_PPSR L4 S"
|
|
#property indicator_type22 DRAW_LINE
|
|
#property indicator_color22 clrLightGreen
|
|
#property indicator_style22 STYLE_DOT
|
|
#property indicator_width22 1
|
|
|
|
//
|
|
#define l4S1BufferIndex 22
|
|
double l4S1Buffer[];
|
|
|
|
//
|
|
#property indicator_label23 "X121_PPSR L4 S1"
|
|
#property indicator_type23 DRAW_LINE
|
|
#property indicator_color23 clrLightGreen
|
|
#property indicator_style23 STYLE_DOT
|
|
#property indicator_width23 1
|
|
|
|
//
|
|
#define l4S2BufferIndex 23
|
|
double l4S2Buffer[];
|
|
|
|
//
|
|
#property indicator_label24 "X121_PPSR L4 S2"
|
|
#property indicator_type24 DRAW_LINE
|
|
#property indicator_color24 clrLightGreen
|
|
#property indicator_style24 STYLE_DOT
|
|
#property indicator_width24 1
|
|
|
|
//
|
|
// END Buffers ...
|
|
//
|
|
|
|
//
|
|
// START Global Definitions: Variables, Properties and etc ...
|
|
//
|
|
|
|
//
|
|
int maxLength;
|
|
|
|
//
|
|
int currentPeriodSecconds = 0;
|
|
|
|
//
|
|
int mL1Candles;
|
|
double mLastL1R;
|
|
double mLastL1S;
|
|
int mLastL1StartBarIndex = 0;
|
|
ENUM_SERIESMODE mL1HHMode = NULL;
|
|
ENUM_SERIESMODE mL1LLMode = NULL;
|
|
datetime mLastL1StartTime = NULL;
|
|
ENUM_TIMEFRAMES mL1Period = NULL;
|
|
|
|
//
|
|
int mL2Candles;
|
|
double mLastL2R;
|
|
double mLastL2S;
|
|
int mLastL2StartBarIndex = 0;
|
|
ENUM_SERIESMODE mL2HHMode = NULL;
|
|
ENUM_SERIESMODE mL2LLMode = NULL;
|
|
datetime mLastL2StartTime = NULL;
|
|
ENUM_TIMEFRAMES mL2Period = NULL;
|
|
|
|
//
|
|
int mL3Candles;
|
|
double mLastL3R;
|
|
double mLastL3S;
|
|
int mLastL3StartBarIndex = 0;
|
|
ENUM_SERIESMODE mL3HHMode = NULL;
|
|
ENUM_SERIESMODE mL3LLMode = NULL;
|
|
datetime mLastL3StartTime = NULL;
|
|
ENUM_TIMEFRAMES mL3Period = NULL;
|
|
|
|
//
|
|
int mL4Candles;
|
|
double mLastL4R;
|
|
double mLastL4S;
|
|
int mLastL4StartBarIndex = 0;
|
|
ENUM_SERIESMODE mL4HHMode = NULL;
|
|
ENUM_SERIESMODE mL4LLMode = NULL;
|
|
datetime mLastL4StartTime = NULL;
|
|
ENUM_TIMEFRAMES mL4Period = NULL;
|
|
|
|
//
|
|
// END Global Definitions: Variables, Properties and etc ...
|
|
//
|
|
|
|
//
|
|
// START Event Handlers ...
|
|
//
|
|
|
|
//
|
|
// Initialization ...
|
|
int OnInit()
|
|
{
|
|
//
|
|
// Validate Inputs ...
|
|
if (!ValidateInputs())
|
|
{
|
|
return INIT_PARAMETERS_INCORRECT;
|
|
}
|
|
|
|
//
|
|
logTag = ShortName;
|
|
|
|
//
|
|
// because in some cases we may have more than one input for
|
|
// calculation and we must prevent any calculation
|
|
// untill we pass the biggest input length, here we get max Input length
|
|
// and then wait until pass it ...
|
|
maxLength = ExtractMaxLengthOfInputs();
|
|
|
|
//
|
|
// Do Initialization ...
|
|
|
|
//
|
|
if (currentPeriodSecconds == 0)
|
|
{
|
|
currentPeriodSecconds = PeriodSeconds(_Period);
|
|
}
|
|
|
|
//
|
|
// Find Level 1 Period ...
|
|
if (mL1Period == NULL)
|
|
{
|
|
//
|
|
if (l1Method == X_PERIOD_AUTO)
|
|
{
|
|
mL1Period = GetNearestTimeFrame(_Period);
|
|
}
|
|
else
|
|
{
|
|
mL1Period = l1Period;
|
|
}
|
|
|
|
//
|
|
int level1PeriodSecconds = PeriodSeconds(mL1Period);
|
|
|
|
//
|
|
mL1Candles = level1PeriodSecconds / currentPeriodSecconds;
|
|
|
|
//
|
|
mL1HHMode = l1HHMode == NULL ? MODE_HIGH : l1HHMode;
|
|
mL1LLMode = l1LLMode == NULL ? MODE_LOW : l1LLMode;
|
|
}
|
|
|
|
//
|
|
// Find Level 2 Period ...
|
|
if (mL2Period == NULL)
|
|
{
|
|
//
|
|
if (l2Method == X_PERIOD_AUTO)
|
|
{
|
|
mL2Period = GetMediestTimeFrame(_Period);
|
|
}
|
|
else
|
|
{
|
|
mL2Period = l2Period;
|
|
}
|
|
|
|
//
|
|
int level2PeriodSecconds = PeriodSeconds(mL2Period);
|
|
|
|
//
|
|
mL2Candles = level2PeriodSecconds / currentPeriodSecconds;
|
|
|
|
//
|
|
mL2HHMode = l2HHMode == NULL ? MODE_HIGH : l2HHMode;
|
|
mL2LLMode = l2LLMode == NULL ? MODE_LOW : l2LLMode;
|
|
}
|
|
|
|
//
|
|
// Find Level 3 Period ...
|
|
if (mL3Period == NULL)
|
|
{
|
|
//
|
|
if (l3Method == X_PERIOD_AUTO)
|
|
{
|
|
mL3Period = GetFarestTimeFrame(_Period);
|
|
}
|
|
else
|
|
{
|
|
mL3Period = l3Period;
|
|
}
|
|
|
|
//
|
|
int level3PeriodSecconds = PeriodSeconds(mL3Period);
|
|
|
|
//
|
|
mL3Candles = level3PeriodSecconds / currentPeriodSecconds;
|
|
|
|
//
|
|
mL3HHMode = l3HHMode == NULL ? MODE_HIGH : l3HHMode;
|
|
mL3LLMode = l3LLMode == NULL ? MODE_LOW : l3LLMode;
|
|
}
|
|
|
|
//
|
|
// Find Level 4 Period ...
|
|
if (mL4Period == NULL)
|
|
{
|
|
//
|
|
if (l4Method == X_PERIOD_AUTO)
|
|
{
|
|
mL4Period = GetHindmostTimeFrame(_Period);
|
|
}
|
|
else
|
|
{
|
|
mL4Period = l4Period;
|
|
}
|
|
|
|
//
|
|
int level4PeriodSecconds = PeriodSeconds(mL4Period);
|
|
|
|
//
|
|
mL4Candles = level4PeriodSecconds / currentPeriodSecconds;
|
|
|
|
//
|
|
mL4HHMode = l4HHMode == NULL ? MODE_HIGH : l4HHMode;
|
|
mL4LLMode = l4LLMode == NULL ? MODE_LOW : l4LLMode;
|
|
}
|
|
|
|
//
|
|
// Define Index Buffers ...
|
|
DefineBuffers();
|
|
|
|
//
|
|
// Set Indicator ShortName ...
|
|
SetIndicatorName();
|
|
|
|
//
|
|
string comment = GenerateComment();
|
|
Comment(comment);
|
|
|
|
//
|
|
// Init Succeed ...
|
|
return INIT_SUCCEEDED;
|
|
}
|
|
|
|
//
|
|
// DeInitialization ...
|
|
void OnDeinit(const int reason)
|
|
{
|
|
//
|
|
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
|
|
// REASON_REMOVE 1 Program removed from a chart
|
|
// REASON_RECOMPILE 2 Program recompiled
|
|
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
|
|
// REASON_CHARTCLOSE 4 Chart closed
|
|
// REASON_PARAMETERS 5 Inputs changed by a user
|
|
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
|
|
// REASON_TEMPLATE 7 Another chart template applied
|
|
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
|
|
// REASON_CLOSE 9 Terminal closed
|
|
}
|
|
|
|
//
|
|
// Calculations ...
|
|
//
|
|
// Calculating what we want ...
|
|
int OnCalculate(
|
|
//
|
|
// total Candles on chart ...
|
|
const int rates_total,
|
|
//
|
|
// total calculated Candles on charts ...
|
|
const int prev_calculated,
|
|
//
|
|
// history of Candles Open Time ...
|
|
const datetime &time[],
|
|
//
|
|
// history of Candles Open Price ...
|
|
const double &open[],
|
|
//
|
|
// history of Candles High Price ...
|
|
const double &high[],
|
|
//
|
|
// history of Candles Low Price ...
|
|
const double &low[],
|
|
//
|
|
// history of Candles Close Price ...
|
|
const double &close[],
|
|
//
|
|
// history of Tick Volumes on Candle ...
|
|
const long &tick_volume[],
|
|
//
|
|
// history of Trade Volumes ...
|
|
const long &volume[],
|
|
//
|
|
// history of Candles Spread Price ...
|
|
const int &spread[])
|
|
{
|
|
//
|
|
// Prepare Buffers ...
|
|
ArraySetAsSeries(time, true);
|
|
ArraySetAsSeries(open, true);
|
|
ArraySetAsSeries(high, true);
|
|
ArraySetAsSeries(low, true);
|
|
ArraySetAsSeries(close, true);
|
|
ArraySetAsSeries(tick_volume, true);
|
|
ArraySetAsSeries(volume, true);
|
|
ArraySetAsSeries(spread, true);
|
|
|
|
//
|
|
// this counts Available Bars ...
|
|
int limit;
|
|
|
|
//
|
|
limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1;
|
|
|
|
//
|
|
// Main Loop ...
|
|
for (int i = limit - 1; i >= 0 && !IsStopped(); i--)
|
|
{
|
|
CalculateBuffers(i);
|
|
}
|
|
|
|
//
|
|
return rates_total;
|
|
}
|
|
|
|
//
|
|
// END Event Handlers ...
|
|
//
|
|
|
|
//
|
|
// START Functions ...
|
|
//
|
|
|
|
//
|
|
// Validate Input Args for Initialization ...
|
|
bool ValidateInputs()
|
|
{
|
|
//
|
|
bool result =
|
|
//
|
|
// Validate Inputs ...
|
|
(l1Method != X_PERIOD_NOTHING &&
|
|
(l1Period == NULL ? l1Method == X_PERIOD_AUTO : true))
|
|
//
|
|
&&
|
|
//
|
|
(l2Method != X_PERIOD_NOTHING &&
|
|
(l2Period == NULL ? l2Method == X_PERIOD_AUTO : true))
|
|
//
|
|
&&
|
|
//
|
|
(l3Method != X_PERIOD_NOTHING &&
|
|
(l3Period == NULL ? l3Method == X_PERIOD_AUTO : true))
|
|
//
|
|
&&
|
|
//
|
|
(l4Method != X_PERIOD_NOTHING &&
|
|
(l4Period == NULL ? l4Method == X_PERIOD_AUTO : true))
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Retrieve all Exists Input Max Length ...
|
|
// use for Start Of Drawing ...
|
|
int ExtractMaxLengthOfInputs()
|
|
{
|
|
//
|
|
int result = 0;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Define Indexes and Styles ...
|
|
void DefineBuffers()
|
|
{
|
|
//
|
|
// LEVEL 1 ...
|
|
ENUM_DRAW_TYPE l1DrawType = showSRLevel1 ? DRAW_LINE : DRAW_NONE;
|
|
ENUM_DRAW_TYPE l1PPDrawType = showPPLevel1 ? DRAW_LINE : DRAW_NONE;
|
|
|
|
//
|
|
// RESISTANCE ...
|
|
ArraySetAsSeries(l1RBuffer, true);
|
|
SetIndexBuffer(l1RBufferIndex, l1RBuffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l1RBufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l1RBufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l1RBufferIndex, PLOT_DRAW_TYPE, l1DrawType);
|
|
|
|
ArraySetAsSeries(l1R1Buffer, true);
|
|
SetIndexBuffer(l1R1BufferIndex, l1R1Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l1R1BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l1R1BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l1R1BufferIndex, PLOT_DRAW_TYPE, l1PPDrawType);
|
|
|
|
ArraySetAsSeries(l1R2Buffer, true);
|
|
SetIndexBuffer(l1R2BufferIndex, l1R2Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l1R2BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l1R2BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l1R2BufferIndex, PLOT_DRAW_TYPE, l1PPDrawType);
|
|
|
|
//
|
|
// SUPPORT ...
|
|
ArraySetAsSeries(l1SBuffer, true);
|
|
SetIndexBuffer(l1SBufferIndex, l1SBuffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l1SBufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l1SBufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l1SBufferIndex, PLOT_DRAW_TYPE, l1DrawType);
|
|
|
|
ArraySetAsSeries(l1S1Buffer, true);
|
|
SetIndexBuffer(l1S1BufferIndex, l1S1Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l1S1BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l1S1BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l1S1BufferIndex, PLOT_DRAW_TYPE, l1PPDrawType);
|
|
|
|
ArraySetAsSeries(l1S2Buffer, true);
|
|
SetIndexBuffer(l1S2BufferIndex, l1S2Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l1S2BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l1S2BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l1S2BufferIndex, PLOT_DRAW_TYPE, l1PPDrawType);
|
|
|
|
//
|
|
// LEVEL 2 ...
|
|
ENUM_DRAW_TYPE l2DrawType = showSRLevel2 ? DRAW_LINE : DRAW_NONE;
|
|
ENUM_DRAW_TYPE l2PPDrawType = showPPLevel2 ? DRAW_LINE : DRAW_NONE;
|
|
|
|
//
|
|
// RESISTANCE ...
|
|
ArraySetAsSeries(l2RBuffer, true);
|
|
SetIndexBuffer(l2RBufferIndex, l2RBuffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l2RBufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l2RBufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l2RBufferIndex, PLOT_DRAW_TYPE, l2DrawType);
|
|
|
|
ArraySetAsSeries(l2R1Buffer, true);
|
|
SetIndexBuffer(l2R1BufferIndex, l2R1Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l2R1BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l2R1BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l2R1BufferIndex, PLOT_DRAW_TYPE, l2PPDrawType);
|
|
|
|
ArraySetAsSeries(l2R2Buffer, true);
|
|
SetIndexBuffer(l2R2BufferIndex, l2R2Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l2R2BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l2R2BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l2R2BufferIndex, PLOT_DRAW_TYPE, l2PPDrawType);
|
|
|
|
//
|
|
// SUPPORT ...
|
|
ArraySetAsSeries(l2SBuffer, true);
|
|
SetIndexBuffer(l2SBufferIndex, l2SBuffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l2SBufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l2SBufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l2SBufferIndex, PLOT_DRAW_TYPE, l2DrawType);
|
|
|
|
ArraySetAsSeries(l2S1Buffer, true);
|
|
SetIndexBuffer(l2S1BufferIndex, l2S1Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l2S1BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l2S1BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l2S1BufferIndex, PLOT_DRAW_TYPE, l2PPDrawType);
|
|
|
|
ArraySetAsSeries(l2S2Buffer, true);
|
|
SetIndexBuffer(l2S2BufferIndex, l2S2Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l2S2BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l2S2BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l2S2BufferIndex, PLOT_DRAW_TYPE, l2PPDrawType);
|
|
|
|
//
|
|
// LEVEL 3 ...
|
|
ENUM_DRAW_TYPE l3DrawType = showSRLevel3 ? DRAW_LINE : DRAW_NONE;
|
|
ENUM_DRAW_TYPE l3PPDrawType = showPPLevel3 ? DRAW_LINE : DRAW_NONE;
|
|
|
|
//
|
|
// RESISTANCE ...
|
|
ArraySetAsSeries(l3RBuffer, true);
|
|
SetIndexBuffer(l3RBufferIndex, l3RBuffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l3RBufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l3RBufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l3RBufferIndex, PLOT_DRAW_TYPE, l3DrawType);
|
|
|
|
ArraySetAsSeries(l3R1Buffer, true);
|
|
SetIndexBuffer(l3R1BufferIndex, l3R1Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l3R1BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l3R1BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l3R1BufferIndex, PLOT_DRAW_TYPE, l3PPDrawType);
|
|
|
|
ArraySetAsSeries(l3R2Buffer, true);
|
|
SetIndexBuffer(l3R2BufferIndex, l3R2Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l3R2BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l3R2BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l3R2BufferIndex, PLOT_DRAW_TYPE, l3PPDrawType);
|
|
|
|
//
|
|
// SUPPORT ...
|
|
ArraySetAsSeries(l3SBuffer, true);
|
|
SetIndexBuffer(l3SBufferIndex, l3SBuffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l3SBufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l3SBufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l3SBufferIndex, PLOT_DRAW_TYPE, l3DrawType);
|
|
|
|
ArraySetAsSeries(l3S1Buffer, true);
|
|
SetIndexBuffer(l3S1BufferIndex, l3S1Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l3S1BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l3S1BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l3S1BufferIndex, PLOT_DRAW_TYPE, l3PPDrawType);
|
|
|
|
ArraySetAsSeries(l3S2Buffer, true);
|
|
SetIndexBuffer(l3S2BufferIndex, l3S2Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l3S2BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l3S2BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l3S2BufferIndex, PLOT_DRAW_TYPE, l3PPDrawType);
|
|
|
|
//
|
|
// LEVEL 4 ...
|
|
ENUM_DRAW_TYPE l4DrawType = showSRLevel4 ? DRAW_LINE : DRAW_NONE;
|
|
ENUM_DRAW_TYPE l4PPDrawType = showPPLevel4 ? DRAW_LINE : DRAW_NONE;
|
|
|
|
//
|
|
// RESISTANCE ...
|
|
ArraySetAsSeries(l4RBuffer, true);
|
|
SetIndexBuffer(l4RBufferIndex, l4RBuffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l4RBufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l4RBufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l4RBufferIndex, PLOT_DRAW_TYPE, l4DrawType);
|
|
|
|
ArraySetAsSeries(l4R1Buffer, true);
|
|
SetIndexBuffer(l4R1BufferIndex, l4R1Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l4R1BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l4R1BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l4R1BufferIndex, PLOT_DRAW_TYPE, l4PPDrawType);
|
|
|
|
ArraySetAsSeries(l4R2Buffer, true);
|
|
SetIndexBuffer(l4R2BufferIndex, l4R2Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l4R2BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l4R2BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l4R2BufferIndex, PLOT_DRAW_TYPE, l4PPDrawType);
|
|
|
|
//
|
|
// SUPPORT ...
|
|
ArraySetAsSeries(l4SBuffer, true);
|
|
SetIndexBuffer(l4SBufferIndex, l4SBuffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l4SBufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l4SBufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l4SBufferIndex, PLOT_DRAW_TYPE, l4DrawType);
|
|
|
|
ArraySetAsSeries(l4S1Buffer, true);
|
|
SetIndexBuffer(l4S1BufferIndex, l4S1Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l4S1BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l4S1BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l4S1BufferIndex, PLOT_DRAW_TYPE, l4PPDrawType);
|
|
|
|
ArraySetAsSeries(l4S2Buffer, true);
|
|
SetIndexBuffer(l4S2BufferIndex, l4S2Buffer, INDICATOR_DATA);
|
|
PlotIndexSetInteger(l4S2BufferIndex, PLOT_DRAW_BEGIN, maxLength);
|
|
PlotIndexSetInteger(l4S2BufferIndex, PLOT_SHOW_DATA, false);
|
|
PlotIndexSetInteger(l4S2BufferIndex, PLOT_DRAW_TYPE, l4PPDrawType);
|
|
}
|
|
|
|
//
|
|
// Set Indicator Short Name and also we can define Buffers Labels ...
|
|
void SetIndicatorName()
|
|
{
|
|
//
|
|
string indicatorShortName = "";
|
|
StringConcatenate(indicatorShortName, ShortName, "");
|
|
|
|
//
|
|
IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName);
|
|
}
|
|
|
|
//
|
|
// Calculate Buffers ...
|
|
void CalculateBuffers(
|
|
int bar_index // Selected Bar Index
|
|
)
|
|
{
|
|
//
|
|
XOHCL c = GetCandle(bar_index);
|
|
|
|
//
|
|
int maxCandles = MathMax(mL1Candles, mL2Candles);
|
|
maxCandles = MathMax(maxCandles, mL3Candles);
|
|
maxCandles = MathMax(maxCandles, mL4Candles);
|
|
|
|
//
|
|
double l1RValue = 0;
|
|
double l1SValue = 0;
|
|
double l1CloseValue = 0;
|
|
|
|
//
|
|
double l2RValue = 0;
|
|
double l2SValue = 0;
|
|
double l2CloseValue = 0;
|
|
|
|
//
|
|
double l3RValue = 0;
|
|
double l3SValue = 0;
|
|
double l3CloseValue = 0;
|
|
|
|
//
|
|
double l4RValue = 0;
|
|
double l4SValue = 0;
|
|
double l4CloseValue = 0;
|
|
|
|
//
|
|
double l1PPValue = 0;
|
|
double l1R1Value = 0;
|
|
double l1R2Value = 0;
|
|
double l1S1Value = 0;
|
|
double l1S2Value = 0;
|
|
|
|
//
|
|
double l2PPValue = 0;
|
|
double l2R1Value = 0;
|
|
double l2R2Value = 0;
|
|
double l2S1Value = 0;
|
|
double l2S2Value = 0;
|
|
|
|
//
|
|
double l3PPValue = 0;
|
|
double l3R1Value = 0;
|
|
double l3R2Value = 0;
|
|
double l3S1Value = 0;
|
|
double l3S2Value = 0;
|
|
|
|
//
|
|
double l4PPValue = 0;
|
|
double l4R1Value = 0;
|
|
double l4R2Value = 0;
|
|
double l4S1Value = 0;
|
|
double l4S2Value = 0;
|
|
|
|
//
|
|
// LEVEL 1 ...
|
|
|
|
//
|
|
l1RValue = GetHighestHigh(
|
|
mL1Candles,
|
|
bar_index,
|
|
mL1HHMode);
|
|
l1SValue = GetLowestLow(
|
|
mL1Candles,
|
|
bar_index,
|
|
mL1LLMode);
|
|
l1CloseValue = GetLowestLow(
|
|
mL1Candles,
|
|
bar_index,
|
|
MODE_CLOSE);
|
|
|
|
//
|
|
// Calculate Pivot Points ...
|
|
double l1Diff = MathAbs(l1RValue - l1SValue);
|
|
l1PPValue = (l1RValue + l1SValue + l1CloseValue) / 3;
|
|
|
|
//
|
|
l1R1Value = (2 * l1PPValue) - l1SValue;
|
|
l1R2Value = l1PPValue + (l1Diff);
|
|
|
|
//
|
|
l1S1Value = (2 * l1PPValue) - l1RValue;
|
|
l1S2Value = l1PPValue - l1Diff;
|
|
|
|
//
|
|
// LEVEL 2 ...
|
|
|
|
//
|
|
l2RValue = GetHighestHigh(
|
|
mL2Candles,
|
|
bar_index,
|
|
mL2HHMode);
|
|
l2SValue = GetLowestLow(
|
|
mL2Candles,
|
|
bar_index,
|
|
mL2LLMode);
|
|
l2CloseValue = GetLowestLow(
|
|
mL2Candles,
|
|
bar_index,
|
|
MODE_CLOSE);
|
|
|
|
//
|
|
// Calculate Pivot Points ...
|
|
double l2Diff = MathAbs(l2RValue - l2SValue);
|
|
l2PPValue = (l2RValue + l2SValue + l2CloseValue) / 3;
|
|
|
|
//
|
|
l2R1Value = (2 * l2PPValue) - l2SValue;
|
|
l2R2Value = l2PPValue + (l2Diff);
|
|
|
|
//
|
|
l2S1Value = (2 * l2PPValue) - l2RValue;
|
|
l2S2Value = l2PPValue - l2Diff;
|
|
|
|
//
|
|
// LEVEL 3 ...
|
|
|
|
//
|
|
l3RValue = GetHighestHigh(
|
|
mL3Candles,
|
|
bar_index,
|
|
mL3HHMode);
|
|
l3SValue = GetLowestLow(
|
|
mL3Candles,
|
|
bar_index,
|
|
mL3LLMode);
|
|
l3CloseValue = GetLowestLow(
|
|
mL3Candles,
|
|
bar_index,
|
|
MODE_CLOSE);
|
|
|
|
//
|
|
// Calculate Pivot Points ...
|
|
double l3Diff = MathAbs(l3RValue - l3SValue);
|
|
l3PPValue = (l3RValue + l3SValue + l3CloseValue) / 3;
|
|
|
|
//
|
|
l3R1Value = (2 * l3PPValue) - l3SValue;
|
|
l3R2Value = l1PPValue + (l3Diff);
|
|
|
|
//
|
|
l3S1Value = (2 * l3PPValue) - l3RValue;
|
|
l3S2Value = l3PPValue - l3Diff;
|
|
|
|
//
|
|
// LEVEL 4 ...
|
|
|
|
//
|
|
l4RValue = GetHighestHigh(
|
|
mL4Candles,
|
|
bar_index,
|
|
mL4HHMode);
|
|
l4SValue = GetLowestLow(
|
|
mL4Candles,
|
|
bar_index,
|
|
mL4LLMode);
|
|
l4CloseValue = GetLowestLow(
|
|
mL4Candles,
|
|
bar_index,
|
|
MODE_CLOSE);
|
|
|
|
//
|
|
// Calculate Pivot Points ...
|
|
double l4Diff = MathAbs(l4RValue - l4SValue);
|
|
l4PPValue = (l4RValue + l4SValue + l4CloseValue) / 3;
|
|
|
|
//
|
|
l4R1Value = (2 * l4PPValue) - l4SValue;
|
|
l4R2Value = l4PPValue + (l4Diff);
|
|
|
|
//
|
|
l4S1Value = (2 * l4PPValue) - l4RValue;
|
|
l4S2Value = l4PPValue - l4Diff;
|
|
|
|
//
|
|
// FILLING BUFFERS ...
|
|
|
|
//
|
|
l1RBuffer[bar_index] = l1RValue;
|
|
l1R1Buffer[bar_index] = l1R1Value;
|
|
l1R2Buffer[bar_index] = l1R2Value;
|
|
|
|
//
|
|
l1SBuffer[bar_index] = l1SValue;
|
|
l1S1Buffer[bar_index] = l1S1Value;
|
|
l1S2Buffer[bar_index] = l1S2Value;
|
|
|
|
//
|
|
l2RBuffer[bar_index] = l2RValue;
|
|
l2R1Buffer[bar_index] = l2R1Value;
|
|
l2R2Buffer[bar_index] = l2R2Value;
|
|
|
|
//
|
|
l2SBuffer[bar_index] = l2SValue;
|
|
l2S1Buffer[bar_index] = l2S1Value;
|
|
l2S2Buffer[bar_index] = l2S2Value;
|
|
|
|
//
|
|
l3RBuffer[bar_index] = l3RValue;
|
|
l3R1Buffer[bar_index] = l3R1Value;
|
|
l3R2Buffer[bar_index] = l3R2Value;
|
|
|
|
//
|
|
l3SBuffer[bar_index] = l3SValue;
|
|
l3S1Buffer[bar_index] = l3S1Value;
|
|
l3S2Buffer[bar_index] = l3S2Value;
|
|
|
|
//
|
|
l4RBuffer[bar_index] = l4RValue;
|
|
l4R1Buffer[bar_index] = l4R1Value;
|
|
l4R2Buffer[bar_index] = l4R2Value;
|
|
|
|
//
|
|
l4SBuffer[bar_index] = l4SValue;
|
|
l4S1Buffer[bar_index] = l4S1Value;
|
|
l4S2Buffer[bar_index] = l4S2Value;
|
|
}
|
|
|
|
//
|
|
// Generate Comment String ...
|
|
string GenerateComment()
|
|
{
|
|
//
|
|
string result = "";
|
|
|
|
//
|
|
result += "L1 P: " + EnumToString(mL1Period) + "\n";
|
|
result += "L2 P: " + EnumToString(mL2Period) + "\n";
|
|
result += "L3 P: " + EnumToString(mL3Period) + "\n";
|
|
result += "L4 P: " + EnumToString(mL4Period);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// END Functions ...
|
|
//
|