MobinMQL/Include/Trade/SymbolInfo.mqh
2025-07-22 14:47:41 +03:00

789 lines
34 KiB
MQL5

//+------------------------------------------------------------------+
//| SymbolInfo.mqh |
//| Copyright 2000-2025, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Object.mqh>
//+------------------------------------------------------------------+
//| Class CSymbolInfo. |
//| Appointment: Class for access to symbol info. |
//| Derives from class CObject. |
//+------------------------------------------------------------------+
class CSymbolInfo : public CObject
{
protected:
string m_name; // symbol name
MqlTick m_tick; // structure of tick;
double m_point; // symbol point
double m_tick_value; // symbol tick value
double m_tick_value_profit; // symbol tick value profit
double m_tick_value_loss; // symbol tick value loss
double m_tick_size; // symbol tick size
double m_contract_size; // symbol contract size
double m_lots_min; // symbol lots min
double m_lots_max; // symbol lots max
double m_lots_step; // symbol lots step
double m_lots_limit; // symbol lots limit
double m_swap_long; // symbol swap long
double m_swap_short; // symbol swap short
int m_digits; // symbol digits
int m_order_mode; // symbol valid orders
ENUM_SYMBOL_TRADE_EXECUTION m_trade_execution; // symbol trade execution
ENUM_SYMBOL_CALC_MODE m_trade_calcmode; // symbol trade calcmode
ENUM_SYMBOL_TRADE_MODE m_trade_mode; // symbol trade mode
ENUM_SYMBOL_SWAP_MODE m_swap_mode; // symbol swap mode
ENUM_DAY_OF_WEEK m_swap3; // symbol swap3
double m_margin_initial; // symbol margin initial
double m_margin_maintenance; // symbol margin maintenance
bool m_margin_hedged_use_leg; // calculate hedged margin using larger leg
double m_margin_hedged; // symbol margin hedged
int m_trade_time_flags; // symbol trade time flags
int m_trade_fill_flags; // symbol trade fill flags
public:
CSymbolInfo(void);
~CSymbolInfo(void);
//--- methods of access to protected data
string Name(void) const { return(m_name); }
bool Name(const string name);
bool Refresh(void);
bool RefreshRates(void);
//--- fast access methods to the integer symbol propertyes
bool Select(void) const;
bool Select(const bool select);
bool IsSynchronized(void) const;
//--- volumes
ulong Volume(void) const { return(m_tick.volume); }
ulong VolumeHigh(void) const;
ulong VolumeLow(void) const;
//--- miscellaneous
datetime Time(void) const { return(m_tick.time); }
int Spread(void) const;
bool SpreadFloat(void) const;
int TicksBookDepth(void) const;
//--- trade levels
int StopsLevel(void) const;
int FreezeLevel(void) const;
//--- fast access methods to the double symbol propertyes
//--- bid parameters
double Bid(void) const { return(m_tick.bid); }
double BidHigh(void) const;
double BidLow(void) const;
//--- ask parameters
double Ask(void) const { return(m_tick.ask); }
double AskHigh(void) const;
double AskLow(void) const;
//--- last parameters
double Last(void) const { return(m_tick.last); }
double LastHigh(void) const;
double LastLow(void) const;
//--- fast access methods to the mix symbol propertyes
int OrderMode(void) const { return(m_order_mode); }
//--- terms of trade
ENUM_SYMBOL_CALC_MODE TradeCalcMode(void) const { return(m_trade_calcmode); }
string TradeCalcModeDescription(void) const;
ENUM_SYMBOL_TRADE_MODE TradeMode(void) const { return(m_trade_mode); }
string TradeModeDescription(void) const;
//--- execution terms of trade
ENUM_SYMBOL_TRADE_EXECUTION TradeExecution(void) const { return(m_trade_execution); }
string TradeExecutionDescription(void) const;
//--- swap terms of trade
ENUM_SYMBOL_SWAP_MODE SwapMode(void) const { return(m_swap_mode); }
string SwapModeDescription(void) const;
ENUM_DAY_OF_WEEK SwapRollover3days(void) const { return(m_swap3); }
string SwapRollover3daysDescription(void) const;
//--- dates for futures
datetime StartTime(void) const;
datetime ExpirationTime(void) const;
//--- margin parameters
double MarginInitial(void) const { return(m_margin_initial); }
double MarginMaintenance(void) const { return(m_margin_maintenance); }
bool MarginHedgedUseLeg(void) const { return(m_margin_hedged_use_leg); }
double MarginHedged(void) const { return(m_margin_hedged); }
//--- left for backward compatibility
double MarginLong(void) const { return(0.0); }
double MarginShort(void) const { return(0.0); }
double MarginLimit(void) const { return(0.0); }
double MarginStop(void) const { return(0.0); }
double MarginStopLimit(void) const { return(0.0); }
//--- trade flags parameters
int TradeTimeFlags(void) const { return(m_trade_time_flags); }
int TradeFillFlags(void) const { return(m_trade_fill_flags); }
//--- tick parameters
int Digits(void) const { return(m_digits); }
double Point(void) const { return(m_point); }
double TickValue(void) const { return(m_tick_value); }
double TickValueProfit(void) const { return(m_tick_value_profit); }
double TickValueLoss(void) const { return(m_tick_value_loss); }
double TickSize(void) const { return(m_tick_size); }
//--- lots parameters
double ContractSize(void) const { return(m_contract_size); }
double LotsMin(void) const { return(m_lots_min); }
double LotsMax(void) const { return(m_lots_max); }
double LotsStep(void) const { return(m_lots_step); }
double LotsLimit(void) const { return(m_lots_limit); }
//--- swaps
double SwapLong(void) const { return(m_swap_long); }
double SwapShort(void) const { return(m_swap_short); }
//--- fast access methods to the string symbol propertyes
string CurrencyBase(void) const;
string CurrencyProfit(void) const;
string CurrencyMargin(void) const;
string Bank(void) const;
string Description(void) const;
string Path(void) const;
//--- session information
long SessionDeals(void) const;
long SessionBuyOrders(void) const;
long SessionSellOrders(void) const;
double SessionTurnover(void) const;
double SessionInterest(void) const;
double SessionBuyOrdersVolume(void) const;
double SessionSellOrdersVolume(void) const;
double SessionOpen(void) const;
double SessionClose(void) const;
double SessionAW(void) const;
double SessionPriceSettlement(void) const;
double SessionPriceLimitMin(void) const;
double SessionPriceLimitMax(void) const;
//--- access methods to the API MQL5 functions
bool InfoInteger(const ENUM_SYMBOL_INFO_INTEGER prop_id,long& var) const;
bool InfoDouble(const ENUM_SYMBOL_INFO_DOUBLE prop_id,double& var) const;
bool InfoString(const ENUM_SYMBOL_INFO_STRING prop_id,string& var) const;
bool InfoMarginRate(const ENUM_ORDER_TYPE order_type,double& initial_margin_rate,double& maintenance_margin_rate) const;
//--- service methods
double NormalizePrice(const double price) const;
bool CheckMarketWatch(void);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CSymbolInfo::CSymbolInfo(void) : m_name(NULL),
m_point(0.0),
m_tick_value(0.0),
m_tick_value_profit(0.0),
m_tick_value_loss(0.0),
m_tick_size(0.0),
m_contract_size(0.0),
m_lots_min(0.0),
m_lots_max(0.0),
m_lots_step(0.0),
m_swap_long(0.0),
m_swap_short(0.0),
m_digits(0),
m_order_mode(0),
m_trade_execution(0),
m_trade_calcmode(0),
m_trade_mode(0),
m_swap_mode(0),
m_swap3(0),
m_margin_initial(0.0),
m_margin_maintenance(0.0),
m_margin_hedged_use_leg(false),
m_margin_hedged(0.0),
m_trade_time_flags(0),
m_trade_fill_flags(0)
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CSymbolInfo::~CSymbolInfo(void)
{
}
//+------------------------------------------------------------------+
//| Set name |
//+------------------------------------------------------------------+
bool CSymbolInfo::Name(const string name)
{
string symbol_name=StringLen(name)>0 ? name : _Symbol;
//--- check previous set name
if(m_name!=symbol_name)
{
m_name=symbol_name;
//---
if(!CheckMarketWatch())
return(false);
//---
if(!Refresh())
{
m_name="";
Print(__FUNCTION__+": invalid data of symbol '"+symbol_name+"'");
return(false);
}
}
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| Refresh cached data |
//+------------------------------------------------------------------+
bool CSymbolInfo::Refresh(void)
{
long tmp_long=0;
//---
if(!SymbolInfoDouble(m_name,SYMBOL_POINT,m_point))
return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE,m_tick_value))
return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE_PROFIT,m_tick_value_profit))
return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE_LOSS,m_tick_value_loss))
return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_SIZE,m_tick_size))
return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_CONTRACT_SIZE,m_contract_size))
return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_VOLUME_MIN,m_lots_min))
return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_VOLUME_MAX,m_lots_max))
return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_VOLUME_STEP,m_lots_step))
return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_VOLUME_LIMIT,m_lots_limit))
return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_SWAP_LONG,m_swap_long))
return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_SWAP_SHORT,m_swap_short))
return(false);
if(!SymbolInfoInteger(m_name,SYMBOL_DIGITS,tmp_long))
return(false);
m_digits=(int)tmp_long;
if(!SymbolInfoInteger(m_name,SYMBOL_ORDER_MODE,tmp_long))
return(false);
m_order_mode=(int)tmp_long;
if(!SymbolInfoInteger(m_name,SYMBOL_TRADE_EXEMODE,tmp_long))
return(false);
m_trade_execution=(ENUM_SYMBOL_TRADE_EXECUTION)tmp_long;
if(!SymbolInfoInteger(m_name,SYMBOL_TRADE_CALC_MODE,tmp_long))
return(false);
m_trade_calcmode=(ENUM_SYMBOL_CALC_MODE)tmp_long;
if(!SymbolInfoInteger(m_name,SYMBOL_TRADE_MODE,tmp_long))
return(false);
m_trade_mode=(ENUM_SYMBOL_TRADE_MODE)tmp_long;
if(!SymbolInfoInteger(m_name,SYMBOL_SWAP_MODE,tmp_long))
return(false);
m_swap_mode=(ENUM_SYMBOL_SWAP_MODE)tmp_long;
if(!SymbolInfoInteger(m_name,SYMBOL_SWAP_ROLLOVER3DAYS,tmp_long))
return(false);
m_swap3=(ENUM_DAY_OF_WEEK)tmp_long;
if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_INITIAL,m_margin_initial))
return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_MAINTENANCE,m_margin_maintenance))
return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_HEDGED,m_margin_hedged))
return(false);
if(!SymbolInfoInteger(m_name,SYMBOL_MARGIN_HEDGED_USE_LEG,tmp_long))
return(false);
m_margin_hedged_use_leg=(bool)tmp_long;
if(!SymbolInfoInteger(m_name,SYMBOL_EXPIRATION_MODE,tmp_long))
return(false);
m_trade_time_flags=(int)tmp_long;
if(!SymbolInfoInteger(m_name,SYMBOL_FILLING_MODE,tmp_long))
return(false);
m_trade_fill_flags=(int)tmp_long;
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| Refresh cached data |
//+------------------------------------------------------------------+
bool CSymbolInfo::RefreshRates(void)
{
return(SymbolInfoTick(m_name,m_tick));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SELECT" |
//+------------------------------------------------------------------+
bool CSymbolInfo::Select(void) const
{
return((bool)SymbolInfoInteger(m_name,SYMBOL_SELECT));
}
//+------------------------------------------------------------------+
//| Set the property value "SYMBOL_SELECT" |
//+------------------------------------------------------------------+
bool CSymbolInfo::Select(const bool select)
{
return(SymbolSelect(m_name,select));
}
//+------------------------------------------------------------------+
//| Check synchronize symbol |
//+------------------------------------------------------------------+
bool CSymbolInfo::IsSynchronized(void) const
{
return(SymbolIsSynchronized(m_name));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_VOLUMEHIGH" |
//+------------------------------------------------------------------+
ulong CSymbolInfo::VolumeHigh(void) const
{
return(SymbolInfoInteger(m_name,SYMBOL_VOLUMEHIGH));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_VOLUMELOW" |
//+------------------------------------------------------------------+
ulong CSymbolInfo::VolumeLow(void) const
{
return(SymbolInfoInteger(m_name,SYMBOL_VOLUMELOW));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SPREAD" |
//+------------------------------------------------------------------+
int CSymbolInfo::Spread(void) const
{
return((int)SymbolInfoInteger(m_name,SYMBOL_SPREAD));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SPREAD_FLOAT" |
//+------------------------------------------------------------------+
bool CSymbolInfo::SpreadFloat(void) const
{
return((bool)SymbolInfoInteger(m_name,SYMBOL_SPREAD_FLOAT));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_TICKS_BOOKDEPTH" |
//+------------------------------------------------------------------+
int CSymbolInfo::TicksBookDepth(void) const
{
return((int)SymbolInfoInteger(m_name,SYMBOL_TICKS_BOOKDEPTH));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_TRADE_STOPS_LEVEL" |
//+------------------------------------------------------------------+
int CSymbolInfo::StopsLevel(void) const
{
return((int)SymbolInfoInteger(m_name,SYMBOL_TRADE_STOPS_LEVEL));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_TRADE_FREEZE_LEVEL" |
//+------------------------------------------------------------------+
int CSymbolInfo::FreezeLevel(void) const
{
return((int)SymbolInfoInteger(m_name,SYMBOL_TRADE_FREEZE_LEVEL));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_BIDHIGH" |
//+------------------------------------------------------------------+
double CSymbolInfo::BidHigh(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_BIDHIGH));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_BIDLOW" |
//+------------------------------------------------------------------+
double CSymbolInfo::BidLow(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_BIDLOW));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_ASKHIGH" |
//+------------------------------------------------------------------+
double CSymbolInfo::AskHigh(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_ASKHIGH));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_ASKLOW" |
//+------------------------------------------------------------------+
double CSymbolInfo::AskLow(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_ASKLOW));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_LASTHIGH" |
//+------------------------------------------------------------------+
double CSymbolInfo::LastHigh(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_LASTHIGH));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_LASTLOW" |
//+------------------------------------------------------------------+
double CSymbolInfo::LastLow(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_LASTLOW));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_TRADE_CALC_MODE" as string |
//+------------------------------------------------------------------+
string CSymbolInfo::TradeCalcModeDescription(void) const
{
string str;
//---
switch(m_trade_calcmode)
{
case SYMBOL_CALC_MODE_FOREX:
str="Calculation of profit and margin for Forex";
break;
case SYMBOL_CALC_MODE_CFD:
str="Calculation of collateral and earnings for CFD";
break;
case SYMBOL_CALC_MODE_FUTURES:
str="Calculation of collateral and profits for futures";
break;
case SYMBOL_CALC_MODE_CFDINDEX:
str="Calculation of collateral and earnings for CFD on indices";
break;
case SYMBOL_CALC_MODE_CFDLEVERAGE:
str="Calculation of collateral and earnings for the CFD when trading with leverage";
break;
case SYMBOL_CALC_MODE_EXCH_STOCKS:
str="Calculation for exchange stocks";
break;
case SYMBOL_CALC_MODE_EXCH_FUTURES:
str="Calculation for exchange futures";
break;
case SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS:
str="Calculation for FORTS futures";
break;
default:
str="Unknown calculation mode";
}
//--- result
return(str);
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_TRADE_MODE" as string |
//+------------------------------------------------------------------+
string CSymbolInfo::TradeModeDescription(void) const
{
string str;
//---
switch(m_trade_mode)
{
case SYMBOL_TRADE_MODE_DISABLED:
str="Disabled";
break;
case SYMBOL_TRADE_MODE_LONGONLY:
str="Long only";
break;
case SYMBOL_TRADE_MODE_SHORTONLY:
str="Short only";
break;
case SYMBOL_TRADE_MODE_CLOSEONLY:
str="Close only";
break;
case SYMBOL_TRADE_MODE_FULL:
str="Full access";
break;
default:
str="Unknown trade mode";
}
//--- result
return(str);
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_TRADE_EXEMODE" as string |
//+------------------------------------------------------------------+
string CSymbolInfo::TradeExecutionDescription(void) const
{
string str;
//---
switch(m_trade_execution)
{
case SYMBOL_TRADE_EXECUTION_REQUEST:
str="Trading on request";
break;
case SYMBOL_TRADE_EXECUTION_INSTANT:
str="Trading on live streaming prices";
break;
case SYMBOL_TRADE_EXECUTION_MARKET:
str="Execution of orders on the market";
break;
case SYMBOL_TRADE_EXECUTION_EXCHANGE:
str="Exchange execution";
break;
default:
str="Unknown trade execution";
}
//--- result
return(str);
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SWAP_MODE" as string |
//+------------------------------------------------------------------+
string CSymbolInfo::SwapModeDescription(void) const
{
string str;
//---
switch(m_swap_mode)
{
case SYMBOL_SWAP_MODE_DISABLED:
str="No swaps";
break;
case SYMBOL_SWAP_MODE_POINTS:
str="Swaps are calculated in points";
break;
case SYMBOL_SWAP_MODE_CURRENCY_SYMBOL:
str="Swaps are calculated in base currency";
break;
case SYMBOL_SWAP_MODE_CURRENCY_MARGIN:
str="Swaps are calculated in margin currency";
break;
case SYMBOL_SWAP_MODE_CURRENCY_DEPOSIT:
str="Swaps are calculated in deposit currency";
break;
case SYMBOL_SWAP_MODE_INTEREST_CURRENT:
str="Swaps are calculated as annual interest using the current price";
break;
case SYMBOL_SWAP_MODE_INTEREST_OPEN:
str="Swaps are calculated as annual interest using the open price";
break;
case SYMBOL_SWAP_MODE_REOPEN_CURRENT:
str="Swaps are charged by reopening positions at the close price";
break;
case SYMBOL_SWAP_MODE_REOPEN_BID:
str="Swaps are charged by reopening positions at the Bid price";
break;
default:
str="Unknown swap mode";
}
//--- result
return(str);
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SWAP_ROLLOVER3DAYS" as string |
//+------------------------------------------------------------------+
string CSymbolInfo::SwapRollover3daysDescription(void) const
{
string str;
//---
switch(m_swap3)
{
case SUNDAY:
str="Sunday";
break;
case MONDAY:
str="Monday";
break;
case TUESDAY:
str="Tuesday";
break;
case WEDNESDAY:
str="Wednesday";
break;
case THURSDAY:
str="Thursday";
break;
case FRIDAY:
str="Friday";
break;
case SATURDAY:
str="Saturday";
break;
default:
str="Unknown";
}
//--- result
return(str);
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_START_TIME" |
//+------------------------------------------------------------------+
datetime CSymbolInfo::StartTime(void) const
{
return((datetime)SymbolInfoInteger(m_name,SYMBOL_START_TIME));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_EXPIRATION_TIME" |
//+------------------------------------------------------------------+
datetime CSymbolInfo::ExpirationTime(void) const
{
return((datetime)SymbolInfoInteger(m_name,SYMBOL_EXPIRATION_TIME));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_CURRENCY_BASE" |
//+------------------------------------------------------------------+
string CSymbolInfo::CurrencyBase(void) const
{
return(SymbolInfoString(m_name,SYMBOL_CURRENCY_BASE));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_CURRENCY_PROFIT" |
//+------------------------------------------------------------------+
string CSymbolInfo::CurrencyProfit(void) const
{
return(SymbolInfoString(m_name,SYMBOL_CURRENCY_PROFIT));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_CURRENCY_MARGIN" |
//+------------------------------------------------------------------+
string CSymbolInfo::CurrencyMargin(void) const
{
return(SymbolInfoString(m_name,SYMBOL_CURRENCY_MARGIN));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_BANK" |
//+------------------------------------------------------------------+
string CSymbolInfo::Bank(void) const
{
return(SymbolInfoString(m_name,SYMBOL_BANK));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_DESCRIPTION" |
//+------------------------------------------------------------------+
string CSymbolInfo::Description(void) const
{
return(SymbolInfoString(m_name,SYMBOL_DESCRIPTION));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_PATH" |
//+------------------------------------------------------------------+
string CSymbolInfo::Path(void) const
{
return(SymbolInfoString(m_name,SYMBOL_PATH));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SESSION_DEALS" |
//+------------------------------------------------------------------+
long CSymbolInfo::SessionDeals(void) const
{
return(SymbolInfoInteger(m_name,SYMBOL_SESSION_DEALS));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SESSION_BUY_ORDERS" |
//+------------------------------------------------------------------+
long CSymbolInfo::SessionBuyOrders(void) const
{
return(SymbolInfoInteger(m_name,SYMBOL_SESSION_BUY_ORDERS));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SESSION_SELL_ORDERS" |
//+------------------------------------------------------------------+
long CSymbolInfo::SessionSellOrders(void) const
{
return(SymbolInfoInteger(m_name,SYMBOL_SESSION_SELL_ORDERS));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SESSION_TURNOVER" |
//+------------------------------------------------------------------+
double CSymbolInfo::SessionTurnover(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_SESSION_TURNOVER));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SESSION_INTEREST" |
//+------------------------------------------------------------------+
double CSymbolInfo::SessionInterest(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_SESSION_INTEREST));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SESSION_BUY_ORDERS_VOLUME" |
//+------------------------------------------------------------------+
double CSymbolInfo::SessionBuyOrdersVolume(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_SESSION_BUY_ORDERS_VOLUME));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SESSION_SELL_ORDERS_VOLUME" |
//+------------------------------------------------------------------+
double CSymbolInfo::SessionSellOrdersVolume(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_SESSION_SELL_ORDERS_VOLUME));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SESSION_OPEN" |
//+------------------------------------------------------------------+
double CSymbolInfo::SessionOpen(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_SESSION_OPEN));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SESSION_CLOSE" |
//+------------------------------------------------------------------+
double CSymbolInfo::SessionClose(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_SESSION_CLOSE));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SESSION_AW" |
//+------------------------------------------------------------------+
double CSymbolInfo::SessionAW(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_SESSION_AW));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SESSION_PRICE_SETTLEMENT" |
//+------------------------------------------------------------------+
double CSymbolInfo::SessionPriceSettlement(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_SESSION_PRICE_SETTLEMENT));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SESSION_PRICE_LIMIT_MIN" |
//+------------------------------------------------------------------+
double CSymbolInfo::SessionPriceLimitMin(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_SESSION_PRICE_LIMIT_MIN));
}
//+------------------------------------------------------------------+
//| Get the property value "SYMBOL_SESSION_PRICE_LIMIT_MAX" |
//+------------------------------------------------------------------+
double CSymbolInfo::SessionPriceLimitMax(void) const
{
return(SymbolInfoDouble(m_name,SYMBOL_SESSION_PRICE_LIMIT_MAX));
}
//+------------------------------------------------------------------+
//| Access functions SymbolInfoInteger(...) |
//+------------------------------------------------------------------+
bool CSymbolInfo::InfoInteger(const ENUM_SYMBOL_INFO_INTEGER prop_id,long &var) const
{
return(SymbolInfoInteger(m_name,prop_id,var));
}
//+------------------------------------------------------------------+
//| Access functions SymbolInfoDouble(...) |
//+------------------------------------------------------------------+
bool CSymbolInfo::InfoDouble(const ENUM_SYMBOL_INFO_DOUBLE prop_id,double &var) const
{
return(SymbolInfoDouble(m_name,prop_id,var));
}
//+------------------------------------------------------------------+
//| Access functions SymbolInfoString(...) |
//+------------------------------------------------------------------+
bool CSymbolInfo::InfoString(const ENUM_SYMBOL_INFO_STRING prop_id,string &var) const
{
return(SymbolInfoString(m_name,prop_id,var));
}
//+------------------------------------------------------------------+
//| Access functions SymbolInfoMarginRate(...) |
//+------------------------------------------------------------------+
bool CSymbolInfo::InfoMarginRate(const ENUM_ORDER_TYPE order_type,double& initial_margin_rate,double& maintenance_margin_rate) const
{
return(SymbolInfoMarginRate(m_name,order_type,initial_margin_rate,maintenance_margin_rate));
}
//+------------------------------------------------------------------+
//| Normalize price |
//+------------------------------------------------------------------+
double CSymbolInfo::NormalizePrice(const double price) const
{
if(m_tick_size!=0)
return(NormalizeDouble(MathRound(price/m_tick_size)*m_tick_size,m_digits));
//---
return(NormalizeDouble(price,m_digits));
}
//+------------------------------------------------------------------+
//| Checks if symbol is selected in the MarketWatch |
//| and adds symbol to the MarketWatch, if necessary |
//+------------------------------------------------------------------+
bool CSymbolInfo::CheckMarketWatch(void)
{
//--- check if symbol is selected in the MarketWatch
if(!Select())
{
if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL)
{
printf(__FUNCTION__+": Unknown symbol '%s'",m_name);
return(false);
}
if(!Select(true))
{
printf(__FUNCTION__+": Error adding symbol %d",GetLastError());
return(false);
}
}
//--- succeed
return(true);
}
//+------------------------------------------------------------------+