forked from SahrJohn/RSI-Stoch-MA-EA
149 lines
5.8 KiB
MQL5
149 lines
5.8 KiB
MQL5
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| 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";
|
||
|
|
}
|
||
|
|
}
|