Initial MQL5 EA Project
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| Utilities.mqh - Helper utility functions |
|
||||
//| Price normalization, lot normalization, etc. |
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
#ifndef __UTILITIES_MQH__
|
||||
#define __UTILITIES_MQH__
|
||||
|
||||
class CUtilities
|
||||
{
|
||||
public:
|
||||
// Normalize price to bid/ask
|
||||
static double NormalizePrice(const string symbol, double price)
|
||||
{
|
||||
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
|
||||
int digits = GetDigits(symbol);
|
||||
return NormalizeDouble(price, digits);
|
||||
}
|
||||
|
||||
// Normalize lot size to contract size step
|
||||
static double NormalizeLot(const string symbol, double lot)
|
||||
{
|
||||
double min_lot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
|
||||
double max_lot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
|
||||
double lot_step = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
|
||||
|
||||
// Apply limits
|
||||
if(lot < min_lot) lot = min_lot;
|
||||
if(lot > max_lot) lot = max_lot;
|
||||
|
||||
// Round to step
|
||||
lot = MathFloor(lot / lot_step) * lot_step;
|
||||
|
||||
return NormalizeDouble(lot, 2);
|
||||
}
|
||||
|
||||
// Convert points to price distance
|
||||
static double PointsToPrice(const string symbol, int points)
|
||||
{
|
||||
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
|
||||
return (double)points * point;
|
||||
}
|
||||
|
||||
// Convert price distance to points
|
||||
static int PriceToPoints(const string symbol, double price_distance)
|
||||
{
|
||||
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
|
||||
return (int)(price_distance / point);
|
||||
}
|
||||
|
||||
// Get point value
|
||||
static double GetPoint(const string symbol)
|
||||
{
|
||||
return SymbolInfoDouble(symbol, SYMBOL_POINT);
|
||||
}
|
||||
|
||||
// Get digits
|
||||
static int GetDigits(const string symbol)
|
||||
{
|
||||
long digits = SymbolInfoInteger(symbol, SYMBOL_DIGITS);
|
||||
if(digits < 0)
|
||||
digits = 0;
|
||||
if(digits > 255)
|
||||
digits = 255;
|
||||
return (int)digits;
|
||||
}
|
||||
|
||||
// Safe double comparison with precision
|
||||
static bool DoubleEquals(double a, double b, double tolerance = 0.00001)
|
||||
{
|
||||
return MathAbs(a - b) < tolerance;
|
||||
}
|
||||
|
||||
// Get contract size (lot multiplier)
|
||||
static double GetContractSize(const string symbol)
|
||||
{
|
||||
return SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE);
|
||||
}
|
||||
};
|
||||
|
||||
#endif //__UTILITIES_MQH__
|
||||
Reference in New Issue
Block a user