Files
xMQL5/BKPS/Series1/Indicators/x-saherelm.tdma.indicator.mq5
T
2024-01-25 04:09:42 +03:30

1114 lines
29 KiB
Plaintext

/////////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 MA Trend Detector Indicator
// -----------------------------------------------------
// Name: XTDMA
// Description: detect trends based on MA's ...
//
//
// 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 XTDMA Indicator"
#property strict
//
// START Constants ...
//
#define ShortName "XTDMA"
//
// END Constants ...
//
//
// START Inputs ...
//
//
input group "Long Cycle";
//
input int lcFastLength = 9; // Fast Length
input int lcSlowLength = 18; // Slow Length
//
input ENUM_MA_METHOD lcMethod = MODE_EMA; // Calculation Method
input ENUM_APPLIED_PRICE lcAppliedTo = PRICE_CLOSE; // Calculation Price
//
input color lcFastColor = clrAqua; // Fast Color
input color lcSlowColor = clrMagenta; // Slow Color
//
input bool lcDrawLines = false; // Draw Fast/Slow Lines
input bool lcDrawCrosses = false; // Draw Cross Vertical Lines
input bool lcDrawTrends = false; // Draw Trend State
// input bool lcDrawSwings = false; // Draw Swing Points
//
input uchar lcTrendUpArrowCode = 233; // Trend UP Arrow Code
input uchar lcTrendDownArrowCode = 234; // Trend Down Arrow Code
// input uchar lcSwingsArrowCode = 108; // Swing Point Arrow Code
//
input group "Medium Cycle";
//
input int mcFastLength = 9; // Fast Length
input int mcSlowLength = 18; // Slow Length
//
input ENUM_MA_METHOD mcMethod = MODE_EMA; // Calculation Method
input ENUM_APPLIED_PRICE mcAppliedTo = PRICE_CLOSE; // Calculation Price
//
input color mcFastColor = clrLime; // Fast Color
input color mcSlowColor = clrRed; // Slow Color
//
input bool mcDrawLines = false; // Draw Fast/Slow Lines
input bool mcDrawCrosses = false; // Draw Cross Vertical Lines
input bool mcDrawTrends = false; // Draw Trend State
//
input uchar mcTrendUpArrowCode = 233; // Trend UP Arrow Code
input uchar mcTrendDownArrowCode = 234; // Trend Down Arrow Code
//
input group "Short Cycle";
//
input int scFastLength = 9; // Fast Length
input int scSlowLength = 18; // Slow Length
//
input ENUM_MA_METHOD scMethod = MODE_EMA; // Calculation Method
input ENUM_APPLIED_PRICE scAppliedTo = PRICE_CLOSE; // Calculation Price
//
input color scFastColor = clrLightBlue; // Fast Color
input color scSlowColor = clrLightSalmon; // Slow Color
//
input bool scDrawLines = false; // Draw Fast/Slow Lines
input bool scDrawCrosses = false; // Draw Cross Vertical Lines
input bool scDrawTrends = false; // Draw Trend State
//
input uchar scTrendUpArrowCode = 233; // Trend UP Arrow Code
input uchar scTrendDownArrowCode = 234; // Trend Down Arrow Code
// //
// input group "Current Cycle";
// //
// input int ccFastLength = 9; // Fast Length
// input int ccSlowLength = 18; // Slow Length
// //
// input ENUM_MA_METHOD ccMethod = MODE_EMA; // Calculation Method
// input ENUM_APPLIED_PRICE ccAppliedTo = PRICE_CLOSE; // Calculation Price
// //
// input color ccFastColor = clrCadetBlue; // Fast Color
// input color ccSlowColor = clrMediumVioletRed; // Slow Color
// //
// input bool ccDrawLines = false; // Draw Fast/Slow Lines
// input bool ccDrawCrosses = false; // Draw Cross Vertical Lines
// input bool ccDrawTrends = false; // Draw Trend State
// //
// input uchar ccTrendUpArrowCode = 233; // Trend UP Arrow Code
// input uchar ccTrendDownArrowCode = 234; // Trend Down Arrow Code
//
// END Inputs ...
//
//
// Includes Logging Library ...
#include "../Libraries/x-saherelm.log.lib.mq5";
//
// Include Common and Models Library ...
#include "../Libraries/x-saherelm.common.lib.mq5";
//
// Include Draw Library ...
#include "../Libraries/x-saherelm.draw.lib.mq5";
//
// START Buffers ...
//
#property indicator_chart_window
//
#property indicator_buffers 9
#property indicator_plots 8
//
// LC Fast ...
#define lcFastBufferIndex 0
double lcSlowBuffer[];
//
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//
// LC Slow ...
#define lcSlowBufferIndex 1
double lcFastBuffer[];
//
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
// //
// // LC Swings ...
// #define lcSwingBufferIndex 8
// double lcSwingBuffer[];
//
// MC Fast ...
#define mcFastBufferIndex 2
double mcSlowBuffer[];
//
#property indicator_style3 STYLE_DASHDOT
#property indicator_width3 1
//
// MC Slow ...
#define mcSlowBufferIndex 3
double mcFastBuffer[];
//
#property indicator_style4 STYLE_DASHDOT
#property indicator_width4 1
//
// SC Fast ...
#define scFastBufferIndex 4
double scSlowBuffer[];
//
#property indicator_style5 STYLE_DOT
#property indicator_width5 1
//
// SC Slow ...
#define scSlowBufferIndex 5
double scFastBuffer[];
//
#property indicator_style6 STYLE_DOT
#property indicator_width6 1
// //
// // CC Fast ...
// #define ccFastBufferIndex 6
// double ccSlowBuffer[];
// //
// #property indicator_style7 STYLE_DASH
// #property indicator_width7 1
// //
// // CC Slow ...
// #define ccSlowBufferIndex 7
// double ccFastBuffer[];
// //
// #property indicator_style8 STYLE_DASH
// #property indicator_width8 1
//
// END Buffers ...
//
//
// START Global Definitions: Variables, Properties and etc ...
//
//
// LC Handlers ...
ENUM_TIMEFRAMES lcPeriod;
int lcFastMaHandler = INVALID_HANDLE;
int lcSlowMaHandler = INVALID_HANDLE;
// int lcSwingHandler = INVALID_HANDLE;
//
// MC Handlers ...
ENUM_TIMEFRAMES mcPeriod;
int mcFastMaHandler = INVALID_HANDLE;
int mcSlowMaHandler = INVALID_HANDLE;
//
// SC Handlers ...
ENUM_TIMEFRAMES scPeriod;
int scFastMaHandler = INVALID_HANDLE;
int scSlowMaHandler = INVALID_HANDLE;
//
// CC Handlers ...
// int ccFastMaHandler = INVALID_HANDLE;
// int ccSlowMaHandler = INVALID_HANDLE;
//
// END Global Definitions: Variables, Properties and etc ...
//
//
// START Event Handlers ...
//
//
// Initialization ...
int OnInit()
{
//
// Validate Inputs ...
if (!ValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
logTag = ShortName;
drawPrefix = ShortName;
//
// Define Index Buffers ...
DefineBuffers();
//
// Set Indicator ShortName ...
SetIndicatorName();
//
// Define LC Handlers ...
lcPeriod = GetFarestTimeFrame();
if (lcPeriod == _Period)
{
//
LogMessage("invalid LC TimeFrame ...");
return INIT_FAILED;
}
//
// LC Swing Handler ...
// lcSwingHandler = iCustom(
// _Symbol,
// lcPeriod,
// "x-saherelm.obd.indicator",
// //
// 5, // Market Length
// 0, // Arrow Distrance from Price
// lcSwingsArrowCode, // Swing High Arrow Code
// lcSlowColor, // Swing High Arrow Color
// lcSwingsArrowCode, // Swing Low Arrow Code
// lcFastColor // Swing Low Arrow Color
// );
// if (lcSwingHandler == INVALID_HANDLE)
// {
// //
// LogMessage("LC OBD Indicator initialization failed ...");
// //
// return INIT_FAILED;
// }
//
// LC Fast Ma Handler ...
lcFastMaHandler = iMA(
_Symbol,
lcPeriod,
lcFastLength,
0,
lcMethod,
lcAppliedTo);
if (lcFastMaHandler == INVALID_HANDLE)
{
//
LogMessage("LC Ma Indicator initialization failed ...");
//
return INIT_FAILED;
}
//
// LC Slow Ma Handler ...
lcSlowMaHandler = iMA(
_Symbol,
lcPeriod,
lcSlowLength,
0,
lcMethod,
lcAppliedTo);
if (lcSlowMaHandler == INVALID_HANDLE)
{
//
LogMessage("LC Ma Indicator initialization failed ...");
//
return INIT_FAILED;
}
//
// Define MC Handlers ...
mcPeriod = GetMediumTimeFrame();
if (mcPeriod == _Period)
{
//
LogMessage("invalid MC TimeFrame ...");
return INIT_FAILED;
}
//
// MC Fast Ma Handler ...
mcFastMaHandler = iMA(
_Symbol,
mcPeriod,
mcFastLength,
0,
mcMethod,
mcAppliedTo);
if (mcFastMaHandler == INVALID_HANDLE)
{
//
LogMessage("MC Ma Indicator initialization failed ...");
//
return INIT_FAILED;
}
//
// MC Slow Ma Handler ...
mcSlowMaHandler = iMA(
_Symbol,
mcPeriod,
mcSlowLength,
0,
mcMethod,
mcAppliedTo);
if (mcSlowMaHandler == INVALID_HANDLE)
{
//
LogMessage("MC Ma Indicator initialization failed ...");
//
return INIT_FAILED;
}
//
// Define SC Handlers ...
scPeriod = _Period; // GetSmallestTimeFrame();
// if (scPeriod == _Period)
// {
// //
// LogMessage("invalid SC TimeFrame ...");
// // return INIT_FAILED;
// }
//
// SC Fast Ma Handler ...
scFastMaHandler = iMA(
_Symbol,
scPeriod,
scFastLength,
0,
scMethod,
scAppliedTo);
if (scFastMaHandler == INVALID_HANDLE)
{
//
LogMessage("SC Ma Indicator initialization failed ...");
//
return INIT_FAILED;
}
//
// SC Slow Ma Handler ...
scSlowMaHandler = iMA(
_Symbol,
scPeriod,
scSlowLength,
0,
scMethod,
scAppliedTo);
if (scSlowMaHandler == INVALID_HANDLE)
{
//
LogMessage("SC Ma Indicator initialization failed ...");
//
return INIT_FAILED;
}
//
// CC Fast Ma Handler ...
// ccFastMaHandler = iMA(
// _Symbol,
// _Period,
// ccFastLength,
// 0,
// ccMethod,
// ccAppliedTo);
// if (ccFastMaHandler == INVALID_HANDLE)
// {
// //
// LogMessage("CC Ma Indicator initialization failed ...");
// //
// return INIT_FAILED;
// }
//
// CC Slow Ma Handler ...
// ccSlowMaHandler = iMA(
// _Symbol,
// _Period,
// ccSlowLength,
// 0,
// ccMethod,
// ccAppliedTo);
// if (ccSlowMaHandler == INVALID_HANDLE)
// {
// //
// LogMessage("CC Ma Indicator initialization failed ...");
// //
// return INIT_FAILED;
// }
//
// Comment Period on Chart ...
string comment =
"XTDMA \n" +
"LC Period: " + EnumToString(lcPeriod) + "\n" +
"MC Period: " + EnumToString(mcPeriod) + "\n" +
"SC Period: " + EnumToString(scPeriod) + "\n";
//
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
//
// Here we can handle De Initialization Reasons ...
OnDeinitDrawLibrary();
//
ChartRedraw();
//
// Remove Comments ...
Comment("");
}
//
// 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;
//
// 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 ...
int maxLength = MathMax(0, lcFastLength);
maxLength = MathMax(maxLength, lcSlowLength);
//
// Check Calculated Bars on Handlers ...
// int lcSwingCalculatedBars = BarsCalculated(lcSwingHandler);
int lcFastMaCalculatedBars = BarsCalculated(lcFastMaHandler);
int lcSlowMaCalculatedBars = BarsCalculated(lcSlowMaHandler);
int mcFastMaCalculatedBars = BarsCalculated(mcFastMaHandler);
int mcSlowMaCalculatedBars = BarsCalculated(mcSlowMaHandler);
int scFastMaCalculatedBars = BarsCalculated(scFastMaHandler);
int scSlowMaCalculatedBars = BarsCalculated(scSlowMaHandler);
// int ccFastMaCalculatedBars = BarsCalculated(ccFastMaHandler);
// int ccSlowMaCalculatedBars = BarsCalculated(ccSlowMaHandler);
// lcSwingCalculatedBars < maxLength ||
// ccFastMaCalculatedBars < maxLength ||
// ccSlowMaCalculatedBars < maxLength
if (
lcFastMaCalculatedBars < maxLength ||
lcSlowMaCalculatedBars < maxLength ||
mcFastMaCalculatedBars < maxLength ||
mcSlowMaCalculatedBars < maxLength ||
scFastMaCalculatedBars < maxLength ||
scSlowMaCalculatedBars < maxLength)
{
return prev_calculated;
}
//
limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated;
//
// Buffers Copy ...
// int lcSwingCopied = CopyBuffer(lcSwingHandler, 0, 0, limit + 1, lcSwingBuffer);
int lcFastCopiedMas = CopyBuffer(lcFastMaHandler, 0, 0, limit + 1, lcFastBuffer);
int lcSlowCopiedMas = CopyBuffer(lcSlowMaHandler, 0, 0, limit + 1, lcSlowBuffer);
int mcFastCopiedMas = CopyBuffer(mcFastMaHandler, 0, 0, limit + 1, mcFastBuffer);
int mcSlowCopiedMas = CopyBuffer(mcSlowMaHandler, 0, 0, limit + 1, mcSlowBuffer);
int scFastCopiedMas = CopyBuffer(scFastMaHandler, 0, 0, limit + 1, scFastBuffer);
int scSlowCopiedMas = CopyBuffer(scSlowMaHandler, 0, 0, limit + 1, scSlowBuffer);
// int ccFastCopiedMas = CopyBuffer(ccFastMaHandler, 0, 0, limit + 1, ccFastBuffer);
// int ccSlowCopiedMas = CopyBuffer(ccSlowMaHandler, 0, 0, limit + 1, ccSlowBuffer);
// lcSwingCopied <= 0 ||
// ccFastCopiedMas <= 0 ||
// ccSlowCopiedMas <= 0
if (
lcFastCopiedMas <= 0 ||
lcSlowCopiedMas <= 0 ||
mcFastCopiedMas <= 0 ||
mcSlowCopiedMas <= 0 ||
scFastCopiedMas <= 0 ||
scSlowCopiedMas <= 0)
{
return prev_calculated;
}
//
// Main Loop ...
for (int i = limit; i >= 0 && !IsStopped(); i--)
{
CalculateBuffers(i);
}
//
return rates_total;
}
//
// END Event Handlers ...
//
//
// START Functions ...
//
//
// Validate Input Args for Initialization ...
bool ValidateInputs()
{
//
bool result = false;
//
// Validate Args ...
if (lcFastLength >= 5 && lcSlowLength >= 6 && lcSlowLength > lcFastLength)
{
result = true;
}
//
return result;
}
//
// Define Indexes and Styles ...
void DefineBuffers()
{
//
// LC Draw Type ...
ENUM_DRAW_TYPE lcDrawType = lcDrawLines ? DRAW_LINE : DRAW_NONE;
//
// LC Fast Buffer ...
string lcFastBufferLabel = "LC F " + "(" + (string)lcFastLength + ")";
ArraySetAsSeries(lcFastBuffer, true);
SetIndexBuffer(lcFastBufferIndex, lcFastBuffer, INDICATOR_DATA);
PlotIndexSetString(lcFastBufferIndex, PLOT_LABEL, lcFastBufferLabel);
PlotIndexSetInteger(lcFastBufferIndex, PLOT_DRAW_BEGIN, lcFastLength);
PlotIndexSetInteger(lcFastBufferIndex, PLOT_DRAW_TYPE, lcDrawType);
PlotIndexSetInteger(lcFastBufferIndex, PLOT_LINE_COLOR, lcFastColor);
//
// LC Slow Buffer ...
string lcSlowBufferLabel = "LC S " + "(" + (string)lcSlowLength + ")";
ArraySetAsSeries(lcSlowBuffer, true);
SetIndexBuffer(lcSlowBufferIndex, lcSlowBuffer, INDICATOR_DATA);
PlotIndexSetString(lcSlowBufferIndex, PLOT_LABEL, lcSlowBufferLabel);
PlotIndexSetInteger(lcSlowBufferIndex, PLOT_DRAW_BEGIN, lcSlowLength);
PlotIndexSetInteger(lcSlowBufferIndex, PLOT_DRAW_TYPE, lcDrawType);
PlotIndexSetInteger(lcSlowBufferIndex, PLOT_LINE_COLOR, lcSlowColor);
//
// LC Swings ...
// ArraySetAsSeries(lcSwingBuffer, true);
// SetIndexBuffer(lcSwingBufferIndex, lcSwingBuffer, INDICATOR_CALCULATIONS);
//
// MC Draw Type ...
ENUM_DRAW_TYPE mcDrawType = mcDrawLines ? DRAW_LINE : DRAW_NONE;
//
// MC Fast Buffer ...
string mcFastBufferLabel = "MC F " + "(" + (string)mcFastLength + ")";
ArraySetAsSeries(mcFastBuffer, true);
SetIndexBuffer(mcFastBufferIndex, mcFastBuffer, INDICATOR_DATA);
PlotIndexSetString(mcFastBufferIndex, PLOT_LABEL, mcFastBufferLabel);
PlotIndexSetInteger(mcFastBufferIndex, PLOT_DRAW_BEGIN, mcFastLength);
PlotIndexSetInteger(mcFastBufferIndex, PLOT_DRAW_TYPE, mcDrawType);
PlotIndexSetInteger(mcFastBufferIndex, PLOT_LINE_COLOR, mcFastColor);
//
// MC Slow Buffer ...
string mcSlowBufferLabel = "MC S " + "(" + (string)mcSlowLength + ")";
ArraySetAsSeries(mcSlowBuffer, true);
SetIndexBuffer(mcSlowBufferIndex, mcSlowBuffer, INDICATOR_DATA);
PlotIndexSetString(mcSlowBufferIndex, PLOT_LABEL, mcSlowBufferLabel);
PlotIndexSetInteger(mcSlowBufferIndex, PLOT_DRAW_BEGIN, mcSlowLength);
PlotIndexSetInteger(mcSlowBufferIndex, PLOT_DRAW_TYPE, mcDrawType);
PlotIndexSetInteger(mcSlowBufferIndex, PLOT_LINE_COLOR, mcSlowColor);
//
// SC Draw Type ...
ENUM_DRAW_TYPE scDrawType = scDrawLines ? DRAW_LINE : DRAW_NONE;
//
// SC Fast Buffer ...
string scFastBufferLabel = "SC F " + "(" + (string)scFastLength + ")";
ArraySetAsSeries(scFastBuffer, true);
SetIndexBuffer(scFastBufferIndex, scFastBuffer, INDICATOR_DATA);
PlotIndexSetString(scFastBufferIndex, PLOT_LABEL, scFastBufferLabel);
PlotIndexSetInteger(scFastBufferIndex, PLOT_DRAW_BEGIN, scFastLength);
PlotIndexSetInteger(scFastBufferIndex, PLOT_DRAW_TYPE, scDrawType);
PlotIndexSetInteger(scFastBufferIndex, PLOT_LINE_COLOR, scFastColor);
//
// SC Slow Buffer ...
string scSlowBufferLabel = "SC S " + "(" + (string)scSlowLength + ")";
ArraySetAsSeries(scSlowBuffer, true);
SetIndexBuffer(scSlowBufferIndex, scSlowBuffer, INDICATOR_DATA);
PlotIndexSetString(scSlowBufferIndex, PLOT_LABEL, scSlowBufferLabel);
PlotIndexSetInteger(scSlowBufferIndex, PLOT_DRAW_BEGIN, scSlowLength);
PlotIndexSetInteger(scSlowBufferIndex, PLOT_DRAW_TYPE, scDrawType);
PlotIndexSetInteger(scSlowBufferIndex, PLOT_LINE_COLOR, scSlowColor);
//
// CC Draw Type ...
// ENUM_DRAW_TYPE ccDrawType = ccDrawLines ? DRAW_LINE : DRAW_NONE;
//
// CC Fast Buffer ...
// string ccFastBufferLabel = "CC F " + "(" + (string)ccFastLength + ")";
// ArraySetAsSeries(ccFastBuffer, true);
// SetIndexBuffer(ccFastBufferIndex, ccFastBuffer, INDICATOR_DATA);
// PlotIndexSetString(ccFastBufferIndex, PLOT_LABEL, ccFastBufferLabel);
// PlotIndexSetInteger(ccFastBufferIndex, PLOT_DRAW_BEGIN, ccFastLength);
// PlotIndexSetInteger(ccFastBufferIndex, PLOT_DRAW_TYPE, ccDrawType);
// PlotIndexSetInteger(ccFastBufferIndex, PLOT_LINE_COLOR, ccFastColor);
//
// CC Slow Buffer ...
// string ccSlowBufferLabel = "CC S " + "(" + (string)ccSlowLength + ")";
// ArraySetAsSeries(ccSlowBuffer, true);
// SetIndexBuffer(ccSlowBufferIndex, ccSlowBuffer, INDICATOR_DATA);
// PlotIndexSetString(ccSlowBufferIndex, PLOT_LABEL, ccSlowBufferLabel);
// PlotIndexSetInteger(ccSlowBufferIndex, PLOT_DRAW_BEGIN, ccSlowLength);
// PlotIndexSetInteger(ccSlowBufferIndex, PLOT_DRAW_TYPE, ccDrawType);
// PlotIndexSetInteger(ccSlowBufferIndex, PLOT_LINE_COLOR, ccSlowColor);
}
//
// Set Indicator Short Name and also we can define Buffers Labels ...
void SetIndicatorName()
{
//
string indicatorShortName = "";
StringConcatenate(indicatorShortName, ShortName, " ", "( ", lcFastLength, ",", lcSlowLength, " )");
//
IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName);
}
//
// Calculate Buffers ...
void CalculateBuffers(int bar_index)
{
//
// LC ...
CalculateLC(bar_index);
//
// MC ...
CalculateMC(bar_index);
//
// SC ...
CalculateSC(bar_index);
//
// CC ...
// CalculateCC(bar_index);
}
//
// Calculate Long Cycle ...
void CalculateLC(int bar_index)
{
//
// Get LC Bar Index ...
// int lcBarIndex = GetCandleBarIndex(bar_index, lcPeriod);
// if (lcBarIndex == -1) {
// return;
// }
//
// Check Crosses ...
bool isLCFastCrossOverSlow = IsCrossOver(lcFastBuffer, lcSlowBuffer, bar_index);
bool isLCFastCrossUnderSlow = IsCrossUnder(lcFastBuffer, lcSlowBuffer, bar_index);
if (
lcDrawCrosses &&
(isLCFastCrossOverSlow || isLCFastCrossUnderSlow))
{
//
// Draw Crosses ...
color clrLine = isLCFastCrossOverSlow ? lcFastColor : lcSlowColor;
DrawCrossLine(clrLine, bar_index);
}
//
// Chack Trends ...
bool isLCTrendsUp = IsOver(lcFastBuffer, lcSlowBuffer, bar_index);
bool isLCTrendsDown = IsUnder(lcFastBuffer, lcSlowBuffer, bar_index);
if (
lcDrawTrends &&
(isLCTrendsUp || isLCTrendsDown))
{
//
// Draw Trends ...
color clrArrow = isLCTrendsUp ? lcFastColor : lcSlowColor;
string name = "LC Trends " + (isLCTrendsUp ? "UP" : "Down");
uchar arrowCode = isLCTrendsUp ? lcTrendUpArrowCode : lcTrendDownArrowCode;
//
DrawTrendsArrow(
name,
clrArrow,
arrowCode,
isLCTrendsUp,
bar_index);
}
//
// Check Swings ...
// double swingValue = lcSwingBuffer[bar_index];
// if (swingValue != 0)
// {
// //
// string name = "LC";
// bool isSwingHigh = swingValue == 1;
// uchar arrowCode = lcSwingsArrowCode;
// color clrArrow = isSwingHigh ? lcSlowColor : lcFastColor;
// //
// DrawSwingArrow(
// name,
// isSwingHigh,
// clrArrow,
// arrowCode,
// bar_index);
// }
}
//
// Calculate Medium Cycle ...
void CalculateMC(int bar_index)
{
// //
// // Get MC Bar Index ...
// int mcBarIndex = GetCandleBarIndex(bar_index, mcPeriod);
// if (mcBarIndex == -1) {
// return;
// }
//
// Check Crosses ...
bool isMCFastCrossOverSlow = IsCrossOver(mcFastBuffer, mcSlowBuffer, bar_index);
bool isMCFastCrossUnderSlow = IsCrossUnder(mcFastBuffer, mcSlowBuffer, bar_index);
if (
mcDrawCrosses &&
(isMCFastCrossOverSlow || isMCFastCrossUnderSlow))
{
//
// Draw Crosses ...
color clrLine = isMCFastCrossOverSlow ? mcFastColor : mcSlowColor;
DrawCrossLine(clrLine, bar_index);
}
//
// Chack Trends ...
bool isMCTrendsUp = IsOver(mcFastBuffer, mcSlowBuffer, bar_index);
bool isMCTrendsDown = IsUnder(mcFastBuffer, mcSlowBuffer, bar_index);
if (
mcDrawTrends &&
(isMCTrendsUp || isMCTrendsDown))
{
//
// Draw Trends ...
color clrArrow = isMCTrendsUp ? mcFastColor : mcSlowColor;
string name = "MC Trends " + (isMCTrendsUp ? "UP" : "Down");
uchar arrowCode = isMCTrendsUp ? mcTrendUpArrowCode : mcTrendDownArrowCode;
//
DrawTrendsArrow(
name,
clrArrow,
arrowCode,
isMCTrendsUp,
bar_index);
}
}
//
// Calculate Short Cycle ...
void CalculateSC(int bar_index)
{
// //
// // Get SC Bar Index ...
// int scBarIndex = GetCandleBarIndex(bar_index, scPeriod);
// if (scBarIndex == -1) {
// return;
// }
//
// Check Crosses ...
bool isSCFastCrossOverSlow = IsCrossOver(scFastBuffer, scSlowBuffer, bar_index);
bool isSCFastCrossUnderSlow = IsCrossUnder(scFastBuffer, scSlowBuffer, bar_index);
if (
scDrawCrosses &&
(isSCFastCrossOverSlow || isSCFastCrossUnderSlow))
{
//
// Draw Crosses ...
color clrLine = isSCFastCrossOverSlow ? scFastColor : scSlowColor;
DrawCrossLine(clrLine, bar_index);
}
//
// Chack Trends ...
bool isSCTrendsUp = IsOver(scFastBuffer, scSlowBuffer, bar_index);
bool isSCTrendsDown = IsUnder(scFastBuffer, scSlowBuffer, bar_index);
if (
scDrawTrends &&
(isSCTrendsUp || isSCTrendsDown))
{
//
// Draw Trends ...
color clrArrow = isSCTrendsUp ? scFastColor : scSlowColor;
string name = "SC Trends " + (isSCTrendsUp ? "UP" : "Down");
uchar arrowCode = isSCTrendsUp ? scTrendUpArrowCode : scTrendDownArrowCode;
//
DrawTrendsArrow(
name,
clrArrow,
arrowCode,
isSCTrendsUp,
bar_index);
}
}
//
// Calculate Current Cycle ...
// void CalculateCC(int bar_index)
// {
// //
// // Check Crosses ...
// bool isCCFastCrossOverSlow = IsCrossOvedr(ccFastBuffer, ccSlowBuffer, bar_index);
// bool isCCFastCrossUnderSlow = IsCrossUnder(ccFastBuffer, ccSlowBuffer, bar_index);
// if (
// ccDrawCrosses &&
// (isCCFastCrossOverSlow || isCCFastCrossUnderSlow))
// {
// //
// // Draw Crosses ...
// color clrLine = isCCFastCrossOverSlow ? ccFastColor : ccSlowColor;
// DrawCrossLine(clrLine, bar_index);
// }
// //
// // Chack Trends ...
// bool isCCTrendsUp = IsOver(ccFastBuffer, ccSlowBuffer, bar_index);
// bool isCCTrendsDown = IsUnder(ccFastBuffer, ccSlowBuffer, bar_index);
// if (
// ccDrawTrends &&
// (isCCTrendsUp || isCCTrendsDown))
// {
// //
// // Draw Trends ...
// color clrArrow = isCCTrendsUp ? ccFastColor : ccSlowColor;
// string name = "CC Trends " + (isCCTrendsUp ? "UP" : "Down");
// uchar arrowCode = isCCTrendsUp ? ccTrendUpArrowCode : ccTrendDownArrowCode;
// //
// DrawTrendsArrow(
// name,
// clrArrow,
// arrowCode,
// isCCTrendsUp,
// bar_index);
// }
// }
//
// Draw a Swing Point ...
void DrawSwingArrow(
string name, // Suggested Object Name Prefix
bool isSwingHigh, // Swing Direction
color arrowColor, // Suggested Arrow Color
uchar arrowCode, // Suggested ArrowCode
int bar_index // Bar Index
)
{
//
XOHCL candle = GetCandle(bar_index + 3);
//
// Define Required Object Properties fro Draw an Arrow ...
datetime time = iTime(_Symbol, _Period, bar_index + 3);
ENUM_ARROW_ANCHOR anchor = isSwingHigh ? ANCHOR_BOTTOM : ANCHOR_TOP;
double price = isSwingHigh ? candle.high : candle.low;
name += " Swing " + (isSwingHigh ? "High" : "Low") + "_" + (string)time + "_" + (string)price;
//
// Draw desired Arrow ...
DrawArrow(
0,
name,
0,
time,
price,
arrowCode,
anchor,
arrowColor);
}
//
// Draw Cross Lines of Cycles ...
void DrawCrossLine(color lineColor, int bar_index)
{
//
datetime time = iTime(_Symbol, _Period, bar_index);
string name = "CrossLine_" + (string)time;
//
DrawVerticalLine(
0,
name,
0,
time,
lineColor);
}
//
//
void DrawTrendsArrow(
string name, // Suggested Object Name Prefix
color clr, // Suggested Arrow Color
uchar arrowCode, // Suggested ArrowCode
bool isUp, // Trend Direction
int bar_index // Bar Index
)
{
//
XOHCL candle = GetCandle(bar_index);
//
double price = isUp ? candle.low : candle.high;
datetime time = iTime(_Symbol, _Period, bar_index);
name += "_" + (string)time + "_" + (string)price;
ENUM_ARROW_ANCHOR anchor = isUp ? ANCHOR_TOP : ANCHOR_BOTTOM;
//
// Draw Specified Arrow ...
DrawArrow(
0,
name,
0,
time,
price,
arrowCode,
anchor,
clr,
STYLE_SOLID,
1);
}
//
// END Functions ...
//