RSI-Stoch-MA-EA/Utilities.mqh

149 lines
5.8 KiB
MQL5
Raw Permalink Normal View History

2026-01-20 07:42:59 +00:00
//+------------------------------------------------------------------+
//| 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";
}
}