OriginalIndicators.mqhファイルのコード全体記述は以下のようになっています。
//+------------------------------------------------------------------+
//| OriginalIndicators.mqh |
//| MQL5ssei |
//| https://mqlinvestmentlab.com/ |
//+------------------------------------------------------------------+
#property copyright "MQL5ssei"
#property link "https://mqlinvestmentlab.com/"
//インジケータ値を配列にコピーす数を規定
#define MAX_COPY 100
//インジケータに共通する処理を担う基礎クラス
class CBaseIndicator
{
protected:
int handle;//インジケータのハンドル値を格納する変数
double main[];//インジケータの値を格納する配列
public:
CBaseIndicator(void);//コンストラクタ
double Main(int parIndex=0);
void Release();
virtual int Init() { return(handle); }
};
CBaseIndicator::CBaseIndicator(void)
{
ArraySetAsSeries(main,true);
}
double CBaseIndicator::Main(int parIndex=0)
{
CopyBuffer(handle,0,0,MAX_COPY,main);
double value = NormalizeDouble(main[parIndex],_Digits);
return(value);
}
void CBaseIndicator::Release(void)
{
IndicatorRelease(handle);
}
class CDerivediMA : public CBaseIndicator
{
public:
int Init(string parSymbol,ENUM_TIMEFRAMES parTimeframe,int parMAPeriod,int parMAShift,ENUM_MA_METHOD parMAMethod,ENUM_APPLIED_PRICE parMAPrice);
};
int CDerivediMA::Init(string parSymbol,ENUM_TIMEFRAMES parTimeframe,int parMAPeriod,int parMAShift,ENUM_MA_METHOD parMAMethod,ENUM_APPLIED_PRICE parMAPrice)
{
handle = iMA(parSymbol,parTimeframe,parMAPeriod,parMAShift,parMAMethod,parMAPrice);
return(handle);
}
class CDerivediStochastic : public CBaseIndicator
{
private:
double signal[];
public:
int Init(string parSymbol, ENUM_TIMEFRAMES parTimeframe, int parKPeriod, int parDPeriod, int parSlowing, ENUM_MA_METHOD parMAMethod, ENUM_STO_PRICE parPrice);
double Signal(int parShift=0);
CDerivediStochastic(void);
};
int CDerivediStochastic::Init(string parSymbol, ENUM_TIMEFRAMES parTimeframe, int parKPeriod, int parDPeriod, int parSlowing, ENUM_MA_METHOD parMAMethod, ENUM_STO_PRICE parPrice)
{
handle = iStochastic(parSymbol,parTimeframe,parKPeriod,parDPeriod,parSlowing,parMAMethod,parPrice);
return(handle);
}
CDerivediStochastic::CDerivediStochastic(void)
{
ArraySetAsSeries(signal,true);
}
double CDerivediStochastic::Signal(int parShift=0)
{
CopyBuffer(handle,1,0,MAX_COPY,signal);
double value = NormalizeDouble(signal[parShift],_Digits);
return(value);
}
// Bollinger Bands インジケータの派生クラス
class CDerivediBollinger : public CBaseIndicator
{
private:
double upper[], lower[]; // 上部バンドと下部バンドの値を格納する配列
public:
CDerivediBollinger(); // コンストラクタ
int Init(string parSymbol,ENUM_TIMEFRAMES parTimeframe,int parPeriod,int parShift,double parDeviation,ENUM_APPLIED_PRICE parPrice); // 初期化関数
double Upper(int parShift=0); // 上部バンドの値を取得する関数
double Lower(int parShift=0); // 下部バンドの値を取得する関数
};
// コンストラクタ
CDerivediBollinger::CDerivediBollinger(void)
{
ArraySetAsSeries(upper,true); // upper配列を時系列として設定
ArraySetAsSeries(lower,true); // lower配列を時系列として設定
}
// 初期化関数
int CDerivediBollinger::Init(string parSymbol,ENUM_TIMEFRAMES parTimeframe,int parPeriod,int parShift,double parDeviation,ENUM_APPLIED_PRICE parPrice)
{
handle = iBands(parSymbol,parTimeframe,parPeriod,parShift,parDeviation,parPrice); // Bollinger Bandsインジケータのハンドルを取得
return(handle); // ハンドルを返す
}
// 上部バンドの値を取得する関数
double CDerivediBollinger::Upper(int parShift=0)
{
CopyBuffer(handle,1,0,MAX_COPY,upper); // 上部バンドの値をバッファからコピー
double value = NormalizeDouble(upper[parShift],_Digits); // 値を正規化
return(value); // 正規化された値を返す
}
// 下部バンドの値を取得する関数
double CDerivediBollinger::Lower(int parShift=0)
{
CopyBuffer(handle,2,0,MAX_COPY,lower); // 下部バンドの値をバッファからコピー
double value = NormalizeDouble(lower[parShift],_Digits); // 値を正規化
return(value); // 正規化された値を返す
}
// RSI インジケータの派生クラス
class CDerivediRSI : public CBaseIndicator
{
public:
int Init(string parSymbol, ENUM_TIMEFRAMES parTimeframe, int parRSIPeriod, ENUM_APPLIED_PRICE parRSIPrice); // 初期化関数
};
// 初期化関数
int CDerivediRSI::Init(string parSymbol, ENUM_TIMEFRAMES parTimeframe, int parRSIPeriod, ENUM_APPLIED_PRICE parRSIPrice)
{
handle = iRSI(parSymbol,parTimeframe,parRSIPeriod,parRSIPrice); // RSIインジケータのハンドルを取得
return(handle); // ハンドルを返す
}