Files
2018-06-20 15:35:55 +02:00

515 lines
44 KiB
Plaintext

//+------------------------------------------------------------------+
//| Symbol.mqh |
//| Copyright 2016, Vasiliy Sokolov. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link "http://www.mql5.com"
#include <Object.mqh>
#include "MarketBook.mqh"
#include "Series.mqh"
#include "SessionInfo.mqh"
//+------------------------------------------------------------------+
//| defines |
//+------------------------------------------------------------------+
class CSymbol : public CObject
{
private:
string m_symbol; // Symbol
ENUM_TIMEFRAMES m_period; // Timeframe
public:
CSymbol(void);
CSymbol(string symbol, ENUM_TIMEFRAMES period);
// Based series
CTime Time;
COpen Open;
CHigh High;
CLow Low;
CClose Close;
CVolume Volume;
CMarketBook MarketBook;
CSessionInfo SessionInfo;
// Based foo
bool InitSeries(string symbol,ENUM_TIMEFRAMES period);
bool Available(void);
string Name(void);
bool Name(string symbol);
ENUM_TIMEFRAMES Period(void);
bool Period(ENUM_TIMEFRAMES period);
// SymbolInfoInteger
bool SelectInMarketWatch(void);
bool SpreadFloat(void);
int Digits(void);
int Spread(void);
int StopLevel(void);
int FreezeLevel(void);
int FlagsExpirationOrders(void);
int FlagsExecutionOrders(void);
int FlagsAllowedOrders(void);
int IndexByTime(datetime time);
int BarsTotal(void);
ENUM_SYMBOL_CALC_MODE CalcContractType(void);
ENUM_SYMBOL_TRADE_MODE ExecuteOrderType(void);
ENUM_SYMBOL_TRADE_EXECUTION ExecuteDealsType(void);
ENUM_SYMBOL_SWAP_MODE CalcSwapMode(void);
ENUM_DAY_OF_WEEK DayOfSwap3x(void);
ENUM_SYMBOL_OPTION_MODE OptionType(void);
ENUM_SYMBOL_OPTION_RIGHT OptionRight(void);
datetime TimeOfLastQuote(void);
datetime StartDate(void);
datetime ExpirationDate(void);
// SymbolInfoDouble
double Ask(void);
double Bid(void);
double Last(void);
double StepToPrice(int price_step);
double PriceStep(void);
double OptionStrike(void);
double TickValue(void);
double ContractSize(void);
double VolumeContractMin(void);
double VolumeContractMax(void);
double VolumeContractStep(void);
double VolumeContractLimit(void);
double SwapLong(void);
double SwapShort();
double MarginInit(void);
double MarginMaintenance(void);
double MarginHedged(void);
// SymbolInfoString
string NameBasisSymbol(void);
string NameBasisCurrency(void);
string NameCurrencyProfit(void);
string NameCurrencyMargin(void);
string NameBank(void);
string Description(void);
string NameISIN(void);
string SymbolPath(void);
};
//+------------------------------------------------------------------+
//| Sets OHLCV series for the current instrument and timeframe |
//+------------------------------------------------------------------+
CSymbol::CSymbol(void)
{
m_symbol = ::Symbol();
m_period = ::Period();
InitSeries(Symbol(), ::Period());
}
//+------------------------------------------------------------------+
//| Returns the total number of bars of this symbol in the current |
//| timeframe |
//+------------------------------------------------------------------+
int CSymbol::BarsTotal(void)
{
int bars = Bars(this.Name(), this.Period());
return bars;
}
//+------------------------------------------------------------------+
//| Returns the bar index corresponding to the specified time |
//+------------------------------------------------------------------+
int CSymbol::IndexByTime(datetime time)
{
int bars = Bars(this.Name(), this.Period(), time, TimeCurrent());
return bars-1;
}
//+------------------------------------------------------------------+
//| Sets OHLCV series for the specified instrument and timeframe |
//+------------------------------------------------------------------+
CSymbol::CSymbol(string symbol, ENUM_TIMEFRAMES period)
{
m_symbol = symbol;
m_period = period;
InitSeries(symbol, period);
}
//+------------------------------------------------------------------+
//| Returns the symbol |
//+------------------------------------------------------------------+
string CSymbol::Name(void)
{
return m_symbol;
}
//+------------------------------------------------------------------+
//| Sets the symbol |
//+------------------------------------------------------------------+
bool CSymbol::Name(string symbol)
{
m_symbol = symbol;
InitSeries(m_symbol, m_period);
return Available();
}
//+------------------------------------------------------------------+
//| Returns the period of the instrument |
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES CSymbol::Period(void)
{
return m_period;
}
//+------------------------------------------------------------------+
//| Sets the period of the instrument |
//+------------------------------------------------------------------+
bool CSymbol::Period(ENUM_TIMEFRAMES period)
{
m_period = period;
InitSeries(m_symbol, m_period);
return Available();
}
//+------------------------------------------------------------------+
//| Sets OHLCV series for the current instrument and timeframe. |
//| Returns true if the symbol is available and false in the opposite|
//| case |
//+------------------------------------------------------------------+
bool CSymbol::InitSeries(string symbol,ENUM_TIMEFRAMES period)
{
m_symbol = symbol;
Time.Symbol(symbol);
Time.Timeframe(period);
Open.Symbol(symbol);
Open.Timeframe(period);
High.Symbol(symbol);
High.Timeframe(period);
Low.Symbol(symbol);
Low.Timeframe(period);
Close.Symbol(symbol);
Close.Timeframe(period);
Volume.Symbol(symbol);
Volume.Timeframe(period);
SessionInfo.Symbol(symbol);
return Time.Total() > 0;
}
//+------------------------------------------------------------------+
//| Returns true if the symbol is available for work and false |
//| otherwise |
//+------------------------------------------------------------------+
bool CSymbol::Available(void)
{
return Bars(m_symbol, m_period) > 0;
}
//+------------------------------------------------------------------+
//| An indication that the symbol exists in the terminal |
//+------------------------------------------------------------------+
bool CSymbol::SelectInMarketWatch(void)
{
return (bool)SymbolInfoInteger(m_symbol, SYMBOL_SELECT);
}
//+------------------------------------------------------------------+
//| An indication of the floating spread |
//+------------------------------------------------------------------+
bool CSymbol::SpreadFloat(void)
{
return (bool)SymbolInfoInteger(m_symbol, SYMBOL_SPREAD_FLOAT);
}
//+------------------------------------------------------------------+
//| Spread value in points |
//+------------------------------------------------------------------+
int CSymbol::Spread(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_SPREAD);
}
//+------------------------------------------------------------------+
//| Minimum distance in points from the current close price |
//| for setting Stop orders |
//+------------------------------------------------------------------+
int CSymbol::StopLevel(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_STOPS_LEVEL);
}
//+------------------------------------------------------------------+
//| Freeze distance for trading operations (in points) |
//+------------------------------------------------------------------+
int CSymbol::FreezeLevel(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_FREEZE_LEVEL);
}
//+------------------------------------------------------------------+
//| Flags of allowed order expiration modes |
//+------------------------------------------------------------------+
int CSymbol::FlagsExpirationOrders(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_EXPIRATION_MODE);
}
//+------------------------------------------------------------------+
//| Flags of allowed order execution modes |
//+------------------------------------------------------------------+
int CSymbol::FlagsExecutionOrders(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_FILLING_MODE);
}
//+------------------------------------------------------------------+
//| Flags of allowed order types |
//+------------------------------------------------------------------+
int CSymbol::FlagsAllowedOrders(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_ORDER_MODE);
}
//+------------------------------------------------------------------+
//| An indication that the symbol is selected in Market Watch |
//+------------------------------------------------------------------+
int CSymbol::Digits(void)
{
int digits=(int)SymbolInfoInteger(m_symbol, SYMBOL_DIGITS);
return digits;
}
//+------------------------------------------------------------------+
//| Contract price calculation mode |
//+------------------------------------------------------------------+
ENUM_SYMBOL_CALC_MODE CSymbol::CalcContractType(void)
{
return (ENUM_SYMBOL_CALC_MODE)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_CALC_MODE);
}
//+------------------------------------------------------------------+
//| Order execution type |
//+------------------------------------------------------------------+
ENUM_SYMBOL_TRADE_MODE CSymbol::ExecuteOrderType(void)
{
return (ENUM_SYMBOL_TRADE_MODE)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_MODE);
}
//+------------------------------------------------------------------+
//| Deal execution type |
//+------------------------------------------------------------------+
ENUM_SYMBOL_TRADE_EXECUTION CSymbol::ExecuteDealsType(void)
{
return (ENUM_SYMBOL_TRADE_EXECUTION)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_EXEMODE);
}
//+------------------------------------------------------------------+
//| Swap calculation model |
//+------------------------------------------------------------------+
ENUM_SYMBOL_SWAP_MODE CSymbol::CalcSwapMode(void)
{
return (ENUM_SYMBOL_SWAP_MODE)SymbolInfoInteger(m_symbol, SYMBOL_SWAP_MODE);
}
//+------------------------------------------------------------------+
//| Triple-day swap day |
//+------------------------------------------------------------------+
ENUM_DAY_OF_WEEK CSymbol::DayOfSwap3x(void)
{
return (ENUM_DAY_OF_WEEK)SymbolInfoInteger(m_symbol, SYMBOL_SWAP_ROLLOVER3DAYS);
}
//+------------------------------------------------------------------+
//| Option type |
//+------------------------------------------------------------------+
ENUM_SYMBOL_OPTION_MODE CSymbol::OptionType(void)
{
return (ENUM_SYMBOL_OPTION_MODE)SymbolInfoInteger(m_symbol, SYMBOL_OPTION_MODE);
}
//+------------------------------------------------------------------+
//| Option right (Call/Put) |
//+------------------------------------------------------------------+
ENUM_SYMBOL_OPTION_RIGHT CSymbol::OptionRight(void)
{
return (ENUM_SYMBOL_OPTION_RIGHT)SymbolInfoInteger(m_symbol, SYMBOL_OPTION_RIGHT);
}
//+------------------------------------------------------------------+
//| Time of the last quote |
//+------------------------------------------------------------------+
datetime CSymbol::TimeOfLastQuote(void)
{
return (datetime)SymbolInfoInteger(m_symbol, SYMBOL_TIME);
}
//+------------------------------------------------------------------+
//| Trading start date for an instrument |
//+------------------------------------------------------------------+
datetime CSymbol::StartDate(void)
{
return (datetime)SymbolInfoInteger(m_symbol, SYMBOL_START_TIME);
}
//+------------------------------------------------------------------+
//| Trading end date for an instrument |
//+------------------------------------------------------------------+
datetime CSymbol::ExpirationDate(void)
{
return (datetime)SymbolInfoInteger(m_symbol, SYMBOL_EXPIRATION_TIME);
}
//+------------------------------------------------------------------+
//| Returns Ask price. |
//+------------------------------------------------------------------+
double CSymbol::Ask(void)
{
double ask = SymbolInfoDouble(m_symbol, SYMBOL_ASK);
int digits = (int)SymbolInfoInteger(m_symbol, SYMBOL_DIGITS);
ask=NormalizeDouble(ask,digits);
return ask;
}
//+------------------------------------------------------------------+
//| Returns Bid price. |
//+------------------------------------------------------------------+
double CSymbol::Bid(void)
{
double bid = SymbolInfoDouble(m_symbol, SYMBOL_BID);
int digits = (int)SymbolInfoInteger(m_symbol, SYMBOL_DIGITS);
bid=NormalizeDouble(bid,digits);
return bid;
}
//+------------------------------------------------------------------+
//| Returns Last price. |
//+------------------------------------------------------------------+
double CSymbol::Last(void)
{
double last= SymbolInfoDouble(m_symbol,SYMBOL_LAST);
int digits =(int)SymbolInfoInteger(m_symbol,SYMBOL_DIGITS);
last=NormalizeDouble(last,digits);
return last;
}
//+------------------------------------------------------------------+
//| Returns price steps as the price. For example, passed value |
//| 3 on 5-digit EURUSD will be converted to 0.00003 |
//+------------------------------------------------------------------+
double CSymbol::StepToPrice(int price_step)
{
double price = SymbolInfoDouble(m_symbol, SYMBOL_POINT)*(double)price_step;
return price;
}
//+------------------------------------------------------------------+
//| Returns the minimum price change for the instrument, for example |
//| EURUSD 5-digit 0.00001 will be returned |
//+------------------------------------------------------------------+
double CSymbol::PriceStep(void)
{
double price = SymbolInfoDouble(m_symbol, SYMBOL_POINT);
return price;
}
//+------------------------------------------------------------------+
//| Returns option execution price |
//+------------------------------------------------------------------+
double CSymbol::OptionStrike(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_OPTION_STRIKE);
}
//+------------------------------------------------------------------+
//| Returns the value of one tick expressed in the deposit currency |
//+------------------------------------------------------------------+
double CSymbol::TickValue(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_TRADE_TICK_VALUE);
}
//+------------------------------------------------------------------+
//| The size of one contract in the base contract units |
//+------------------------------------------------------------------+
double CSymbol::ContractSize(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_TRADE_CONTRACT_SIZE);
}
//+------------------------------------------------------------------+
//| Minimum volume for deal execution in contracts |
//+------------------------------------------------------------------+
double CSymbol::VolumeContractMin(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_MIN);
}
//+-------------------------------------------------------------------+
//| Maximum volume for deal execution in contracts |
//+-------------------------------------------------------------------+
double CSymbol::VolumeContractMax(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_MAX);
}
//+-------------------------------------------------------------------+
//| The maximum allowed for this symbol total volume of an |
//| open position |
//+-------------------------------------------------------------------+
double CSymbol::VolumeContractLimit(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_LIMIT);
}
//+-------------------------------------------------------------------+
//| The minimum volume change step for deal execution |
//+-------------------------------------------------------------------+
double CSymbol::VolumeContractStep(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_STEP);
}
//+-------------------------------------------------------------------+
//| The value of swap charged for holding a long position with volume |
//| of one contract |
//+-------------------------------------------------------------------+
double CSymbol::SwapLong(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_SWAP_LONG);
}
//+-------------------------------------------------------------------+
//| The value of swap charged for holding a short position with volume|
//| of one contract |
//+-------------------------------------------------------------------+
double CSymbol::SwapShort(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_SWAP_SHORT);
}
//+-------------------------------------------------------------------+
//| The margin required to open a one-lot position |
//+-------------------------------------------------------------------+
double CSymbol::MarginInit(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_MARGIN_INITIAL);
}
//+-------------------------------------------------------------------+
//| The margin required to maintain one lot of an open position |
//+-------------------------------------------------------------------+
double CSymbol::MarginMaintenance(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_MARGIN_MAINTENANCE);
}
//+-------------------------------------------------------------------+
//| The margin required to maintain one lot of a hedged position |
//+-------------------------------------------------------------------+
double CSymbol::MarginHedged(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_MARGIN_HEDGED);
}
//+-------------------------------------------------------------------+
//| The name of the underlaying asset for a derivative symbol |
//+-------------------------------------------------------------------+
string CSymbol::NameBasisSymbol(void)
{
return SymbolInfoString(m_symbol, SYMBOL_BASIS);
}
//+-------------------------------------------------------------------+
//| The base currency of an instrument |
//+-------------------------------------------------------------------+
string CSymbol::NameBasisCurrency(void)
{
return SymbolInfoString(m_symbol, SYMBOL_CURRENCY_BASE);
}
//+-------------------------------------------------------------------+
//| Profit currency |
//+-------------------------------------------------------------------+
string CSymbol::NameCurrencyProfit(void)
{
return SymbolInfoString(m_symbol, SYMBOL_CURRENCY_PROFIT);
}
//+-------------------------------------------------------------------+
//| Margin currency |
//+-------------------------------------------------------------------+
string CSymbol::NameCurrencyMargin(void)
{
return SymbolInfoString(m_symbol, SYMBOL_CURRENCY_MARGIN);
}
//+-------------------------------------------------------------------+
//| The source of the current quote |
//+-------------------------------------------------------------------+
string CSymbol::NameBank(void)
{
return SymbolInfoString(m_symbol, SYMBOL_BANK);
}
//+-------------------------------------------------------------------+
//| The string description of a symbol |
//+-------------------------------------------------------------------+
string CSymbol::Description(void)
{
return SymbolInfoString(m_symbol, SYMBOL_DESCRIPTION);
}
//+-------------------------------------------------------------------+
//| The name of a trading symbol in the international |
//| system of securities identification numbers ISIN |
//+-------------------------------------------------------------------+
string CSymbol::NameISIN(void)
{
return SymbolInfoString(m_symbol, SYMBOL_ISIN);
}
//+-------------------------------------------------------------------+
//| Path in the symbol tree |
//+-------------------------------------------------------------------+
string CSymbol::SymbolPath(void)
{
return SymbolInfoString(m_symbol, SYMBOL_PATH);
}