クロスプラットフォームEA: マネーマネジメント

Enrico Lambino | 18 7月, 2017


目次

  1. イントロダクション
  2. 目的
  3. 基本クラス
  4. マネーマネジメントのクラスとタイプ
  5. マネーマネジメントオブジェクトのコンテナ
  6. 結論

イントロダクション

マネーマネジメントは、EAに共通の特徴です。 EAが動的にエントリーする次のトレードのロットサイズを決定することができます。 この記事では、クロスプラットフォームのEAで、トレードロットの計算プロセス全体を自動化できるようにするマネーマネジメントクラスを紹介します。

目的

  • トレードで使用される最も一般的なマネーマネジメントメソッドを理解し、適用する。
  • EAでマネーマネジメントメソッドの一覧から動的に選択できるようにする。
  • mql4 と MQL5 との互換性がある。

基本クラス

この記事に記載されているすべての マネーマネジメントクラスには、CMoneyBase から派生した CMoney の親として、特定の基本クラスがあります。 CMoneyBase クラスは、次のクラススニペットで定義されます。

class CMoneyBase : public CObject
  {
protected:
   bool              m_active;
   double            m_volume;
   double            m_balance;
   double            m_balance_inc;
   int               m_period;
   bool              m_equity;
   string            m_name;
   CSymbolManager   *m_symbol_man;
   CSymbolInfo      *m_symbol;
   CAccountInfo     *m_account;
   CEventAggregator *m_event_man;
   CObject          *m_container;
public:
                     CMoneyBase(void);
                    ~CMoneyBase(void);
   virtual int       Type(void) const {return CLASS_TYPE_MONEY;}
   //---初期化
   virtual bool      Init(CSymbolManager*,CAccountInfo*,CEventAggregator*);
   bool              InitAccount(CAccountInfo*);
   bool              InitSymbol(CSymbolManager*);
   CObject          *GetContainer(void);
   void              SetContainer(CObject*);
   virtual bool      Validate(void);
   //---ゲッターとセッター
   bool              Active(void) const;
   void              Active(const bool);
   void              Equity(const bool);
   bool              Equity(void) const;
   void              LastUpdate(const datetime);
   datetime          LastUpdate(void) const;
   void              Name(const string);
   string            Name(void) const;
   double            Volume(const string,const double,const ENUM_ORDER_TYPE,const double);
   void              Volume(const double);
   double            Volume(void) const;
protected:
   virtual void      OnLotSizeUpdated(void);
   virtual bool      UpdateLotSize(const string,const double,const ENUM_ORDER_TYPE,const double);
  };

クラスのメソッドのほとんどは、クラスのさまざまなメンバーのセッターまたはゲッターのいずれかであり、自明です。 実用的なアプリケーションでは、UpdateLotSize、OnLotSizeUpdated、およびボリュームのメソッドが重要な3つのメソッドです。

UpdateLotSize メソッドは、トレードロットの実際の計算が行われる場所です。 基本クラスから拡張される主なメソッドでもあり、したがって、マネーマネジメントクラス間の違いのほとんどは、このメソッド内にあります。 CMoneyBase の場合、メソッドは true 値を返す以外は何も行わないため、仮想と見なすことができます。

bool CMoneyBase::UpdateLotSize(const string,const double,const ENUM_ORDER_TYPE,const double)
  {
   return true;
  }

場合によって、トレードロットの計算後に、今後の計算に使用する特定の変数を更新する必要があります。 このような場合、OnLotSizeUpdated メソッドを使用します。 このメソッドは、UpdateLotSize メソッド内で自動的に呼び出されます。 次のコードは、上記のメソッドです。

void CMoneyBase::OnLotSizeUpdated(void)
  {
   m_symbol=m_symbol_man.Get();
   double maxvol=m_symbol.LotsMax();
   double minvol=m_symbol.LotsMin();
   if(m_volume<minvol)
      m_volume=minvol;
   if(m_volume>maxvol)
      m_volume=maxvol;
  }

マネーマネジメントオブジェクトによって計算された実際のトレードロットを取得するために、EAは UpdateLotSize または OnLotSizeUpdated を呼び出す必要はありません。 むしろ、クラスのボリュームメソッドを呼び出す必要があります。 このメソッドは、コード内の他の2つのメソッドを自動的に呼び出します。

