Fix all Refactors issues on X121SMC for start Implementing Strategy ...
This commit is contained in:
@@ -0,0 +1,186 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| SMC_Indicator.mq5 |
|
||||
//| Smart Money Concepts Indicator for MT5 |
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
#include "../Libraries/x-saherelm.common.lib.mq5";
|
||||
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 8
|
||||
#property indicator_color1 clrGreen // BOS Up
|
||||
#property indicator_color2 clrRed // BOS Down
|
||||
#property indicator_color3 clrBlue // Order Block
|
||||
#property indicator_color4 clrOrange // FVG
|
||||
#property indicator_color5 clrPurple // Liquidity Zones
|
||||
#property indicator_color6 clrMagenta // Premium/Discount Levels
|
||||
#property indicator_color7 clrYellow // Equal Highs
|
||||
#property indicator_color8 clrCyan // Equal Lows
|
||||
|
||||
// Indicator buffers
|
||||
double BosUpBuffer[];
|
||||
double BosDownBuffer[];
|
||||
double OrderBlockBuffer[];
|
||||
double FvgBuffer[];
|
||||
double LiquidityBuffer[];
|
||||
double PremiumBuffer[];
|
||||
double EqualHighBuffer[];
|
||||
double EqualLowBuffer[];
|
||||
|
||||
// Input parameters for customization
|
||||
input int swingRange = 2; // Range to detect swing highs/lows
|
||||
input int orderBlockLookback = 20; // Bars to look back for order blocks
|
||||
input int fvgDepth = 3; // Depth for fair value gaps
|
||||
input bool enableAlerts = true; // Enable alerts for SMC signals
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Initialization |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
SetIndexBuffer(0, BosUpBuffer, INDICATOR_DATA);
|
||||
SetIndexBuffer(1, BosDownBuffer, INDICATOR_DATA);
|
||||
SetIndexBuffer(2, OrderBlockBuffer, INDICATOR_DATA);
|
||||
SetIndexBuffer(3, FvgBuffer, INDICATOR_DATA);
|
||||
SetIndexBuffer(4, LiquidityBuffer, INDICATOR_DATA);
|
||||
SetIndexBuffer(5, PremiumBuffer, INDICATOR_DATA);
|
||||
SetIndexBuffer(6, EqualHighBuffer, INDICATOR_DATA);
|
||||
SetIndexBuffer(7, EqualLowBuffer, INDICATOR_DATA);
|
||||
|
||||
IndicatorSetString(INDICATOR_SHORTNAME, "Smart Money Concepts Indicator");
|
||||
|
||||
return INIT_SUCCEEDED;
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Swing High and Low Detection |
|
||||
//+------------------------------------------------------------------+
|
||||
bool isSwingHigh(int index)
|
||||
{
|
||||
double high = iHigh(_Symbol, _Period, index);
|
||||
for (int i = 1; i <= swingRange; i++)
|
||||
{
|
||||
if (iHigh(_Symbol, _Period, index + i) >= high || iHigh(_Symbol, _Period, index - i) >= high)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
bool isSwingLow(int index)
|
||||
{
|
||||
double low = iLow(_Symbol, _Period, index);
|
||||
for (int i = 1; i <= swingRange; i++)
|
||||
{
|
||||
if (iLow(_Symbol, _Period, index + i) <= low || iLow(_Symbol, _Period, index - i) <= low)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Detect Order Blocks |
|
||||
//+------------------------------------------------------------------+
|
||||
void detectOrderBlocks(int rates_total)
|
||||
{
|
||||
ArrayInitialize(OrderBlockBuffer, 0);
|
||||
|
||||
for (int i = rates_total - orderBlockLookback - 1; i >= swingRange; i--)
|
||||
{
|
||||
if (isSwingHigh(i))
|
||||
{
|
||||
OrderBlockBuffer[i] = iHigh(_Symbol, _Period, i); // Bullish Order Block
|
||||
}
|
||||
else if (isSwingLow(i))
|
||||
{
|
||||
OrderBlockBuffer[i] = iLow(_Symbol, _Period, i); // Bearish Order Block
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Detect Fair Value Gaps |
|
||||
//+------------------------------------------------------------------+
|
||||
void detectFairValueGaps(int rates_total)
|
||||
{
|
||||
ArrayInitialize(FvgBuffer, 0);
|
||||
|
||||
for (int i = rates_total - fvgDepth - 1; i >= swingRange; i--)
|
||||
{
|
||||
if (iHigh(_Symbol, _Period, i) < iLow(_Symbol, _Period, i - fvgDepth))
|
||||
{
|
||||
FvgBuffer[i] = (iHigh(_Symbol, _Period, i) + iLow(_Symbol, _Period, i - fvgDepth)) / 2.0; // FVG midpoint
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Detect Liquidity Zones |
|
||||
//+------------------------------------------------------------------+
|
||||
void detectLiquidityZones(int rates_total)
|
||||
{
|
||||
//
|
||||
ArrayInitialize(LiquidityBuffer, 0);
|
||||
|
||||
//
|
||||
double points = GetPoints(_Symbol);
|
||||
|
||||
//
|
||||
for (int i = rates_total - swingRange - 1; i >= swingRange; i--)
|
||||
{
|
||||
if (isSwingHigh(i))
|
||||
{
|
||||
LiquidityBuffer[i] = iHigh(_Symbol, _Period, i) + (points * 10); // Above swing high for liquidity pool
|
||||
}
|
||||
else if (isSwingLow(i))
|
||||
{
|
||||
LiquidityBuffer[i] = iLow(_Symbol, _Period, i) - (points * 10); // Below swing low for liquidity pool
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Detect Equal Highs and Lows |
|
||||
//+------------------------------------------------------------------+
|
||||
void detectEqualHighsLows(int rates_total)
|
||||
{
|
||||
ArrayInitialize(EqualHighBuffer, 0);
|
||||
ArrayInitialize(EqualLowBuffer, 0);
|
||||
|
||||
for (int i = rates_total - swingRange - 1; i >= swingRange; i--)
|
||||
{
|
||||
if (isSwingHigh(i) && iHigh(_Symbol, _Period, i) == iHigh(_Symbol, _Period, i + swingRange))
|
||||
{
|
||||
EqualHighBuffer[i] = iHigh(_Symbol, _Period, i);
|
||||
}
|
||||
else if (isSwingLow(i) && iLow(_Symbol, _Period, i) == iLow(_Symbol, _Period, i + swingRange))
|
||||
{
|
||||
EqualLowBuffer[i] = iLow(_Symbol, _Period, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Main Calculation Loop |
|
||||
//+------------------------------------------------------------------+
|
||||
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[])
|
||||
{
|
||||
|
||||
detectOrderBlocks(rates_total);
|
||||
detectFairValueGaps(rates_total);
|
||||
detectLiquidityZones(rates_total);
|
||||
detectEqualHighsLows(rates_total);
|
||||
|
||||
return rates_total;
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
Reference in New Issue
Block a user