//+------------------------------------------------------------------+ //| AccountInfoHelper.mqh | //+------------------------------------------------------------------+ #ifndef _ACCOUNTINFOHELPER_MQH_ #define _ACCOUNTINFOHELPER_MQH_ //+------------------------------------------------------------------+ //| インクルード | //+------------------------------------------------------------------+ #ifdef _MQL4 enum ENUM_ACCOUNT_MARGIN_MODE { ACCOUNT_MARGIN_MODE_RETAIL_NETTING, ACCOUNT_MARGIN_MODE_EXCHANGE, ACCOUNT_MARGIN_MODE_RETAIL_HEDGING, }; #include #else // _MQL4 #include #endif // _MQL4 //+------------------------------------------------------------------+ //| ClAccountInfoHelperクラス | //+------------------------------------------------------------------+ class ClAccountInfoHelper : public CObject { public: ClAccountInfoHelper(void); virtual ~ClAccountInfoHelper(void); ENUM_ACCOUNT_MARGIN_MODE MarginMode(void) const; // マージンモード double Balance(void) const; // 口座残高 double Credit(void) const; // 与えられたクレジットの額 double Profit(void) const; // 口座の含み損益 double Equity(void) const; // 有効証拠金 double Margin(void) const; // 必要証拠金 double FreeMargin(void) const; // 余剰証拠金 double MarginLevel(void) const; // 証拠金維持率 string Currency(void) const; // 通貨名 string CurrencyJPN(void) const; // 通貨名 double OrderProfitCheck(const string symbol, const ENUM_ORDER_TYPE trade_operation, const double volume, const double price_open, const double price_close) const; double FreeMarginCheck(const string symbol, const ENUM_ORDER_TYPE trade_operation, const double volume, const double price) const; protected: #ifdef _MQL4 #else // _MQL4 CAccountInfo l_AccountInfo; // アカウント情報 #endif // _MQL4 }; //+------------------------------------------------------------------+ //| コンストラクター | //+------------------------------------------------------------------+ ClAccountInfoHelper::ClAccountInfoHelper(void) { } //+------------------------------------------------------------------+ //| デストラクター | //+------------------------------------------------------------------+ ClAccountInfoHelper::~ClAccountInfoHelper(void) { } //+------------------------------------------------------------------+ //| マージンモード | //+------------------------------------------------------------------+ ENUM_ACCOUNT_MARGIN_MODE ClAccountInfoHelper::MarginMode(void) const { #ifdef _MQL4 return(ACCOUNT_MARGIN_MODE_RETAIL_HEDGING); #else return(l_AccountInfo.MarginMode()); #endif } //+------------------------------------------------------------------+ //| 口座残高 | //+------------------------------------------------------------------+ double ClAccountInfoHelper::Balance(void) const { #ifdef _MQL4 return(AccountInfoDouble(ACCOUNT_BALANCE)); #else return(l_AccountInfo.Balance()); #endif } //+------------------------------------------------------------------+ //| 与えられたクレジットの額 | //+------------------------------------------------------------------+ double ClAccountInfoHelper::Credit(void) const { #ifdef _MQL4 return(AccountInfoDouble(ACCOUNT_CREDIT)); #else return(l_AccountInfo.Credit()); #endif } //+------------------------------------------------------------------+ //| 口座の含み損益 | //+------------------------------------------------------------------+ double ClAccountInfoHelper::Profit(void) const { #ifdef _MQL4 return(AccountInfoDouble(ACCOUNT_PROFIT)); #else return(l_AccountInfo.Profit()); #endif } //+------------------------------------------------------------------+ //| 有効証拠金 | //+------------------------------------------------------------------+ double ClAccountInfoHelper::Equity(void) const { #ifdef _MQL4 return(AccountInfoDouble(ACCOUNT_EQUITY)); #else return(l_AccountInfo.Equity()); #endif } //+------------------------------------------------------------------+ //| 必要証拠金 | //+------------------------------------------------------------------+ double ClAccountInfoHelper::Margin(void) const { #ifdef _MQL4 return(AccountInfoDouble(ACCOUNT_MARGIN)); #else return(l_AccountInfo.Margin()); #endif } //+------------------------------------------------------------------+ //| 余剰証拠金 | //+------------------------------------------------------------------+ double ClAccountInfoHelper::FreeMargin(void) const { #ifdef _MQL4 return(AccountInfoDouble(ACCOUNT_FREEMARGIN)); #else return(l_AccountInfo.FreeMargin()); #endif } //+------------------------------------------------------------------+ //| 証拠金維持率 | //+------------------------------------------------------------------+ double ClAccountInfoHelper::MarginLevel(void) const { #ifdef _MQL4 return(AccountInfoDouble(ACCOUNT_MARGIN_LEVEL)); #else return(l_AccountInfo.MarginLevel()); #endif } //+------------------------------------------------------------------+ //| 通貨名 | //+------------------------------------------------------------------+ string ClAccountInfoHelper::Currency(void) const { #ifdef _MQL4 return(AccountInfoString(ACCOUNT_CURRENCY)); #else return(l_AccountInfo.Currency()); #endif } //+------------------------------------------------------------------+ //| 通貨名 | //+------------------------------------------------------------------+ string ClAccountInfoHelper::CurrencyJPN(void) const { #ifdef _MQL4 string currency = Currency(); if(currency == "JPY") { currency = "円"; } else if(currency == "USD") { currency = "ドル"; } else if(currency == "EUR") { currency = "ユーロ"; } return(currency); #else string currency = Currency(); if(currency == "JPY") { currency = "円"; } else if(currency == "USD") { currency = "ドル"; } else if(currency == "EUR") { currency = "ユーロ"; } return(currency); #endif } //+------------------------------------------------------------------+ //| 想定利益(損失)額の計算 | //+------------------------------------------------------------------+ double ClAccountInfoHelper::OrderProfitCheck(const string symbol, const ENUM_ORDER_TYPE trade_operation, const double volume, const double price_open, const double price_close) const { #ifdef _MQL4 double profit = EMPTY_VALUE; if(trade_operation == ORDER_TYPE_BUY || trade_operation == ORDER_TYPE_BUY_LIMIT || trade_operation == ORDER_TYPE_BUY_STOP) { profit = (price_close - price_open) * volume * MarketInfo(symbol, MODE_TICKVALUE) / MarketInfo(symbol, MODE_POINT); } else if(trade_operation == ORDER_TYPE_SELL || trade_operation == ORDER_TYPE_SELL_LIMIT || trade_operation == ORDER_TYPE_SELL_STOP) { profit = (price_open - price_close) * volume * MarketInfo(symbol, MODE_TICKVALUE) / MarketInfo(symbol, MODE_POINT); } return(profit); #else return(l_AccountInfo.OrderProfitCheck(symbol, trade_operation, volume, price_open, price_close)); #endif } //+------------------------------------------------------------------+ //| ポジションを持ったと仮定した場合の余剰証拠金 | //+------------------------------------------------------------------+ double ClAccountInfoHelper::FreeMarginCheck(const string symbol, const ENUM_ORDER_TYPE trade_operation, const double volume, const double price) const { #ifdef _MQL4 double freeMargin = 0.0; if(trade_operation == ORDER_TYPE_BUY || trade_operation == ORDER_TYPE_BUY_LIMIT || trade_operation == ORDER_TYPE_BUY_STOP) { ResetLastError(); freeMargin = AccountFreeMarginCheck(symbol, OP_BUY, volume); if(GetLastError() == ERR_NOT_ENOUGH_MONEY) { freeMargin = 0.0; } } else if(trade_operation == ORDER_TYPE_SELL || trade_operation == ORDER_TYPE_SELL_LIMIT || trade_operation == ORDER_TYPE_SELL_STOP) { ResetLastError(); freeMargin = AccountFreeMarginCheck(symbol, OP_SELL, volume); if(GetLastError() == ERR_NOT_ENOUGH_MONEY) { freeMargin = 0.0; } } return(freeMargin); #else return(l_AccountInfo.FreeMarginCheck(symbol, trade_operation, volume, price)); #endif } #endif // _ACCOUNTINFOHELPER_MQH_ //+------------------------------------------------------------------+