Initial Commit ...
This commit is contained in:
@@ -0,0 +1,533 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center Sharp Market Pump/Dump Indicator
|
||||
// ---------------------------------------------
|
||||
// this indicator detects market
|
||||
// sharp pump and dumps ...
|
||||
//
|
||||
// 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 SHPD Indicator"
|
||||
#property strict
|
||||
|
||||
//
|
||||
// START Inputs ...
|
||||
//
|
||||
input int marketLength = 7; // Market Length
|
||||
input int loopback = 5; // Loopback for Sharp
|
||||
input double multiplier = 2.0; // Multiplier
|
||||
input double minimumMarketGap = 0.03; // Minimum Market Gap
|
||||
//
|
||||
// END Inputs ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Global Definitions: Variables, Properties and etc ...
|
||||
//
|
||||
//
|
||||
// Specify this is an Chart Indicator ...
|
||||
// #property indicator_chart_window
|
||||
#property indicator_separate_window
|
||||
|
||||
//
|
||||
#property indicator_buffers 6
|
||||
#property indicator_plots 6
|
||||
|
||||
//
|
||||
#property indicator_label1 "Market Highest"
|
||||
#property indicator_type1 DRAW_LINE
|
||||
#property indicator_color1 clrAqua
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 1
|
||||
|
||||
//
|
||||
#property indicator_label2 "Market Lowest"
|
||||
#property indicator_type2 DRAW_LINE
|
||||
#property indicator_color2 clrAqua
|
||||
#property indicator_style2 STYLE_SOLID
|
||||
#property indicator_width2 1
|
||||
|
||||
//
|
||||
#property indicator_label3 "Market Highest Low"
|
||||
#property indicator_type3 DRAW_LINE
|
||||
#property indicator_color3 clrFuchsia
|
||||
#property indicator_style3 STYLE_DOT
|
||||
#property indicator_width3 1
|
||||
|
||||
//
|
||||
#property indicator_label4 "Market Lowest High"
|
||||
#property indicator_type4 DRAW_LINE
|
||||
#property indicator_color4 clrBlueViolet
|
||||
#property indicator_style4 STYLE_DOT
|
||||
#property indicator_width4 1
|
||||
|
||||
//
|
||||
#property indicator_label5 "Market Moving Average"
|
||||
#property indicator_type5 DRAW_LINE
|
||||
#property indicator_color5 clrYellow
|
||||
#property indicator_style5 STYLE_DASHDOT
|
||||
#property indicator_width5 1
|
||||
|
||||
//
|
||||
#property indicator_label6 "Market Moving Average T"
|
||||
#property indicator_type6 DRAW_LINE
|
||||
#property indicator_color6 clrLime
|
||||
#property indicator_style6 STYLE_DASHDOT
|
||||
#property indicator_width6 1
|
||||
|
||||
//
|
||||
// here we declare indicator buffers ...
|
||||
//
|
||||
double marketHighestBuffer[];
|
||||
double marketLowestBuffer[];
|
||||
double marketHighestLowBuffer[];
|
||||
double marketLowestHighBuffer[];
|
||||
|
||||
//
|
||||
double marketMovingAverageBuffer[];
|
||||
double marketMovingAverageTBuffer[];
|
||||
|
||||
//
|
||||
#define marketHighestBufferIndex 0
|
||||
#define marketLowestBufferIndex 1
|
||||
#define marketHighestLowBufferIndex 2
|
||||
#define marketLowestHighBufferIndex 3
|
||||
#define marketMovingAverageBufferIndex 4
|
||||
#define marketMovingAverageTBufferIndex 5
|
||||
|
||||
//
|
||||
// Includes our shared library ...
|
||||
#include "../Libraries/x-saherelm.lib.mq4"
|
||||
|
||||
//
|
||||
// here we specify logging enabled or not ...
|
||||
bool enableLogging = true;
|
||||
|
||||
//
|
||||
// this is a Tag which attached to our Logger ...
|
||||
string logTag = "X_SHPD_IND";
|
||||
//
|
||||
// END Global Definitions: Variables, Properties and etc ...
|
||||
//
|
||||
|
||||
//
|
||||
// Start Event Handlers ...
|
||||
//
|
||||
//
|
||||
// Initialization ...
|
||||
int OnInit() {
|
||||
//
|
||||
// Validate Inputs ...
|
||||
if (
|
||||
loopback < 0
|
||||
|| marketLength < 0
|
||||
|| loopback > marketLength
|
||||
) {
|
||||
return INIT_PARAMETERS_INCORRECT;
|
||||
}
|
||||
|
||||
//
|
||||
// Initialize what we want ...
|
||||
SetIndexBuffer(marketHighestBufferIndex, marketHighestBuffer);
|
||||
SetIndexBuffer(marketLowestBufferIndex, marketLowestBuffer);
|
||||
//
|
||||
SetIndexBuffer(marketHighestLowBufferIndex, marketHighestLowBuffer);
|
||||
SetIndexBuffer(marketLowestHighBufferIndex, marketLowestHighBuffer);
|
||||
//
|
||||
SetIndexBuffer(marketMovingAverageBufferIndex, marketMovingAverageBuffer);
|
||||
SetIndexBuffer(marketMovingAverageTBufferIndex, marketMovingAverageTBuffer);
|
||||
|
||||
//
|
||||
return INIT_SUCCEEDED;
|
||||
}
|
||||
|
||||
//
|
||||
// De Initialization ...
|
||||
void OnDeinit(const int reason) {
|
||||
RemoveDraws(logTag);
|
||||
}
|
||||
|
||||
//
|
||||
// Calculating what we want ...
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[]
|
||||
) {
|
||||
//
|
||||
int limit;
|
||||
|
||||
//
|
||||
static int lastMarketTrend = 0;
|
||||
static datetime lastMarketTrendTime = 0;
|
||||
|
||||
//
|
||||
// input variable, we return 0 means nothing passed ...
|
||||
if (rates_total < marketLength) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
// found which candles calculated before ...
|
||||
limit = rates_total - prev_calculated;
|
||||
if (prev_calculated > 0) {
|
||||
limit++;
|
||||
}
|
||||
|
||||
//
|
||||
// Do Calculation ...
|
||||
for (int i = limit - 1 - (loopback + 1); i >= 0; i--) {
|
||||
//
|
||||
int lastMarketHighestIndex = iHighest(
|
||||
_Symbol,
|
||||
_Period,
|
||||
MODE_HIGH,
|
||||
marketLength,
|
||||
i
|
||||
);
|
||||
double lastMarketHighest = high[lastMarketHighestIndex];
|
||||
marketHighestBuffer[i] = lastMarketHighest;
|
||||
|
||||
//
|
||||
int lastMarketLowestIndex = iLowest(
|
||||
_Symbol,
|
||||
_Period,
|
||||
MODE_LOW,
|
||||
marketLength,
|
||||
i
|
||||
);
|
||||
double lastMarketLowest = low[lastMarketLowestIndex];
|
||||
marketLowestBuffer[i] = lastMarketLowest;
|
||||
|
||||
//
|
||||
int lastMarketHighestLowIndex = iLowest(
|
||||
_Symbol,
|
||||
_Period,
|
||||
MODE_HIGH,
|
||||
marketLength,
|
||||
i
|
||||
);
|
||||
double lastMarketHighestLow = high[lastMarketHighestLowIndex];
|
||||
marketHighestLowBuffer[i] = lastMarketHighestLow;
|
||||
|
||||
//
|
||||
int lastMarketLowestHighIndex = iHighest(
|
||||
_Symbol,
|
||||
_Period,
|
||||
MODE_LOW,
|
||||
marketLength,
|
||||
i
|
||||
);
|
||||
double lastMarketLowestHigh = low[lastMarketLowestHighIndex];
|
||||
marketLowestHighBuffer[i] = lastMarketLowestHigh;
|
||||
|
||||
//
|
||||
double marketMovingAverage = iMA(
|
||||
_Symbol,
|
||||
_Period,
|
||||
marketLength * 2, // Ma Length ...
|
||||
0, // Ma Shift ...
|
||||
MODE_SMA, // Ma Method ...
|
||||
PRICE_MEDIAN, // Ma Applied Price ...
|
||||
i // Bar Index ...
|
||||
);
|
||||
marketMovingAverageBuffer[i] = marketMovingAverage;
|
||||
|
||||
//
|
||||
double marketMovingAverageT = iMA(
|
||||
_Symbol,
|
||||
_Period,
|
||||
marketLength * 2, // Ma Length ...
|
||||
0, // Ma Shift ...
|
||||
MODE_SMA, // Ma Method ...
|
||||
PRICE_TYPICAL, // Ma Applied Price ...
|
||||
i // Bar Index ...
|
||||
);
|
||||
marketMovingAverageTBuffer[i] = marketMovingAverageT;
|
||||
|
||||
//
|
||||
double marketGap = MathAbs(marketMovingAverageBuffer[i] - marketMovingAverageTBuffer[i]);
|
||||
|
||||
//
|
||||
// this means Market Going to Trend Down ...
|
||||
bool isMCrossOverMT = marketMovingAverageBuffer[i] > marketMovingAverageTBuffer[i]
|
||||
&& !(
|
||||
marketMovingAverageBuffer[i + 1] > marketMovingAverageTBuffer[i + 1]
|
||||
);
|
||||
bool isTrendDown = isMCrossOverMT &&
|
||||
marketGap > minimumMarketGap;
|
||||
|
||||
//
|
||||
// this means Market Going to Trend Up ...
|
||||
bool isMCrossUnderMT = marketMovingAverageBuffer[i] < marketMovingAverageTBuffer[i]
|
||||
&& !(
|
||||
marketMovingAverageBuffer[i + 1] < marketMovingAverageTBuffer[i + 1]
|
||||
);
|
||||
bool isTrendUp =
|
||||
// !isTrendDown
|
||||
// &&
|
||||
isMCrossUnderMT
|
||||
&& marketGap > minimumMarketGap;
|
||||
|
||||
//
|
||||
bool isTrendRange = (
|
||||
!isMCrossUnderMT
|
||||
&& !isMCrossOverMT
|
||||
) || (
|
||||
!isTrendUp
|
||||
&& !isTrendDown
|
||||
);
|
||||
|
||||
//
|
||||
// Detect Last Market Trend State & Last Market Trend Time ...
|
||||
int currentMarketTrend =
|
||||
isTrendDown ? -1 :
|
||||
isTrendUp ? 1 :
|
||||
0;
|
||||
if (currentMarketTrend != lastMarketTrend) {
|
||||
//
|
||||
lastMarketTrend = currentMarketTrend;
|
||||
lastMarketTrendTime = iTime(
|
||||
_Symbol,
|
||||
_Period,
|
||||
i
|
||||
);
|
||||
|
||||
//
|
||||
if (isTrendDown) {
|
||||
//
|
||||
datetime arrowTime = iTime(
|
||||
_Symbol,
|
||||
_Period,
|
||||
i
|
||||
);
|
||||
|
||||
//
|
||||
double arrowPrice = iHigh(
|
||||
_Symbol,
|
||||
_Period,
|
||||
i
|
||||
);
|
||||
arrowPrice = arrowPrice + (50 * _Point);
|
||||
|
||||
//
|
||||
string lbl = StringConcatenate(
|
||||
logTag,
|
||||
"_TrendDown_",
|
||||
arrowTime
|
||||
);
|
||||
|
||||
//
|
||||
DrawArrow(
|
||||
0,
|
||||
lbl,
|
||||
0,
|
||||
arrowTime,
|
||||
arrowPrice,
|
||||
SYMBOL_ARROWDOWN,
|
||||
ANCHOR_TOP,
|
||||
clrFuchsia,
|
||||
STYLE_SOLID,
|
||||
3
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
if (isTrendUp) {
|
||||
//
|
||||
datetime arrowTime = iTime(
|
||||
_Symbol,
|
||||
_Period,
|
||||
i
|
||||
);
|
||||
|
||||
//
|
||||
double arrowPrice = iLow(
|
||||
_Symbol,
|
||||
_Period,
|
||||
i
|
||||
);
|
||||
arrowPrice = arrowPrice - (50 * _Point);
|
||||
|
||||
//
|
||||
string lbl = StringConcatenate(
|
||||
logTag,
|
||||
"_TrendUp_",
|
||||
arrowTime
|
||||
);
|
||||
|
||||
//
|
||||
DrawArrow(
|
||||
0,
|
||||
lbl,
|
||||
0,
|
||||
arrowTime,
|
||||
arrowPrice,
|
||||
SYMBOL_ARROWUP,
|
||||
ANCHOR_BOTTOM,
|
||||
clrAqua,
|
||||
STYLE_SOLID,
|
||||
3
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
if (isTrendRange) {
|
||||
//
|
||||
datetime arrowTime = iTime(
|
||||
_Symbol,
|
||||
_Period,
|
||||
i
|
||||
);
|
||||
|
||||
//
|
||||
double arrowUpPrice = iHigh(
|
||||
_Symbol,
|
||||
_Period,
|
||||
i
|
||||
);
|
||||
arrowUpPrice = arrowUpPrice + (50 * _Point);
|
||||
|
||||
//
|
||||
double arrowDownPrice = iLow(
|
||||
_Symbol,
|
||||
_Period,
|
||||
i
|
||||
);
|
||||
arrowDownPrice = arrowDownPrice - (50 * _Point);
|
||||
|
||||
//
|
||||
string lblUp = StringConcatenate(
|
||||
logTag,
|
||||
"_TrendRange_UP_",
|
||||
arrowTime
|
||||
);
|
||||
|
||||
//
|
||||
string lblDown = StringConcatenate(
|
||||
logTag,
|
||||
"_TrendRange_DOWN_",
|
||||
arrowTime
|
||||
);
|
||||
|
||||
//
|
||||
DrawArrow(
|
||||
0,
|
||||
lblUp,
|
||||
0,
|
||||
arrowTime,
|
||||
arrowUpPrice,
|
||||
SYMBOL_ARROWDOWN,
|
||||
ANCHOR_TOP,
|
||||
clrGray,
|
||||
STYLE_SOLID,
|
||||
3
|
||||
);
|
||||
|
||||
//
|
||||
DrawArrow(
|
||||
0,
|
||||
lblDown,
|
||||
0,
|
||||
arrowTime,
|
||||
arrowDownPrice,
|
||||
SYMBOL_ARROWUP,
|
||||
ANCHOR_BOTTOM,
|
||||
clrGray,
|
||||
STYLE_SOLID,
|
||||
3
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
bool isSharp = false;
|
||||
double marketHLGap = marketHighestBuffer[i] - marketLowestBuffer[i];
|
||||
for (int j = i + loopback; j > i; j--) {
|
||||
//
|
||||
double prevMarketHLGap = marketHighestBuffer[j] - marketLowestBuffer[j + 1];
|
||||
bool isThisSharp =
|
||||
marketHLGap > prevMarketHLGap * multiplier;
|
||||
|
||||
//
|
||||
isSharp = isSharp ||
|
||||
(
|
||||
// (
|
||||
// isTrendUp || isTrendDown
|
||||
// )
|
||||
// &&
|
||||
(
|
||||
isThisSharp
|
||||
&& marketGap > minimumMarketGap
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
if (isSharp) {
|
||||
//
|
||||
datetime arrowTime = iTime(
|
||||
_Symbol,
|
||||
_Period,
|
||||
i
|
||||
);
|
||||
|
||||
//
|
||||
double arrowPrice = iHigh(
|
||||
_Symbol,
|
||||
_Period,
|
||||
i
|
||||
);
|
||||
arrowPrice = arrowPrice + (50 * _Point);
|
||||
|
||||
//
|
||||
string lbl = StringConcatenate(
|
||||
logTag,
|
||||
"_SHARP_",
|
||||
arrowTime
|
||||
);
|
||||
|
||||
//
|
||||
DrawArrow(
|
||||
0,
|
||||
lbl,
|
||||
0,
|
||||
arrowTime,
|
||||
arrowPrice,
|
||||
SYMBOL_ARROWDOWN,
|
||||
ANCHOR_TOP,
|
||||
clrYellow,
|
||||
STYLE_SOLID,
|
||||
3
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// return value of prev_calculated for next call
|
||||
return(rates_total);
|
||||
}
|
||||
//
|
||||
// END Event Handlers ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Functions ...
|
||||
//
|
||||
//
|
||||
// END Functions ...
|
||||
//
|
||||
Reference in New Issue
Block a user