double CMoneyBase::Volume(const string symbol,const double price,const ENUM_ORDER_TYPE type,const double sl=0)
  {
   if(!Active())
      return 0;
   if(UpdateLotSize(symbol,price,type,sl))
      OnLotSizeUpdated();
   return m_volume;
  }

マネーマネジメントのクラスとタイプ

固定ロット

ロットサイジングの最も一般的なメソッドであり、ほとんどのトレーダーが精通しているものです。 固定ロットサイジングでは、すべてのトレードは一定のトレードサイズを持っている。

このタイプのマネーマネジメントでは、固定量だけを必要とします。 したがって、CMoney/CMoneyBase との主な違いは、固定ロットサイズを指定する、そのコンストラクタにあります。

CMoneyFixedLotBase::CMoneyFixedLotBase(double volume)
  {
   Volume(volume);
  }
この マネーマネジメントメソッドの出力を動的に変更する必要がある場合は、ボリュームメソッドを呼び出すことによって、m_volume クラスメンバーを変更するだけです。


固定リスク (固定小数)

マネーマネジメントのリスク% または固定小数メソッドは、トレードごとのリスクであるために、口座残高または持分の一定の割合を割り当てます。 これは、CmoneyFixedRisk として標準ライブラリに実装されます。 トレードが損失になる場合は、損失額は、エントリ時の口座残高の割合に相当します。 最大の損失は、ストップロスの値に相場がなったときです。 このメソッドは、動作にゼロ以外のストップロスが必要です。

トレードごとのリスク率の計算は、次の式で表されます。

Volume = (balance * account_percentage / ticks) / tick_value

ただし、

  • バランス–バランスもしくはエクイティ
  • account_percentage-リスクの割合 (範囲: 0.0-1.0)
  • ティック-ストップロス値、ティックで表現
  • ick_value-シンボルまたはティックの動きごとの資産通貨の値 (1.0 ロットに基づいて)

ティックは、特定の通貨ペアの価格での最小の値幅として定義されます。 たとえば、5 桁のブローカーの eurusd では、可能な最小の動きは0.00001 のティックサイズです。 ストップロスの値がポイントまたはピップで表現される場合、結果は、ポイントまたはピップでのトレード価格とそのストップロス価格との差になります。

同じ通貨ペアでも、4桁のブローカーの通貨のティック値は、5桁のブローカーとは異なります。 4桁のブローカーでは、1ティックが1ポイント (または pip) に相当するため、5桁のブローカーでは、pip は10ポイントに相当します。

固定リスクマネーマネジメントの例として、米ドル口座に $1000 残高があり、トレードあたりのリスク率が5% と仮定します。 5桁のブローカーで0.1のティック値 と200ポイント (20 ピップ) ストップロスを仮定:

Volume = (1000 * 0.05 / 200) / 0.1 = 2.5 lot

計算ロットサイズは、リスクの割合と使用可能な残高に応じて増加しますが、ストップロスの大きさとティック値に基づいて減少します。 アカウントバランス、リスク、およびティック値は多くの場合一定ですが、可変であるストップロスは珍しくありません (動的に計算されます)。 固定リスクは通常、非常に小さなロットサイズ (したがって、ブローカーによって拒否) につながるので、エントリの価格とストップロスの間の距離に上限がない戦略には適していません。 一方、あまりにも小さなストップロスの値は非常に大きなロットサイズになり、また、低い上限ロットのブローカーとのトラブルを引き起こす可能性があります。 この問題はMT5で大部分が解決されており、サイズが大きすぎるとオーダーが複数の案件に分割されます。 しかし、MT4では、そのような関数はありません-トレードサイズが (マイナートレードに分割) 巨大なトレードサイズに対処するために何か準備するか、またはシンプルに許可されている最大ロットサイズを超えて回避するしかありません。

計算で使用される式は、その UpdateLotSize メソッド内にあります。

