UTE/Strategy/Symbol.mqh
super.admin bd7e405a90 convert
2025-05-30 16:34:43 +02:00

515 lines
No EOL
44 KiB
MQL5

//+------------------------------------------------------------------+
//| 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; // Символ инструмента
ENUM_TIMEFRAMES m_period; // Таймфрейм инструмента
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);
};
//+------------------------------------------------------------------+
//| Устанавливает серии OHLCV для текущего инструмента и таймфрейма |
//+------------------------------------------------------------------+
CSymbol::CSymbol(void)
{
m_symbol = ::Symbol();
m_period = ::Period();
InitSeries(Symbol(), ::Period());
}
//+------------------------------------------------------------------+
//| Возвращает общее количество баров данной инструмента по текущему |
//| таймфрейму |
//+------------------------------------------------------------------+
int CSymbol::BarsTotal(void)
{
int bars = Bars(this.Name(), this.Period());
return bars;
}
//+------------------------------------------------------------------+
//| Возвращает индекс бара, соответствующий указаному времени |
//+------------------------------------------------------------------+
int CSymbol::IndexByTime(datetime time)
{
int bars = Bars(this.Name(), this.Period(), time, TimeCurrent());
return bars-1;
}
//+------------------------------------------------------------------+
//| Устанавливает серии OHLCV для указанного инструмента и таймфрейма|
//+------------------------------------------------------------------+
CSymbol::CSymbol(string symbol, ENUM_TIMEFRAMES period)
{
m_symbol = symbol;
m_period = period;
InitSeries(symbol, period);
}
//+------------------------------------------------------------------+
//| Возвращает символ инструмента |
//+------------------------------------------------------------------+
string CSymbol::Name(void)
{
return m_symbol;
}
//+------------------------------------------------------------------+
//| Устанавливает символ инструмента |
//+------------------------------------------------------------------+
bool CSymbol::Name(string symbol)
{
m_symbol = symbol;
InitSeries(m_symbol, m_period);
return Available();
}
//+------------------------------------------------------------------+
//| Возвращает период инструмента |
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES CSymbol::Period(void)
{
return m_period;
}
//+------------------------------------------------------------------+
//| Устанавливает период инструмента |
//+------------------------------------------------------------------+
bool CSymbol::Period(ENUM_TIMEFRAMES period)
{
m_period = period;
InitSeries(m_symbol, m_period);
return Available();
}
//+------------------------------------------------------------------+
//| Устанавливает серии OHLCV для текущего инструмента и таймфрейма. |
//| Возвращает истину, если инструмент доступен и ложь в противном |
//| случае |
//+------------------------------------------------------------------+
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;
}
//+------------------------------------------------------------------+
//| Возвращает истину, если инструмент доступен для работы и ложь в |
//| противном случае |
//+------------------------------------------------------------------+
bool CSymbol::Available(void)
{
return Bars(m_symbol, m_period) > 0;
}
//+------------------------------------------------------------------+
//| Признак того, что данный инструмент присутствует в терминале |
//+------------------------------------------------------------------+
bool CSymbol::SelectInMarketWatch(void)
{
return (bool)SymbolInfoInteger(m_symbol, SYMBOL_SELECT);
}
//+------------------------------------------------------------------+
//| Признак плавающего спреда |
//+------------------------------------------------------------------+
bool CSymbol::SpreadFloat(void)
{
return (bool)SymbolInfoInteger(m_symbol, SYMBOL_SPREAD_FLOAT);
}
//+------------------------------------------------------------------+
//| Размер спреда в пунктах |
//+------------------------------------------------------------------+
int CSymbol::Spread(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_SPREAD);
}
//+------------------------------------------------------------------+
//| Минимальный отступ в пунктах от текущей цены закрытия |
//| для установки Stop ордеров |
//+------------------------------------------------------------------+
int CSymbol::StopLevel(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_STOPS_LEVEL);
}
//+------------------------------------------------------------------+
//| Дистанция заморозки торговых операций (в пунктах) |
//+------------------------------------------------------------------+
int CSymbol::FreezeLevel(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_FREEZE_LEVEL);
}
//+------------------------------------------------------------------+
//| Флаги разрешенных режимов истечения ордера |
//+------------------------------------------------------------------+
int CSymbol::FlagsExpirationOrders(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_EXPIRATION_MODE);
}
//+------------------------------------------------------------------+
//| Флаги разрешенных режимов исполнения ордера |
//+------------------------------------------------------------------+
int CSymbol::FlagsExecutionOrders(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_FILLING_MODE);
}
//+------------------------------------------------------------------+
//| Флаги разрешенных типов ордеров |
//+------------------------------------------------------------------+
int CSymbol::FlagsAllowedOrders(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_ORDER_MODE);
}
//+------------------------------------------------------------------+
//| Признак того, что символ выбран в Market Watch |
//+------------------------------------------------------------------+
int CSymbol::Digits(void)
{
int digits=(int)SymbolInfoInteger(m_symbol, SYMBOL_DIGITS);
return digits;
}
//+------------------------------------------------------------------+
//| Способ вычисления стоимости контракта |
//+------------------------------------------------------------------+
ENUM_SYMBOL_CALC_MODE CSymbol::CalcContractType(void)
{
return (ENUM_SYMBOL_CALC_MODE)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_CALC_MODE);
}
//+------------------------------------------------------------------+
//| Тип исполнения ордеров |
//+------------------------------------------------------------------+
ENUM_SYMBOL_TRADE_MODE CSymbol::ExecuteOrderType(void)
{
return (ENUM_SYMBOL_TRADE_MODE)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_MODE);
}
//+------------------------------------------------------------------+
//| Тип исполнения сделок |
//+------------------------------------------------------------------+
ENUM_SYMBOL_TRADE_EXECUTION CSymbol::ExecuteDealsType(void)
{
return (ENUM_SYMBOL_TRADE_EXECUTION)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_EXEMODE);
}
//+------------------------------------------------------------------+
//| Модель расчета свопа |
//+------------------------------------------------------------------+
ENUM_SYMBOL_SWAP_MODE CSymbol::CalcSwapMode(void)
{
return (ENUM_SYMBOL_SWAP_MODE)SymbolInfoInteger(m_symbol, SYMBOL_SWAP_MODE);
}
//+------------------------------------------------------------------+
//| День недели для начисления тройного свопа |
//+------------------------------------------------------------------+
ENUM_DAY_OF_WEEK CSymbol::DayOfSwap3x(void)
{
return (ENUM_DAY_OF_WEEK)SymbolInfoInteger(m_symbol, SYMBOL_SWAP_ROLLOVER3DAYS);
}
//+------------------------------------------------------------------+
//| Тип опциона |
//+------------------------------------------------------------------+
ENUM_SYMBOL_OPTION_MODE CSymbol::OptionType(void)
{
return (ENUM_SYMBOL_OPTION_MODE)SymbolInfoInteger(m_symbol, SYMBOL_OPTION_MODE);
}
//+------------------------------------------------------------------+
//| Право опциона (Call/Put) |
//+------------------------------------------------------------------+
ENUM_SYMBOL_OPTION_RIGHT CSymbol::OptionRight(void)
{
return (ENUM_SYMBOL_OPTION_RIGHT)SymbolInfoInteger(m_symbol, SYMBOL_OPTION_RIGHT);
}
//+------------------------------------------------------------------+
//| Время последней котировки |
//+------------------------------------------------------------------+
datetime CSymbol::TimeOfLastQuote(void)
{
return (datetime)SymbolInfoInteger(m_symbol, SYMBOL_TIME);
}
//+------------------------------------------------------------------+
//| Дата начала торгов по инструменту |
//+------------------------------------------------------------------+
datetime CSymbol::StartDate(void)
{
return (datetime)SymbolInfoInteger(m_symbol, SYMBOL_START_TIME);
}
//+------------------------------------------------------------------+
//| Дата окончания торгов по инструменту |
//+------------------------------------------------------------------+
datetime CSymbol::ExpirationDate(void)
{
return (datetime)SymbolInfoInteger(m_symbol, SYMBOL_EXPIRATION_TIME);
}
//+------------------------------------------------------------------+
//| Возвращает цену Ask. |
//+------------------------------------------------------------------+
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;
}
//+------------------------------------------------------------------+
//| Возвращает цену Bid. |
//+------------------------------------------------------------------+
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;
}
//+------------------------------------------------------------------+
//| Возвращает цену Last. |
//+------------------------------------------------------------------+
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;
}
//+------------------------------------------------------------------+
//| Возвращает прайстепы в виде цены. Например переданное значение |
//| 3 на EURUSD пятизнаке будет сконвертированно в 0.00003 |
//+------------------------------------------------------------------+
double CSymbol::StepToPrice(int price_step)
{
double price = SymbolInfoDouble(m_symbol, SYMBOL_POINT)*(double)price_step;
return price;
}
//+------------------------------------------------------------------+
//| Возвращает минимальное изменение цены инструмента, например для |
//| EURUSD пятизнаке будет возвращено 0.00001 |
//+------------------------------------------------------------------+
double CSymbol::PriceStep(void)
{
double price = SymbolInfoDouble(m_symbol, SYMBOL_POINT);
return price;
}
//+------------------------------------------------------------------+
//| Возвращает цену исполнения опциона |
//+------------------------------------------------------------------+
double CSymbol::OptionStrike(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_OPTION_STRIKE);
}
//+------------------------------------------------------------------+
//| Возвращает стоимость одного тика выраженную в валюте дипозита |
//+------------------------------------------------------------------+
double CSymbol::TickValue(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_TRADE_TICK_VALUE);
}
//+------------------------------------------------------------------+
//| Размер одного контракта в базовых еденицах контракта |
//+------------------------------------------------------------------+
double CSymbol::ContractSize(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_TRADE_CONTRACT_SIZE);
}
//+------------------------------------------------------------------+
//| Минимальный объем для заключения сделки, выраженный в контрактах |
//+------------------------------------------------------------------+
double CSymbol::VolumeContractMin(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_MIN);
}
//+-------------------------------------------------------------------+
//| Максимальный объем для заключения сделки, выраженный в контрактах |
//+-------------------------------------------------------------------+
double CSymbol::VolumeContractMax(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_MAX);
}
//+-------------------------------------------------------------------+
//| Максимально допустимый для данного символа совокупный объем |
//| открытой позиции |
//+-------------------------------------------------------------------+
double CSymbol::VolumeContractLimit(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_LIMIT);
}
//+-------------------------------------------------------------------+
//| Минимальный шаг изменения объема для заключения сделки |
//+-------------------------------------------------------------------+
double CSymbol::VolumeContractStep(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_STEP);
}
//+-------------------------------------------------------------------+
//| Значение свопа зачисляемого при удержании длиной позиции объемом |
//| в один контракт |
//+-------------------------------------------------------------------+
double CSymbol::SwapLong(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_SWAP_LONG);
}
//+-------------------------------------------------------------------+
//| Значение свопа зачисляемого при удержании короткой позиции объемом|
//| в один контракт |
//+-------------------------------------------------------------------+
double CSymbol::SwapShort(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_SWAP_SHORT);
}
//+-------------------------------------------------------------------+
//| Маржа необходимая для открытия позиции размеров в один лот |
//+-------------------------------------------------------------------+
double CSymbol::MarginInit(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_MARGIN_INITIAL);
}
//+-------------------------------------------------------------------+
//| Маржа необходимая для поддержания одного лота открытой позиции |
//+-------------------------------------------------------------------+
double CSymbol::MarginMaintenance(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_MARGIN_MAINTENANCE);
}
//+-------------------------------------------------------------------+
//| Маржа необходимая для удержания одного лота перекрытой позиции |
//+-------------------------------------------------------------------+
double CSymbol::MarginHedged(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_MARGIN_HEDGED);
}
//+-------------------------------------------------------------------+
//| Имя базового актива для производного инструмента |
//+-------------------------------------------------------------------+
string CSymbol::NameBasisSymbol(void)
{
return SymbolInfoString(m_symbol, SYMBOL_BASIS);
}
//+-------------------------------------------------------------------+
//| Базовая валюта инструмента |
//+-------------------------------------------------------------------+
string CSymbol::NameBasisCurrency(void)
{
return SymbolInfoString(m_symbol, SYMBOL_CURRENCY_BASE);
}
//+-------------------------------------------------------------------+
//| Валюта прибыли |
//+-------------------------------------------------------------------+
string CSymbol::NameCurrencyProfit(void)
{
return SymbolInfoString(m_symbol, SYMBOL_CURRENCY_PROFIT);
}
//+-------------------------------------------------------------------+
//| Валюта в которой вычисляется залоговые средства |
//+-------------------------------------------------------------------+
string CSymbol::NameCurrencyMargin(void)
{
return SymbolInfoString(m_symbol, SYMBOL_CURRENCY_MARGIN);
}
//+-------------------------------------------------------------------+
//| Источник текущей котировки |
//+-------------------------------------------------------------------+
string CSymbol::NameBank(void)
{
return SymbolInfoString(m_symbol, SYMBOL_BANK);
}
//+-------------------------------------------------------------------+
//| Строковое описание символа |
//+-------------------------------------------------------------------+
string CSymbol::Description(void)
{
return SymbolInfoString(m_symbol, SYMBOL_DESCRIPTION);
}
//+-------------------------------------------------------------------+
//| Имя торгового символа в системе международных |
//| идентификационных кодов ценных бумаг — ISIN |
//+-------------------------------------------------------------------+
string CSymbol::NameISIN(void)
{
return SymbolInfoString(m_symbol, SYMBOL_ISIN);
}
//+-------------------------------------------------------------------+
//| Путь в дереве символов |
//+-------------------------------------------------------------------+
string CSymbol::SymbolPath(void)
{
return SymbolInfoString(m_symbol, SYMBOL_PATH);
}