pekonoriブログ関連

Expert Advisor Programming for MetaTrader5【日本語訳 第十五章】資金管理とトレードサイズ

  1. HOME >
  2. pekonoriブログ関連 >

Expert Advisor Programming for MetaTrader5【日本語訳 第十五章】資金管理とトレードサイズ

お金の管理とトレードサイズ P197

ここまでは、TradeVolumeという名前の入力変数を使用して注文量を指定してきました。EAをプログラミングすると、口座残高の変化に応じてリスクを管理し、取引サイズを拡大または縮小できる自動化された資金管理テクニックを使用する機会があります。取引サイズを自動的に管理する手法と、取引量の正確性を検証する手法について説明します。

取引量の確認 P197

取引量をOrderSend()関数に渡す前に、まずそれが有効かどうかを確認する必要があります。ほとんどの外国為替ブローカは0.01ロットの小さな取引サイズを許可していますが、一部のブローカはより高い最小取引サイズを持っているか、マイクロロットを使用していません。

              //入力変数

                  input double TradeVolume = 0.12;

                  //OnTick()イベントハンドラ

                  double minVolume = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);

double maxVolume = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);

double stepVolume = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);

                  double tradeSize;

                  if(TradeVolume < minVolume) tradeSize = minVolume;

                  else if(TradeVolume > maxVolume) tradeSize = maxVolume;

                  else tradeSize = MathRound(TradeVolume / stopVolume) * stepVolume;

                  if(stepVolume >= 0.1) tradeSize = NormalizeDouble(tradeSize);

                  else tradeSize = NormalizeDouble(tradeSize, 2);

TradeVolume入力変数は、取引サイズを保持します。その下のコードは、注文が行われる前にOnTick()イベントハンドラに入ります。通常は関数に配置されるため、何度も再利用できます。

SymbolInfoDouble()関数は、指定された銘柄に関する情報を取引サーバーから取得します。上記の例では、SymbolInfoDouble()を使用して、最小取引量、最大取引量、およびステップサイズを取得します。外国為替ブローカの場合、ステップサイズは通常0.01または0.1です。MQL5リファレンスの[標準定数…] > [環境状態] > [シンボルプロパティ]で、SymbolInfo…()パラメータ定数を表示できます。

次に、確認済みの取引量を保持するtradeSizeという名前の変数を宣言します。TradeVolumeを最小取引量に対してチェックします。TradeVolumeが最小取引量より小さい場合、最小取引量に調整します。最大取引量についても同じことを行います。次に、ステップサイズに対してTradeVolumeをチェックします。

TradeVolumeをステップサイズ(stepVolume)で除算し、MathRound()を使用して結果を最も近い整数に収め、再度ステップサイズを掛けます。元の取引量がステップサイズに一致する場合、この計算は効果がありません。それ以外の場合、取引量は最も近い有効なステップサイズに収められます。上記の例では、stepVolumeが0.1でTradeVolumeが0.12の場合、TradeVolumeの値は0.1に収められます。最後に、取引量をステップサイズの桁数に正規化します。

必要に応じて取引量を検証し、自動的に調整するために使用できる関数を作成しましょう。この章で作成するすべての取引量とマネー管理関連の関数を保持する新しいインクルードファイルを作成します。インクルードファイルはMoneyManagement.mqhという名前で、\MQL5\Include\Mql5Bookフォルダに配置されます。

以下は、MoneyManagement.mqhインクルードファイルにある、当社の取引量検証機能です。

              double VerifyVolume(string pSymbol, double pVolume)

{

double minVolume = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);

double maxVolume = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);

double stepVolume = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);

                      double tradeSize;

                      if(pVolume < minVolume) tradeSize = minVolume;

                      else if(pVolume > maxVolume) tradeSize = maxVolume;

                      else tradeSize = MathRound(pVolume / stopVolume) * stepVolume;

                      if(stepVolume >= 0.1) tradeSize = NormalizeDouble(tradeSize, 1);

                      else tradeSize = NormalizeDouble(tradeSize, 2);

                      return(tradeSize);

                  }