bool CMoneyFixedFractionalBase::UpdateLotSize(const string symbol,const double price,const ENUM_ORDER_TYPE type,const double sl)
  {
   m_symbol=m_symbol_man.Get(symbol);
   double last_volume=m_volume;
   if(CheckPointer(m_symbol))
     {
      double balance=m_equity==false?m_account.Balance():m_account.Equity();
      double ticks=0;
      if(price==0.0)
        {
         if(type==ORDER_TYPE_BUY)
            ticks=MathAbs(m_symbol.Bid()-sl)/m_symbol.TickSize();
         else if(type==ORDER_TYPE_SELL)
            ticks=MathAbs(m_symbol.Ask()-sl)/m_symbol.TickSize();
        }
      else ticks=MathAbs(price-sl)/m_symbol.TickSize();
      m_volume=((balance*(m_risk/100))/ticks)/m_symbol.TickValue();
     }
   return NormalizeDouble(last_volume-m_volume,2)==0;
  }
まず、ストップロスの値をティックで取得します。 その後、実際の式を使用して、クラスの m_volume メンバーを更新し、最終的な出力として使用します。


固定比率

固定比率マネーマネジメントでは、バランスで使用できる現在の残高に比例してトレードサイズが計算されます。 マネーマネジメントのこのタイプでは、ロットサイズが自動的に調整されていることを除いて、固定ロットのマネーマネジメントの特別なケースとしてではなく、裁量トレーダーによって考慮することができます。 アカウントが増加している場合, ロットサイズはまた、すべてのしきい値の後に増加します。 ロットサイズが減少している場合、ロットサイズも応じて調整されます。

固定リスクマネーマネジメントとは異なり、フィックスレシオはゼロ以外のストップロスを必要としません。 トレードがストップロスを必要としない場合に使用することが理想的です。しかし、その決済は別のメソッドで管理されています (資産通貨での損益によって決済する等).

固定比率のマネーマネジメントに基づくトレードサイズの計算は一般に次式で表されます。

ボリューム = ベースボリューム + (残高 /残高増加) * ボリュームインクリメント

ただし、

  • ベースボリューム –アカウントのサイズに関係ない合計ボリュームに追加するボリューム
  • 残高–アカウント残高
  • 残高増加-ロットサイズの増加を誘発するためのアカウントのバランスの増加
  • ボリュームインクリメント – 残高増加によってバランスが変化した場合の合計ボリュームから追加/減算されるボリューム

例として、0.0 ロットのベースボリュームを持っていると仮定し、ボリュームは、アカウント上のすべての $1000 によって0.1増加するとします。 アカウントは現在、$2500 の価値があります。 したがって、合計ボリュームは次のように計算されます。

Volume = 0 + (2500 / 1000) * 0.1 = 0.25 lot

このメソッドには多くのバリエーションがあります。 1つは、ロットサイズが一定のレベルでのみ更新されるメソッドです (固定比率マネーマネジメントで実装されたものです)。 例えば、前述した例では、計算されたボリュームは0.25 ロットでしたが、一部では、0.2 ロットのままで、バランスが $3000 を超えると0.3 ロットに増加するだけです。

UpdateLotSize メソッドは、次のように実装できます。

bool CMoneyFixedRatioBase::UpdateLotSize(const string symbol,const double price,const ENUM_ORDER_TYPE type,const double sl=0)
  {
   m_symbol=m_symbol_man.Get(symbol);
   double last_volume=m_volume;
   if(CheckPointer(m_symbol))
     {
      double balance=m_equity==false?m_account.Balance():m_account.Equity();      
      m_volume=m_volume_base+((int)(balance/m_balance_inc))*m_volume_inc;
      m_balance=balance;
     }
   return NormalizeDouble(last_volume-m_volume,2)==0;
  }


ポイントごとの固定リスク (固定マージン)

ポイントごとの固定リスクは、ストップロスの各ポイントが資産通貨の特定の値の価値があるようなメソッドで動作します。 このアルゴリズムでは、トレーダーのティック値に基づいてロットサイズが計算されます。 たとえば、アカウントが usd で、ポイントあたりの固定リスクが2.0 である場合、ストップロスの各ポイントには $2 の価値があります。 トレードのストップロスが200ポイントなら、全体のトレードの最大のリスクは $400 (相場がトレードのストップロスに当る場合) です。

