1021 lines
18 KiB
Plaintext
1021 lines
18 KiB
Plaintext
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 XTD Oscillator Helper for Signal Providers
|
|
// ---------------------------------------------------------------------
|
|
//
|
|
//
|
|
// Maintainer:
|
|
// ------------
|
|
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Global Properties ...
|
|
#property library
|
|
#property copyright "Copyright 2023, SaherElm IT Center"
|
|
#property link "https://www.saherelm.ir"
|
|
#property version "1.00"
|
|
#property strict
|
|
|
|
//
|
|
#include "..\Libraries\x-saherelm.log.lib.mq5"
|
|
#include "..\Libraries\x-saherelm.common.lib.mq5"
|
|
#include "x-saherelm.xmap.provider.inputs.lib.mq5"
|
|
|
|
//
|
|
// START Enum Definitions ...
|
|
//
|
|
|
|
//
|
|
// XTD Oscillator States ...
|
|
enum ENUM_X_XTD_STATES
|
|
{
|
|
X_XTD_BULLISH_CROSSED_OVER_BEARISH = 2,
|
|
X_XTD_BULLISH_OVER_BEARISH = 1,
|
|
X_XTD_NEUTURAL = 0,
|
|
X_XTD_BULLISH_UNDER_BEARISH = -1,
|
|
X_XTD_BULLISH_CROSSED_UNDER_BEARISH = -2
|
|
};
|
|
|
|
//
|
|
// XTD Oscillator Buffer Lines ...
|
|
enum ENUM_X_XTD_BUFFER_LINES
|
|
{
|
|
X_XTD_BULLISH_POWER_LINE = 0,
|
|
X_XTD_BEARISH_POWER_LINE = 1,
|
|
X_XTD_SIGNAL_LINE = 2,
|
|
};
|
|
//
|
|
// END Enum Definitions ...
|
|
//
|
|
|
|
//
|
|
// START Inputs ...
|
|
//
|
|
input group "XTD Oscillator";
|
|
input int xTDLength = 28; // Market Length
|
|
input bool xTDDrawCrosses = false; // Draw Cross Arrows
|
|
input uchar xTDBullishArrowCode = 228; // Cross Over Arrow Code
|
|
input color xTDBullishArrowColor = clrAqua; // Cross Over Arrow Color
|
|
input uchar xTDBearishArrowCode = 230; // Cross Under Arrow Code
|
|
input color xTDBearishArrowColor = clrMagenta; // Cross Under Arrow Color
|
|
//
|
|
// END Inputs ...
|
|
//
|
|
|
|
//
|
|
// START Definitions ...
|
|
//
|
|
int xTDHandler = INVALID_HANDLE;
|
|
double xTDBullishBuffer[];
|
|
double xTDBearishBuffer[];
|
|
double xTDSignalBuffer[];
|
|
//
|
|
// END Definitions ...
|
|
//
|
|
|
|
//
|
|
// START Handler Functions ...
|
|
//
|
|
//
|
|
// Init Indicators ...
|
|
bool XTDInitHandlers()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Initialize Indicator/Oscillator Handlers ...
|
|
ResetLastError();
|
|
|
|
//
|
|
// XTD Handler ...
|
|
ArraySetAsSeries(xTDBullishBuffer, true);
|
|
ArraySetAsSeries(xTDBearishBuffer, true);
|
|
ArraySetAsSeries(xTDSignalBuffer, true);
|
|
xTDHandler = iCustom(
|
|
_Symbol,
|
|
_Period,
|
|
"x-saherelm.xtd.oscillator",
|
|
//
|
|
// Inputs ...
|
|
xTDLength,
|
|
xTDDrawCrosses,
|
|
xTDBullishArrowCode,
|
|
xTDBullishArrowColor,
|
|
xTDBearishArrowCode,
|
|
xTDBearishArrowColor);
|
|
if (xTDHandler == INVALID_HANDLE)
|
|
{
|
|
//
|
|
LogMessage("failed to Initialize XTD Oscillator: " + (string)GetLastError());
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = true;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Release Indicators ...
|
|
void XTDReleaseHandlers()
|
|
{
|
|
IndicatorRelease(xTDHandler);
|
|
}
|
|
|
|
//
|
|
// Handle Reading Buffers ...
|
|
void XTDReadBuffers()
|
|
{
|
|
//
|
|
// XTD Bullish Buffer ...
|
|
CopyBuffer(
|
|
xTDHandler,
|
|
X_XTD_BULLISH_POWER_LINE,
|
|
0,
|
|
xMAPNumberOfItemsPerTick,
|
|
xTDBullishBuffer);
|
|
|
|
//
|
|
// XTD Bullish Buffer ...
|
|
CopyBuffer(
|
|
xTDHandler,
|
|
X_XTD_BEARISH_POWER_LINE,
|
|
0,
|
|
xMAPNumberOfItemsPerTick,
|
|
xTDBearishBuffer);
|
|
|
|
//
|
|
// XTD Signal Buffer ...
|
|
CopyBuffer(
|
|
xTDHandler,
|
|
X_XTD_SIGNAL_LINE,
|
|
0,
|
|
xMAPNumberOfItemsPerTick,
|
|
xTDSignalBuffer);
|
|
}
|
|
//
|
|
// END Handler Funcions ...
|
|
//
|
|
|
|
//
|
|
// START XTD Custom Functions ...
|
|
//
|
|
//
|
|
// Find Peak based On this Indicator ...
|
|
bool XTDIsPeak(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Find Vale based On this Indicator ...
|
|
bool XTDIsVale(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Bull Crossed Over Bear ...
|
|
bool XTDIsBullCrossedOverBear(
|
|
int bar_index // sepcified Bar Index
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
xTDBullishBuffer[bar_index] > xTDBearishBuffer[bar_index] &&
|
|
xTDBullishBuffer[bar_index + 1] <= xTDBearishBuffer[bar_index + 1];
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Bull Crossed Under Bear ...
|
|
bool XTDIsBullCrossedUnderBear(
|
|
int bar_index // sepcified Bar Index
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
xTDBullishBuffer[bar_index] < xTDBearishBuffer[bar_index] &&
|
|
xTDBullishBuffer[bar_index + 1] >= xTDBearishBuffer[bar_index + 1];
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Signal Crossed Over Bear ...
|
|
bool XTDIsSignalCrossedOverBear(
|
|
int bar_index // sepcified Bar Index
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
xTDSignalBuffer[bar_index] > xTDBearishBuffer[bar_index] &&
|
|
xTDSignalBuffer[bar_index + 1] <= xTDBearishBuffer[bar_index + 1];
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Signal Crossed Under Bear ...
|
|
bool XTDIsSignalCrossedUnderBear(
|
|
int bar_index // sepcified Bar Index
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
xTDSignalBuffer[bar_index] < xTDBearishBuffer[bar_index] &&
|
|
xTDSignalBuffer[bar_index + 1] >= xTDBearishBuffer[bar_index + 1];
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Bull Over Bear ...
|
|
bool XTDIsBullOverBear(
|
|
int bar_index // sepcified Bar Index
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
xTDBullishBuffer[bar_index] > xTDBearishBuffer[bar_index];
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Bull Under Bear ...
|
|
bool XTDIsBullUnderBear(
|
|
int bar_index // sepcified Bar Index
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
xTDBullishBuffer[bar_index] < xTDBearishBuffer[bar_index];
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Signal Over Bear ...
|
|
bool XTDIsSignalOverBear(
|
|
int bar_index // sepcified Bar Index
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
xTDSignalBuffer[bar_index] > xTDBearishBuffer[bar_index];
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Signal Under Bear ...
|
|
bool XTDIsSignalUnderBear(
|
|
int bar_index // sepcified Bar Index
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
xTDSignalBuffer[bar_index] < xTDBearishBuffer[bar_index];
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Bull is Going Up in Loopback ...
|
|
bool XTDIsBullIncreaseInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback == 0 ||
|
|
ArraySize(xTDBullishBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double value1 = xTDBullishBuffer[1];
|
|
double valueLast = xTDBullishBuffer[loopback - 1];
|
|
result = value1 > valueLast;
|
|
for (int i = 2; i < loopback; i++)
|
|
{
|
|
//
|
|
double valuei = xTDBullishBuffer[i];
|
|
bool isResult = value1 >= valuei;
|
|
|
|
//
|
|
result = result && isResult;
|
|
if (!result)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Bull is Going Down in Loopback ...
|
|
bool XTDIsBullDecreaseInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback == 0 ||
|
|
ArraySize(xTDBullishBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double value1 = xTDBullishBuffer[1];
|
|
double valueLast = xTDBullishBuffer[loopback - 1];
|
|
result = value1 < valueLast;
|
|
for (int i = 2; i < loopback; i++)
|
|
{
|
|
//
|
|
double valuei = xTDBullishBuffer[i];
|
|
bool isResult = value1 <= valuei;
|
|
|
|
//
|
|
result = result && isResult;
|
|
if (!result)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Bear is Going Up in Loopback ...
|
|
bool XTDIsBearIncreaseInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback == 0 ||
|
|
ArraySize(xTDBearishBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double value1 = xTDBearishBuffer[1];
|
|
double valueLast = xTDBearishBuffer[loopback - 1];
|
|
result = value1 > valueLast;
|
|
for (int i = 2; i < loopback; i++)
|
|
{
|
|
//
|
|
double valuei = xTDBearishBuffer[i];
|
|
bool isResult = value1 >= valuei;
|
|
|
|
//
|
|
result = result && isResult;
|
|
if (!result)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Bear is Going Down in Loopback ...
|
|
bool XTDIsBearDecreaseInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback == 0 ||
|
|
ArraySize(xTDBearishBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double value1 = xTDBearishBuffer[1];
|
|
double valueLast = xTDBearishBuffer[loopback - 1];
|
|
result = value1 < valueLast;
|
|
for (int i = 2; i < loopback; i++)
|
|
{
|
|
//
|
|
double valuei = xTDBearishBuffer[i];
|
|
bool isResult = value1 <= valuei;
|
|
|
|
//
|
|
result = result && isResult;
|
|
if (!result)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Signal is Going Up in Loopback ...
|
|
bool XTDIsSignalIncreaseInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback == 0 ||
|
|
ArraySize(xTDSignalBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double value1 = xTDSignalBuffer[1];
|
|
double valueLast = xTDSignalBuffer[loopback - 1];
|
|
result = value1 > valueLast;
|
|
for (int i = 2; i < loopback; i++)
|
|
{
|
|
//
|
|
double valuei = xTDSignalBuffer[i];
|
|
bool isResult = value1 >= valuei;
|
|
|
|
//
|
|
result = result && isResult;
|
|
if (!result)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Signal is Going Down in Loopback ...
|
|
bool XTDIsSignalDecreaseInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback == 0 ||
|
|
ArraySize(xTDSignalBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double value1 = xTDSignalBuffer[1];
|
|
double valueLast = xTDSignalBuffer[loopback - 1];
|
|
result = value1 < valueLast;
|
|
for (int i = 2; i < loopback; i++)
|
|
{
|
|
//
|
|
double valuei = xTDSignalBuffer[i];
|
|
bool isResult = value1 <= valuei;
|
|
|
|
//
|
|
result = result && isResult;
|
|
if (!result)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Get Max Bull in Loopback ...
|
|
double XTDGetMaxBullInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback == 0 ||
|
|
ArraySize(xTDBullishBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
for (int i = 2; i < loopback; i++)
|
|
{
|
|
//
|
|
double value = xTDBullishBuffer[i];
|
|
result =
|
|
result == 0 || result < value ? value : result;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Get Min Bull in Loopback ...
|
|
double XTDGetMinBullInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback == 0 ||
|
|
ArraySize(xTDBullishBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
for (int i = 2; i < loopback; i++)
|
|
{
|
|
//
|
|
double value = xTDBullishBuffer[i];
|
|
result =
|
|
result == 0 || result > value ? value : result;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Get Max Bear in Loopback ...
|
|
double XTDGetMaxBearInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback == 0 ||
|
|
ArraySize(xTDBearishBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
for (int i = 2; i < loopback; i++)
|
|
{
|
|
//
|
|
double value = xTDBearishBuffer[i];
|
|
result =
|
|
result == 0 || result < value ? value : result;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Get Min Bear in Loopback ...
|
|
double XTDGetMinBearInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback == 0 ||
|
|
ArraySize(xTDBearishBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
for (int i = 2; i < loopback; i++)
|
|
{
|
|
//
|
|
double value = xTDBearishBuffer[i];
|
|
result =
|
|
result == 0 || result > value ? value : result;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Get Max Signal in Loopback ...
|
|
double XTDGetMaxSignalInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback == 0 ||
|
|
ArraySize(xTDSignalBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
for (int i = 2; i < loopback; i++)
|
|
{
|
|
//
|
|
double value = xTDSignalBuffer[i];
|
|
result =
|
|
result == 0 || result < value ? value : result;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Get Min Signal in Loopback ...
|
|
double XTDGetMinSignalInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback == 0 ||
|
|
ArraySize(xTDSignalBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
for (int i = 2; i < loopback; i++)
|
|
{
|
|
//
|
|
double value = xTDSignalBuffer[i];
|
|
result =
|
|
result == 0 || result > value ? value : result;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Count Bull Over Bear Crosses In Loopback ...
|
|
int XTDCountBullOverBearCrossesInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
int result = 0;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback < 0 ||
|
|
ArraySize(xTDBullishBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Loop through Loopback ...
|
|
for (int i = 0; i < loopback - 1; i++) {
|
|
//
|
|
bool isCrossed = XTDIsBullCrossedOverBear(i);
|
|
if (isCrossed) {
|
|
result++;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Count Bull Under Bear Crosses In Loopback ...
|
|
int XTDCountBullUnderBearCrossesInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
int result = 0;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback < 0 ||
|
|
ArraySize(xTDBullishBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Loop through Loopback ...
|
|
for (int i = 0; i < loopback - 1; i++) {
|
|
//
|
|
bool isCrossed = XTDIsBullCrossedUnderBear(i);
|
|
if (isCrossed) {
|
|
result++;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Count Signal Over Bear Crosses In Loopback ...
|
|
int XTDCountSignalOverBearCrossesInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
int result = 0;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback < 0 ||
|
|
ArraySize(xTDSignalBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Loop through Loopback ...
|
|
for (int i = 0; i < loopback - 1; i++) {
|
|
//
|
|
bool isCrossed = XTDIsSignalCrossedOverBear(i);
|
|
if (isCrossed) {
|
|
result++;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Count Signal Under Bear Crosses In Loopback ...
|
|
int XTDCountSignalUnderBearCrossesInLoopback(
|
|
int loopback // loopback length
|
|
)
|
|
{
|
|
//
|
|
int result = 0;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback < 0 ||
|
|
ArraySize(xTDSignalBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Loop through Loopback ...
|
|
for (int i = 0; i < loopback - 1; i++) {
|
|
//
|
|
bool isCrossed = XTDIsSignalCrossedUnderBear(i);
|
|
if (isCrossed) {
|
|
result++;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Find First Bull Cross Over Bear in Loopback ...
|
|
int XTDFindBullOverBearCrossIndexInLoopback(
|
|
int loopback // loopback length
|
|
) {
|
|
//
|
|
int result = -1;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback < 0 ||
|
|
ArraySize(xTDBullishBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Loop through Loopback ...
|
|
for (int i = 0; i < loopback - 1; i++) {
|
|
//
|
|
bool isCrossed = XTDIsBullCrossedOverBear(i);
|
|
if (isCrossed) {
|
|
//
|
|
result = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Find First Bull Cross Under Bear in Loopback ...
|
|
int XTDFindBullUnderBearCrossIndexInLoopback(
|
|
int loopback // loopback length
|
|
) {
|
|
//
|
|
int result = -1;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback < 0 ||
|
|
ArraySize(xTDBullishBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Loop through Loopback ...
|
|
for (int i = 0; i < loopback - 1; i++) {
|
|
//
|
|
bool isCrossed = XTDIsBullCrossedUnderBear(i);
|
|
if (isCrossed) {
|
|
//
|
|
result = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Find First Signall Cross Over Bear in Loopback ...
|
|
int XTDFindSignalOverBearCrossIndexInLoopback(
|
|
int loopback // loopback length
|
|
) {
|
|
//
|
|
int result = -1;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback < 0 ||
|
|
ArraySize(xTDSignalBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Loop through Loopback ...
|
|
for (int i = 0; i < loopback - 1; i++) {
|
|
//
|
|
bool isCrossed = XTDIsSignalCrossedOverBear(i);
|
|
if (isCrossed) {
|
|
//
|
|
result = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Find First Signal Cross Under Bear in Loopback ...
|
|
int XTDFindSignalUnderBearCrossIndexInLoopback(
|
|
int loopback // loopback length
|
|
) {
|
|
//
|
|
int result = -1;
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (
|
|
loopback < 0 ||
|
|
ArraySize(xTDSignalBuffer) < loopback)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Loop through Loopback ...
|
|
for (int i = 0; i < loopback - 1; i++) {
|
|
//
|
|
bool isCrossed = XTDIsSignalCrossedUnderBear(i);
|
|
if (isCrossed) {
|
|
//
|
|
result = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
//
|
|
// END XTD Custom Functions ...
|
|
//
|