//+------------------------------------------------------------------+ //| 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 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 OpenPositions[i].distance_from_current) { PositionRec tmp = OpenPositions[i]; OpenPositions[i] = OpenPositions[j]; OpenPositions[j] = tmp; } } } for(int i=0; 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= 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= 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= 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= 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); } } } //+------------------------------------------------------------------+