典型的なトレーダーには、マネーマネジメントのこのタイプを使用して処理する方が簡単です。 トレーダーは、シンプルに資産のティック値を明記する必要があり、トレードロットは自動的に計算されます。 ティック値、または価格の最低の動きごとの利益/損失の変化は、同じままになりますが、総リスクは、トレードのストップロスの大きさに依存します。

このマネーマネジメントのメソッドで使用される式を使用して、UpdateLotSize メソッドは、次のメソッドで実装することができます。

bool CMoneyFixedRiskPerPointBase::UpdateLotSize(const string symbol,const double price,const ENUM_ORDER_TYPE type,const double sl=0)
  {
   m_symbol=m_symbol_man.Get(symbol);
   double last_volume=m_volume;
   if(CheckPointer(m_symbol))
     {
      double balance=m_equity==false?m_account.Balance():m_account.Equity();
      m_volume=(m_risk/m_symbol.TickValue());
     }
   return NormalizeDouble(last_volume-m_volume,2)==0;
  }


固定リスク (固定マージン)

マージンによる固定リスクは、MQL5 標準ライブラリのCMoneyFixedMarginクラスに相当します。 これは、実際にマネーマネジメントのポイントメソッドごとの固定リスクの特別な場合です。 しかし、ポイントごとの固定リスクとは異なり、このメソッドは、ストップロスの大きさに関係なく、そのリスクは同じままになるようなトレードロットの計算におけるストップロス値全体を考慮します。 前の例では、ストップロスで200ポイント、最大リスクとして $400 でした。 ストップロスが100ポイントに減少した場合、1ポイントあたりの固定リスクでのトレードの最大リスクも半減 ($200) になりますが、固定マージンマネーマネジメントでは、最大のリスクは一定 ($400) のままとなります。

この式を考えると、次のように UpdateLotSize メソッドを実装できます。

bool CMoneyFixedRiskBase::UpdateLotSize(const string symbol,const double price,const ENUM_ORDER_TYPE type,const double sl)
  {
   m_symbol=m_symbol_man.Get(symbol);
   double last_volume=m_volume;
   if(CheckPointer(m_symbol))
     {
      double balance=m_equity==false?m_account.Balance():m_account.Equity();
      double ticks=0;
      if(price==0.0)
        {
         if(type==ORDER_TYPE_BUY)
            ticks=MathAbs(m_symbol.Bid()-sl)/m_symbol.TickSize();
         else if(type==ORDER_TYPE_SELL)
            ticks=MathAbs(m_symbol.Ask()-sl)/m_symbol.TickSize();
        }
      else ticks=MathAbs(price-sl)/m_symbol.TickSize();
      m_volume=(m_risk/m_symbol.TickValue())/ticks;
     }
   return NormalizeDouble(last_volume-m_volume,2)==0;
  }
ここで使用される式は、ストップロスのティック値を取得してから、前の式の出力をこの値で除算する必要がある点を除けば、ポイントごとの固定リスクにかなり似ています。


マネーマネジメントオブジェクトのコンテナ

以前の記事で説明したシグナル・クラスと同様に、マネーマネジメントオブジェクトにもコンテナがあります。 EAは、プラットフォームに読み込まれた利用可能な マネーマネジメントオブジェクトの一覧から動的に選択することができます。 理想的には、このコンテナは、マネーマネジメントクラスとEAのコード間の仲介役です。 このオブジェクトの基本クラスは CMoneysBase で、その定義は次のようになります。

class CMoneysBase : public CArrayObj
  {
protected:
   bool              m_active;
   int               m_selected;
   CEventAggregator *m_event_man;
   CObject          *m_container;
public:
                     CMoneysBase(void);
                    ~CMoneysBase(void);
   virtual int       Type(void) const {return CLASS_TYPE_MONEYS;}
   //---初期化
   virtual bool      Init(CSymbolManager*,CAccountInfo*,CEventAggregator*);
   CObject          *GetContainer(void);
   void              SetContainer(CObject*);
   virtual bool      Validate(void) const;
   //---セッターとゲッター
   virtual bool      Active(void) const;
   virtual void      Active(const bool);
   virtual int       Selected(void) const;
   virtual void      Selected(const int);
   virtual bool      Selected(const string);
   //---ボリュームの計算
   virtual double    Volume(const string,const double,const ENUM_ORDER_TYPE,const double);
  };

