MQL5 標準ライブラリのラッパークラスを作ろう (CSymbolInfo 編) の続き。
ラッパークラスを作るに至った経緯は上記ページを参照。
今回は CAccountInfo のラッパークラス。
3 分クッキング方式( ^ω^)
MQL5 版のコードは CAccountInfo
の対応メソッドを呼び出しているだけである。
MQL4 版のコードは AccountInfoDouble()
で対応する値を取得している。ただし、MarginMode()
, OrderProfitCheck()
, FreeMarginCheck()
は他と異なった実装になっている。
特に MarginMode()
の戻り値の ENUM_ACCOUNT_MARGIN_MODE は MQL4 に存在しないデータのため、便宜的に enum の宣言を追加し固定値 (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) を返却している。
//+------------------------------------------------------------------+ //| 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 <Object.mqh> #else // _MQL4 #include <Trade\AccountInfo.mqh> #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_ //+------------------------------------------------------------------+
MQL4 のソースをビルドするときはソースに #define _MQL4 を定義することに留意する。
//+------------------------------------------------------------------+ //| Sample.mq4 | //+------------------------------------------------------------------+ #property strict #property copyright "" #property version "1.0" // MQL4用ソースを使用 #define _MQL4 // インクルード #include "AccountInfoHelper.mqh" //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { ClAccountInfoHelper accountInfo; PrintFormat("口座残高 = %s %s", DoubleToString(accountInfo.Balance(), 0), accountInfo.Currency()); PrintFormat("有効証拠金 = %s %s", DoubleToString(accountInfo.Equity(), 0), accountInfo.Currency()); PrintFormat("証拠金維持率 = %s %%", DoubleToString(accountInfo.MarginLevel(), 2)); return(INIT_SUCCEEDED); } // (以下、略)