//+------------------------------------------------------------------+ //| Utilities.mqh | //| Utility Functions for QuarterTheory | //+------------------------------------------------------------------+ #property copyright "QuarterTheory x VIZION" #property strict #include "GlobalVariables.mqh" //+------------------------------------------------------------------+ //| Get mid price between bid and ask | //+------------------------------------------------------------------+ double MidPrice() { double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); return (bid + ask) / 2.0; } //+------------------------------------------------------------------+ //| Check if price is near a level | //+------------------------------------------------------------------+ bool NearLevel(const double price, const double level, const double tolPoints) { return (MathAbs(price - level) <= tolPoints * _Point); } //+------------------------------------------------------------------+ //| Check if Stochastic crossed up | //+------------------------------------------------------------------+ bool StochCrossUp() { return (Stoch_K_Previous < Stoch_D_Current && Stoch_K_Current >= Stoch_D_Current); } //+------------------------------------------------------------------+ //| Check if Stochastic crossed down | //+------------------------------------------------------------------+ bool StochCrossDown() { return (Stoch_K_Previous > Stoch_D_Current && Stoch_K_Current <= Stoch_D_Current); } //+------------------------------------------------------------------+ //| Check if current bias is bullish | //+------------------------------------------------------------------+ bool IsBullBias() { return (Current_Bias == BIAS_BULL); } //+------------------------------------------------------------------+ //| Check if current bias is bearish | //+------------------------------------------------------------------+ bool IsBearBias() { return (Current_Bias == BIAS_BEAR); } //+------------------------------------------------------------------+ //| Check if MA50 was reclaimed (bull) | //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+ //| Check if MA50 was reclaimed (bear) | //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+ //| Convert family enum to text | //+------------------------------------------------------------------+ 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"; } //+------------------------------------------------------------------+ //| Convert bias enum to text | //+------------------------------------------------------------------+ string BiasToText(TREND_BIAS b) { if(b == BIAS_BULL) return "Bull"; if(b == BIAS_BEAR) return "Bear"; return "Neutral"; } //+------------------------------------------------------------------+ //| Convert strength enum to text | //+------------------------------------------------------------------+ string StrengthToText(TREND_STRENGTH s) { switch(s) { case STRENGTH_WEAK: return "Weak"; case STRENGTH_CONFIRMED: return "Confirmed"; case STRENGTH_STRONG: return "Strong"; } return "Weak"; } //+------------------------------------------------------------------+ //| Convert state enum to text | //+------------------------------------------------------------------+ 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"; } }