このオブジェクトは複数の マネーマネジメントオブジェクトを含むように設計されているため、EAで使用できるようにするには少なくとも2つのメソッドが必要です。

  1. 動的にマネーマネジメントメソッドを切り替えるには、
  2. 選択したマネーマネジメントオブジェクトを使用し、その計算されたトレード数量を取得します


この選択は2つのメソッドで行われます。オブジェクト配列の マネーマネジメントオブジェクトのインデックスの割り当てを通じて (CMoneysBase はCArrayObjを拡張)、または名前 (CMoneyBase/CMoney の名前メソッド) を使用して選択するオブジェクトを検索します。 次に、整数の引数 (またはインデックス) を受け取るオーバーロードされたメソッドを示します。

CMoneysBase::Selected(const int value)
  {
   m_selected=value;
  }

次に、文字列引数 (マネーマネジメントオブジェクトの名前) を受け取る選択したメソッドを示します。 name メソッドを使用して割り当てることができる マネーマネジメントオブジェクトの空でない名前が必要であることに注意してください。

bool CMoneysBase::Selected(const string select)
  {
   for(int i=0;i<Total();i++)
     {
      CMoney *money=At(i);
      if(!CheckPointer(money))
         continue;
      if(StringCompare(money.Name(),select))
        {
         Selected(i);
         return true;
        }
     }
   return false;
  }

3番目のオーバーロードされたメソッドは、引数を持たないメソッドです。 選択した マネーマネジメントオブジェクトのインデックスを返し、EAが現在選択している マネーマネジメントメソッドを知りたい場合にのみ役に立ちます。

intCMoneysBase:: 選択された (void) const
  {
   return m_selected;
  }
実際のボリュームは、ボリュームメソッドによってこのオブジェクトを通じて計算されます。 このメソッドは、最初に選択した マネーマネジメントオブジェクトへのポインターを取得し、独自のボリュームメソッドを呼び出します。 CMoneysBase のボリュームメソッドのコードを以下に示します。
double CMoneysBase::Volume(const string symbol,const double price,const ENUM_ORDER_TYPE type,const double sl=0)
  {
   CMoney *money=At(m_selected);
   if(CheckPointer(money))
      return money.Volume(symbol,price,type,sl);
   return 0;
  }

ここでは、メソッドはオブジェクト配列からオブジェクトにアクセスし、ポインターに格納します。 エラーを回避するためには、インデックスによって参照される実際の要素がオブジェクト配列内に実際に存在することを確認する必要があります。


例として、前の記事の最後の例を使用します。 この記事で紹介した マネーマネジメントクラスを紹介し、1つのコンテナに配置して、オーダーマネージャに追加するなどのメソッドで変更します。 以下に示されているのは、関数の関数に対処します:

int()
  {
//---
   order_manager=new COrderManager();
   money_manager = new CMoneys();
   CMoney *money_fixed= new CMoneyFixedLot(0.05);
   //CMoney * money_ff = 新しい CMoneyFixedFractional (5);
   CMoney *money_ratio= new CMoneyFixedRatio(0,0.1,1000);
   //CMoney *money_riskperpoint= new CMoneyFixedRiskPerPoint(0.1);
   //CMoney *money_risk= new CMoneyFixedRisk(100);
   
   money_manager.Add(money_fixed);
   //money_manager.Add(money_ff);
   money_manager.Add(money_ratio);
   //money_manager.Add(money_riskperpoint);
   //money_manager.Add(money_risk);
   order_manager.AddMoneys(money_manager);
   //order_manager.Account(money_manager);
   symbol_manager=new CSymbolManager();
   symbol_info=new CSymbolInfo();
   if(!symbol_info.Name(Symbol()))
      Print("symbol not set");
   symbol_manager.Add(GetPointer(symbol_info));
   order_manager.Init(symbol_manager,new CAccountInfo());

   MqlParam params[1];
   params[0].type=TYPE_STRING;
# ifdef__MQL5__
   params[0].string_value="Examples\\Heiken_Ashi";
#else
   params[0].string_value="Heiken Ashi";
#endif
   SignalHA *signal_ha=new SignalHA(Symbol(),0,1,params,signal_bar);
   SignalMA *signal_ma=new SignalMA(Symbol(),(ENUM_TIMEFRAMES) Period(),maperiod,0,mamethod,maapplied,signal_bar);
   signals=new CSignals();
   signals.Add(GetPointer(signal_ha));
   signals.Add(GetPointer(signal_ma));
   signals.Init(GetPointer(symbol_manager),NULL);
//---
   return(INIT_SUCCEEDED);
  }

