164 lines
6.5 KiB
MQL5
164 lines
6.5 KiB
MQL5
#ifndef WARNINGS_MQH
|
|
#define WARNINGS_MQH
|
|
|
|
void ResetWarningFlags()
|
|
{
|
|
MA7_Cross_14_Warning = false;
|
|
MA7_Cross_21_Warning = false;
|
|
MA50_Break_Warning = false;
|
|
Fib_Reject_Warning = false;
|
|
MFIB_Reject_Warning = false;
|
|
Fib_Reclaim_Warning = false;
|
|
MFIB_Reclaim_Warning = false;
|
|
Fib_Break_Warning = false;
|
|
MFIB_Break_Warning = false;
|
|
MA_Reject_Warning = false;
|
|
MA_Reclaim_Warning = false;
|
|
MA_Break_Warning = false;
|
|
Stoch_Extreme_Warning = false;
|
|
Stoch_Reject_Warning = false;
|
|
Stoch_Level_Cross = false;
|
|
MA50_Warning = false;
|
|
MA140_Warning = false;
|
|
MA230_Warning = false;
|
|
MA500_Warning = false;
|
|
Pullback_Warning = false;
|
|
Retracement_Warning = false;
|
|
Band_Snap_Warning = false;
|
|
MA14_Magnet_Active = false;
|
|
Fib_Break_Confirmed = false;
|
|
MFIB_Break_Confirmed = false;
|
|
Strong_MA_Bounce = false;
|
|
Trend_Resumption = false;
|
|
}
|
|
|
|
void AddDirectionalScore(const bool bullish_event)
|
|
{
|
|
int dir = BiasDirection();
|
|
if(dir == 0)
|
|
{
|
|
Active_Warnings++;
|
|
return;
|
|
}
|
|
|
|
if((dir > 0 && bullish_event) || (dir < 0 && !bullish_event))
|
|
Active_Praise_Signals++;
|
|
else
|
|
Active_Warnings++;
|
|
}
|
|
|
|
void DetectWarnings()
|
|
{
|
|
Active_Warnings = 0;
|
|
Active_Praise_Signals = 0;
|
|
ResetWarningFlags();
|
|
|
|
double current = MidPrice();
|
|
double prev = iClose(_Symbol, PERIOD_CURRENT, 1);
|
|
|
|
// Stoch core logic.
|
|
if(Stoch_K_Current <= Stoch_Oversold || Stoch_K_Current >= Stoch_Overbought)
|
|
Stoch_Extreme_Warning = true;
|
|
|
|
bool cross_up = (Stoch_K_Previous <= Stoch_D_Current && Stoch_K_Current > Stoch_D_Current);
|
|
bool cross_dn = (Stoch_K_Previous >= Stoch_D_Current && Stoch_K_Current < Stoch_D_Current);
|
|
if(cross_up || cross_dn)
|
|
Stoch_Level_Cross = true;
|
|
|
|
if((cross_dn && Stoch_K_Current > Stoch_Mid) || (cross_up && Stoch_K_Current < Stoch_Mid))
|
|
Stoch_Reject_Warning = true;
|
|
|
|
if(Stoch_Extreme_Warning) Active_Warnings++;
|
|
|
|
// MA crosses and strong MA touches.
|
|
MA7_Cross_14_Warning = ((MA_Previous[0] > MA_Previous[1] && MA_Current[0] <= MA_Current[1]) ||
|
|
(MA_Previous[0] < MA_Previous[1] && MA_Current[0] >= MA_Current[1]));
|
|
MA7_Cross_21_Warning = ((MA_Previous[0] > MA_Previous[2] && MA_Current[0] <= MA_Current[2]) ||
|
|
(MA_Previous[0] < MA_Previous[2] && MA_Current[0] >= MA_Current[2]));
|
|
MA50_Break_Warning = ((MA_Previous[0] > MA_Previous[3] && MA_Current[0] <= MA_Current[3]) ||
|
|
(MA_Previous[0] < MA_Previous[3] && MA_Current[0] >= MA_Current[3]));
|
|
|
|
double b = MA_Touch_Buffer;
|
|
MA50_Warning = NearLevel(current, MA_Current[3], b);
|
|
MA140_Warning = NearLevel(current, MA_Current[4], b);
|
|
MA230_Warning = NearLevel(current, MA_Current[5], b);
|
|
MA500_Warning = NearLevel(current, MA_Current[6], b);
|
|
|
|
MA_Reject_Warning = (MA50_Warning || MA140_Warning || MA230_Warning || MA500_Warning) && (Stoch_Reject_Warning || Stoch_Level_Cross);
|
|
MA_Reclaim_Warning = MA50_Break_Warning || MA7_Cross_14_Warning;
|
|
MA_Break_Warning = MA7_Cross_21_Warning || MA50_Break_Warning;
|
|
|
|
Pullback_Warning = MA7_Cross_14_Warning || MA_Reject_Warning;
|
|
Retracement_Warning = MA7_Cross_21_Warning || MA50_Break_Warning;
|
|
|
|
if(Current_ATR > 0.0 && MathAbs(current - MA_Current[0]) > Current_ATR * 1.5)
|
|
Band_Snap_Warning = true;
|
|
|
|
// Fib and MFib combos: break/reject/reclaim/break+retest
|
|
for(int i = 1; i <= 5; ++i)
|
|
{
|
|
double lv = PriceLevels[i];
|
|
bool break_up = (prev <= lv && current > lv);
|
|
bool break_dn = (prev >= lv && current < lv);
|
|
bool reject_up = (iLow(_Symbol, PERIOD_CURRENT, 0) <= lv && current > lv);
|
|
bool reject_dn = (iHigh(_Symbol, PERIOD_CURRENT, 0) >= lv && current < lv);
|
|
bool reclaim_up = (prev < lv && current > lv);
|
|
bool reclaim_dn = (prev > lv && current < lv);
|
|
bool retest_up = (prev > lv && NearLevel(iLow(_Symbol, PERIOD_CURRENT, 0), lv, b));
|
|
bool retest_dn = (prev < lv && NearLevel(iHigh(_Symbol, PERIOD_CURRENT, 0), lv, b));
|
|
|
|
if(break_up) { Fib_Break_Warning = true; AddDirectionalScore(true); }
|
|
if(break_dn) { Fib_Break_Warning = true; AddDirectionalScore(false); }
|
|
if(reject_up) { Fib_Reject_Warning = true; AddDirectionalScore(true); }
|
|
if(reject_dn) { Fib_Reject_Warning = true; AddDirectionalScore(false); }
|
|
if(reclaim_up) { Fib_Reclaim_Warning = true; AddDirectionalScore(true); }
|
|
if(reclaim_dn) { Fib_Reclaim_Warning = true; AddDirectionalScore(false); }
|
|
if(retest_up) AddDirectionalScore(true);
|
|
if(retest_dn) AddDirectionalScore(false);
|
|
}
|
|
|
|
double mfib[5] = {MFIB_Level_236, MFIB_Level_382, MFIB_Level_500, MFIB_Level_618, MFIB_Level_786};
|
|
for(int i = 0; i < 5; ++i)
|
|
{
|
|
double lv = mfib[i];
|
|
bool break_up = (prev <= lv && current > lv);
|
|
bool break_dn = (prev >= lv && current < lv);
|
|
bool reject_up = (iLow(_Symbol, PERIOD_CURRENT, 0) <= lv && current > lv);
|
|
bool reject_dn = (iHigh(_Symbol, PERIOD_CURRENT, 0) >= lv && current < lv);
|
|
|
|
if(break_up) { MFIB_Break_Warning = true; MFIB_Break_Confirmed = true; AddDirectionalScore(true); }
|
|
if(break_dn) { MFIB_Break_Warning = true; MFIB_Break_Confirmed = true; AddDirectionalScore(false); }
|
|
if(reject_up) { MFIB_Reject_Warning = true; AddDirectionalScore(true); }
|
|
if(reject_dn) { MFIB_Reject_Warning = true; AddDirectionalScore(false); }
|
|
|
|
if((prev < lv && current > lv) || (prev > lv && current < lv))
|
|
{
|
|
MFIB_Reclaim_Warning = true;
|
|
AddDirectionalScore(current > lv);
|
|
}
|
|
}
|
|
|
|
MA14_Magnet_Active = (Current_ATR > 0.0 && (MathAbs(current - MA_Current[1]) / Current_ATR) < 0.7);
|
|
Strong_MA_Bounce = (MA140_Warning || MA230_Warning || MA500_Warning) && Stoch_Level_Cross;
|
|
Trend_Resumption = (IsBullBias() || IsBearBias()) && !Band_Snap_Warning;
|
|
|
|
Warning_Confluence_Count = 0;
|
|
if(MA7_Cross_14_Warning) Warning_Confluence_Count++;
|
|
if(MA7_Cross_21_Warning) Warning_Confluence_Count++;
|
|
if(MA50_Break_Warning) Warning_Confluence_Count++;
|
|
if(Stoch_Extreme_Warning) Warning_Confluence_Count++;
|
|
if(Stoch_Reject_Warning) Warning_Confluence_Count++;
|
|
if(Stoch_Level_Cross) Warning_Confluence_Count++;
|
|
if(Fib_Reject_Warning) Warning_Confluence_Count++;
|
|
if(MFIB_Reject_Warning) Warning_Confluence_Count++;
|
|
if(MA_Reject_Warning) Warning_Confluence_Count++;
|
|
if(Band_Snap_Warning) Warning_Confluence_Count++;
|
|
|
|
Warning_Confluence_3Plus = (Warning_Confluence_Count >= 3);
|
|
|
|
double spread_points = (SymbolInfoDouble(_Symbol, SYMBOL_ASK) - SymbolInfoDouble(_Symbol, SYMBOL_BID)) / _Point;
|
|
if(spread_points > 30.0)
|
|
Active_Warnings++;
|
|
}
|
|
|
|
#endif
|