Initial Commit ...
This commit is contained in:
@@ -0,0 +1,408 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center XMMA Indicator
|
||||
// ---------------------------------------------
|
||||
// this is an indicator which going to analyse
|
||||
// Market based on Price Movements and provide
|
||||
// some informations to act based on current market
|
||||
// state ...
|
||||
//
|
||||
// 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 Market Analyser (XMMA) Indicator"
|
||||
#property strict
|
||||
|
||||
//
|
||||
// START Inputs ...
|
||||
//
|
||||
input int marketLength = 7; // Market Length
|
||||
input int fastShift = 1; // Fast Shift
|
||||
input int slowShift = 3; // Slow Shift
|
||||
input int longMarketFastMultiplier = 100; // Long Market Fast Multiplier
|
||||
input int longMarketSlowMultiplier = 200; // Long Market Slow Multiplier
|
||||
//
|
||||
// END Inputs ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Global Definitions: Variables, Properties and etc ...
|
||||
//
|
||||
#property indicator_chart_window
|
||||
|
||||
//
|
||||
// define indicator buffers ...
|
||||
#property indicator_buffers 7
|
||||
#property indicator_plots 7
|
||||
|
||||
//
|
||||
// Fast ...
|
||||
#property indicator_label1 "Fast"
|
||||
#property indicator_type1 DRAW_LINE
|
||||
#property indicator_color1 clrGreen
|
||||
#property indicator_style1 STYLE_DOT
|
||||
#property indicator_width1 1
|
||||
|
||||
//
|
||||
// Slow ...
|
||||
#property indicator_label2 "SLow"
|
||||
#property indicator_type2 DRAW_LINE
|
||||
#property indicator_color2 clrRed
|
||||
#property indicator_style2 STYLE_DOT
|
||||
#property indicator_width2 1
|
||||
|
||||
//
|
||||
// Mid ...
|
||||
#property indicator_label3 "Mid"
|
||||
#property indicator_type3 DRAW_LINE
|
||||
#property indicator_color3 clrBisque
|
||||
#property indicator_style3 STYLE_DASH
|
||||
#property indicator_width3 1
|
||||
|
||||
//
|
||||
// Long SL ...
|
||||
#property indicator_label4 "Long SL"
|
||||
#property indicator_type4 DRAW_LINE
|
||||
#property indicator_color4 clrAqua
|
||||
#property indicator_style4 STYLE_DASH
|
||||
#property indicator_width4 1
|
||||
|
||||
//
|
||||
// Short SL ...
|
||||
#property indicator_label5 "Short SL"
|
||||
#property indicator_type5 DRAW_LINE
|
||||
#property indicator_color5 clrFuchsia
|
||||
#property indicator_style5 STYLE_DASH
|
||||
#property indicator_width5 1
|
||||
|
||||
//
|
||||
// Long Market Fast ...
|
||||
#property indicator_label6 "Long Fast"
|
||||
#property indicator_type6 DRAW_LINE
|
||||
#property indicator_color6 clrAqua
|
||||
#property indicator_style6 STYLE_DOT
|
||||
#property indicator_width6 1
|
||||
//
|
||||
// Long Market Slow ...
|
||||
#property indicator_label7 "Long Market Slow"
|
||||
#property indicator_type7 DRAW_LINE
|
||||
#property indicator_color7 clrFuchsia
|
||||
#property indicator_style7 STYLE_DOT
|
||||
#property indicator_width7 1
|
||||
|
||||
//
|
||||
// Declare Buffers ...
|
||||
#define fastBufferIndex 0
|
||||
#define slowBufferIndex 1
|
||||
#define midBufferIndex 2
|
||||
#define longSLBufferIndex 3
|
||||
#define shortSLBufferIndex 4
|
||||
#define longMarketFastBufferIndex 5
|
||||
#define longMarketSlowBufferIndex 6
|
||||
|
||||
//
|
||||
double fastBuffer[];
|
||||
double slowBuffer[];
|
||||
double midBuffer[];
|
||||
double longSLBuffer[];
|
||||
double shortSLBuffer[];
|
||||
double longMarketFastBuffer[];
|
||||
double longMarketSlowBuffer[];
|
||||
|
||||
//
|
||||
int lastCrossOverIndex = 0;
|
||||
double lastCrossOver = 0.0;
|
||||
|
||||
//
|
||||
int lastCrossUnderIndex = 0;
|
||||
double lastCrossUnder = 0.0;
|
||||
|
||||
//
|
||||
double lastLongSL = 0.0;
|
||||
int lastLongSLIndex = 0;
|
||||
|
||||
//
|
||||
double lastShortSL = 0.0;
|
||||
int lastShortSLIndex = 0;
|
||||
//
|
||||
// END Global Definitions: Variables, Properties and etc ...
|
||||
//
|
||||
|
||||
//
|
||||
// Start Event Handlers ...
|
||||
//
|
||||
//
|
||||
// Initialization ...
|
||||
int OnInit() {
|
||||
//
|
||||
// Initialize what we want ...
|
||||
|
||||
//
|
||||
// Validating Input Parameters ...
|
||||
if (
|
||||
fastShift < 0 ||
|
||||
slowShift < 0 ||
|
||||
marketLength <= 0 ||
|
||||
slowShift < fastShift
|
||||
) {
|
||||
return INIT_PARAMETERS_INCORRECT;
|
||||
}
|
||||
|
||||
//
|
||||
// Fast ...
|
||||
SetIndexBuffer(fastBufferIndex, fastBuffer);
|
||||
|
||||
//
|
||||
// Slow ...
|
||||
SetIndexBuffer(slowBufferIndex, slowBuffer);
|
||||
|
||||
//
|
||||
// Mid ...
|
||||
SetIndexBuffer(midBufferIndex, midBuffer);
|
||||
|
||||
//
|
||||
// Long SL ...
|
||||
SetIndexBuffer(longSLBufferIndex, longSLBuffer);
|
||||
|
||||
//
|
||||
// Short SL ...
|
||||
SetIndexBuffer(shortSLBufferIndex, shortSLBuffer);
|
||||
|
||||
//
|
||||
// Long Market Fast ...
|
||||
SetIndexBuffer(longMarketFastBufferIndex, longMarketFastBuffer);
|
||||
|
||||
//
|
||||
// Long Market Slow ...
|
||||
SetIndexBuffer(longMarketSlowBufferIndex, longMarketSlowBuffer);
|
||||
|
||||
//
|
||||
// initialization done ...
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
|
||||
//
|
||||
// Do Calculation ...
|
||||
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[]
|
||||
) {
|
||||
//
|
||||
// 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, marketLength);
|
||||
|
||||
//
|
||||
// input variable, we return 0 means nothing passed ...
|
||||
if (rates_total < maxLength) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
// found which candles calculated before ...
|
||||
limit = (prev_calculated == 0) ? rates_total - maxLength - 1 : rates_total - prev_calculated + 1;
|
||||
|
||||
//
|
||||
// this is the main loop of calculations, for each bar index ...
|
||||
for (int i = limit - 1; i >= 0; i--) {
|
||||
//
|
||||
// Start Calculation here ...
|
||||
// i is bar_index ...
|
||||
|
||||
//
|
||||
// Calculate Flow ...
|
||||
CalculateFlow(i);
|
||||
}
|
||||
|
||||
//
|
||||
return rates_total;
|
||||
}
|
||||
//
|
||||
// END Event Handlers ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Functions ...
|
||||
//
|
||||
//
|
||||
// Calculate Flow ...
|
||||
void CalculateFlow(
|
||||
const int &bar_index
|
||||
) {
|
||||
//
|
||||
int fastLength = marketLength + fastShift;
|
||||
int slowLength = marketLength + fastShift + slowShift;
|
||||
|
||||
//
|
||||
// Calculating Fast ...
|
||||
double fast = iMA(
|
||||
_Symbol,
|
||||
_Period,
|
||||
fastLength,
|
||||
0,
|
||||
MODE_EMA,
|
||||
PRICE_WEIGHTED,
|
||||
bar_index
|
||||
);
|
||||
fastBuffer[bar_index] = fast;
|
||||
|
||||
//
|
||||
// Calculating Slow ...
|
||||
double slow = iMA(
|
||||
_Symbol,
|
||||
_Period,
|
||||
slowLength,
|
||||
0,
|
||||
MODE_EMA,
|
||||
PRICE_WEIGHTED,
|
||||
bar_index
|
||||
);
|
||||
slowBuffer[bar_index] = slow;
|
||||
|
||||
//
|
||||
// Calculating XMa Mid ...
|
||||
double xmaMid = iMA(
|
||||
_Symbol,
|
||||
_Period,
|
||||
marketLength,
|
||||
0,
|
||||
MODE_EMA,
|
||||
PRICE_HIGH,
|
||||
bar_index
|
||||
);
|
||||
midBuffer[bar_index] = xmaMid;
|
||||
|
||||
//
|
||||
// Calculating XMa Long Market Fast ...
|
||||
double xmaLongMarketFast = iMA(
|
||||
_Symbol,
|
||||
_Period,
|
||||
marketLength * longMarketFastMultiplier,
|
||||
0,
|
||||
MODE_SMA,
|
||||
PRICE_CLOSE,
|
||||
bar_index
|
||||
);
|
||||
longMarketFastBuffer[bar_index] = xmaLongMarketFast;
|
||||
|
||||
//
|
||||
// Calculating XMa Long Market Slow ...
|
||||
double xmaLongMarketSlow = iMA(
|
||||
_Symbol,
|
||||
_Period,
|
||||
marketLength * longMarketSlowMultiplier,
|
||||
0,
|
||||
MODE_SMA,
|
||||
PRICE_CLOSE,
|
||||
bar_index
|
||||
);
|
||||
longMarketSlowBuffer[bar_index] = xmaLongMarketSlow;
|
||||
|
||||
//
|
||||
// Find Cross Points ...
|
||||
//
|
||||
bool isCrossOver = fastBuffer[bar_index] > slowBuffer[bar_index]
|
||||
&& !(
|
||||
fastBuffer[bar_index + 1] > slowBuffer[bar_index + 1]
|
||||
);
|
||||
|
||||
//
|
||||
bool isCrossUnder = fastBuffer[bar_index] < slowBuffer[bar_index]
|
||||
&& !(
|
||||
fastBuffer[bar_index + 1] < slowBuffer[bar_index + 1]
|
||||
);
|
||||
|
||||
//
|
||||
// Find Trending ...
|
||||
//
|
||||
bool isTrendUp = fastBuffer[bar_index] > slowBuffer[bar_index]
|
||||
&& fastBuffer[bar_index] > fastBuffer[bar_index + 1]
|
||||
&& slowBuffer[bar_index] > slowBuffer[bar_index + 1];
|
||||
|
||||
//
|
||||
bool isTrendDown = fastBuffer[bar_index] < slowBuffer[bar_index]
|
||||
&& fastBuffer[bar_index] < fastBuffer[bar_index + 1]
|
||||
&& slowBuffer[bar_index] < slowBuffer[bar_index + 1];
|
||||
|
||||
//
|
||||
// Do Some Calculations ...
|
||||
if (isCrossOver) {
|
||||
//
|
||||
lastCrossOverIndex = bar_index;
|
||||
lastCrossOver = fastBuffer[bar_index];
|
||||
} else if (isCrossUnder) {
|
||||
//
|
||||
lastCrossUnderIndex = bar_index;
|
||||
lastCrossUnder = fastBuffer[bar_index];
|
||||
}
|
||||
|
||||
//
|
||||
// Calculate SLs ...
|
||||
//
|
||||
// Long SL ...
|
||||
if (lastCrossOver > 0) {
|
||||
//
|
||||
lastLongSLIndex = iLowest(
|
||||
_Symbol,
|
||||
_Period,
|
||||
MODE_LOW,
|
||||
marketLength,
|
||||
lastCrossOverIndex
|
||||
);
|
||||
|
||||
//
|
||||
lastLongSL = iLow(
|
||||
_Symbol,
|
||||
_Period,
|
||||
lastLongSLIndex
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Short SL ...
|
||||
if (lastCrossUnder > 0) {
|
||||
//
|
||||
lastShortSLIndex = iHighest(
|
||||
_Symbol,
|
||||
_Period,
|
||||
MODE_HIGH,
|
||||
marketLength,
|
||||
lastCrossUnderIndex
|
||||
);
|
||||
|
||||
//
|
||||
lastShortSL = iHigh(
|
||||
_Symbol,
|
||||
_Period,
|
||||
lastShortSLIndex
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
longSLBuffer[bar_index] = lastLongSL;
|
||||
shortSLBuffer[bar_index] = lastShortSL;
|
||||
}
|
||||
//
|
||||
// END Functions ...
|
||||
//
|
||||
Reference in New Issue
Block a user