UTE/Strategy/Symbol.mqh

515 lines
44 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:34:43 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| 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; // !8<2>; 8=AB@C<5=B0
ENUM_TIMEFRAMES m_period; // "09<D@59< 8=AB@C<5=B0
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);
};
//+------------------------------------------------------------------+
//| #AB0=02;8205B A5@88 OHLCV 4;O B5:CI53> 8=AB@C<5=B0 8 B09<D@59<0 |
//+------------------------------------------------------------------+
CSymbol::CSymbol(void)
{
m_symbol = ::Symbol();
m_period = ::Period();
InitSeries(Symbol(), ::Period());
}
//+------------------------------------------------------------------+
//| >72@0I05B >1I55 :>;8G5AB2> 10@>2 40==>9 8=AB@C<5=B0 ?> B5:CI5<C |
//| B09<D@59<C |
//+------------------------------------------------------------------+
int CSymbol::BarsTotal(void)
{
int bars = Bars(this.Name(), this.Period());
return bars;
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A 10@0, A>>B25BAB2CNI89 C:070=><C 2@5<5=8 |
//+------------------------------------------------------------------+
int CSymbol::IndexByTime(datetime time)
{
int bars = Bars(this.Name(), this.Period(), time, TimeCurrent());
return bars-1;
}
//+------------------------------------------------------------------+
//| #AB0=02;8205B A5@88 OHLCV 4;O C:070==>3> 8=AB@C<5=B0 8 B09<D@59<0|
//+------------------------------------------------------------------+
CSymbol::CSymbol(string symbol, ENUM_TIMEFRAMES period)
{
m_symbol = symbol;
m_period = period;
InitSeries(symbol, period);
}
//+------------------------------------------------------------------+
//| >72@0I05B A8<2>; 8=AB@C<5=B0 |
//+------------------------------------------------------------------+
string CSymbol::Name(void)
{
return m_symbol;
}
//+------------------------------------------------------------------+
//| #AB0=02;8205B A8<2>; 8=AB@C<5=B0 |
//+------------------------------------------------------------------+
bool CSymbol::Name(string symbol)
{
m_symbol = symbol;
InitSeries(m_symbol, m_period);
return Available();
}
//+------------------------------------------------------------------+
//| >72@0I05B ?5@8>4 8=AB@C<5=B0 |
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES CSymbol::Period(void)
{
return m_period;
}
//+------------------------------------------------------------------+
//| #AB0=02;8205B ?5@8>4 8=AB@C<5=B0 |
//+------------------------------------------------------------------+
bool CSymbol::Period(ENUM_TIMEFRAMES period)
{
m_period = period;
InitSeries(m_symbol, m_period);
return Available();
}
//+------------------------------------------------------------------+
//| #AB0=02;8205B A5@88 OHLCV 4;O B5:CI53> 8=AB@C<5=B0 8 B09<D@59<0. |
//| >72@0I05B 8AB8=C, 5A;8 8=AB@C<5=B 4>ABC?5= 8 ;>6L 2 ?@>B82=>< |
//| A;CG05 |
//+------------------------------------------------------------------+
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;
}
//+------------------------------------------------------------------+
//| >72@0I05B 8AB8=C, 5A;8 8=AB@C<5=B 4>ABC?5= 4;O @01>BK 8 ;>6L 2 |
//| ?@>B82=>< A;CG05 |
//+------------------------------------------------------------------+
bool CSymbol::Available(void)
{
return Bars(m_symbol, m_period) > 0;
}
//+------------------------------------------------------------------+
//| @87=0: B>3>, GB> 40==K9 8=AB@C<5=B ?@8ACBAB2C5B 2 B5@<8=0;5 |
//+------------------------------------------------------------------+
bool CSymbol::SelectInMarketWatch(void)
{
return (bool)SymbolInfoInteger(m_symbol, SYMBOL_SELECT);
}
//+------------------------------------------------------------------+
//| @87=0: ?;020NI53> A?@540 |
//+------------------------------------------------------------------+
bool CSymbol::SpreadFloat(void)
{
return (bool)SymbolInfoInteger(m_symbol, SYMBOL_SPREAD_FLOAT);
}
//+------------------------------------------------------------------+
//| 07<5@ A?@540 2 ?C=:B0E |
//+------------------------------------------------------------------+
int CSymbol::Spread(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_SPREAD);
}
//+------------------------------------------------------------------+
//| 8=8<0;L=K9 >BABC? 2 ?C=:B0E >B B5:CI59 F5=K 70:@KB8O |
//| 4;O CAB0=>2:8 Stop >@45@>2 |
//+------------------------------------------------------------------+
int CSymbol::StopLevel(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_STOPS_LEVEL);
}
//+------------------------------------------------------------------+
//| 8AB0=F8O 70<>@>7:8 B>@3>2KE >?5@0F89 (2 ?C=:B0E) |
//+------------------------------------------------------------------+
int CSymbol::FreezeLevel(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_FREEZE_LEVEL);
}
//+------------------------------------------------------------------+
//| $;038 @07@5H5==KE @568<>2 8AB5G5=8O >@45@0 |
//+------------------------------------------------------------------+
int CSymbol::FlagsExpirationOrders(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_EXPIRATION_MODE);
}
//+------------------------------------------------------------------+
//| $;038 @07@5H5==KE @568<>2 8A?>;=5=8O >@45@0 |
//+------------------------------------------------------------------+
int CSymbol::FlagsExecutionOrders(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_FILLING_MODE);
}
//+------------------------------------------------------------------+
//| $;038 @07@5H5==KE B8?>2 >@45@>2 |
//+------------------------------------------------------------------+
int CSymbol::FlagsAllowedOrders(void)
{
return (int)SymbolInfoInteger(m_symbol, SYMBOL_ORDER_MODE);
}
//+------------------------------------------------------------------+
//| @87=0: B>3>, GB> A8<2>; 2K1@0= 2 Market Watch |
//+------------------------------------------------------------------+
int CSymbol::Digits(void)
{
int digits=(int)SymbolInfoInteger(m_symbol, SYMBOL_DIGITS);
return digits;
}
//+------------------------------------------------------------------+
//| !?>A>1 2KG8A;5=8O AB>8<>AB8 :>=B@0:B0 |
//+------------------------------------------------------------------+
ENUM_SYMBOL_CALC_MODE CSymbol::CalcContractType(void)
{
return (ENUM_SYMBOL_CALC_MODE)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_CALC_MODE);
}
//+------------------------------------------------------------------+
//| "8? 8A?>;=5=8O >@45@>2 |
//+------------------------------------------------------------------+
ENUM_SYMBOL_TRADE_MODE CSymbol::ExecuteOrderType(void)
{
return (ENUM_SYMBOL_TRADE_MODE)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_MODE);
}
//+------------------------------------------------------------------+
//| "8? 8A?>;=5=8O A45;>: |
//+------------------------------------------------------------------+
ENUM_SYMBOL_TRADE_EXECUTION CSymbol::ExecuteDealsType(void)
{
return (ENUM_SYMBOL_TRADE_EXECUTION)SymbolInfoInteger(m_symbol, SYMBOL_TRADE_EXEMODE);
}
//+------------------------------------------------------------------+
//| >45;L @0AG5B0 A2>?0 |
//+------------------------------------------------------------------+
ENUM_SYMBOL_SWAP_MODE CSymbol::CalcSwapMode(void)
{
return (ENUM_SYMBOL_SWAP_MODE)SymbolInfoInteger(m_symbol, SYMBOL_SWAP_MODE);
}
//+------------------------------------------------------------------+
//| 5=L =545;8 4;O =0G8A;5=8O B@>9=>3> A2>?0 |
//+------------------------------------------------------------------+
ENUM_DAY_OF_WEEK CSymbol::DayOfSwap3x(void)
{
return (ENUM_DAY_OF_WEEK)SymbolInfoInteger(m_symbol, SYMBOL_SWAP_ROLLOVER3DAYS);
}
//+------------------------------------------------------------------+
//| "8? >?F8>=0 |
//+------------------------------------------------------------------+
ENUM_SYMBOL_OPTION_MODE CSymbol::OptionType(void)
{
return (ENUM_SYMBOL_OPTION_MODE)SymbolInfoInteger(m_symbol, SYMBOL_OPTION_MODE);
}
//+------------------------------------------------------------------+
//| @02> >?F8>=0 (Call/Put) |
//+------------------------------------------------------------------+
ENUM_SYMBOL_OPTION_RIGHT CSymbol::OptionRight(void)
{
return (ENUM_SYMBOL_OPTION_RIGHT)SymbolInfoInteger(m_symbol, SYMBOL_OPTION_RIGHT);
}
//+------------------------------------------------------------------+
//| @5<O ?>A;54=59 :>B8@>2:8 |
//+------------------------------------------------------------------+
datetime CSymbol::TimeOfLastQuote(void)
{
return (datetime)SymbolInfoInteger(m_symbol, SYMBOL_TIME);
}
//+------------------------------------------------------------------+
//| 0B0 =0G0;0 B>@3>2 ?> 8=AB@C<5=BC |
//+------------------------------------------------------------------+
datetime CSymbol::StartDate(void)
{
return (datetime)SymbolInfoInteger(m_symbol, SYMBOL_START_TIME);
}
//+------------------------------------------------------------------+
//| 0B0 >:>=G0=8O B>@3>2 ?> 8=AB@C<5=BC |
//+------------------------------------------------------------------+
datetime CSymbol::ExpirationDate(void)
{
return (datetime)SymbolInfoInteger(m_symbol, SYMBOL_EXPIRATION_TIME);
}
//+------------------------------------------------------------------+
//| >72@0I05B F5=C 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;
}
//+------------------------------------------------------------------+
//| >72@0I05B F5=C 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;
}
//+------------------------------------------------------------------+
//| >72@0I05B F5=C 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;
}
//+------------------------------------------------------------------+
//| >72@0I05B ?@09AB5?K 2 2845 F5=K. 0?@8<5@ ?5@540==>5 7=0G5=85 |
//| 3 =0 EURUSD ?OB87=0:5 1C45B A:>=25@B8@>20==> 2 0.00003 |
//+------------------------------------------------------------------+
double CSymbol::StepToPrice(int price_step)
{
double price = SymbolInfoDouble(m_symbol, SYMBOL_POINT)*(double)price_step;
return price;
}
//+------------------------------------------------------------------+
//| >72@0I05B <8=8<0;L=>5 87<5=5=85 F5=K 8=AB@C<5=B0, =0?@8<5@ 4;O |
//| EURUSD ?OB87=0:5 1C45B 2>72@0I5=> 0.00001 |
//+------------------------------------------------------------------+
double CSymbol::PriceStep(void)
{
double price = SymbolInfoDouble(m_symbol, SYMBOL_POINT);
return price;
}
//+------------------------------------------------------------------+
//| >72@0I05B F5=C 8A?>;=5=8O >?F8>=0 |
//+------------------------------------------------------------------+
double CSymbol::OptionStrike(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_OPTION_STRIKE);
}
//+------------------------------------------------------------------+
//| >72@0I05B AB>8<>ABL >4=>3> B8:0 2K@065==CN 2 20;NB5 48?>78B0 |
//+------------------------------------------------------------------+
double CSymbol::TickValue(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_TRADE_TICK_VALUE);
}
//+------------------------------------------------------------------+
//| 07<5@ >4=>3> :>=B@0:B0 2 107>2KE 545=8F0E :>=B@0:B0 |
//+------------------------------------------------------------------+
double CSymbol::ContractSize(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_TRADE_CONTRACT_SIZE);
}
//+------------------------------------------------------------------+
//| 8=8<0;L=K9 >1J5< 4;O 70:;NG5=8O A45;:8, 2K@065==K9 2 :>=B@0:B0E |
//+------------------------------------------------------------------+
double CSymbol::VolumeContractMin(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_MIN);
}
//+-------------------------------------------------------------------+
//| 0:A8<0;L=K9 >1J5< 4;O 70:;NG5=8O A45;:8, 2K@065==K9 2 :>=B@0:B0E |
//+-------------------------------------------------------------------+
double CSymbol::VolumeContractMax(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_MAX);
}
//+-------------------------------------------------------------------+
//| 0:A8<0;L=> 4>?CAB8<K9 4;O 40==>3> A8<2>;0 A>2>:C?=K9 >1J5< |
//| >B:@KB>9 ?>78F88 |
//+-------------------------------------------------------------------+
double CSymbol::VolumeContractLimit(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_LIMIT);
}
//+-------------------------------------------------------------------+
//| 8=8<0;L=K9 H03 87<5=5=8O >1J5<0 4;O 70:;NG5=8O A45;:8 |
//+-------------------------------------------------------------------+
double CSymbol::VolumeContractStep(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_STEP);
}
//+-------------------------------------------------------------------+
//| =0G5=85 A2>?0 70G8A;O5<>3> ?@8 C45@60=88 4;8=>9 ?>78F88 >1J5<>< |
//| 2 >48= :>=B@0:B |
//+-------------------------------------------------------------------+
double CSymbol::SwapLong(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_SWAP_LONG);
}
//+-------------------------------------------------------------------+
//| =0G5=85 A2>?0 70G8A;O5<>3> ?@8 C45@60=88 :>@>B:>9 ?>78F88 >1J5<><|
//| 2 >48= :>=B@0:B |
//+-------------------------------------------------------------------+
double CSymbol::SwapShort(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_SWAP_SHORT);
}
//+-------------------------------------------------------------------+
//| 0@60 =5>1E>48<0O 4;O >B:@KB8O ?>78F88 @07<5@>2 2 >48= ;>B |
//+-------------------------------------------------------------------+
double CSymbol::MarginInit(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_MARGIN_INITIAL);
}
//+-------------------------------------------------------------------+
//| 0@60 =5>1E>48<0O 4;O ?>445@60=8O >4=>3> ;>B0 >B:@KB>9 ?>78F88 |
//+-------------------------------------------------------------------+
double CSymbol::MarginMaintenance(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_MARGIN_MAINTENANCE);
}
//+-------------------------------------------------------------------+
//| 0@60 =5>1E>48<0O 4;O C45@60=8O >4=>3> ;>B0 ?5@5:@KB>9 ?>78F88 |
//+-------------------------------------------------------------------+
double CSymbol::MarginHedged(void)
{
return SymbolInfoDouble(m_symbol, SYMBOL_MARGIN_HEDGED);
}
//+-------------------------------------------------------------------+
//| <O 107>2>3> 0:B820 4;O ?@>872>4=>3> 8=AB@C<5=B0 |
//+-------------------------------------------------------------------+
string CSymbol::NameBasisSymbol(void)
{
return SymbolInfoString(m_symbol, SYMBOL_BASIS);
}
//+-------------------------------------------------------------------+
//| 07>20O 20;NB0 8=AB@C<5=B0 |
//+-------------------------------------------------------------------+
string CSymbol::NameBasisCurrency(void)
{
return SymbolInfoString(m_symbol, SYMBOL_CURRENCY_BASE);
}
//+-------------------------------------------------------------------+
//| 0;NB0 ?@81K;8 |
//+-------------------------------------------------------------------+
string CSymbol::NameCurrencyProfit(void)
{
return SymbolInfoString(m_symbol, SYMBOL_CURRENCY_PROFIT);
}
//+-------------------------------------------------------------------+
//| 0;NB0 2 :>B>@>9 2KG8A;O5BAO 70;>3>2K5 A@54AB20 |
//+-------------------------------------------------------------------+
string CSymbol::NameCurrencyMargin(void)
{
return SymbolInfoString(m_symbol, SYMBOL_CURRENCY_MARGIN);
}
//+-------------------------------------------------------------------+
//| AB>G=8: B5:CI59 :>B8@>2:8 |
//+-------------------------------------------------------------------+
string CSymbol::NameBank(void)
{
return SymbolInfoString(m_symbol, SYMBOL_BANK);
}
//+-------------------------------------------------------------------+
//| !B@>:>2>5 >?8A0=85 A8<2>;0 |
//+-------------------------------------------------------------------+
string CSymbol::Description(void)
{
return SymbolInfoString(m_symbol, SYMBOL_DESCRIPTION);
}
//+-------------------------------------------------------------------+
//| <O B>@3>2>3> A8<2>;0 2 A8AB5<5 <564C=0@>4=KE |
//| 845=B8D8:0F8>==KE :>4>2 F5==KE 1C<03  ISIN |
//+-------------------------------------------------------------------+
string CSymbol::NameISIN(void)
{
return SymbolInfoString(m_symbol, SYMBOL_ISIN);
}
//+-------------------------------------------------------------------+
//| CBL 2 45@525 A8<2>;>2 |
//+-------------------------------------------------------------------+
string CSymbol::SymbolPath(void)
{
return SymbolInfoString(m_symbol, SYMBOL_PATH);
}