pSymbolパラメータはトレードシンボルでpVolumeは確認するトレードボリュームです。この関数は、調整された取引量をプログラムに返します。

資金管理 P198

資金管理とは、リスクに応じてポジションサイズを適切に調整する方法です。ほとんどのトレーダーは、すべての取引で同じ固定取引量を使用します。

最適な取引サイズを計算するには、取引開始価格からのストップロス価格の距離と現在の残高のパーセンテージを使用して、取引ごとの最大リスクを決定します。適切なガイドラインは、トレードごとのリスクを現在の残高の2~3%に制限することです。何かしらの理由で取引量を計算できない場合(つまり、ストップロスまたはパーセンテージが指定されていない場合)、指定された固定取引量にフォールバックします。

お金の管理ルーチンの関数を作成しましょう。この関数はMoneyManagement.mqhインクルードファイルに入り、MoneyManagement()という名前になります。

              #define MAX_PERCENT 10

                  double MoneyManagement(string pSymbol, double pFixeVol, double pPercent, int pStopPoints)

{

    double tradeSize;

    if(pPercent > 0 && pStopPoints > 0)

{

if(pPercent > MAX_PERCENT) pPercent = MAX_PERCENT;

double margin = AccountInfoDouble(ACCOUNT_BALANCE) * (pPercent / 100);

double tickSize = SymbolInfoDouble(pSymbol, SYMBOL_TRADE_TICK_VALUE);

tradeSize = (margin / pStopPoints) / tickSize;

tradeSize = VerifyVolume(pSymbol, tradeSize);

return(tradeSize);

}

else

{

    tradeSize = pFixedVol;

    tradeSize = VerifyVolume(pSymbol, tradeSize);

    return(tradeSize);

}

}

pSymbolパラメータはトレードシンボル、pFixedVolはデフォルトの取引量、pPercentは使用する現在の残高のパーセンテージ、pStopPointsはポイント単位のストップロス距離です。tradeSize変数は、計算された取引量を保持します。まず、pPercentとpStopPointsが両方とも0より大きいかどうかを確認します。そうでない場合、取引量を計算できず、pFixedVolで指定されたデフォルトの取引量にフォールバックします。

pPerentpとStopPointsが有効な場合、取引量の計算に進みます。まず、pPercentを最大取引量と比較します。前述のように、リスクを残高の2~3%以下に制限することをお勧めします。MoneyManagement.mqhファイルの上部に定義されているMAX_PERCENT定数は、10%の最大リスクを指定します。pPercentがこれを超える場合は、10%以下に調整されます

次に、リスクに対するマージンの量を計算します。AccountInfoDouble()関数とACCOUNT_BALANCEパラメータを使用して、口座残高を取得します。これにpPercentを掛けて(100で割って分数を求めます)、その結果をmargin変数に格納します。次に、SYMBOL_TRADE_TICK_VALUEパラメータを指定したSymbolInfoDouble()関数を使用して取引サーバーからシンボルのティックサイズを取得し、結果をtickSize変数に格納します。ティックサイズは1つのポイント移動によって表される利益または損失の量です。

取引量を計算するには、リスクに対するマージン(margin)をポイント単位のストップロス(pStopLoss)で割り、その結果をtickSizeで割ります。次に、計算された取引量をVerifyVolume()関数に渡します。検証結果はプログラムに返されます。

例でこれを明確にしましょう。$5000の口座残高の2%以下のリスクで注文を出したいとします。最初のストップロスは、注文の始値から500ポイント離れた場所に配置されます。シンボルはEURUSDで、ミニロットを使用しているため、ティックサイズは1ポイント当たり1ドルになります。$5000の2%は$100なのでこの値はマージン変数に保存されます。tickSize変数は$1になります。

