testrepo/copus5.mqh

2497 lines
92 KiB
MQL5
Raw Permalink Normal View History

2026-01-20 06:18:46 +00:00
//+------------------------------------------------------------------+
//| QuarterTheory_VIZION_FINAL_v5.8.mq5 |
//| PRAISE SYSTEM: 8 Trend Signals for Aggressive Continuation |
//| WARN vs PRAISE: Dynamic position sizing and setup priority |
//| War Survivor: 2.5x size + 25% MFIB partials | All 18 Active |
//+------------------------------------------------------------------+
#property copyright "QuarterTheory x VIZION"
#property version "5.80"
#property strict
#include <Trade/Trade.mqh>
CTrade Trade;
//================ INPUT PARAMETERS ==================//
input group "=== CORE SETTINGS ==="
input int MagicNumber = 456789;
input double Risk_Per_Trade = 1.2;
input int Max_Trades_Per_Setup = 10;
input int Max_Total_Trades = 100;
input int Min_Runners_To_Keep = 4;
input group "=== MARKET MODE SYSTEM ==="
input bool Use_Market_Mode_Filter = true;
input int Mode_Confirmation_Bars = 2;
input double Chop_ATR_Threshold = 0.5;
input double Range_Price_Threshold = 0.3;
input group "=== REVERSAL CONFIRMATION ==="
input bool Only_Close_On_Full_Reversal = true;
input int Reversal_Confirmation_Bars = 3;
input group "=== MA SYSTEM ==="
input int MA_1 = 7;
input int MA_2 = 14;
input int MA_3 = 21;
input int MA_4 = 50;
input int MA_5 = 140;
input int MA_6 = 230;
input int MA_7 = 500;
input int MA_8 = 1000;
input int MA_9 = 1100;
input int MA_10 = 1300;
input int MA_Touch_Buffer = 100;
input group "=== STOCHASTIC ==="
input int Stoch_K_Period = 5;
input int Stoch_D_Period = 3;
input int Stoch_Slowing = 3;
input double Stoch_Extreme_High = 85.0; // Extreme overbought
input double Stoch_Extreme_Low = 15.0; // Extreme oversold
input double Stoch_High = 70.0;
input double Stoch_Low = 30.0;
// STOCHASTIC KEY LEVELS for Pullback Detection
// OS (Oversold) Levels: <20, 20, 35, 50
// OB (Overbought) Levels: 50, 65, 80, >80
// K x D (or D x K) at ANY of these levels = pullback signal
double Stoch_Levels[7] = {20.0, 35.0, 50.0, 65.0, 80.0}; // Key pivot levels
input group "=== MOVING FIBONACCI (ATH/ATL) ==="
input int MFIB_Lookback = 500; // Moving fib from ATH/ATL over this period
input bool Use_MFIB_382_Bias = true; // Price > .382 = bull bias, < .382 = bear bias
input group "=== FIBONACCI ==="
input int Lookback_Bars = 200;
input bool Show_Levels = true;
input group "=== CONTINUATION TRADE SETTINGS ==="
input int Continuation_SL_Points = 150;
input int Continuation_BreakEven_Points = 300;
input int Continuation_Trail_Points = 300;
input int Continuation_TP_Points = 4000;
input int Continuation_Partial_TP = 900;
input double Continuation_Partial_Percent = 33.0;
input group "=== COUNTER-TREND TRADE SETTINGS (Pullback/Retracement/Range/Chop) ==="
input int Counter_SL_Points = 50; // Tight SL
input int Counter_BreakEven_Points = 25; // Fast BE
input int Counter_Trail_Points = 150; // Trail by 150
input int Counter_TP_Points = 3000; // Open TP for trend expansion
input int Counter_Partial_TP = 100; // First partial
input double Counter_Partial_Percent = 50.0; // Close 50% early
input group "=== WAR SURVIVOR: AGGRESSIVE MFIB PARTIAL SYSTEM ==="
input bool Use_MFIB_Partials = true; // Take 25% at each MFIB reject
input double MFIB_Partial_Percent = 25.0; // 25% per MFIB level
input int MFIB_Partial_Min_Profit = 30; // Min profit to take MFIB partial (points)
input double War_Survivor_Lot_Multiplier = 2.5; // Multiply lot size for more survivors
input group "=== PRAISE SYSTEM: Aggressive Trend Following ==="
input bool Use_Praise_System = true; // Enable PRAISE signals
input double Praise_Size_Multiplier_Strong = 1.5; // 3 praise signals
input double Praise_Size_Multiplier_Supreme = 2.0; // 4+ praise signals
input int Praise_Tight_Trail = 100; // Tighter trail for supreme praise
input bool Pause_Counter_On_Praise = true; // Disable counter when P >= 3
input bool Reduce_Continuation_On_Warn = true; // 50% size continuation when W >= 3
input bool Max_Aggression_Mode = true; // Take EVERY valid setup (no hesitation)
input group "=== BAND SNAP DETECTION ==="
input double Band_Snap_ATR_Multiplier = 2.0;
input group "=== RE-ENTRY SETTINGS ==="
input bool Allow_Re_Entry = true;
input int Re_Entry_Cooldown_Bars = 5;
//================ ENUMS ==================//
enum MODE_FAMILY
{
FAMILY_TRENDING = 0,
FAMILY_RANGING = 1,
FAMILY_CHOP = 2,
FAMILY_TRANSITIONAL = 3
};
enum TREND_BIAS
{
BIAS_NEUTRAL = 0,
BIAS_BULL = 1,
BIAS_BEAR = -1
};
enum TREND_STRENGTH
{
STRENGTH_WEAK = 0,
STRENGTH_CONFIRMED = 1,
STRENGTH_STRONG = 2
};
enum PRICE_STATE
{
STATE_CONTINUATION = 0,
STATE_PULLBACK = 1,
STATE_DEEP_RETRACEMENT = 2,
STATE_REVERSAL_ATTEMPT = 3,
STATE_REVERSAL_CONFIRMED = 4,
STATE_RANGE_MID_DRIFT = 10,
STATE_RANGE_EDGE_TEST = 11,
STATE_RANGE_REJECTION = 12,
STATE_RANGE_BREAK_ATTEMPT = 13,
STATE_RANGE_BREAK_CONFIRMED = 14,
STATE_CHOP_NOISE = 20,
STATE_CHOP_VOL_SPIKE = 21,
STATE_CHOP_SQUEEZE = 22,
STATE_CHOP_FAKEOUT_LOOP = 23,
STATE_UNKNOWN = 99
};
enum SETUP_TYPE
{
SETUP_MA14_CROSS = 1,
SETUP_MA50_BOUNCE = 2,
SETUP_MA140_BOUNCE = 3,
SETUP_MA230_BOUNCE = 4,
SETUP_MA500_TOUCH = 5,
SETUP_FIB_BREAK = 6,
SETUP_FIB_RECLAIM = 7,
SETUP_FIB_REJECT = 8,
SETUP_MAGNET_WALK = 9,
SETUP_STAIRCASE_ADV = 10,
SETUP_CTRL_PULLBACK = 11,
SETUP_TF_RESET = 12,
SETUP_MFIB_LADDER = 13,
SETUP_MFIB_PRESS = 14,
SETUP_MEAN_REV = 15,
SETUP_RANGE_ENGINE = 16,
SETUP_PULLBACK_COUNTER = 17,
SETUP_RETRACEMENT_COUNTER = 18
};
enum TRADE_CATEGORY
{
CATEGORY_CONTINUATION = 0,
CATEGORY_COUNTER_TREND = 1
};
//================ GLOBALS ==================//
int Stoch_Handle, ATR_Handle, ADX_Handle;
double Stoch_K_Current = 0, Stoch_K_Previous = 0, Stoch_K_Prev2 = 0;
double Stoch_D_Current = 0;
double Current_ATR = 0;
double Current_ADX = 0;
double PriceLevels[7];
int MA_Handles[10];
double MA_Current[10];
double MA_Previous[10];
double MA_Prev2[10];
// Moving MFIB from ATH to ATL
double MFIB_High, MFIB_Low;
double MFIB_Level_236, MFIB_Level_382, MFIB_Level_050;
double MFIB_Level_618, MFIB_Level_786;
// MFIB .382 Bias
TREND_BIAS MFIB_Bias = BIAS_NEUTRAL;
MODE_FAMILY Current_Family = FAMILY_TRANSITIONAL;
TREND_BIAS Current_Bias = BIAS_NEUTRAL;
TREND_STRENGTH Current_Strength = STRENGTH_WEAK;
PRICE_STATE Current_State = STATE_UNKNOWN;
MODE_FAMILY Prev_Family = FAMILY_TRANSITIONAL;
TREND_BIAS Prev_Bias = BIAS_NEUTRAL;
TREND_STRENGTH Prev_Strength = STRENGTH_WEAK;
int Mode_Confirmation_Count = 0;
int Reversal_Confirm_Counter = 0;
bool MA7_Cross_14_Warning = false;
bool MA7_Cross_21_Warning = false;
bool MA50_Break_Warning = false;
bool Fib_Reject_Warning = false;
bool MFIB_Reject_Warning = false;
bool Fib_Reclaim_Warning = false; // NEW: Fib reclaim signal
bool MFIB_Reclaim_Warning = false; // NEW: MFIB reclaim signal
bool Fib_Break_Warning = false; // NEW: Fib break signal
bool MFIB_Break_Warning = false; // NEW: MFIB break signal
bool MA_Reject_Warning = false;
bool MA_Reclaim_Warning = false; // NEW: MA reclaim signal
bool MA_Break_Warning = false; // NEW: MA break signal
bool Stoch_Extreme_Warning = false;
bool Stoch_Reject_Warning = false;
bool Stoch_Level_Cross = false; // NEW: K x D at key level
// Strong MA warnings (140, 230, 500, 50)
bool MA50_Warning = false;
bool MA140_Warning = false;
bool MA230_Warning = false;
bool MA500_Warning = false;
bool Pullback_Warning = false;
bool Retracement_Warning = false;
bool Band_Snap_Warning = false;
bool Is_Pullback_State = false;
bool Is_Retracement_State = false;
// NEW: Re-entry combo flags
bool MA14_Magnet_Active = false; // Price hugging MA14
bool Fib_Break_Confirmed = false; // Clean fib break
bool MFIB_Break_Confirmed = false; // Clean MFIB break
bool Strong_MA_Bounce = false; // Bounce off 140/230/500
bool Trend_Resumption = false; // Post-pullback trend resume
// PRAISE SYSTEM: 8 Trend Strength Signals (NO stochastic)
bool Praise_Triple_Magnet = false; // 7x14x21 all tight
bool Praise_Power_Couple = false; // 14x21 very close
bool Praise_MFIB_Staircase = false; // Sequential MFIB advance
bool Praise_MFIB_Express = false; // Skips MFIB level
bool Praise_MFIB_Breakout = false; // MFIB break + hold
bool Praise_MA_Stack = false; // Perfect MA stack
bool Praise_Clean_Reclaim = false; // MFIB+MA+Fib reclaim together
bool Praise_Multi_Breakout = false; // Everything breaking at once
int Praise_Count = 0; // Total praise signals
int Warning_Confluence_Count = 0;
bool Warning_Confluence_3Plus = false;
struct PositionRec
{
ulong ticket;
double entry;
double original_lot;
bool is_buy;
bool partial_tp_hit;
bool be_set;
bool trailing_active;
bool is_runner;
SETUP_TYPE setup_type;
TRADE_CATEGORY category;
string setup_name;
MODE_FAMILY entry_family;
TREND_BIAS entry_bias;
TREND_STRENGTH entry_strength;
double distance_from_current;
datetime last_close_time;
bool closed_at_sl; // NEW: Track if closed at SL
bool closed_at_be; // NEW: Track if closed at BE
double close_price; // NEW: Track close price for re-entry reference
// WAR SURVIVOR: MFIB partial tracking
int mfib_partials_taken; // Count of MFIB partials taken (0-4 possible)
double last_mfib_partial_price; // Last price where MFIB partial was taken
};
PositionRec OpenPositions[];
// NEW: Track recently closed positions for re-entry opportunities
struct ClosedPositionRec
{
SETUP_TYPE setup_type;
TRADE_CATEGORY category;
bool was_buy;
double close_price;
datetime close_time;
bool closed_at_sl;
bool closed_at_be;
};
ClosedPositionRec RecentClosures[10]; // Track last 10 closures
int ClosureIndex = 0;
int TodayTrades = 0;
int BuyTrades = 0;
int SellTrades = 0;
int ClosedByReversal = 0;
int SetupCount[19];
datetime LastEntryTime[19];
//================ HELPERS ==================//
double MidPrice()
{
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
return (bid + ask) / 2.0;
}
bool NearLevel(const double price, const double level, const double tolPoints)
{
return (MathAbs(price - level) <= tolPoints * _Point);
}
bool StochCrossUp()
{
return (Stoch_K_Previous < Stoch_D_Current && Stoch_K_Current >= Stoch_D_Current);
}
bool StochCrossDown()
{
return (Stoch_K_Previous > Stoch_D_Current && Stoch_K_Current <= Stoch_D_Current);
}
bool IsBullBias() { return (Current_Bias == BIAS_BULL); }
bool IsBearBias() { return (Current_Bias == BIAS_BEAR); }
bool Bull_MA50_Reclaimed()
{
bool reclaimed = (MA_Previous[0] <= MA_Previous[3]) && (MA_Current[0] > MA_Current[3]);
double low0 = iLow(_Symbol, PERIOD_CURRENT, 0);
double close0 = iClose(_Symbol, PERIOD_CURRENT, 0);
bool rejected = (low0 <= MA_Current[3] && close0 > MA_Current[3] && (StochCrossUp() || Stoch_K_Current > 50));
return (reclaimed || rejected);
}
bool Bear_MA50_Reclaimed()
{
bool reclaimed = (MA_Previous[0] >= MA_Previous[3]) && (MA_Current[0] < MA_Current[3]);
double high0 = iHigh(_Symbol, PERIOD_CURRENT, 0);
double close0 = iClose(_Symbol, PERIOD_CURRENT, 0);
bool rejected = (high0 >= MA_Current[3] && close0 < MA_Current[3] && (StochCrossDown() || Stoch_K_Current < 50));
return (reclaimed || rejected);
}
// Track position closure for re-entry opportunities
void RecordClosure(SETUP_TYPE setup, TRADE_CATEGORY cat, bool was_buy, double close_price, bool at_sl, bool at_be)
{
RecentClosures[ClosureIndex].setup_type = setup;
RecentClosures[ClosureIndex].category = cat;
RecentClosures[ClosureIndex].was_buy = was_buy;
RecentClosures[ClosureIndex].close_price = close_price;
RecentClosures[ClosureIndex].close_time = TimeCurrent();
RecentClosures[ClosureIndex].closed_at_sl = at_sl;
RecentClosures[ClosureIndex].closed_at_be = at_be;
ClosureIndex = (ClosureIndex + 1) % 10; // Circular buffer
}
// Check if recently closed at SL or BE (within last 10 bars)
bool RecentlyStopped(SETUP_TYPE setup)
{
datetime now = TimeCurrent();
datetime cutoff = now - 10 * PeriodSeconds(PERIOD_CURRENT);
for(int i=0; i<10; i++)
{
if(RecentClosures[i].setup_type == setup &&
RecentClosures[i].close_time > cutoff &&
(RecentClosures[i].closed_at_sl || RecentClosures[i].closed_at_be))
{
return true;
}
}
return false;
}
//+------------------------------------------------------------------+
// COMPREHENSIVE RE-ENTRY SYSTEM
//+------------------------------------------------------------------+
bool CanReEnter(SETUP_TYPE setup)
{
if(!Allow_Re_Entry) return true;
datetime now = TimeCurrent();
datetime cooldown_end = LastEntryTime[setup] + Re_Entry_Cooldown_Bars * PeriodSeconds(PERIOD_CURRENT);
bool cooldown_passed = (now >= cooldown_end);
// Check if recently stopped out
bool recently_stopped = RecentlyStopped(setup);
//================================================================
// RE-ENTRY COMBO TRIGGERS (Override cooldown)
//================================================================
// COMBO 1: 3+ Rejection/Reclaim at Strong MAs (140, 230, 500+)
int reject_reclaim_count = 0;
if(Fib_Reject_Warning) reject_reclaim_count++;
if(MFIB_Reject_Warning) reject_reclaim_count++;
if(MA_Reject_Warning) reject_reclaim_count++;
if(Fib_Reclaim_Warning) reject_reclaim_count++;
if(MFIB_Reclaim_Warning) reject_reclaim_count++;
if(MA_Reclaim_Warning) reject_reclaim_count++;
bool at_strong_ma = (MA140_Warning || MA230_Warning || MA500_Warning);
bool combo1_strong_ma_confluence = (reject_reclaim_count >= 3 && at_strong_ma);
// COMBO 2: MA14 Magnet + Fib/MFIB Break (Trending)
bool combo2_ma14_magnet_break = (MA14_Magnet_Active && (Fib_Break_Confirmed || MFIB_Break_Confirmed));
// COMBO 3: Strong MA Bounce + Stoch Confirmation (Post-SL/BE)
bool combo3_strong_bounce = (Strong_MA_Bounce && recently_stopped &&
(Stoch_Level_Cross || StochCrossUp() || StochCrossDown()));
// COMBO 4: Trend Resumption after Pullback (MA50 reclaim + 2+ signals)
bool combo4_trend_resume = (Trend_Resumption && Warning_Confluence_Count >= 2);
// COMBO 5: Fib/MFIB Reclaim + MA Alignment (Post-BE)
bool mas_aligned_bull = (MA_Current[0] > MA_Current[1]) && (MA_Current[1] > MA_Current[2]);
bool mas_aligned_bear = (MA_Current[0] < MA_Current[1]) && (MA_Current[1] < MA_Current[2]);
bool combo5_level_reclaim = ((Fib_Reclaim_Warning || MFIB_Reclaim_Warning) &&
recently_stopped && (mas_aligned_bull || mas_aligned_bear));
// COMBO 6: Band Snap Recovery + Strong MA (Overextension correction)
bool combo6_snap_recovery = (Band_Snap_Warning && at_strong_ma && recently_stopped);
// COMBO 7: Multiple Level Confluence (Fib + MFIB + MA all align)
bool fib_and_mfib = (Fib_Reject_Warning || Fib_Reclaim_Warning) &&
(MFIB_Reject_Warning || MFIB_Reclaim_Warning);
bool combo7_triple_level = (fib_and_mfib && (MA_Reject_Warning || MA_Reclaim_Warning));
// COMBO 8: Stoch Extreme + Fib/MFIB Level + Post-SL
bool combo8_extreme_level = (Stoch_Extreme_Warning && recently_stopped &&
(Fib_Reject_Warning || MFIB_Reject_Warning));
// COMBO 9: MA Cross + Level Break + Continuation State
bool combo9_cross_break = (MA7_Cross_14_Warning && (Fib_Break_Confirmed || MFIB_Break_Confirmed) &&
Current_State == STATE_CONTINUATION);
// COMBO 10: 4+ Warning Confluence (Extreme conviction)
bool combo10_mega_confluence = (Warning_Confluence_Count >= 4);
//================================================================
// DECISION LOGIC
//================================================================
// If ANY combo triggers, allow immediate re-entry
bool combo_triggered =
combo1_strong_ma_confluence ||
combo2_ma14_magnet_break ||
combo3_strong_bounce ||
combo4_trend_resume ||
combo5_level_reclaim ||
combo6_snap_recovery ||
combo7_triple_level ||
combo8_extreme_level ||
combo9_cross_break ||
combo10_mega_confluence;
// Log re-entry combo if triggered
if(combo_triggered && !cooldown_passed)
{
string combo_name = "";
if(combo1_strong_ma_confluence) combo_name = "3+Reject/Reclaim@StrongMA";
else if(combo2_ma14_magnet_break) combo_name = "MA14Magnet+FibBreak";
else if(combo3_strong_bounce) combo_name = "StrongMA_Bounce+Stoch";
else if(combo4_trend_resume) combo_name = "TrendResumption";
else if(combo5_level_reclaim) combo_name = "Level_Reclaim+MA_Align";
else if(combo6_snap_recovery) combo_name = "BandSnap_Recovery";
else if(combo7_triple_level) combo_name = "Triple_Level_Confluence";
else if(combo8_extreme_level) combo_name = "Stoch_Extreme+Level";
else if(combo9_cross_break) combo_name = "MA_Cross+Level_Break";
else if(combo10_mega_confluence) combo_name = "4+_Confluence";
Print("🔁 RE-ENTRY COMBO TRIGGERED: ", combo_name);
}
return (cooldown_passed || combo_triggered);
}
//+------------------------------------------------------------------+
int OnInit()
{
Print("========================================");
Print("QuarterTheory_VIZION_FINAL v5.7");
Print("⚔️ WAR SURVIVOR SYSTEM:");
Print(" - Aggressive MFIB Partials: 25% at each reject");
Print(" - Larger Initial Size: ", DoubleToString(War_Survivor_Lot_Multiplier, 1), "x multiplier");
Print(" - Max 4 MFIB partials per trade");
Print(" - Survive frequent trailing stops");
Print("SMART RE-ENTRY:");
Print(" - 10 combo triggers for post-SL/BE re-entry");
Print(" - 3+ Reject/Reclaim at MA140/230/500");
Print("ALL 18 SETUPS ACTIVE:");
Print(" - 14 Continuation (150 SL, 4000 TP)");
Print(" - 4 Counter-Trend (50 SL, 3000 TP)");
Print("TRAILING SL:");
Print(" - Counter: 150pts behind price");
Print(" - Continuation: 300pts behind price");
Print("========================================");
Trade.SetExpertMagicNumber(MagicNumber);
Trade.SetDeviationInPoints(50);
Trade.SetTypeFilling(ORDER_FILLING_FOK);
Stoch_Handle = iStochastic(_Symbol, PERIOD_CURRENT, Stoch_K_Period, Stoch_D_Period,
Stoch_Slowing, MODE_SMA, STO_LOWHIGH);
ATR_Handle = iATR(_Symbol, PERIOD_CURRENT, 14);
ADX_Handle = iADX(_Symbol, PERIOD_CURRENT, 14);
int periods[10] = {MA_1, MA_2, MA_3, MA_4, MA_5, MA_6, MA_7, MA_8, MA_9, MA_10};
for(int i=0; i<10; i++)
MA_Handles[i] = iMA(_Symbol, PERIOD_CURRENT, periods[i], 0, MODE_EMA, PRICE_CLOSE);
ArrayInitialize(SetupCount, 0);
ArrayInitialize(LastEntryTime, 0);
CalculateLevels();
if(Show_Levels) DrawLevels();
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
for(int i=0; i<10; i++)
if(MA_Handles[i] != INVALID_HANDLE)
IndicatorRelease(MA_Handles[i]);
if(Stoch_Handle != INVALID_HANDLE) IndicatorRelease(Stoch_Handle);
if(ATR_Handle != INVALID_HANDLE) IndicatorRelease(ATR_Handle);
if(ADX_Handle != INVALID_HANDLE) IndicatorRelease(ADX_Handle);
ObjectsDeleteAll(0, "Level_");
ObjectsDeleteAll(0, "MFIB_");
ObjectsDeleteAll(0, "ModeLabel");
ObjectsDeleteAll(0, "StateLabel");
ObjectsDeleteAll(0, "WarningLabel");
ObjectsDeleteAll(0, "MFIBLabel");
Print("Final: B:", BuyTrades, " | S:", SellTrades, " | Reversed:", ClosedByReversal);
}
//+------------------------------------------------------------------+
void CalculateLevels()
{
// Static Fibonacci levels for reference
double high = iHigh(_Symbol, PERIOD_CURRENT, 0);
double low = iLow(_Symbol, PERIOD_CURRENT, 0);
for(int i=1; i<=Lookback_Bars; i++)
{
double h = iHigh(_Symbol, PERIOD_CURRENT, i);
double l = iLow(_Symbol, PERIOD_CURRENT, i);
if(h > high) high = h;
if(l < low) low = l;
}
double range = high - low;
PriceLevels[0] = low;
PriceLevels[1] = low + range * 0.236;
PriceLevels[2] = low + range * 0.382;
PriceLevels[3] = low + range * 0.5;
PriceLevels[4] = low + range * 0.618;
PriceLevels[5] = low + range * 0.786;
PriceLevels[6] = high;
// MOVING FIBONACCI - From ATH to ATL (stacked from top)
double ath = iHigh(_Symbol, PERIOD_CURRENT, 0);
double atl = iLow(_Symbol, PERIOD_CURRENT, 0);
for(int i=1; i<=MFIB_Lookback; i++)
{
double h = iHigh(_Symbol, PERIOD_CURRENT, i);
double l = iLow(_Symbol, PERIOD_CURRENT, i);
if(h > ath) ath = h;
if(l < atl) atl = l;
}
MFIB_High = ath;
MFIB_Low = atl;
double mfib_range = ath - atl;
// Levels stacked from ATH down to ATL
MFIB_Level_236 = ath - (mfib_range * 0.236); // 23.6% down from ATH
MFIB_Level_382 = ath - (mfib_range * 0.382); // 38.2% down from ATH *** KEY BIAS LEVEL ***
MFIB_Level_050 = ath - (mfib_range * 0.500); // 50% down from ATH
MFIB_Level_618 = ath - (mfib_range * 0.618); // 61.8% down from ATH *** KEY LEVEL ***
MFIB_Level_786 = ath - (mfib_range * 0.786); // 78.6% down from ATH
// MFIB .382 Bias Logic
if(Use_MFIB_382_Bias)
{
double current = MidPrice();
if(current > MFIB_Level_382)
MFIB_Bias = BIAS_BULL; // Above .382 = bullish bias
else if(current < MFIB_Level_382)
MFIB_Bias = BIAS_BEAR; // Below .382 = bearish bias
else
MFIB_Bias = BIAS_NEUTRAL;
}
else
{
MFIB_Bias = BIAS_NEUTRAL;
}
}
void DrawLevels()
{
ObjectsDeleteAll(0, "Level_");
ObjectsDeleteAll(0, "MFIB_");
color level_colors[7] = {clrRed, clrOrange, clrYellow, clrLime, clrCyan, clrBlue, clrMagenta};
// Draw static fib levels
for(int i=0; i<7; i++)
{
string name = "Level_" + IntegerToString(i);
ObjectCreate(0, name, OBJ_HLINE, 0, 0, PriceLevels[i]);
ObjectSetInteger(0, name, OBJPROP_COLOR, level_colors[i]);
ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_DOT);
ObjectSetInteger(0, name, OBJPROP_WIDTH, 1);
}
// Draw MFIB levels (more prominent)
string mfib_name = "MFIB_382";
ObjectCreate(0, mfib_name, OBJ_HLINE, 0, 0, MFIB_Level_382);
ObjectSetInteger(0, mfib_name, OBJPROP_COLOR, clrYellow);
ObjectSetInteger(0, mfib_name, OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(0, mfib_name, OBJPROP_WIDTH, 2);
mfib_name = "MFIB_618";
ObjectCreate(0, mfib_name, OBJ_HLINE, 0, 0, MFIB_Level_618);
ObjectSetInteger(0, mfib_name, OBJPROP_COLOR, clrCyan);
ObjectSetInteger(0, mfib_name, OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(0, mfib_name, OBJPROP_WIDTH, 2);
mfib_name = "MFIB_050";
ObjectCreate(0, mfib_name, OBJ_HLINE, 0, 0, MFIB_Level_050);
ObjectSetInteger(0, mfib_name, OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, mfib_name, OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(0, mfib_name, OBJPROP_WIDTH, 1);
}
//+------------------------------------------------------------------+
void UpdateIndicators()
{
for(int i=0; i<10; i++)
{
double curr[1], prev[1], prev2[1];
if(CopyBuffer(MA_Handles[i], 0, 0, 1, curr) > 0) MA_Current[i] = curr[0];
if(CopyBuffer(MA_Handles[i], 0, 1, 1, prev) > 0) MA_Previous[i] = prev[0];
if(CopyBuffer(MA_Handles[i], 0, 2, 1, prev2) > 0) MA_Prev2[i] = prev2[0];
}
double k_curr[1], k_prev[1], k_prev2[1], d_curr[1];
if(CopyBuffer(Stoch_Handle, MAIN_LINE, 0, 1, k_curr) > 0) Stoch_K_Current = k_curr[0];
if(CopyBuffer(Stoch_Handle, MAIN_LINE, 1, 1, k_prev) > 0) Stoch_K_Previous = k_prev[0];
if(CopyBuffer(Stoch_Handle, MAIN_LINE, 2, 1, k_prev2) > 0) Stoch_K_Prev2 = k_prev2[0];
if(CopyBuffer(Stoch_Handle, SIGNAL_LINE, 0, 1, d_curr) > 0) Stoch_D_Current = d_curr[0];
double atr[1], adx[1];
if(CopyBuffer(ATR_Handle, 0, 0, 1, atr) > 0) Current_ATR = atr[0];
if(CopyBuffer(ADX_Handle, 0, 0, 1, adx) > 0) Current_ADX = adx[0];
}
//+------------------------------------------------------------------+
void DetectWarnings()
{
double current = MidPrice();
double bufferPts = (double)MA_Touch_Buffer;
double prev = iClose(_Symbol, PERIOD_CURRENT, 1);
// MFIB levels array for use throughout function
double mfib_levels[5] = {MFIB_Level_236, MFIB_Level_382, MFIB_Level_050, MFIB_Level_618, MFIB_Level_786};
// Reset all warnings
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;
//================================================================
// 1) STOCHASTIC ANALYSIS
//================================================================
// A) Extreme levels
if(Stoch_K_Current <= Stoch_Extreme_Low || Stoch_K_Current >= Stoch_Extreme_High)
Stoch_Extreme_Warning = true;
// B) Cross at key levels (20, 35, 50, 65, 80)
bool k_crossed_d = false;
bool near_key_level = false;
// Check if K crossed D (either direction)
if((Stoch_K_Previous < Stoch_D_Current && Stoch_K_Current >= Stoch_D_Current) ||
(Stoch_K_Previous > Stoch_D_Current && Stoch_K_Current <= Stoch_D_Current))
{
k_crossed_d = true;
}
// Check if current stoch is near any key level
for(int i=0; i<5; i++)
{
if(MathAbs(Stoch_K_Current - Stoch_Levels[i]) <= 5.0)
{
near_key_level = true;
break;
}
}
if(k_crossed_d && near_key_level)
Stoch_Level_Cross = true;
// C) Reject patterns (cross at meaningful bands)
bool stoch_reject_down = (StochCrossDown() && Stoch_K_Current > 50);
bool stoch_reject_up = (StochCrossUp() && Stoch_K_Current < 50);
if(stoch_reject_down || stoch_reject_up || Stoch_Level_Cross)
Stoch_Reject_Warning = true;
//================================================================
// 2) MA CROSS ANALYSIS
//================================================================
// MA7 x MA14 cross (pullback signal)
bool ma7_crossed_14_down = (MA_Previous[0] > MA_Previous[1]) && (MA_Current[0] <= MA_Current[1]);
bool ma7_crossed_14_up = (MA_Previous[0] < MA_Previous[1]) && (MA_Current[0] >= MA_Current[1]);
if(ma7_crossed_14_down || ma7_crossed_14_up)
{
MA7_Cross_14_Warning = true;
Pullback_Warning = true;
}
// MA7 x MA21 cross (retracement signal)
bool ma7_crossed_21_down = (MA_Previous[0] > MA_Previous[2]) && (MA_Current[0] <= MA_Current[2]);
bool ma7_crossed_21_up = (MA_Previous[0] < MA_Previous[2]) && (MA_Current[0] >= MA_Current[2]);
if(ma7_crossed_21_down || ma7_crossed_21_up)
{
MA7_Cross_21_Warning = true;
Retracement_Warning = true;
}
// MA50 break (reversal warning)
bool ma7_broke_50_down = (MA_Previous[0] > MA_Previous[3]) && (MA_Current[0] <= MA_Current[3]);
bool ma7_broke_50_up = (MA_Previous[0] < MA_Previous[3]) && (MA_Current[0] >= MA_Current[3]);
if(ma7_broke_50_down || ma7_broke_50_up)
MA50_Break_Warning = true;
//================================================================
// 3) BAND SNAP
//================================================================
if(Current_ATR > 0.0)
{
double distance = MathAbs(current - MA_Current[0]);
double band_threshold = Current_ATR * Band_Snap_ATR_Multiplier;
if(distance >= band_threshold)
Band_Snap_Warning = true;
}
//================================================================
// 5) FIBONACCI LEVEL ANALYSIS (Reject, Reclaim, Break)
//================================================================
bool at_fib = false;
int fib_level_idx = -1;
for(int i=1; i<6; i++)
{
if(NearLevel(current, PriceLevels[i], bufferPts))
{
at_fib = true;
fib_level_idx = i;
break;
}
}
if(at_fib)
{
double fib_level = PriceLevels[fib_level_idx];
// REJECT: Price hits level + stoch reject/extreme
if(Stoch_Extreme_Warning || Stoch_Reject_Warning || Stoch_Level_Cross)
Fib_Reject_Warning = true;
// RECLAIM: Price crosses back above/below level
if((prev < fib_level && current > fib_level) || (prev > fib_level && current < fib_level))
Fib_Reclaim_Warning = true;
// BREAK: Price decisively breaks through
if(MathAbs(current - fib_level) > bufferPts * 1.5)
Fib_Break_Warning = true;
}
//================================================================
// 6) MFIB LEVEL ANALYSIS (Reject, Reclaim, Break)
//================================================================
bool at_mfib = false;
double mfib_level = 0;
for(int i=0; i<5; i++)
{
if(NearLevel(current, mfib_levels[i], bufferPts))
{
at_mfib = true;
mfib_level = mfib_levels[i];
break;
}
}
if(at_mfib)
{
// REJECT: Price hits MFIB + stoch signal
if(Stoch_Extreme_Warning || Stoch_Reject_Warning || Stoch_Level_Cross)
MFIB_Reject_Warning = true;
// RECLAIM: Price crosses MFIB level
if((prev < mfib_level && current > mfib_level) || (prev > mfib_level && current < mfib_level))
MFIB_Reclaim_Warning = true;
// BREAK: Price breaks through MFIB decisively
if(MathAbs(current - mfib_level) > bufferPts * 1.5)
MFIB_Break_Warning = true;
}
//================================================================
// 7) STRONG MA ANALYSIS (50, 140, 230, 500)
//================================================================
// Check proximity to each strong MA
bool at_ma50 = NearLevel(current, MA_Current[3], bufferPts);
bool at_ma140 = NearLevel(current, MA_Current[4], bufferPts);
bool at_ma230 = NearLevel(current, MA_Current[5], bufferPts);
bool at_ma500 = NearLevel(current, MA_Current[6], bufferPts);
if(at_ma50) MA50_Warning = true;
if(at_ma140) MA140_Warning = true;
if(at_ma230) MA230_Warning = true;
if(at_ma500) MA500_Warning = true;
// MA REJECT: At strong MA + stoch signal
if((at_ma50 || at_ma140 || at_ma230 || at_ma500) &&
(Stoch_Extreme_Warning || Stoch_Reject_Warning || Stoch_Level_Cross))
{
MA_Reject_Warning = true;
}
// MA RECLAIM: Price reclaims strong MA
if(at_ma50 && ((prev < MA_Current[3] && current > MA_Current[3]) ||
(prev > MA_Current[3] && current < MA_Current[3])))
MA_Reclaim_Warning = true;
if(at_ma140 && ((prev < MA_Current[4] && current > MA_Current[4]) ||
(prev > MA_Current[4] && current < MA_Current[4])))
MA_Reclaim_Warning = true;
// MA BREAK: Price breaks away from MA
if((at_ma50 || at_ma140 || at_ma230) && MathAbs(current - MA_Current[3]) > bufferPts * 2)
MA_Break_Warning = true;
//================================================================
// 8) PULLBACK CONFLUENCE
// Mix and match: (MA, Fib, MFIB, Stoch) x (Reject, Reclaim, Break)
//================================================================
// Any 2+ of these combinations = pullback signal
int pullback_signals = 0;
if(MA7_Cross_14_Warning) pullback_signals++;
if(Fib_Reject_Warning) pullback_signals++;
if(MFIB_Reject_Warning) pullback_signals++;
if(MA_Reject_Warning) pullback_signals++;
if(Stoch_Level_Cross) pullback_signals++;
if(Band_Snap_Warning) pullback_signals++;
if(Fib_Reclaim_Warning) pullback_signals++;
if(MFIB_Reclaim_Warning) pullback_signals++;
if(MA_Reclaim_Warning) pullback_signals++;
if(pullback_signals >= 2)
Pullback_Warning = true;
//================================================================
// 9) WARNING CONFLUENCE COUNT
//================================================================
Warning_Confluence_Count = 0;
if(Stoch_Extreme_Warning) Warning_Confluence_Count++;
if(Stoch_Reject_Warning) Warning_Confluence_Count++;
if(Stoch_Level_Cross) Warning_Confluence_Count++;
if(MA7_Cross_14_Warning) Warning_Confluence_Count++;
if(MA7_Cross_21_Warning) Warning_Confluence_Count++;
if(MA50_Break_Warning) 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(Fib_Reclaim_Warning) Warning_Confluence_Count++;
if(MFIB_Reclaim_Warning) Warning_Confluence_Count++;
if(MA_Reclaim_Warning) Warning_Confluence_Count++;
if(Band_Snap_Warning) Warning_Confluence_Count++;
if(MA50_Warning) Warning_Confluence_Count++;
if(MA140_Warning) Warning_Confluence_Count++;
if(MA230_Warning) Warning_Confluence_Count++;
if(MA500_Warning) Warning_Confluence_Count++;
Warning_Confluence_3Plus = (Warning_Confluence_Count >= 3);
//================================================================
// 10) RE-ENTRY COMBO FLAGS
//================================================================
// Strong MA flag for use in re-entry detection
bool at_strong_ma = (MA140_Warning || MA230_Warning || MA500_Warning);
// MA14 Magnet: Price hugging MA14 (within 0.7 ATR)
MA14_Magnet_Active = false;
if(Current_ATR > 0.0)
{
double distance_to_ma14 = MathAbs(current - MA_Current[1]);
if((distance_to_ma14 / Current_ATR) < 0.7)
MA14_Magnet_Active = true;
}
// Fib Break Confirmed: Price cleanly broke through fib level
Fib_Break_Confirmed = false;
for(int i=1; i<6; i++)
{
if(MathAbs(prev - PriceLevels[i]) < bufferPts * 0.5 && // Was near level
MathAbs(current - PriceLevels[i]) > bufferPts * 2.0) // Now far from level
{
Fib_Break_Confirmed = true;
break;
}
}
// MFIB Break Confirmed: Price cleanly broke through MFIB level
MFIB_Break_Confirmed = false;
for(int i=0; i<5; i++)
{
if(MathAbs(prev - mfib_levels[i]) < bufferPts * 0.5 &&
MathAbs(current - mfib_levels[i]) > bufferPts * 2.0)
{
MFIB_Break_Confirmed = true;
break;
}
}
// Strong MA Bounce: Price touched strong MA and bounced with stoch confirmation
Strong_MA_Bounce = false;
if(at_strong_ma)
{
// Check if price was on opposite side of MA and now back
bool ma140_bounce = false, ma230_bounce = false, ma500_bounce = false;
if(MA140_Warning)
{
if((prev < MA_Current[4] && current > MA_Current[4]) ||
(prev > MA_Current[4] && current < MA_Current[4]))
ma140_bounce = true;
}
if(MA230_Warning)
{
if((prev < MA_Current[5] && current > MA_Current[5]) ||
(prev > MA_Current[5] && current < MA_Current[5]))
ma230_bounce = true;
}
if(MA500_Warning)
{
if((prev < MA_Current[6] && current > MA_Current[6]) ||
(prev > MA_Current[6] && current < MA_Current[6]))
ma500_bounce = true;
}
if((ma140_bounce || ma230_bounce || ma500_bounce) &&
(Stoch_Level_Cross || Stoch_Reject_Warning))
Strong_MA_Bounce = true;
}
// Trend Resumption: MA50 reclaimed after pullback
Trend_Resumption = false;
if(IsBullBias() && Bull_MA50_Reclaimed()) Trend_Resumption = true;
if(IsBearBias() && Bear_MA50_Reclaimed()) Trend_Resumption = true;
}
//+------------------------------------------------------------------+
// PRAISE SYSTEM: Detect 8 Aggressive Trend Signals
//+------------------------------------------------------------------+
void DetectPraiseSignals()
{
if(!Use_Praise_System)
{
Praise_Count = 0;
return;
}
double current = MidPrice();
double bufferPts = (double)MA_Touch_Buffer;
// Reset all praise flags
Praise_Triple_Magnet = false;
Praise_Power_Couple = false;
Praise_MFIB_Staircase = false;
Praise_MFIB_Express = false;
Praise_MFIB_Breakout = false;
Praise_MA_Stack = false;
Praise_Clean_Reclaim = false;
Praise_Multi_Breakout = false;
//================================================================
// CATEGORY 1: MA MAGNET PERFECTION
//================================================================
// PRAISE 1: 7x14x21 Triple Magnet Hold
if(Current_ATR > 0.0)
{
double dist7 = MathAbs(current - MA_Current[0]) / Current_ATR;
double dist14 = MathAbs(current - MA_Current[1]) / Current_ATR;
double dist21 = MathAbs(current - MA_Current[2]) / Current_ATR;
bool all_close = (dist7 < 0.5) && (dist14 < 0.7) && (dist21 < 0.9);
bool mas_trending = (MA_Current[0] > MA_Previous[0] && MA_Current[1] > MA_Previous[1] && MA_Current[2] > MA_Previous[2]) ||
(MA_Current[0] < MA_Previous[0] && MA_Current[1] < MA_Previous[1] && MA_Current[2] < MA_Previous[2]);
if(all_close && mas_trending && !Band_Snap_Warning)
Praise_Triple_Magnet = true;
}
// PRAISE 2: 14x21 Power Couple
if(Current_ATR > 0.0)
{
double dist_14_21 = MathAbs(MA_Current[1] - MA_Current[2]) / Current_ATR;
bool couple_close = (dist_14_21 < 0.3);
bool same_direction = (MA_Current[1] > MA_Previous[1] && MA_Current[2] > MA_Previous[2]) ||
(MA_Current[1] < MA_Previous[1] && MA_Current[2] < MA_Previous[2]);
bool ma7_correct_side = (IsBullBias() && MA_Current[0] > MA_Current[1]) ||
(IsBearBias() && MA_Current[0] < MA_Current[1]);
bool price_hugging = MathAbs(current - MA_Current[1]) / Current_ATR < 0.8 ||
MathAbs(current - MA_Current[2]) / Current_ATR < 0.8;
if(couple_close && same_direction && ma7_correct_side && price_hugging)
Praise_Power_Couple = true;
}
//================================================================
// CATEGORY 2: MFIB MOMENTUM
//================================================================
// PRAISE 3: MFIB Staircase Advance
// Track if price is advancing through MFIB levels sequentially
static double last_mfib_level = 0;
static int mfib_advances = 0;
double mfib_levels[5] = {MFIB_Level_786, MFIB_Level_618, MFIB_Level_050, MFIB_Level_382, MFIB_Level_236};
for(int i=0; i<5; i++)
{
if(MathAbs(current - mfib_levels[i]) / _Point < 30) // Just crossed this level
{
if(IsBullBias())
{
if(i > 0 && last_mfib_level == mfib_levels[i-1]) // Sequential advance
mfib_advances++;
}
else if(IsBearBias())
{
if(i < 4 && last_mfib_level == mfib_levels[i+1]) // Sequential decline
mfib_advances++;
}
last_mfib_level = mfib_levels[i];
break;
}
}
if(mfib_advances >= 2 && !MFIB_Reject_Warning)
Praise_MFIB_Staircase = true;
// Reset counter if no advance for 10 bars
static datetime last_advance_time = 0;
if(TimeCurrent() - last_advance_time > 10 * PeriodSeconds())
{
mfib_advances = 0;
last_mfib_level = 0;
}
// PRAISE 4: MFIB Express (skips a level)
static double prev_mfib_zone = 0;
double curr_mfib_zone = 0;
// Determine which MFIB zone we're in
for(int i=0; i<5; i++)
{
if(MathAbs(current - mfib_levels[i]) / _Point < 50)
{
curr_mfib_zone = i;
break;
}
}
if(curr_mfib_zone > 0 && prev_mfib_zone > 0)
{
double zone_diff = MathAbs(curr_mfib_zone - prev_mfib_zone);
if(zone_diff >= 2 && Current_ADX > 25) // Skipped at least one level
Praise_MFIB_Express = true;
}
prev_mfib_zone = curr_mfib_zone;
// PRAISE 5: MFIB Breakout Hold
static int mfib_breakout_hold_bars = 0;
if(MFIB_Break_Confirmed)
mfib_breakout_hold_bars++;
else
mfib_breakout_hold_bars = 0;
if(mfib_breakout_hold_bars >= 3 && !MFIB_Reject_Warning)
{
bool ma7_correct = (IsBullBias() && MA_Current[0] > last_mfib_level) ||
(IsBearBias() && MA_Current[0] < last_mfib_level);
if(ma7_correct)
Praise_MFIB_Breakout = true;
}
//================================================================
// CATEGORY 3: STRUCTURE PERFECTION
//================================================================
// PRAISE 6: MA Stack Perfection
bool stack_bull = (MA_Current[0] > MA_Current[1]) && (MA_Current[1] > MA_Current[2]) &&
(MA_Current[2] > MA_Current[3]) && (MA_Current[3] > MA_Current[4]);
bool stack_bear = (MA_Current[0] < MA_Current[1]) && (MA_Current[1] < MA_Current[2]) &&
(MA_Current[2] < MA_Current[3]) && (MA_Current[3] < MA_Current[4]);
// Check proper spacing (not bunched)
bool properly_spaced = true;
if(Current_ATR > 0.0)
{
for(int i=0; i<4; i++)
{
double spacing = MathAbs(MA_Current[i] - MA_Current[i+1]) / Current_ATR;
if(spacing < 0.1) // Too close = bunched
{
properly_spaced = false;
break;
}
}
}
// All MAs trending (not flat)
bool all_trending = true;
for(int i=0; i<5; i++)
{
if(MathAbs(MA_Current[i] - MA_Previous[i]) / _Point < 5) // Flat
{
all_trending = false;
break;
}
}
if((stack_bull || stack_bear) && properly_spaced && all_trending)
Praise_MA_Stack = true;
// PRAISE 7: Clean Reclaim Sequence
// MFIB + MA + Fib all reclaimed in same zone
bool triple_reclaim = false;
if(MFIB_Reclaim_Warning && MA_Reclaim_Warning && Fib_Reclaim_Warning)
{
// Check if all within 100 points
double mfib_price = 0, ma_price = 0, fib_price = 0;
// Find which MFIB was reclaimed
for(int i=0; i<5; i++)
{
if(MathAbs(current - mfib_levels[i]) / _Point < 100)
{
mfib_price = mfib_levels[i];
break;
}
}
// Find which MA was reclaimed (50, 140, 230)
if(MA50_Warning) ma_price = MA_Current[3];
else if(MA140_Warning) ma_price = MA_Current[4];
else if(MA230_Warning) ma_price = MA_Current[5];
// Find which Fib was reclaimed
for(int i=1; i<6; i++)
{
if(MathAbs(current - PriceLevels[i]) / _Point < 100)
{
fib_price = PriceLevels[i];
break;
}
}
if(mfib_price > 0 && ma_price > 0 && fib_price > 0)
{
if(MathAbs(mfib_price - ma_price) / _Point < 100 &&
MathAbs(mfib_price - fib_price) / _Point < 100)
triple_reclaim = true;
}
}
if(triple_reclaim)
Praise_Clean_Reclaim = true;
//================================================================
// CATEGORY 4: BREAKOUT CONFIRMATION
//================================================================
// PRAISE 8: Multi-Level Breakout
static int breakout_time_window = 0;
static bool mfib_broke = false, fib_broke = false, ma_broke = false;
// Track breakouts
if(MFIB_Break_Confirmed) mfib_broke = true;
if(Fib_Break_Warning) fib_broke = true;
if(MA_Break_Warning) ma_broke = true;
if(mfib_broke || fib_broke || ma_broke)
breakout_time_window++;
// If all 3 broke within 5 bars = multi-breakout
if(breakout_time_window > 0 && breakout_time_window <= 5)
{
if(mfib_broke && fib_broke && ma_broke)
Praise_Multi_Breakout = true;
}
// Reset window after 5 bars
if(breakout_time_window > 5)
{
breakout_time_window = 0;
mfib_broke = false;
fib_broke = false;
ma_broke = false;
}
//================================================================
// COUNT TOTAL PRAISE
//================================================================
Praise_Count = 0;
if(Praise_Triple_Magnet) Praise_Count++;
if(Praise_Power_Couple) Praise_Count++;
if(Praise_MFIB_Staircase) Praise_Count++;
if(Praise_MFIB_Express) Praise_Count++;
if(Praise_MFIB_Breakout) Praise_Count++;
if(Praise_MA_Stack) Praise_Count++;
if(Praise_Clean_Reclaim) Praise_Count++;
if(Praise_Multi_Breakout) Praise_Count++;
}
//+------------------------------------------------------------------+
void DetectFamilyBiasStrength(MODE_FAMILY &family, TREND_BIAS &bias, TREND_STRENGTH &strength)
{
double current = MidPrice();
bool mas_aligned_bull = (MA_Current[0] > MA_Current[1]) && (MA_Current[1] > MA_Current[2]) && (MA_Current[2] > MA_Current[3]);
bool mas_aligned_bear = (MA_Current[0] < MA_Current[1]) && (MA_Current[1] < MA_Current[2]) && (MA_Current[2] < MA_Current[3]);
double recent_high = iHigh(_Symbol, PERIOD_CURRENT, 0);
double recent_low = iLow(_Symbol, PERIOD_CURRENT, 0);
for(int i=1; i<20; i++)
{
recent_high = MathMax(recent_high, iHigh(_Symbol, PERIOD_CURRENT, i));
recent_low = MathMin(recent_low, iLow(_Symbol, PERIOD_CURRENT, i));
}
double range_size = (recent_high - recent_low) / current;
bool is_ranging = (range_size < Range_Price_Threshold);
bool ma_clustered = false;
if(Current_ATR > 0.0)
ma_clustered = ((MathAbs(MA_Current[0] - MA_Current[3]) / Current_ATR) < Chop_ATR_Threshold);
bool is_choppy = (ma_clustered || Current_ADX < 15);
// Bias detection WITH MFIB .382 confirmation
if(mas_aligned_bull && (MFIB_Bias == BIAS_BULL || !Use_MFIB_382_Bias))
bias = BIAS_BULL;
else if(mas_aligned_bear && (MFIB_Bias == BIAS_BEAR || !Use_MFIB_382_Bias))
bias = BIAS_BEAR;
else
{
// Use MFIB bias as tiebreaker when MAs not fully aligned
if(MFIB_Bias == BIAS_BULL && MA_Current[0] > MA_Current[3])
bias = BIAS_BULL;
else if(MFIB_Bias == BIAS_BEAR && MA_Current[0] < MA_Current[3])
bias = BIAS_BEAR;
else if(MA_Current[0] > MA_Current[3])
bias = BIAS_BULL;
else if(MA_Current[0] < MA_Current[3])
bias = BIAS_BEAR;
else
bias = BIAS_NEUTRAL;
}
if(is_choppy && !(mas_aligned_bull || mas_aligned_bear))
family = FAMILY_CHOP;
else if(is_ranging && !(mas_aligned_bull || mas_aligned_bear))
family = FAMILY_RANGING;
else if(bias != BIAS_NEUTRAL)
family = FAMILY_TRENDING;
else
family = FAMILY_TRANSITIONAL;
if(Current_ADX > 25 && (mas_aligned_bull || mas_aligned_bear))
strength = STRENGTH_STRONG;
else if(Current_ADX > 18 && (mas_aligned_bull || mas_aligned_bear))
strength = STRENGTH_CONFIRMED;
else
strength = STRENGTH_WEAK;
}
//+------------------------------------------------------------------+
PRICE_STATE DetermineStateFromContext()
{
if(Current_Family == FAMILY_RANGING)
{
double current = MidPrice();
double bufferPts = (double)MA_Touch_Buffer;
bool near_low = NearLevel(current, PriceLevels[1], bufferPts) || NearLevel(current, PriceLevels[0], bufferPts);
bool near_high = NearLevel(current, PriceLevels[5], bufferPts) || NearLevel(current, PriceLevels[6], bufferPts);
if(near_low || near_high) return STATE_RANGE_EDGE_TEST;
if(Stoch_Reject_Warning || Stoch_Extreme_Warning || Fib_Reject_Warning || MFIB_Reject_Warning) return STATE_RANGE_REJECTION;
double close0 = iClose(_Symbol, PERIOD_CURRENT, 0);
if(close0 > PriceLevels[6] || close0 < PriceLevels[0]) return STATE_RANGE_BREAK_CONFIRMED;
if(NearLevel(current, PriceLevels[6], bufferPts) || NearLevel(current, PriceLevels[0], bufferPts)) return STATE_RANGE_BREAK_ATTEMPT;
return STATE_RANGE_MID_DRIFT;
}
if(Current_Family == FAMILY_CHOP)
{
if(Current_ADX < 12 && !Stoch_Reject_Warning) return STATE_CHOP_NOISE;
if(Current_ATR > 0)
{
double body = MathAbs(iClose(_Symbol, PERIOD_CURRENT, 0) - iOpen(_Symbol, PERIOD_CURRENT, 0));
if((body / Current_ATR) > 1.2) return STATE_CHOP_VOL_SPIKE;
double cluster = MathAbs(MA_Current[0] - MA_Current[3]) / Current_ATR;
if(Current_ADX < 15 && cluster < 0.25) return STATE_CHOP_SQUEEZE;
}
if(Stoch_Reject_Warning) return STATE_CHOP_FAKEOUT_LOOP;
return STATE_CHOP_NOISE;
}
bool ma7_above_14 = (MA_Current[0] > MA_Current[1]);
bool ma7_above_21 = (MA_Current[0] > MA_Current[2]);
bool ma7_above_50 = (MA_Current[0] > MA_Current[3]);
bool ma14_above_50 = (MA_Current[1] > MA_Current[3]);
bool ma21_above_50 = (MA_Current[2] > MA_Current[3]);
bool ma7_below_14 = (MA_Current[0] < MA_Current[1]);
bool ma7_below_21 = (MA_Current[0] < MA_Current[2]);
bool ma7_below_50 = (MA_Current[0] < MA_Current[3]);
bool ma14_below_50 = (MA_Current[1] < MA_Current[3]);
bool ma21_below_50 = (MA_Current[2] < MA_Current[3]);
bool structure_intact_bull = (ma14_above_50 && ma21_above_50);
bool structure_intact_bear = (ma14_below_50 && ma21_below_50);
bool pullbackSignal =
(Pullback_Warning || MFIB_Reject_Warning || Fib_Reject_Warning ||
Stoch_Reject_Warning || Band_Snap_Warning || Stoch_Level_Cross ||
MFIB_Reclaim_Warning || Fib_Reclaim_Warning || MA_Reclaim_Warning);
bool retraceSignal = (MA7_Cross_21_Warning || Retracement_Warning ||
MA140_Warning || MA230_Warning || MA500_Warning);
// Strong MA warnings indicate deeper pullback (potential retracement/reversal)
bool strongMA_pressure = (MA140_Warning || MA230_Warning || MA500_Warning || MA50_Warning);
bool confluenceAligned = false;
if(IsBullBias() && structure_intact_bull) confluenceAligned = Warning_Confluence_3Plus;
if(IsBearBias() && structure_intact_bear) confluenceAligned = Warning_Confluence_3Plus;
if(IsBullBias())
{
if(ma7_below_50 && !ma14_above_50 && !ma21_above_50) return STATE_REVERSAL_CONFIRMED;
if(MA50_Break_Warning && (retraceSignal || strongMA_pressure || Stoch_Extreme_Warning || Stoch_Reject_Warning || Warning_Confluence_3Plus))
return STATE_REVERSAL_ATTEMPT;
// DEEP RETRACEMENT: MA7x21 cross OR testing strong MAs (140/230/500)
if(MA7_Cross_21_Warning || strongMA_pressure || (!ma7_above_21 && (pullbackSignal || retraceSignal || confluenceAligned)))
return STATE_DEEP_RETRACEMENT;
// PULLBACK: MA7x14 cross OR 2+ pullback signals with structure intact
if(MA7_Cross_14_Warning || (structure_intact_bull && (pullbackSignal || confluenceAligned)))
return STATE_PULLBACK;
return STATE_CONTINUATION;
}
if(IsBearBias())
{
if(ma7_above_50 && !ma14_below_50 && !ma21_below_50) return STATE_REVERSAL_CONFIRMED;
if(MA50_Break_Warning && (retraceSignal || strongMA_pressure || Stoch_Extreme_Warning || Stoch_Reject_Warning || Warning_Confluence_3Plus))
return STATE_REVERSAL_ATTEMPT;
// DEEP RETRACEMENT: MA7x21 cross OR testing strong MAs (140/230/500)
if(MA7_Cross_21_Warning || strongMA_pressure || (!ma7_below_21 && (pullbackSignal || retraceSignal || confluenceAligned)))
return STATE_DEEP_RETRACEMENT;
// PULLBACK: MA7x14 cross OR 2+ pullback signals with structure intact
if(MA7_Cross_14_Warning || (structure_intact_bear && (pullbackSignal || confluenceAligned)))
return STATE_PULLBACK;
return STATE_CONTINUATION;
}
return STATE_UNKNOWN;
}
//+------------------------------------------------------------------+
string FamilyToText(MODE_FAMILY f)
{
switch(f)
{
case FAMILY_TRENDING: return "Trending";
case FAMILY_RANGING: return "Ranging";
case FAMILY_CHOP: return "Chop";
case FAMILY_TRANSITIONAL: return "Transitional";
}
return "Unknown";
}
string BiasToText(TREND_BIAS b)
{
if(b == BIAS_BULL) return "Bull";
if(b == BIAS_BEAR) return "Bear";
return "Neutral";
}
string StrengthToText(TREND_STRENGTH s)
{
switch(s)
{
case STRENGTH_WEAK: return "Weak";
case STRENGTH_CONFIRMED: return "Confirmed";
case STRENGTH_STRONG: return "Strong";
}
return "Weak";
}
string StateToText(PRICE_STATE s)
{
switch(s)
{
case STATE_CONTINUATION: return "Continuation";
case STATE_PULLBACK: return "Pullback";
case STATE_DEEP_RETRACEMENT: return "Deep Retracement";
case STATE_REVERSAL_ATTEMPT: return "Reversal Attempt";
case STATE_REVERSAL_CONFIRMED: return "Reversal Confirmed";
case STATE_RANGE_MID_DRIFT: return "Range: Mid Drift";
case STATE_RANGE_EDGE_TEST: return "Range: Edge Test";
case STATE_RANGE_REJECTION: return "Range: Rejection";
case STATE_RANGE_BREAK_ATTEMPT: return "Range: Break Attempt";
case STATE_RANGE_BREAK_CONFIRMED: return "Range: Break Confirmed";
case STATE_CHOP_NOISE: return "Chop: Noise";
case STATE_CHOP_VOL_SPIKE: return "Chop: Vol Spike";
case STATE_CHOP_SQUEEZE: return "Chop: Squeeze";
case STATE_CHOP_FAKEOUT_LOOP: return "Chop: Fakeout Loop";
default: return "Unknown";
}
}
//+------------------------------------------------------------------+
void UpdateLabels()
{
ObjectDelete(0, "ModeLabel");
ObjectCreate(0, "ModeLabel", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "ModeLabel", OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, "ModeLabel", OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, "ModeLabel", OBJPROP_YDISTANCE, 20);
string mode_text = "MODE: " + FamilyToText(Current_Family);
if(Current_Family == FAMILY_TRENDING)
mode_text += " | " + StrengthToText(Current_Strength) + " " + BiasToText(Current_Bias);
color mode_color = clrYellow;
if(Current_Family == FAMILY_TRENDING)
{
if(Current_Bias == BIAS_BULL) mode_color = (Current_Strength == STRENGTH_STRONG ? clrLime : (Current_Strength == STRENGTH_CONFIRMED ? clrGreenYellow : clrGreen));
if(Current_Bias == BIAS_BEAR) mode_color = (Current_Strength == STRENGTH_STRONG ? clrRed : (Current_Strength == STRENGTH_CONFIRMED ? clrOrangeRed : clrOrange));
}
else if(Current_Family == FAMILY_RANGING) mode_color = clrAqua;
else if(Current_Family == FAMILY_CHOP) mode_color = clrViolet;
ObjectSetString(0, "ModeLabel", OBJPROP_TEXT, mode_text);
ObjectSetInteger(0, "ModeLabel", OBJPROP_COLOR, mode_color);
ObjectSetInteger(0, "ModeLabel", OBJPROP_FONTSIZE, 12);
// MFIB BIAS LABEL
ObjectDelete(0, "MFIBLabel");
if(Use_MFIB_382_Bias)
{
ObjectCreate(0, "MFIBLabel", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "MFIBLabel", OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, "MFIBLabel", OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, "MFIBLabel", OBJPROP_YDISTANCE, 40);
string mfib_text = "MFIB .382 BIAS: " + BiasToText(MFIB_Bias);
color mfib_color = (MFIB_Bias == BIAS_BULL ? clrLime : (MFIB_Bias == BIAS_BEAR ? clrRed : clrGray));
ObjectSetString(0, "MFIBLabel", OBJPROP_TEXT, mfib_text);
ObjectSetInteger(0, "MFIBLabel", OBJPROP_COLOR, mfib_color);
ObjectSetInteger(0, "MFIBLabel", OBJPROP_FONTSIZE, 11);
}
ObjectDelete(0, "StateLabel");
ObjectCreate(0, "StateLabel", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "StateLabel", OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, "StateLabel", OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, "StateLabel", OBJPROP_YDISTANCE, Use_MFIB_382_Bias ? 60 : 40);
string state_text = "STATE: " + StateToText(Current_State);
if(Current_Family == FAMILY_TRENDING && (Current_State == STATE_PULLBACK || Current_State == STATE_DEEP_RETRACEMENT))
{
if(IsBullBias() && !Bull_MA50_Reclaimed())
state_text += " | ACTION: COUNTER-SELLS (50 SL)";
else if(IsBearBias() && !Bear_MA50_Reclaimed())
state_text += " | ACTION: COUNTER-BUYS (50 SL)";
else
state_text += " | ACTION: TREND-OK (150 SL)";
}
color state_color = clrWhite;
if(Current_State == STATE_CONTINUATION) state_color = clrLime;
else if(Current_State == STATE_PULLBACK) state_color = clrYellow;
else if(Current_State == STATE_DEEP_RETRACEMENT) state_color = clrOrange;
else if(Current_State == STATE_REVERSAL_ATTEMPT) state_color = clrOrangeRed;
else if(Current_State == STATE_REVERSAL_CONFIRMED) state_color = clrRed;
else if(Current_Family == FAMILY_RANGING) state_color = clrAqua;
else if(Current_Family == FAMILY_CHOP) state_color = clrViolet;
ObjectSetString(0, "StateLabel", OBJPROP_TEXT, state_text);
ObjectSetInteger(0, "StateLabel", OBJPROP_COLOR, state_color);
ObjectSetInteger(0, "StateLabel", OBJPROP_FONTSIZE, 11);
bool anyWarn =
(Stoch_Extreme_Warning || Stoch_Reject_Warning || Stoch_Level_Cross ||
MA7_Cross_14_Warning || MA7_Cross_21_Warning ||
MA50_Break_Warning || MA50_Warning || MA140_Warning || MA230_Warning || MA500_Warning ||
Fib_Reject_Warning || MFIB_Reject_Warning ||
Fib_Reclaim_Warning || MFIB_Reclaim_Warning || MA_Reclaim_Warning ||
MA_Reject_Warning || Band_Snap_Warning || Warning_Confluence_3Plus);
if(anyWarn)
{
ObjectDelete(0, "WarningLabel");
ObjectCreate(0, "WarningLabel", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "WarningLabel", OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, "WarningLabel", OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, "WarningLabel", OBJPROP_YDISTANCE, Use_MFIB_382_Bias ? 80 : 60);
string warn_text = "WARN: ";
if(Stoch_Extreme_Warning) warn_text += "STOCH-EXT | ";
if(Stoch_Reject_Warning) warn_text += "STOCH-REJ | ";
if(Stoch_Level_Cross) warn_text += "STOCH-LVL | ";
if(MA7_Cross_14_Warning) warn_text += "MA7x14-PB | ";
if(MA7_Cross_21_Warning) warn_text += "MA7x21-RET | ";
if(MA50_Break_Warning) warn_text += "MA50-BRK | ";
if(MA50_Warning) warn_text += "MA50 | ";
if(MA140_Warning) warn_text += "MA140 | ";
if(MA230_Warning) warn_text += "MA230 | ";
if(MA500_Warning) warn_text += "MA500 | ";
if(Fib_Reject_Warning) warn_text += "FIB-REJ | ";
if(MFIB_Reject_Warning) warn_text += "MFIB-REJ | ";
if(Fib_Reclaim_Warning) warn_text += "FIB-RCL | ";
if(MFIB_Reclaim_Warning) warn_text += "MFIB-RCL | ";
if(MA_Reclaim_Warning) warn_text += "MA-RCL | ";
if(MA_Reject_Warning) warn_text += "MA-REJ | ";
if(Band_Snap_Warning) warn_text += "BAND-SNAP | ";
if(Warning_Confluence_3Plus) warn_text += "3+CONF | ";
warn_text += "W=" + IntegerToString(Warning_Confluence_Count);
ObjectSetString(0, "WarningLabel", OBJPROP_TEXT, warn_text);
ObjectSetInteger(0, "WarningLabel", OBJPROP_COLOR, clrRed);
ObjectSetInteger(0, "WarningLabel", OBJPROP_FONTSIZE, 10);
}
else
{
ObjectDelete(0, "WarningLabel");
}
//===================================================================
// PRAISE LABEL DISPLAY
//===================================================================
bool anyPraise = (Praise_Triple_Magnet || Praise_Power_Couple || Praise_MFIB_Staircase ||
Praise_MFIB_Express || Praise_MFIB_Breakout || Praise_MA_Stack ||
Praise_Clean_Reclaim || Praise_Multi_Breakout);
if(anyPraise && Use_Praise_System)
{
ObjectDelete(0, "PraiseLabel");
ObjectCreate(0, "PraiseLabel", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "PraiseLabel", OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, "PraiseLabel", OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, "PraiseLabel", OBJPROP_YDISTANCE, Use_MFIB_382_Bias ? 100 : 80);
string praise_text = "PRAISE: ";
if(Praise_Triple_Magnet) praise_text += "7x14x21-MAG | ";
if(Praise_Power_Couple) praise_text += "14x21-PWR | ";
if(Praise_MFIB_Staircase) praise_text += "MFIB-STAIR | ";
if(Praise_MFIB_Express) praise_text += "MFIB-EXP | ";
if(Praise_MFIB_Breakout) praise_text += "MFIB-BRK | ";
if(Praise_MA_Stack) praise_text += "MA-STACK | ";
if(Praise_Clean_Reclaim) praise_text += "3xRCL | ";
if(Praise_Multi_Breakout) praise_text += "MULTI-BRK | ";
praise_text += "P=" + IntegerToString(Praise_Count);
// Add star indicators for strength
if(Praise_Count >= 4) praise_text += " ⭐⭐⭐⭐";
else if(Praise_Count == 3) praise_text += " ⭐⭐⭐";
color praise_color = clrGold;
if(Praise_Count >= 4) praise_color = clrYellow; // Supreme praise - bright
ObjectSetString(0, "PraiseLabel", OBJPROP_TEXT, praise_text);
ObjectSetInteger(0, "PraiseLabel", OBJPROP_COLOR, praise_color);
ObjectSetInteger(0, "PraiseLabel", OBJPROP_FONTSIZE, 10);
}
else
{
ObjectDelete(0, "PraiseLabel");
}
//===================================================================
// SIGNAL MODE LABEL (P vs W Summary)
//===================================================================
ObjectDelete(0, "SignalLabel");
ObjectCreate(0, "SignalLabel", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "SignalLabel", OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, "SignalLabel", OBJPROP_XDISTANCE, 10);
int signal_y = Use_MFIB_382_Bias ? 120 : 100;
if(!anyPraise) signal_y -= 20; // Move up if no praise label
ObjectSetInteger(0, "SignalLabel", OBJPROP_YDISTANCE, signal_y);
string signal_text = "SIGNAL: ";
color signal_color = clrWhite;
if(Praise_Count >= 4 && Warning_Confluence_Count <= 1)
{
signal_text += "SUPREME TREND (P>>W) - MAX AGGRESSION";
signal_color = clrLime;
}
else if(Praise_Count >= 3 && Warning_Confluence_Count <= 2)
{
signal_text += "STRONG TREND (P>W) - AGGRESSIVE";
signal_color = clrGreenYellow;
}
else if(Praise_Count >= 2 && Praise_Count > Warning_Confluence_Count)
{
signal_text += "TREND MODE (P>W) - CONTINUATION BIAS";
signal_color = clrYellow;
}
else if(Warning_Confluence_Count >= 3 && Praise_Count <= 1)
{
signal_text += "REVERSAL RISK (W>>P) - COUNTER BIAS";
signal_color = clrOrangeRed;
}
else if(Warning_Confluence_Count > Praise_Count)
{
signal_text += "CAUTION (W>P) - DEFENSIVE MODE";
signal_color = clrOrange;
}
else
{
signal_text += "NEUTRAL (P≈W) - STANDARD MODE";
signal_color = clrGray;
}
ObjectSetString(0, "SignalLabel", OBJPROP_TEXT, signal_text);
ObjectSetInteger(0, "SignalLabel", OBJPROP_COLOR, signal_color);
ObjectSetInteger(0, "SignalLabel", OBJPROP_FONTSIZE, 10);
}
//+------------------------------------------------------------------+
void UpdateModeAndState()
{
MODE_FAMILY detected_family;
TREND_BIAS detected_bias;
TREND_STRENGTH detected_strength;
DetectFamilyBiasStrength(detected_family, detected_bias, detected_strength);
Current_Family = detected_family;
Current_Bias = detected_bias;
Current_Strength = detected_strength;
PRICE_STATE detected_state = DetermineStateFromContext();
bool changed =
(detected_family != Prev_Family) ||
(detected_bias != Prev_Bias) ||
(detected_strength != Prev_Strength);
if(changed)
{
int required = Mode_Confirmation_Bars;
if(detected_state == STATE_REVERSAL_CONFIRMED) required = 1;
if(detected_family == Prev_Family && detected_bias == Prev_Bias && detected_strength == Prev_Strength)
{
Mode_Confirmation_Count++;
if(Mode_Confirmation_Count >= required)
{
Prev_Family = detected_family;
Prev_Bias = detected_bias;
Prev_Strength = detected_strength;
Current_Family = detected_family;
Current_Bias = detected_bias;
Current_Strength = detected_strength;
Current_State = detected_state;
Mode_Confirmation_Count = 0;
Reversal_Confirm_Counter = 0;
if(Current_State == STATE_REVERSAL_CONFIRMED)
CloseOnFullReversal();
}
}
else
{
Prev_Family = detected_family;
Prev_Bias = detected_bias;
Prev_Strength = detected_strength;
Mode_Confirmation_Count = 1;
}
}
else
{
Mode_Confirmation_Count = 0;
Current_State = detected_state;
}
Is_Pullback_State = (Current_State == STATE_PULLBACK);
Is_Retracement_State = (Current_State == STATE_DEEP_RETRACEMENT);
UpdateLabels();
}
//+------------------------------------------------------------------+
void MarkRunners()
{
double current = MidPrice();
for(int i=0; i<ArraySize(OpenPositions); i++)
{
if(PositionSelectByTicket(OpenPositions[i].ticket))
{
double entry = OpenPositions[i].entry;
OpenPositions[i].distance_from_current = MathAbs(current - entry) / _Point;
}
}
for(int i=0; i<ArraySize(OpenPositions)-1; i++)
{
for(int j=i+1; j<ArraySize(OpenPositions); j++)
{
if(OpenPositions[j].distance_from_current > OpenPositions[i].distance_from_current)
{
PositionRec tmp = OpenPositions[i];
OpenPositions[i] = OpenPositions[j];
OpenPositions[j] = tmp;
}
}
}
for(int i=0; i<ArraySize(OpenPositions); i++)
OpenPositions[i].is_runner = (i < Min_Runners_To_Keep);
}
//+------------------------------------------------------------------+
void CloseOnFullReversal()
{
if(!Only_Close_On_Full_Reversal) return;
MarkRunners();
Print("🔄 REVERSAL CONFIRMED - Closing opposing positions (protecting runners)");
for(int i=PositionsTotal()-1; i>=0; i--)
{
if(PositionGetTicket(i) == 0) continue;
if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue;
if(PositionGetInteger(POSITION_MAGIC) != MagicNumber) continue;
ulong ticket = PositionGetTicket(i);
bool is_buy = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY);
int idx = -1;
for(int j=0; j<ArraySize(OpenPositions); j++)
{
if(OpenPositions[j].ticket == ticket) { idx = j; break; }
}
if(idx >= 0 && OpenPositions[idx].is_runner)
continue;
bool should_close = false;
if(is_buy && IsBearBias()) should_close = true;
if(!is_buy && IsBullBias()) should_close = true;
if(should_close)
{
if(Trade.PositionClose(ticket))
ClosedByReversal++;
}
}
}
//+------------------------------------------------------------------+
bool IsDirectionAllowed(bool is_buy)
{
if(!Use_Market_Mode_Filter) return true;
if(Current_Family == FAMILY_TRENDING)
{
if(Current_State == STATE_REVERSAL_CONFIRMED)
{
if(IsBullBias() && !is_buy) return false;
if(IsBearBias() && is_buy) return false;
return true;
}
if(Current_State == STATE_PULLBACK || Current_State == STATE_DEEP_RETRACEMENT)
{
if(IsBullBias())
{
if(!Bull_MA50_Reclaimed())
return (!is_buy); // SELLS ONLY
return is_buy;
}
if(IsBearBias())
{
if(!Bear_MA50_Reclaimed())
return (is_buy); // BUYS ONLY
return (!is_buy);
}
}
if(Current_State == STATE_CONTINUATION)
{
if(IsBullBias() && !is_buy) return false;
if(IsBearBias() && is_buy) return false;
return true;
}
return true;
}
return true;
}
//+------------------------------------------------------------------+
int CountSetupTrades(SETUP_TYPE setup)
{
int count = 0;
for(int i=0; i<PositionsTotal(); i++)
{
if(PositionGetTicket(i) == 0) continue;
if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue;
if(PositionGetInteger(POSITION_MAGIC) != MagicNumber) continue;
ulong t = PositionGetTicket(i);
for(int j=0; j<ArraySize(OpenPositions); j++)
{
if(OpenPositions[j].ticket == t)
{
if(OpenPositions[j].setup_type == setup)
count++;
break;
}
}
}
return count;
}
//+------------------------------------------------------------------+
double GetLotSize(TRADE_CATEGORY category)
{
double risk = AccountInfoDouble(ACCOUNT_BALANCE) * Risk_Per_Trade / 100.0;
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
double sl_points = (category == CATEGORY_COUNTER_TREND) ? Counter_SL_Points : Continuation_SL_Points;
double lot = risk / ((sl_points * _Point / tickSize) * tickValue);
// WAR SURVIVOR: Apply multiplier for larger initial positions
if(Use_MFIB_Partials)
lot = lot * War_Survivor_Lot_Multiplier;
// PRAISE SYSTEM: Dynamic sizing based on PRAISE vs WARN
if(Use_Praise_System)
{
if(category == CATEGORY_CONTINUATION)
{
// CONTINUATION TRADES: Boost on PRAISE, reduce on WARN
if(Praise_Count >= 4)
lot = lot * Praise_Size_Multiplier_Supreme; // Supreme praise = 2x
else if(Praise_Count == 3)
lot = lot * Praise_Size_Multiplier_Strong; // Strong praise = 1.5x
// Reduce size if high warnings
if(Reduce_Continuation_On_Warn && Warning_Confluence_Count >= 3)
lot = lot * 0.5; // Cut continuation size in half when warned
}
else if(category == CATEGORY_COUNTER_TREND)
{
// COUNTER-TREND TRADES: Boost on WARN, reduce on PRAISE
if(Warning_Confluence_Count >= 3)
lot = lot * 1.0; // Full size counter when warned
// Reduce counter size if high praise (strong trend)
if(Pause_Counter_On_Praise && Praise_Count >= 3)
lot = lot * 0.25; // Minimal counter when praised (trend strong)
}
}
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double step = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
lot = MathMax(lot, minLot);
lot = MathMin(lot, maxLot);
lot = NormalizeDouble(lot / step, 0) * step;
return lot;
}
//+------------------------------------------------------------------+
void OpenTrade(bool buy, double price, string setup_name, SETUP_TYPE setup_type, TRADE_CATEGORY category)
{
if(!IsDirectionAllowed(buy)) return;
if(!CanReEnter(setup_type)) return;
if(CountSetupTrades(setup_type) >= Max_Trades_Per_Setup) return;
if(PositionsTotal() >= Max_Total_Trades) return;
datetime now = TimeCurrent();
if(now - LastEntryTime[setup_type] < 1) return;
double lot = GetLotSize(category);
if(lot < SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN)) return;
double sl, tp;
if(category == CATEGORY_COUNTER_TREND)
{
sl = buy ? price - Counter_SL_Points * _Point : price + Counter_SL_Points * _Point;
tp = buy ? price + Counter_TP_Points * _Point : price - Counter_TP_Points * _Point;
}
else
{
sl = buy ? price - Continuation_SL_Points * _Point : price + Continuation_SL_Points * _Point;
tp = buy ? price + Continuation_TP_Points * _Point : price - Continuation_TP_Points * _Point;
}
string cat_text = (category == CATEGORY_COUNTER_TREND) ? "CTR" : "CONT";
string bias_text = BiasToText(MFIB_Bias);
string comment = setup_name + "|" + cat_text + "|" + FamilyToText(Current_Family) + "|" + bias_text;
bool result = false;
if(buy) result = Trade.Buy(lot, _Symbol, 0, sl, tp, comment);
else result = Trade.Sell(lot, _Symbol, 0, sl, tp, comment);
if(result)
{
LastEntryTime[setup_type] = now;
TodayTrades++;
if(buy) BuyTrades++; else SellTrades++;
SetupCount[setup_type]++;
ulong ticket = Trade.ResultOrder();
int size = ArraySize(OpenPositions);
ArrayResize(OpenPositions, size+1);
OpenPositions[size].ticket = ticket;
OpenPositions[size].entry = price;
OpenPositions[size].original_lot = lot;
OpenPositions[size].is_buy = buy;
OpenPositions[size].partial_tp_hit = false;
OpenPositions[size].be_set = false;
OpenPositions[size].trailing_active = false;
OpenPositions[size].is_runner = false;
OpenPositions[size].setup_type = setup_type;
OpenPositions[size].category = category;
OpenPositions[size].setup_name = setup_name;
OpenPositions[size].entry_family = Current_Family;
OpenPositions[size].entry_bias = Current_Bias;
OpenPositions[size].entry_strength = Current_Strength;
OpenPositions[size].distance_from_current = 0;
OpenPositions[size].last_close_time = 0;
OpenPositions[size].closed_at_sl = false; // NEW
OpenPositions[size].closed_at_be = false; // NEW
OpenPositions[size].close_price = 0; // NEW
OpenPositions[size].mfib_partials_taken = 0; // WAR SURVIVOR
OpenPositions[size].last_mfib_partial_price = 0; // WAR SURVIVOR
}
}
//+------------------------------------------------------------------+
void ManagePositions()
{
for(int i=PositionsTotal()-1; i>=0; i--)
{
ulong ticket = PositionGetTicket(i);
if(ticket == 0) continue;
if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue;
if(PositionGetInteger(POSITION_MAGIC) != MagicNumber) continue;
int idx = -1;
for(int j=0; j<ArraySize(OpenPositions); j++)
{
if(OpenPositions[j].ticket == ticket) { idx = j; break; }
}
if(idx == -1) continue;
double entry = PositionGetDouble(POSITION_PRICE_OPEN);
double current_sl = PositionGetDouble(POSITION_SL);
double current_tp = PositionGetDouble(POSITION_TP);
bool is_buy = OpenPositions[idx].is_buy;
TRADE_CATEGORY cat = OpenPositions[idx].category;
double current = is_buy ? SymbolInfoDouble(_Symbol, SYMBOL_BID) : SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double profit_points = is_buy ? (current - entry) / _Point : (entry - current) / _Point;
int partial_tp_pts = (cat == CATEGORY_COUNTER_TREND) ? Counter_Partial_TP : Continuation_Partial_TP;
double partial_pct = (cat == CATEGORY_COUNTER_TREND) ? Counter_Partial_Percent : Continuation_Partial_Percent;
int be_pts = (cat == CATEGORY_COUNTER_TREND) ? Counter_BreakEven_Points : Continuation_BreakEven_Points;
int trail_pts = (cat == CATEGORY_COUNTER_TREND) ? Counter_Trail_Points : Continuation_Trail_Points;
// PRAISE SYSTEM: Tighter trail during supreme praise
if(Use_Praise_System && cat == CATEGORY_CONTINUATION && Praise_Count >= 4)
trail_pts = Praise_Tight_Trail; // 100pts trail in supreme trend
if(!OpenPositions[idx].partial_tp_hit && profit_points >= partial_tp_pts)
{
double current_lot = PositionGetDouble(POSITION_VOLUME);
double close_size = NormalizeDouble(OpenPositions[idx].original_lot * partial_pct / 100.0, 2);
if(close_size > 0 && close_size <= current_lot)
{
if(Trade.PositionClosePartial(ticket, close_size))
OpenPositions[idx].partial_tp_hit = true;
}
}
//===================================================================
// WAR SURVIVOR: AGGRESSIVE MFIB PARTIAL SYSTEM
// Take 25% at each MFIB rejection to lock in gains frequently
//===================================================================
if(Use_MFIB_Partials && profit_points >= MFIB_Partial_Min_Profit && OpenPositions[idx].mfib_partials_taken < 4)
{
bool mfib_reject_happened = false;
double mfib_reject_price = 0;
// Check if we're at a MFIB level with rejection
double mfib_levels[5] = {MFIB_Level_236, MFIB_Level_382, MFIB_Level_050, MFIB_Level_618, MFIB_Level_786};
for(int m=0; m<5; m++)
{
double dist_to_level = MathAbs(current - mfib_levels[m]) / _Point;
// At MFIB level (within 50 points)
if(dist_to_level <= 50)
{
// Check for rejection signs
bool has_reject_signal = (MFIB_Reject_Warning || Stoch_Reject_Warning ||
Stoch_Extreme_Warning || Warning_Confluence_3Plus);
// Check if different from last partial
bool new_level = (OpenPositions[idx].last_mfib_partial_price == 0) ||
(MathAbs(current - OpenPositions[idx].last_mfib_partial_price) / _Point > 100);
if(has_reject_signal && new_level)
{
mfib_reject_happened = true;
mfib_reject_price = mfib_levels[m];
break;
}
}
}
// Execute MFIB partial
if(mfib_reject_happened)
{
double current_lot = PositionGetDouble(POSITION_VOLUME);
double close_size = NormalizeDouble(OpenPositions[idx].original_lot * MFIB_Partial_Percent / 100.0, 2);
// Ensure we don't close more than available
if(close_size > current_lot)
close_size = current_lot * 0.25; // Take 25% of what's left
if(close_size > 0 && close_size >= SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN))
{
if(Trade.PositionClosePartial(ticket, close_size))
{
OpenPositions[idx].mfib_partials_taken++;
OpenPositions[idx].last_mfib_partial_price = mfib_reject_price;
Print("💰 WAR SURVIVOR MFIB PARTIAL #", OpenPositions[idx].mfib_partials_taken,
" | Closed ", close_size, " lots at MFIB ", DoubleToString(mfib_reject_price, 2),
" | +", DoubleToString(profit_points, 1), " pts");
}
}
}
}
if(!OpenPositions[idx].be_set && profit_points >= be_pts)
{
if((is_buy && current_sl < entry) || (!is_buy && current_sl > entry))
{
if(Trade.PositionModify(ticket, entry, current_tp))
OpenPositions[idx].be_set = true;
}
}
if(profit_points >= be_pts + 50)
{
OpenPositions[idx].trailing_active = true;
double newSL = 0;
bool should_modify = false;
if(is_buy)
{
newSL = current - trail_pts * _Point;
if(newSL > current_sl + 30 * _Point) should_modify = true;
}
else
{
newSL = current + trail_pts * _Point;
if(newSL < current_sl - 30 * _Point) should_modify = true;
}
if(should_modify) Trade.PositionModify(ticket, newSL, current_tp);
}
// Update close price for tracking
OpenPositions[idx].close_price = current;
}
// Check for recently closed positions (for re-entry tracking)
for(int i=ArraySize(OpenPositions)-1; i>=0; i--)
{
ulong ticket = OpenPositions[i].ticket;
// Check if position still exists
if(!PositionSelectByTicket(ticket))
{
// Position was closed - determine if at SL or BE
double entry = OpenPositions[i].entry;
double close_price = OpenPositions[i].close_price;
bool is_buy = OpenPositions[i].is_buy;
// Check if closed at BE (close price near entry)
bool at_be = (MathAbs(close_price - entry) / _Point < 10);
// Check if closed at SL (assuming loss)
bool at_sl = false;
if(is_buy && close_price < entry) at_sl = true;
if(!is_buy && close_price > entry) at_sl = true;
if(at_be) at_sl = false; // BE takes precedence
// Record closure for re-entry system
RecordClosure(OpenPositions[i].setup_type, OpenPositions[i].category,
OpenPositions[i].is_buy, close_price, at_sl, at_be);
// Remove from array
for(int j=i; j<ArraySize(OpenPositions)-1; j++)
OpenPositions[j] = OpenPositions[j+1];
ArrayResize(OpenPositions, ArraySize(OpenPositions)-1);
}
}
}
//+------------------------------------------------------------------+
void OnTick()
{
UpdateIndicators();
DetectWarnings();
DetectPraiseSignals(); // NEW: Detect PRAISE signals
static int tick_count = 0;
tick_count++;
if(tick_count >= 100)
{
CalculateLevels();
if(Show_Levels) DrawLevels();
tick_count = 0;
}
UpdateModeAndState();
ManagePositions();
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double current = (bid + ask) / 2.0;
double previous = iClose(_Symbol, PERIOD_CURRENT, 1);
double buffer = MA_Touch_Buffer * _Point;
//=================================================================
// PULLBACK COUNTER-TREND SETUPS (50 SL) - TEMPORARILY DISABLED
// Waiting for confirmation of warning/praise signal definitions
//=================================================================
/*
if(Current_Family == FAMILY_TRENDING && Is_Pullback_State && Warning_Confluence_Count >= 3)
{
bool bull = IsBullBias();
bool bear = IsBearBias();
bool ma50_not_reclaimed = (bull && !Bull_MA50_Reclaimed()) || (bear && !Bear_MA50_Reclaimed());
if(ma50_not_reclaimed)
{
int pb_signals = 0;
if(MA7_Cross_14_Warning) pb_signals++;
if(MFIB_Reject_Warning) pb_signals++;
if(Band_Snap_Warning) pb_signals++;
if(Stoch_Reject_Warning || Stoch_Extreme_Warning) pb_signals++;
if(pb_signals >= 2)
{
if(bull) OpenTrade(false, bid, "PB-COUNTER-SELL", SETUP_PULLBACK_COUNTER, CATEGORY_COUNTER_TREND);
if(bear) OpenTrade(true, ask, "PB-COUNTER-BUY", SETUP_PULLBACK_COUNTER, CATEGORY_COUNTER_TREND);
}
}
}
*/
//=================================================================
// RETRACEMENT COUNTER-TREND SETUPS (50 SL) - TEMPORARILY DISABLED
// Waiting for confirmation of warning/praise signal definitions
//=================================================================
/*
if(Current_Family == FAMILY_TRENDING && Is_Retracement_State && Warning_Confluence_Count >= 3)
{
bool bull = IsBullBias();
bool bear = IsBearBias();
bool ma50_not_reclaimed = (bull && !Bull_MA50_Reclaimed()) || (bear && !Bear_MA50_Reclaimed());
if(ma50_not_reclaimed)
{
int ret_signals = 0;
if(MA7_Cross_21_Warning) ret_signals++;
if(MFIB_Reject_Warning) ret_signals++;
if(Band_Snap_Warning) ret_signals++;
if(Stoch_Reject_Warning || Stoch_Extreme_Warning) ret_signals++;
if(ret_signals >= 2)
{
if(bull) OpenTrade(false, bid, "RET-COUNTER-SELL", SETUP_RETRACEMENT_COUNTER, CATEGORY_COUNTER_TREND);
if(bear) OpenTrade(true, ask, "RET-COUNTER-BUY", SETUP_RETRACEMENT_COUNTER, CATEGORY_COUNTER_TREND);
}
}
}
*/
//=================================================================
// CONTINUATION SETUPS (150 SL) - ALL 16 ORIGINAL SETUPS
//=================================================================
if(Current_Family == FAMILY_TRENDING && Current_State == STATE_CONTINUATION)
{
// 1. MA14 CROSS
int ma14_crosses = 0;
for(int i=0; i<10; i++) if(i != 1 && MA_Current[1] > MA_Current[i]) ma14_crosses++;
if(ma14_crosses >= 2) OpenTrade(true, ask, "MA14-CROSS↑", SETUP_MA14_CROSS, CATEGORY_CONTINUATION);
ma14_crosses = 0;
for(int i=0; i<10; i++) if(i != 1 && MA_Current[1] < MA_Current[i]) ma14_crosses++;
if(ma14_crosses >= 2) OpenTrade(false, bid, "MA14-CROSS↓", SETUP_MA14_CROSS, CATEGORY_CONTINUATION);
// 2. MA50 BOUNCE
if(MathAbs(current - MA_Current[3]) <= buffer)
{
OpenTrade(true, ask, "MA50-BOUNCE↑", SETUP_MA50_BOUNCE, CATEGORY_CONTINUATION);
OpenTrade(false, bid, "MA50-BOUNCE↓", SETUP_MA50_BOUNCE, CATEGORY_CONTINUATION);
}
// 3. MA140 BOUNCE
if(MathAbs(current - MA_Current[4]) <= buffer)
{
OpenTrade(true, ask, "MA140-BOUNCE↑", SETUP_MA140_BOUNCE, CATEGORY_CONTINUATION);
OpenTrade(false, bid, "MA140-BOUNCE↓", SETUP_MA140_BOUNCE, CATEGORY_CONTINUATION);
}
// 4. MA230 BOUNCE
if(MathAbs(current - MA_Current[5]) <= buffer)
{
OpenTrade(true, ask, "MA230-BOUNCE↑", SETUP_MA230_BOUNCE, CATEGORY_CONTINUATION);
OpenTrade(false, bid, "MA230-BOUNCE↓", SETUP_MA230_BOUNCE, CATEGORY_CONTINUATION);
}
// 5. MA500 TOUCH
if(MathAbs(current - MA_Current[6]) <= buffer)
{
OpenTrade(true, ask, "MA500-TOUCH↑", SETUP_MA500_TOUCH, CATEGORY_CONTINUATION);
OpenTrade(false, bid, "MA500-TOUCH↓", SETUP_MA500_TOUCH, CATEGORY_CONTINUATION);
}
// 6. FIB BREAKS
for(int i=1; i<6; i++)
{
if(MathAbs(current - PriceLevels[i]) <= buffer)
{
if(previous < PriceLevels[i])
OpenTrade(true, ask, "FIB-BREAK↑", SETUP_FIB_BREAK, CATEGORY_CONTINUATION);
if(previous > PriceLevels[i])
OpenTrade(false, bid, "FIB-BREAK↓", SETUP_FIB_BREAK, CATEGORY_CONTINUATION);
}
}
// 7. FIB RECLAIM
for(int i=1; i<6; i++)
{
if(NearLevel(current, PriceLevels[i], buffer))
{
if(MA_Previous[0] < PriceLevels[i] && MA_Current[0] > PriceLevels[i])
OpenTrade(true, ask, "FIB-RECLAIM↑", SETUP_FIB_RECLAIM, CATEGORY_CONTINUATION);
if(MA_Previous[0] > PriceLevels[i] && MA_Current[0] < PriceLevels[i])
OpenTrade(false, bid, "FIB-RECLAIM↓", SETUP_FIB_RECLAIM, CATEGORY_CONTINUATION);
}
}
// 8. MAGNET WALK
bool hugging = (Current_ATR > 0.0) ? (MathAbs(current - MA_Current[2]) / Current_ATR < 0.7) : false;
if(hugging && MA_Current[0] > MA_Current[3])
OpenTrade(true, ask, "MAGNET-WALK↑", SETUP_MAGNET_WALK, CATEGORY_CONTINUATION);
if(hugging && MA_Current[0] < MA_Current[3])
OpenTrade(false, bid, "MAGNET-WALK↓", SETUP_MAGNET_WALK, CATEGORY_CONTINUATION);
// 9. MFIB LADDER (near MFIB levels)
if(NearLevel(current, MFIB_Level_618, buffer) || NearLevel(current, MFIB_Level_382, buffer))
{
if(IsBullBias()) OpenTrade(true, ask, "MFIB-LADDER↑", SETUP_MFIB_LADDER, CATEGORY_CONTINUATION);
if(IsBearBias()) OpenTrade(false, bid, "MFIB-LADDER↓", SETUP_MFIB_LADDER, CATEGORY_CONTINUATION);
}
// 10. STAIRCASE ADVANCE - MA stack with momentum
bool mas_stacked_bull = (MA_Current[0] > MA_Current[1]) && (MA_Current[1] > MA_Current[2]) &&
(MA_Current[2] > MA_Current[3]) && (MA_Current[3] > MA_Current[4]);
bool mas_stacked_bear = (MA_Current[0] < MA_Current[1]) && (MA_Current[1] < MA_Current[2]) &&
(MA_Current[2] < MA_Current[3]) && (MA_Current[3] < MA_Current[4]);
if(mas_stacked_bull && Current_ADX > 25 && !Band_Snap_Warning)
OpenTrade(true, ask, "STAIRCASE↑", SETUP_STAIRCASE_ADV, CATEGORY_CONTINUATION);
if(mas_stacked_bear && Current_ADX > 25 && !Band_Snap_Warning)
OpenTrade(false, bid, "STAIRCASE↓", SETUP_STAIRCASE_ADV, CATEGORY_CONTINUATION);
// 11. CONTROLLED PULLBACK - Minor pullback in strong trend
bool minor_pb_bull = (MA_Current[0] < MA_Current[1]) && (MA_Current[0] > MA_Current[3]) &&
(Stoch_K_Current < 50) && (Stoch_K_Current > Stoch_Low);
bool minor_pb_bear = (MA_Current[0] > MA_Current[1]) && (MA_Current[0] < MA_Current[3]) &&
(Stoch_K_Current > 50) && (Stoch_K_Current < Stoch_High);
if(minor_pb_bull && IsBullBias())
OpenTrade(true, ask, "CTRL-PB↑", SETUP_CTRL_PULLBACK, CATEGORY_CONTINUATION);
if(minor_pb_bear && IsBearBias())
OpenTrade(false, bid, "CTRL-PB↓", SETUP_CTRL_PULLBACK, CATEGORY_CONTINUATION);
// 12. TIMEFRAME RESET - Price resets to key level then resumes
bool tf_reset_bull = (MA_Previous[0] < MA_Current[3]) && (MA_Current[0] >= MA_Current[3]) &&
(Stoch_K_Current > Stoch_K_Previous);
bool tf_reset_bear = (MA_Previous[0] > MA_Current[3]) && (MA_Current[0] <= MA_Current[3]) &&
(Stoch_K_Current < Stoch_K_Previous);
if(tf_reset_bull && IsBullBias())
OpenTrade(true, ask, "TF-RESET↑", SETUP_TF_RESET, CATEGORY_CONTINUATION);
if(tf_reset_bear && IsBearBias())
OpenTrade(false, bid, "TF-RESET↓", SETUP_TF_RESET, CATEGORY_CONTINUATION);
// 14. MFIB PRESS - Sustained pressure at MFIB levels
bool mfib_press_bull = (NearLevel(current, MFIB_Level_618, buffer) || NearLevel(current, MFIB_Level_786, buffer)) &&
(MA_Current[0] > MA_Current[1]) && (Stoch_K_Current > 50);
bool mfib_press_bear = (NearLevel(current, MFIB_Level_236, buffer) || NearLevel(current, MFIB_Level_382, buffer)) &&
(MA_Current[0] < MA_Current[1]) && (Stoch_K_Current < 50);
if(mfib_press_bull && IsBullBias())
OpenTrade(true, ask, "MFIB-PRESS↑", SETUP_MFIB_PRESS, CATEGORY_CONTINUATION);
if(mfib_press_bear && IsBearBias())
OpenTrade(false, bid, "MFIB-PRESS↓", SETUP_MFIB_PRESS, CATEGORY_CONTINUATION);
}
//=================================================================
// RANGE SETUPS (50 SL) - Counter-trend parameters
//=================================================================
if(Current_Family == FAMILY_RANGING)
{
// Range edge entries
if(MathAbs(current - PriceLevels[1]) < buffer && Stoch_K_Current < 35)
OpenTrade(true, ask, "RANGE-BUY", SETUP_RANGE_ENGINE, CATEGORY_COUNTER_TREND);
if(MathAbs(current - PriceLevels[5]) < buffer && Stoch_K_Current > 65)
OpenTrade(false, bid, "RANGE-SELL", SETUP_RANGE_ENGINE, CATEGORY_COUNTER_TREND);
// MFIB reject in range
if(MFIB_Reject_Warning && (Stoch_Reject_Warning || Stoch_Extreme_Warning || Warning_Confluence_3Plus))
{
if(current <= MFIB_Level_050) OpenTrade(true, ask, "RANGE-MFIB-BUY", SETUP_RANGE_ENGINE, CATEGORY_COUNTER_TREND);
if(current >= MFIB_Level_050) OpenTrade(false, bid, "RANGE-MFIB-SELL", SETUP_RANGE_ENGINE, CATEGORY_COUNTER_TREND);
}
// 8. FIB REJECT in range (using SETUP_FIB_REJECT)
if(Fib_Reject_Warning)
{
if(current <= PriceLevels[3]) OpenTrade(true, ask, "RANGE-FIB-BUY", SETUP_FIB_REJECT, CATEGORY_COUNTER_TREND);
if(current >= PriceLevels[3]) OpenTrade(false, bid, "RANGE-FIB-SELL", SETUP_FIB_REJECT, CATEGORY_COUNTER_TREND);
}
}
//=================================================================
// CHOP SETUPS (50 SL) - Counter-trend parameters
//=================================================================
if(Current_Family == FAMILY_CHOP)
{
if(Stoch_Extreme_Warning || Stoch_Reject_Warning || Fib_Reject_Warning || MFIB_Reject_Warning || Warning_Confluence_3Plus)
{
if(Stoch_K_Current <= Stoch_Low) OpenTrade(true, ask, "CHOP-REV-BUY", SETUP_MEAN_REV, CATEGORY_COUNTER_TREND);
if(Stoch_K_Current >= Stoch_High) OpenTrade(false, bid, "CHOP-REV-SELL", SETUP_MEAN_REV, CATEGORY_COUNTER_TREND);
}
// Band snap in chop
if(Band_Snap_Warning)
{
if(current < MA_Current[0]) OpenTrade(true, ask, "CHOP-SNAP-BUY", SETUP_MEAN_REV, CATEGORY_COUNTER_TREND);
if(current > MA_Current[0]) OpenTrade(false, bid, "CHOP-SNAP-SELL", SETUP_MEAN_REV, CATEGORY_COUNTER_TREND);
}
}
}
//+------------------------------------------------------------------+