ここでは、固定小数、固定リスク、およびポイントマネーマネジメントメソッドごとの固定リスクを使用するためにコード行を含めました。 しかし、これらのメソッドは、ゼロストップロスを必要とするため、この時点で EAはゼロストップでトレードをエントリーし、メソッドを使用することを控えるでしょう。 一方、固定ロットと固定比率のマネーマネジメントメソッドを使用します。 ただし、オブジェクトが無効なストップロス (0 未満) を返す場合、オーダーマネージャのデフォルトのロットサイズが使用されます (デフォルトの0.1 ロットは、CorderManager/COrderManagerBase の m_lotsize クラスメンバで使用できます)。

COrderManager には、マネーマネジメントコンテナ (CMoney) へのポインタである、独自のクラスメンバがあります。 したがって、COrderManager を使用すると、ソースに含まれる マネーマネジメントヘッダーファイルも生成されます。 エキスパートが COrderManager を使用しない場合は、マネーマネジメントクラスへの# includeディレクティブをソースコードに表示する必要があります。

ontick 関数については、ロングポジションでは固定ロットサイジングを使用しますが、ショートポジションでは固定比率ロットサイジングを使用します。 オーダーマネージャの TradeOpen メソッドが呼び出される前に、選択した マネーマネジメントタイプを変更することで、CMoneys の選択されたメソッドを使用して実現できます。

void OnTick()
  {
//---
   if(symbol_info.RefreshRates())
     {
      signals.Check();
      if(signals.CheckOpenLong())
        {
         close_last();
         //Print("Entering buy trade..");
         money_manager.Selected(0);
         order_manager.TradeOpen(Symbol(),ORDER_TYPE_BUY,symbol_info.Ask());
        }
      else if(signals.CheckOpenShort())
        {
         close_last();
         //Print("Entering sell trade..");
         money_manager.Selected(1);
         order_manager.TradeOpen(Symbol(),ORDER_TYPE_SELL,symbol_info.Bid());
        }
     }
  }

マネーマネジメントは、本質的には、純粋な計算であるため、計算されたサイズは、MT4とMT5で同じであることを期待しています。 メタトレーダーの EA のテスト結果を示します。 (最初の10トレード):

# Time Type Order Size Price S / L T / P Profit Balance
1 2017.01.02 00:00 sell 1 1.00 1.05100 0.00000 0.00000
2 2017.01.03 03:00 close 1 1.00 1.04679 0.00000 0.00000 419.96 10419.96
3 2017.01.03 03:00 buy 2 0.05 1.04679 0.00000 0.00000
4 2017.01.03 10:00 close 2 0.05 1.04597 0.00000 0.00000 -4.10 10415.86
5 2017.01.03 10:00 sell 3 1.00 1.04597 0.00000 0.00000
6 2017.01.03 20:00 close 3 1.00 1.04285 0.00000 0.00000 312.00 10727.86
7 2017.01.03 20:00 buy 4 0.05 1.04285 0.00000 0.00000
8 2017.01.03 22:00 close 4 0.05 1.04102 0.00000 0.00000 -9.15 10718.71
9 2017.01.03 22:00 sell 5 1.00 1.04102 0.00000 0.00000
10 2017.01.04 02:00 close 5 1.00 1.04190 0.00000 0.00000 -89.04 10629.67
11 2017.01.04 02:00 buy 6 0.05 1.04190 0.00000 0.00000
12 2017.01.04 03:00 close 6 0.05 1.03942 0.00000 0.00000 -12.40 10617.27
13 2017.01.04 03:00 sell 7 1.00 1.03942 0.00000 0.00000
14 2017.01.04 06:00 close 7 1.00 1.04069 0.00000 0.00000 -127.00 10490.27
15 2017.01.04 06:00 buy 8 0.05 1.04069 0.00000 0.00000
16 2017.01.05 11:00 close 8 0.05 1.05149 0.00000 0.00000 54.05 10544.32
17 2017.01.05 11:00 sell 9 1.00 1.05149 0.00000 0.00000
18 2017.01.05 16:00 close 9 1.00 1.05319 0.00000 0.00000 -170.00 10374.32
19 2017.01.05 16:00 buy 10 0.05 1.05319 0.00000 0.00000
20 2017.01.06 05:00 close 10 0.05 1.05869 0.00000 0.00000 27.52 10401.84