$100を500ポイントで割ると0.2になります。移動の各ポイントは、約$0.20の利益または損失に相当します。0.2を$1で割ると0.2に等しいので、取引量は0.2ロットになります。この0.2ロットの取引が500ポイント離れた最初のストップロスに達した場合、損失は約$100になります。ストップロス距離が200ポイント離れている場合、取引量は0.5ロットになりますが、最大損失は依然として$100です。

EAで資金管理機能を使用する方法の例を次に示します。

              //インクルードディレクティブ

                  #include <Mql5Book/MoneyManagement.mqh>

                  //入力変数

                  input double RiskPercent = 2;

                  input double FixedVolume = 0.1;

                  input int StopLoss =500;

                  //OnTick()イベントハンドラ

                  double tradeSize = MoneyManagement(_Symbol, FixedVolume, RiskPercent, StopLoss);

資金管理関数を使用するには、EAにMoneyManegement.mqhファイルを含める必要があります。RiskPercent入力変数は、現在のトレードバランスに対するトレードリスクの割合です。資金管理を使用したくない場合はこれをゼロに設定してください。FixedVolumeはRiskPercentまたはStopLossがゼロの場合に使用する固定取引量です。

tradeSize変数は、計算された取引量を保持します。MoneyManagement()関数は、指定された入力変数を受け取り、計算および検証された取引量を返します。前の章で定義したように、tradeSize変数を注文関数の1つに渡すことができます。

上記の例では、入力変数によって指定された固定ストップロスを想定しています。指標値やサポート/レジスタンス価格など、動的なストップロス価格を使用したい場合はどうすればよいでしょうか?希望する注文の開始価格(未決注文の価格、または現在のビッドまたはアスク価格)と希望するストップロス価格の間の距離を計算する必要があります。

たとえば、買いポジションを開きたいとします。現在のアスク価格は1.39426で、使用したいストップロス価格は、1.38600です。両者の差は826点。希望の始値とストップロス価格の間のポイントの差を決定する関数を作成します。

              double StopPriceToPoints(string pSymbol, bouble pStopPrice, double pOrderPrice)

{

    double stopDiff = MathAbs(pStopPrice - pOrderPrice);

double getPoint = SymbolInfoDouble(pSymbol, SYMBOL_POINT);

double priceToPoint = stopDiff / getPoint;

return(priceToPoint);

}

pStopPriceパラメータは希望するストップロス価格で、pOrderPriceは希望する注文開始価格です。まず、関数はpStopPriceとpOrderPriceの差を計算し、MathAbs()関数を使用して絶対値を返します。stopDiffをgetPointで割って、ストップロス距離をポイント単位で求めます。

コードでこれを行う方法の例を次に示します。stopLossPrice変数が1.38600に等しく、現在のアスク価格が1.39426であると仮定します。

                  double stopLossPrice = 1.38600;

double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

double stopLossDistance = stopPriceToPoints(_Symbol, stopLossPrice, currentPrice)

double tradeSize = MoneyManagement(_Symbol, FixedVolume, RiskPercent, stopLossDistance);

stopLossPrice変数には希望のストップロス価格1.38600が含まれ、currentPrice変数には現在の売値1.39426が保持されます。stopLossDistance変数は、StopPriceToPoints()関数の戻り値である826を保持します。次に、MoneyManagement()関数の最後のパラメータとしてstopLossDistanceを渡します。RiskPercentの値が2%で、標準ロットを使用して残高が$5000であると仮定すると、取引量は0.08ロットになります。

最初のストップロスを指定している限りMoneyManagement()関数を使用して、取引リスクを口座残高の指定された割合に制限することができます。StopPriceToPoists()関数を使用して動的ストップロスを使用し、ポイント単位でストップロスを計算することもできます。アカウントの残高が増減すると、それに応じて取引サイズが増減します。

≪≪【日本語訳 第十四章】トレーリングストップ

【日本語訳 第十六章】バーと価格データ≫≫

-pekonoriブログ関連