OriginalMoneyManagement.mqhファイルのコード全体記述は以下のようになっています。
//+------------------------------------------------------------------+
//| OriginalMoneyManagement.mqh |
//| MQL5ssei |
//| https://mqlinvestmentlab.com/ |
//+------------------------------------------------------------------+
#property copyright "MQL5ssei"
#property link "https://mqlinvestmentlab.com/"
//+------------------------------------------------------------------+
#define MAX_RISK_PERCENT 10 // 最大リスク許容度
// ロット数を確認・調整する関数
double VerifyVolume(string parSymbol,double parVolume)
{
double minVolume = SymbolInfoDouble(parSymbol,SYMBOL_VOLUME_MIN);
double maxVolume = SymbolInfoDouble(parSymbol,SYMBOL_VOLUME_MAX);
double stepVolume = SymbolInfoDouble(parSymbol,SYMBOL_VOLUME_STEP);
double tradeSize;
if(parVolume < minVolume) tradeSize = minVolume;
else if(parVolume > maxVolume) tradeSize = maxVolume;
else tradeSize = MathRound(parVolume / stepVolume) * stepVolume;
if(stepVolume >= 0.1) tradeSize = NormalizeDouble(tradeSize,1);
else tradeSize = NormalizeDouble(tradeSize,2);
return(tradeSize);
}
// 資金管理を考慮したロット数を算出する関数
double MoneyRiskManagement(string parSymbol,double parFixedVol,double parPercent,int parStopPoints)
{
double tradeSize;//ロット数を格納する変数を宣言
//仮引数が適切に設定されているかを確認する
if(parPercent > 0 && parStopPoints > 0)
{ //最大リスク許容%を超えていたら、//最大リスク許容%に設定しなおす
if(parPercent > MAX_RISK_PERCENT) parPercent = MAX_RISK_PERCENT;
//許容損失額を設定する
double margin = AccountInfoDouble(ACCOUNT_BALANCE) * (parPercent / 100);
//1ティックごとの変動額を算出する
double tickSize = SymbolInfoDouble(parSymbol,SYMBOL_TRADE_TICK_VALUE);
//ロット数を算出する。
tradeSize = (margin / parStopPoints) / tickSize;
//算出したロット数が適切かどうかVerifyVolume関数で確認する。
tradeSize = VerifyVolume(parSymbol,tradeSize);
//ロット数を戻り値として返す
return(tradeSize);
}
else
{//仮引数に許容損失額を算出する値が設定されていなければ固定ロットを返す
tradeSize = parFixedVol;
tradeSize = VerifyVolume(parSymbol,tradeSize);
return(tradeSize);
}
}
//約定価格とストップロス価格との差分をポイントに変換する関数
double StopPriceToPoints(string parSymbol,double parStopPrice, double parOrderPrice)
{
double stopDiff = MathAbs(parStopPrice - parOrderPrice);
double getPoint = SymbolInfoDouble(parSymbol,SYMBOL_POINT);
double priceToPoint = stopDiff / getPoint;
return(priceToPoint);
}