MT5では、次の結果 (ヘッジモード、最初の10トレード) になります:

Orders
Open Time Order Symbol Type Volume Price S / L T / P Time State Comment
2017.01.02 00:00:00 2 EURUSD sell 1.00/1.00 1.05100 2017.01.02 00:00:00 filled
2017.01.03 03:00:00 3 EURUSD buy 1.00/1.00 1.04669 2017.01.03 03:00:00 filled
2017.01.03 03:00:00 4 EURUSD buy 0.05/0.05 1.04669 2017.01.03 03:00:00 filled
2017.01.03 10:00:00 5 EURUSD sell 0.05/0.05 1.04597 2017.01.03 10:00:00 filled
2017.01.03 10:00:00 6 EURUSD sell 1.00/1.00 1.04597 2017.01.03 10:00:00 filled
2017.01.03 20:00:00 7 EURUSD buy 1.00/1.00 1.04273 2017.01.03 20:00:00 filled
2017.01.03 20:00:00 8 EURUSD buy 0.05/0.05 1.04273 2017.01.03 20:00:00 filled
2017.01.03 22:00:00 9 EURUSD sell 0.05/0.05 1.04102 2017.01.03 22:00:00 filled
2017.01.03 22:00:00 10 EURUSD sell 1.00/1.00 1.04102 2017.01.03 22:00:00 filled
2017.01.04 02:00:00 11 EURUSD buy 1.00/1.00 1.04180 2017.01.04 02:00:00 filled
2017.01.04 02:00:00 12 EURUSD buy 0.05/0.05 1.04180 2017.01.04 02:00:00 filled
2017.01.04 03:00:00 13 EURUSD sell 0.05/0.05 1.03942 2017.01.04 03:00:00 filled
2017.01.04 03:00:00 14 EURUSD sell 1.00/1.00 1.03942 2017.01.04 03:00:00 filled
2017.01.04 06:00:00 15 EURUSD buy 1.00/1.00 1.04058 2017.01.04 06:00:00 filled
2017.01.04 06:00:00 16 EURUSD buy 0.05/0.05 1.04058 2017.01.04 06:00:00 filled
2017.01.05 11:00:00 17 EURUSD sell 0.05/0.05 1.05149 2017.01.05 11:00:00 filled
2017.01.05 11:00:00 18 EURUSD sell 1.00/1.00 1.05149 2017.01.05 11:00:00 filled
2017.01.05 16:00:00 19 EURUSD buy 1.00/1.00 1.05307 2017.01.05 16:00:00 filled
2017.01.05 16:00:00 20 EURUSD buy 0.05/0.05 1.05307 2017.01.05 16:00:00 filled
2017.01.06 05:00:00 21 EURUSD sell 0.05/0.05 1.05869 2017.01.06 05:00:00 filled


オーダーマネージャでは、すでに2つのプラットフォーム (および言語) の違いを考慮しているため、ロットサイズ計算のメソッドと結果は同じであり、発生する差異はオーダーマネージャー自身に対して行われます。

結論

この記事では、クロスプラットフォームEAでマネーマネジメントを適用するメソッドについて説明しました。 5つの異なるマネーマネジメントメソッドを紹介しています。 また、動的な マネーマネジメントメソッドの選択に使用される、オブジェクトへのポインタのカスタムコンテナーオブジェクトを備えています。